diff --git a/.clang-tidy b/.clang-tidy index e740d64..4c36e66 100644 --- a/.clang-tidy +++ b/.clang-tidy
@@ -41,6 +41,25 @@ modernize-use-override, modernize-use-transparent-functors, readability-redundant-member-init' + # DISABLED CHECKS: + # An analysis was done of the following checks and they were deemed to either + # have too high of a false positive rate, or were redundant/useless (e.g. + # never fired once in the entirety of chromium). We list them here so that + # future editors of this file are aware these checks have already been + # considered and accordingly rejected. + # bugprone-undelegated-constructor + # bugprone-macro-repeated-side-effects + # bugprone-misplaced-operator-in-strlen-in-alloc + # bugprone-misplaced-pointer-arithmetic-in-alloc + # bugprone-multiple-statement-macro + # bugprone-no-escape + # bugprone-posix-return + # bugprone-shared-ptr-array-mismatch + # bugprone-spuriously-wake-up-functions + # bugprone-standalone-empty + # bugprone-stringview-nullptr + # bugprone-suspicious-enum-usage + # bugprone-unhandled-exception-at-new CheckOptions: - key: bugprone-assert-side-effect.AssertMacros value: assert,DCHECK
diff --git a/DEPS b/DEPS index f34ae7b..0281c6a 100644 --- a/DEPS +++ b/DEPS
@@ -295,19 +295,19 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. - 'src_internal_revision': 'e613517431480bcf7c7a0b6fbad281a1b4f6b26e', + 'src_internal_revision': 'd177ab19a801ad5337736483002b4c7a2ca6c5c4', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Skia # and whatever else without interference from each other. - 'skia_revision': '7f7555536e3c71d4404ad82c57fea4ac21102460', + 'skia_revision': '12dbc34d742ee67f1b267dc276fe7d84631aa856', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling V8 # and whatever else without interference from each other. - 'v8_revision': 'd1a3ead4abb24b456a6ba3b7d098299d111c4d38', + 'v8_revision': '577adbe0c15f8fa0643d5f91cc92a06c271c3456', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling ANGLE # and whatever else without interference from each other. - 'angle_revision': 'd221cf402b218f6fc3f71cff155f99702f24c713', + 'angle_revision': '214b7ce20bb6a308c8e929743cd8402f3f5204dd', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. @@ -371,7 +371,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling catapult # and whatever else without interference from each other. - 'catapult_revision': '168822b896c38f7d0079a2483c81f3d5cbc1d933', + 'catapult_revision': '5255e1a11a4d0bf747f304816a2523f952be9228', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling CrossBench # and whatever else without interference from each other. @@ -391,7 +391,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling devtools-frontend # and whatever else without interference from each other. - 'devtools_frontend_revision': '0f029e02e44f173a3d6ed04cf01c56e90e8c289f', + 'devtools_frontend_revision': '4cc0688b9538f497ae06e3a0f97431ffc86f4181', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libprotobuf-mutator # and whatever else without interference from each other. @@ -415,7 +415,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'dawn_revision': '8d9a27a2cf4483df70ac3a5df515c57a4bb68723', + 'dawn_revision': 'f4cae4afdd4bca082d36025c66c7c284ed16a67f', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -475,7 +475,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling nearby # and whatever else without interference from each other. - 'nearby_revision': '541bffc85815c2fb82d3eab05f75d5aac71102c1', + 'nearby_revision': '59e527dbe3326f52bce1bda3dc30e997a68f2443', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling securemessage # and whatever else without interference from each other. @@ -495,7 +495,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. - 'libcxxabi_revision': '7ff13dd8c66d5047a3ee1e1ba26ddeb70d3d8740', + 'libcxxabi_revision': '1efb5e6d7c5eee01624f3730a935285405c9cd22', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling feed # and whatever else without interference from each other. @@ -1486,7 +1486,7 @@ 'src/clank': { 'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' + - 'cd91ca753ee2e6e286a4af500e3246a02e62fd94', + 'af42a48a53e7717ae26d7cd6e90195216fb9fe51', 'condition': 'checkout_android and checkout_src_internal', }, @@ -2526,7 +2526,7 @@ Var('pdfium_git') + '/pdfium.git' + '@' + Var('pdfium_revision'), 'src/third_party/perfetto': - Var('chromium_git') + '/external/github.com/google/perfetto.git' + '@' + 'f2e70843f73b1e17fea3de511344f65b4bc8ad9c', + Var('chromium_git') + '/external/github.com/google/perfetto.git' + '@' + '829564494ca9d7bc1c8b15998c5f1f3536cdacf8', 'src/base/tracing/test/data': { 'bucket': 'perfetto', @@ -3038,7 +3038,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/media_app/app', - 'version': 'UjL0kayMnT1EQUqhcQ8uKU0TB4PnSOklcndgabv0VVoC', + 'version': 'X5yA3jmrsEHnTqTsWR9XOg42AJNxWOOD5f41r5SO58QC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal',
diff --git a/OWNERS b/OWNERS index c1fa20ca..435400e 100644 --- a/OWNERS +++ b/OWNERS
@@ -7,6 +7,7 @@ per-file .clang-format=thakis@chromium.org per-file .clang-tidy=file://styleguide/c++/OWNERS +per-file .clang-tidy=flowerhack@google.com per-file .clangd=file://styleguide/c++/OWNERS per-file .gitattributes=* per-file .gitignore=*
diff --git a/android_webview/test/data/web_tests/webexposed/global-interface-listing-expected.txt b/android_webview/test/data/web_tests/webexposed/global-interface-listing-expected.txt index 1cb7a05d..25ccda7f 100644 --- a/android_webview/test/data/web_tests/webexposed/global-interface-listing-expected.txt +++ b/android_webview/test/data/web_tests/webexposed/global-interface-listing-expected.txt
@@ -7287,6 +7287,17 @@ getter promise getter reason method constructor +interface Proofreader + static method availability + static method create + attribute @@toStringTag + getter correctionExplanationLanguage + getter expectedInputLanguages + getter includeCorrectionExplanations + getter includeCorrectionTypes + method constructor + method destroy + method proofread interface ProtectedAudience attribute @@toStringTag method constructor
diff --git a/base/BUILD.gn b/base/BUILD.gn index 34f4bc9a..7860ff6 100644 --- a/base/BUILD.gn +++ b/base/BUILD.gn
@@ -4430,9 +4430,7 @@ "android/java/src/org/chromium/base/IntStringCallback.java", "android/java/src/org/chromium/base/JNIUtils.java", "android/java/src/org/chromium/base/JavaExceptionReporter.java", - "android/java/src/org/chromium/base/JniCallbackUtils.java", - "android/java/src/org/chromium/base/JniOnceCallback.java", - "android/java/src/org/chromium/base/JniRepeatingCallback.java", + "android/java/src/org/chromium/base/JniCallbackImpl.java", "android/java/src/org/chromium/base/Token.java", "android/java/src/org/chromium/base/TokenBase.java", "android/java/src/org/chromium/base/UnguessableToken.java", @@ -4612,9 +4610,11 @@ "android/java/src/org/chromium/base/IntentUtils.java", "android/java/src/org/chromium/base/JavaExceptionReporter.java", "android/java/src/org/chromium/base/JavaHandlerThread.java", - "android/java/src/org/chromium/base/JniCallbackUtils.java", + "android/java/src/org/chromium/base/JniCallbackImpl.java", "android/java/src/org/chromium/base/JniOnceCallback.java", + "android/java/src/org/chromium/base/JniOnceRunnable.java", "android/java/src/org/chromium/base/JniRepeatingCallback.java", + "android/java/src/org/chromium/base/JniRepeatingRunnable.java", "android/java/src/org/chromium/base/LocaleUtils.java", "android/java/src/org/chromium/base/MathUtils.java", "android/java/src/org/chromium/base/PackageManagerUtils.java",
diff --git a/base/android/java/src/org/chromium/base/ApplicationStatus.java b/base/android/java/src/org/chromium/base/ApplicationStatus.java index d0a272bf..171498b 100644 --- a/base/android/java/src/org/chromium/base/ApplicationStatus.java +++ b/base/android/java/src/org/chromium/base/ApplicationStatus.java
@@ -52,7 +52,7 @@ private static class ActivityInfo { private int mStatus = ActivityState.DESTROYED; - private ObserverList<ActivityStateListener> mListeners = new ObserverList<>(); + private final ObserverList<ActivityStateListener> mListeners = new ObserverList<>(); /** * @return The current {@link ActivityState} of the activity.
diff --git a/base/android/java/src/org/chromium/base/DeviceInfo.java b/base/android/java/src/org/chromium/base/DeviceInfo.java index ed54701..48d1349 100644 --- a/base/android/java/src/org/chromium/base/DeviceInfo.java +++ b/base/android/java/src/org/chromium/base/DeviceInfo.java
@@ -37,7 +37,7 @@ private static boolean sInitialized; /** The versionCode of Play Services. Can be overridden in tests. */ - private String mGmsVersionCode; + private final String mGmsVersionCode; /** Whether we're running on Android TV or not */ private final boolean mIsTv;
diff --git a/base/android/java/src/org/chromium/base/JniCallbackImpl.java b/base/android/java/src/org/chromium/base/JniCallbackImpl.java new file mode 100644 index 0000000..cc2cf34 --- /dev/null +++ b/base/android/java/src/org/chromium/base/JniCallbackImpl.java
@@ -0,0 +1,80 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.base; + +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; + +/* + * A wrapper that owns a native side base::OnceCallback. + * + * You must call JniOnceCallback#destroy() if you never end up calling onResult + * so as to not leak the native callback. + * + * This class has no additional thread safety measures compared to + * base::RepeatingCallback. + * + * Class is package-private in order to force clients to use one of the implemented + * interfaces (to reduce confusion of a Callback that is also a Runnable), and to + * better document Once vs Repeated semantics. + */ +@JNINamespace("base::android") +@NullMarked +final class JniCallbackImpl<T extends @Nullable Object> + implements JniOnceCallback<T>, + JniOnceRunnable, + JniRepeatingCallback<T>, + JniRepeatingRunnable { + private final @Nullable LifetimeAssert mLifetimeAssert = LifetimeAssert.create(this); + private long mNativePointer; + private final boolean mIsRepeating; + + @CalledByNative + private JniCallbackImpl(boolean isRepeating, long nativePointer) { + mIsRepeating = isRepeating; + mNativePointer = nativePointer; + } + + @Override + @SuppressWarnings("NullAway") + public void run() { + // When used as a Runnable instead of a Callback<T>, the JNI call still expects a + // parameter, but discards it and calls the no-arg OnceCallback. This was simpler + // than introducing a second JNI call that does not take a parameter. + onResult(null); + } + + @Override + public void onResult(T result) { + // TODO(mheikal): maybe store destroy callstack to output here? + assert mNativePointer != 0 : "Called destroyed callback"; + JniCallbackImplJni.get().onResult(mIsRepeating, mNativePointer, result); + if (!mIsRepeating) { + mNativePointer = 0; + LifetimeAssert.setSafeToGc(mLifetimeAssert, true); + } + } + + /** Frees the owned base::OnceCallback's memory */ + @Override + public void destroy() { + if (mNativePointer != 0) { + JniCallbackImplJni.get().destroy(mIsRepeating, mNativePointer); + mNativePointer = 0; + LifetimeAssert.setSafeToGc(mLifetimeAssert, true); + } + } + + @NativeMethods + interface Natives { + void onResult(boolean isRepeating, long callbackPtr, Object result); + + void destroy(boolean isRepeating, long callbackPtr); + } +}
diff --git a/base/android/java/src/org/chromium/base/JniCallbackUtils.java b/base/android/java/src/org/chromium/base/JniCallbackUtils.java deleted file mode 100644 index d5e99b67..0000000 --- a/base/android/java/src/org/chromium/base/JniCallbackUtils.java +++ /dev/null
@@ -1,45 +0,0 @@ -// Copyright 2025 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -package org.chromium.base; - -import org.jni_zero.JNINamespace; -import org.jni_zero.NativeMethods; - -import org.chromium.build.annotations.NullMarked; - -@JNINamespace("base::android") -@NullMarked -final class JniCallbackUtils { - - static void runNativeCallback(JniOnceCallback callback, Object result) { - assert callback.mNativePointer != 0; - JniCallbackUtilsJni.get().onResult(callback.mNativePointer, false, result); - callback.mNativePointer = 0; - } - - static void runNativeCallback(JniRepeatingCallback callback, Object result) { - assert callback.mNativePointer != 0; - JniCallbackUtilsJni.get().onResult(callback.mNativePointer, true, result); - } - - static void destroyNativeCallback(JniOnceCallback callback) { - assert callback.mNativePointer != 0; - JniCallbackUtilsJni.get().destroy(callback.mNativePointer, false); - callback.mNativePointer = 0; - } - - static void destroyNativeCallback(JniRepeatingCallback callback) { - assert callback.mNativePointer != 0; - JniCallbackUtilsJni.get().destroy(callback.mNativePointer, true); - callback.mNativePointer = 0; - } - - @NativeMethods - interface Natives { - void onResult(long callbackPtr, boolean isRepeating, Object result); - - void destroy(long callbackPtr, boolean isRepeating); - } -}
diff --git a/base/android/java/src/org/chromium/base/JniOnceCallback.java b/base/android/java/src/org/chromium/base/JniOnceCallback.java index d298bbd4..2a45296 100644 --- a/base/android/java/src/org/chromium/base/JniOnceCallback.java +++ b/base/android/java/src/org/chromium/base/JniOnceCallback.java
@@ -4,9 +4,7 @@ package org.chromium.base; -import org.jni_zero.CalledByNative; -import org.jni_zero.JNINamespace; - +import org.chromium.base.lifetime.Destroyable; import org.chromium.build.annotations.NullMarked; import org.chromium.build.annotations.Nullable; @@ -19,35 +17,5 @@ * This class has no additional thread safety measures compared to * base::RepeatingCallback. */ -@JNINamespace("base::android") @NullMarked -public final class JniOnceCallback<T extends @Nullable Object> implements Callback<T> { - private final @Nullable LifetimeAssert mLifetimeAssert = LifetimeAssert.create(this); - long mNativePointer; - - @CalledByNative - private JniOnceCallback(long nativePointer) { - mNativePointer = nativePointer; - } - - @Override - public void onResult(T result) { - if (mNativePointer != 0) { - JniCallbackUtils.runNativeCallback(this, result); - mNativePointer = 0; - LifetimeAssert.setSafeToGc(mLifetimeAssert, true); - } else { - // TODO(mheikal): maybe store destroy callstack to output here? - assert false : "Called destroyed callback"; - } - } - - /** Frees the owned base::OnceCallback's memory */ - public void destroy() { - if (mNativePointer != 0) { - JniCallbackUtils.destroyNativeCallback(this); - mNativePointer = 0; - } - LifetimeAssert.setSafeToGc(mLifetimeAssert, true); - } -} +public interface JniOnceCallback<T extends @Nullable Object> extends Callback<T>, Destroyable {}
diff --git a/base/android/java/src/org/chromium/base/JniOnceRunnable.java b/base/android/java/src/org/chromium/base/JniOnceRunnable.java new file mode 100644 index 0000000..899e2d3 --- /dev/null +++ b/base/android/java/src/org/chromium/base/JniOnceRunnable.java
@@ -0,0 +1,20 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.base; + +import org.chromium.base.lifetime.Destroyable; +import org.chromium.build.annotations.NullMarked; + +/* + * A wrapper that owns a native side base::OnceCallback. + * + * You must call JniOnceCallback#destroy() if you never end up calling onResult + * so as to not leak the native callback. + * + * This class has no additional thread safety measures compared to + * base::RepeatingCallback. + */ +@NullMarked +public interface JniOnceRunnable extends Runnable, Destroyable {}
diff --git a/base/android/java/src/org/chromium/base/JniRepeatingCallback.java b/base/android/java/src/org/chromium/base/JniRepeatingCallback.java index 1f4f17c..469abdc 100644 --- a/base/android/java/src/org/chromium/base/JniRepeatingCallback.java +++ b/base/android/java/src/org/chromium/base/JniRepeatingCallback.java
@@ -4,9 +4,7 @@ package org.chromium.base; -import org.jni_zero.CalledByNative; -import org.jni_zero.JNINamespace; - +import org.chromium.base.lifetime.Destroyable; import org.chromium.build.annotations.NullMarked; import org.chromium.build.annotations.Nullable; @@ -19,33 +17,6 @@ * This class has no additional thread safety measures compared to * base::RepeatingCallback. */ -@JNINamespace("base::android") @NullMarked -public class JniRepeatingCallback<T extends @Nullable Object> implements Callback<T> { - private final @Nullable LifetimeAssert mLifetimeAssert = LifetimeAssert.create(this); - long mNativePointer; - - @CalledByNative - private JniRepeatingCallback(long nativePointer) { - mNativePointer = nativePointer; - } - - @Override - public void onResult(T result) { - if (mNativePointer != 0) { - JniCallbackUtils.runNativeCallback(this, result); - } else { - // TODO(mheikal): maybe store destroy callstack to output here? - assert false : "Called destroyed callback"; - } - } - - /** Frees the owned base::RepeatingCallback's memory */ - public void destroy() { - if (mNativePointer != 0) { - JniCallbackUtils.destroyNativeCallback(this); - mNativePointer = 0; - } - LifetimeAssert.setSafeToGc(mLifetimeAssert, true); - } -} +public interface JniRepeatingCallback<T extends @Nullable Object> + extends Callback<T>, Destroyable {}
diff --git a/base/android/java/src/org/chromium/base/JniRepeatingRunnable.java b/base/android/java/src/org/chromium/base/JniRepeatingRunnable.java new file mode 100644 index 0000000..14b40c2b --- /dev/null +++ b/base/android/java/src/org/chromium/base/JniRepeatingRunnable.java
@@ -0,0 +1,20 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +package org.chromium.base; + +import org.chromium.base.lifetime.Destroyable; +import org.chromium.build.annotations.NullMarked; + +/* + * A wrapper that owns a native side base::RepeatingCallback. + * + * You must call JniRepeatingCallback#destroy() when you are done with it to + * not leak the native callback. + * + * This class has no additional thread safety measures compared to + * base::RepeatingCallback. + */ +@NullMarked +public interface JniRepeatingRunnable extends Runnable, Destroyable {}
diff --git a/base/android/java/src/org/chromium/base/LifetimeAssert.java b/base/android/java/src/org/chromium/base/LifetimeAssert.java index 724285b..5acb39a 100644 --- a/base/android/java/src/org/chromium/base/LifetimeAssert.java +++ b/base/android/java/src/org/chromium/base/LifetimeAssert.java
@@ -77,8 +77,8 @@ sActiveWrappers.add(this); } - private static ReferenceQueue<Object> sReferenceQueue = new ReferenceQueue<>(); - private static Set<WrappedReference> sActiveWrappers = + private static final ReferenceQueue<Object> sReferenceQueue = new ReferenceQueue<>(); + private static final Set<WrappedReference> sActiveWrappers = Collections.synchronizedSet(new HashSet<>()); static {
diff --git a/base/android/java/src/org/chromium/base/TraceEvent.java b/base/android/java/src/org/chromium/base/TraceEvent.java index f19cd59..bc38318 100644 --- a/base/android/java/src/org/chromium/base/TraceEvent.java +++ b/base/android/java/src/org/chromium/base/TraceEvent.java
@@ -773,13 +773,13 @@ mRes = res; } - private int mId; - private int mParentId; - private boolean mIsShown; - private boolean mIsDirty; - private String mClassName; + private final int mId; + private final int mParentId; + private final boolean mIsShown; + private final boolean mIsDirty; + private final String mClassName; // One can use mRes to resolve mId to a resource name. - private android.content.res.Resources mRes; + private final android.content.res.Resources mRes; } /**
diff --git a/base/android/java/src/org/chromium/base/jank_tracker/FrameMetricsListener.java b/base/android/java/src/org/chromium/base/jank_tracker/FrameMetricsListener.java index e429f78c..1a91947 100644 --- a/base/android/java/src/org/chromium/base/jank_tracker/FrameMetricsListener.java +++ b/base/android/java/src/org/chromium/base/jank_tracker/FrameMetricsListener.java
@@ -49,10 +49,10 @@ } } - private DisplayListenerBackend mBackend = new DisplayListenerBackend(); + private final DisplayListenerBackend mBackend = new DisplayListenerBackend(); private final FrameMetricsStore mFrameMetricsStore; - private AtomicBoolean mIsRecording = new AtomicBoolean(false); + private final AtomicBoolean mIsRecording = new AtomicBoolean(false); // Microseconds between each frame. private long mVsyncInterval;
diff --git a/base/android/java/src/org/chromium/base/jank_tracker/JankActivityTracker.java b/base/android/java/src/org/chromium/base/jank_tracker/JankActivityTracker.java index 9857c8d..f8a423d 100644 --- a/base/android/java/src/org/chromium/base/jank_tracker/JankActivityTracker.java +++ b/base/android/java/src/org/chromium/base/jank_tracker/JankActivityTracker.java
@@ -29,7 +29,7 @@ private final ThreadChecker mThreadChecker = new ThreadChecker(); private final DestroyChecker mDestroyChecker = new DestroyChecker(); - private WeakReference<Activity> mActivityReference; + private final WeakReference<Activity> mActivityReference; JankActivityTracker( Activity context,
diff --git a/base/android/java/src/org/chromium/base/metrics/CachingUmaRecorder.java b/base/android/java/src/org/chromium/base/metrics/CachingUmaRecorder.java index fd33870..f928311 100644 --- a/base/android/java/src/org/chromium/base/metrics/CachingUmaRecorder.java +++ b/base/android/java/src/org/chromium/base/metrics/CachingUmaRecorder.java
@@ -223,7 +223,7 @@ * <p> * Using {@link AtomicInteger} because the value may need to be updated with a read lock held. */ - private AtomicInteger mDroppedHistogramSampleCount = new AtomicInteger(); + private final AtomicInteger mDroppedHistogramSampleCount = new AtomicInteger(); /** Cache of user actions. */ @GuardedBy("mRwLock")
diff --git a/base/android/java/src/org/chromium/base/process_launcher/ChildProcessConnection.java b/base/android/java/src/org/chromium/base/process_launcher/ChildProcessConnection.java index a1f07e5..2dc1470 100644 --- a/base/android/java/src/org/chromium/base/process_launcher/ChildProcessConnection.java +++ b/base/android/java/src/org/chromium/base/process_launcher/ChildProcessConnection.java
@@ -192,7 +192,7 @@ private final Handler mLauncherHandler; private final Executor mLauncherExecutor; - private ComponentName mServiceName; + private final ComponentName mServiceName; private final @Nullable ComponentName mFallbackServiceName; private @Nullable Intent mBindIntent;
diff --git a/base/android/java/src/org/chromium/base/task/AsyncTask.java b/base/android/java/src/org/chromium/base/task/AsyncTask.java index 853988f..1cc2c15a 100644 --- a/base/android/java/src/org/chromium/base/task/AsyncTask.java +++ b/base/android/java/src/org/chromium/base/task/AsyncTask.java
@@ -69,7 +69,7 @@ private final AtomicBoolean mCancelled = new AtomicBoolean(); private final AtomicBoolean mTaskInvoked = new AtomicBoolean(); - private int mIterationIdForTesting = PostTask.sTestIterationForTesting; + private final int mIterationIdForTesting = PostTask.sTestIterationForTesting; private static class StealRunnableHandler implements RejectedExecutionHandler { @Override
diff --git a/base/android/java/src/org/chromium/base/task/ChainedTasks.java b/base/android/java/src/org/chromium/base/task/ChainedTasks.java index 4aaf737..1c12355 100644 --- a/base/android/java/src/org/chromium/base/task/ChainedTasks.java +++ b/base/android/java/src/org/chromium/base/task/ChainedTasks.java
@@ -33,7 +33,7 @@ private boolean mFinalized; private volatile boolean mCanceled; - private int mIterationIdForTesting = PostTask.sTestIterationForTesting; + private final int mIterationIdForTesting = PostTask.sTestIterationForTesting; private final Runnable mRunAndPost = new Runnable() {
diff --git a/base/android/java/src/org/chromium/base/task/SequencedTaskRunnerImpl.java b/base/android/java/src/org/chromium/base/task/SequencedTaskRunnerImpl.java index e2ccbe9..23cc306 100644 --- a/base/android/java/src/org/chromium/base/task/SequencedTaskRunnerImpl.java +++ b/base/android/java/src/org/chromium/base/task/SequencedTaskRunnerImpl.java
@@ -14,7 +14,7 @@ */ @NullMarked public class SequencedTaskRunnerImpl extends TaskRunnerImpl implements SequencedTaskRunner { - private AtomicInteger mPendingTasks = new AtomicInteger(); + private final AtomicInteger mPendingTasks = new AtomicInteger(); private volatile boolean mReadyToCreateNativeTaskRunner;
diff --git a/base/android/java/src/org/chromium/base/task/TaskRunnerImpl.java b/base/android/java/src/org/chromium/base/task/TaskRunnerImpl.java index 3f26000..a1b71e8 100644 --- a/base/android/java/src/org/chromium/base/task/TaskRunnerImpl.java +++ b/base/android/java/src/org/chromium/base/task/TaskRunnerImpl.java
@@ -46,7 +46,7 @@ // Track tasks in java to prevent overflowing the JNI global ref table (crbug.com/369845089). // Table which ideally covers most immediate posted tasks so they don't have to do map // operations. - private static Object sPendingTaskLock = new Object(); + private static final Object sPendingTaskLock = new Object(); @GuardedBy("sPendingTaskLock") private static final @Nullable Runnable[] sPendingTaskTable = new Runnable[50];
diff --git a/base/android/jni_callback.cc b/base/android/jni_callback.cc index 5624744..9b97caba 100644 --- a/base/android/jni_callback.cc +++ b/base/android/jni_callback.cc
@@ -5,9 +5,7 @@ #include "base/android/jni_callback.h" // Must come after all headers that specialize FromJniType() / ToJniType(). -#include "base/base_minimal_jni/JniCallbackUtils_jni.h" -#include "base/base_minimal_jni/JniOnceCallback_jni.h" -#include "base/base_minimal_jni/JniRepeatingCallback_jni.h" +#include "base/base_minimal_jni/JniCallbackImpl_jni.h" namespace base::android { @@ -25,8 +23,10 @@ jni_zero::ScopedJavaLocalRef<jobject> TransferToJava(JNIEnv* env) && { CHECK(wrapped_callback_); CHECK(!wrapped_callback_->is_null()); - return Java_JniOnceCallback_Constructor( - env, reinterpret_cast<jlong>(wrapped_callback_.release())); + bool is_repeating = false; + return Java_JniCallbackImpl_Constructor( + env, is_repeating, + reinterpret_cast<jlong>(wrapped_callback_.release())); } private: @@ -47,8 +47,10 @@ jni_zero::ScopedJavaLocalRef<jobject> TransferToJava(JNIEnv* env) && { CHECK(wrapped_callback_); CHECK(!wrapped_callback_->is_null()); - return Java_JniRepeatingCallback_Constructor( - env, reinterpret_cast<jlong>(wrapped_callback_.release())); + bool is_repeating = true; + return Java_JniCallbackImpl_Constructor( + env, is_repeating, + reinterpret_cast<jlong>(wrapped_callback_.release())); } JniRepeatingCallback(const JniRepeatingCallback&) = delete; const JniRepeatingCallback& operator=(const JniRepeatingCallback&) = delete; @@ -76,10 +78,39 @@ return JniRepeatingCallback(callback).TransferToJava(env); } -void JNI_JniCallbackUtils_OnResult( +ScopedJavaLocalRef<jobject> ToJniCallback( JNIEnv* env, - jlong callbackPtr, + base::OnceCallback<void()>&& callback) { + return ToJniCallback(env, base::BindOnce( + [](base::OnceCallback<void()> captured_callback, + const jni_zero::JavaRef<jobject>& j_null) { + // For callbacks with no parameters, the + // parameter from Java should be null. + CHECK(!j_null); + std::move(captured_callback).Run(); + }, + std::move(callback))); +} + +ScopedJavaLocalRef<jobject> ToJniCallback( + JNIEnv* env, + const base::RepeatingCallback<void()>& callback) { + return ToJniCallback( + env, base::BindOnce( + [](const base::RepeatingCallback<void()>& captured_callback, + const jni_zero::JavaRef<jobject>& j_null) { + // For callbacks with no parameters, the parameter from Java + // should be null. + CHECK(!j_null); + captured_callback.Run(); + }, + std::move(callback))); +} + +void JNI_JniCallbackImpl_OnResult( + JNIEnv* env, jboolean isRepeating, + jlong callbackPtr, const jni_zero::JavaParamRef<jobject>& j_result) { if (isRepeating) { auto* callback = @@ -92,9 +123,9 @@ } } -void JNI_JniCallbackUtils_Destroy(JNIEnv* env, - jlong callbackPtr, - jboolean isRepeating) { +void JNI_JniCallbackImpl_Destroy(JNIEnv* env, + jboolean isRepeating, + jlong callbackPtr) { if (isRepeating) { auto* callback = reinterpret_cast<JniRepeatingWrappedCallbackType*>(callbackPtr); @@ -111,6 +142,4 @@ } // namespace base::android -DEFINE_JNI_FOR_JniCallbackUtils() -DEFINE_JNI_FOR_JniOnceCallback() -DEFINE_JNI_FOR_JniRepeatingCallback() +DEFINE_JNI_FOR_JniCallbackImpl()
diff --git a/base/android/jni_callback.h b/base/android/jni_callback.h index 89020812..d6d645b 100644 --- a/base/android/jni_callback.h +++ b/base/android/jni_callback.h
@@ -31,6 +31,13 @@ BASE_EXPORT ScopedJavaLocalRef<jobject> ToJniCallback( JNIEnv* env, const JniRepeatingWrappedCallbackType& callback); +// Overloads that accept no parameter. +BASE_EXPORT ScopedJavaLocalRef<jobject> ToJniCallback( + JNIEnv* env, + base::OnceCallback<void()>&& callback); +BASE_EXPORT ScopedJavaLocalRef<jobject> ToJniCallback( + JNIEnv* env, + const base::RepeatingCallback<void()>& callback); // Java Callbacks don't return a value so any return value by the passed in // callback will be ignored.
diff --git a/base/android/junit/src/org/chromium/base/FileUtilsTest.java b/base/android/junit/src/org/chromium/base/FileUtilsTest.java index 13dfc16..fe773b5 100644 --- a/base/android/junit/src/org/chromium/base/FileUtilsTest.java +++ b/base/android/junit/src/org/chromium/base/FileUtilsTest.java
@@ -439,7 +439,7 @@ } private static class TestContentProvider extends ContentProvider { - private HashMap<String, String> mUriToFilename; + private final HashMap<String, String> mUriToFilename; public TestContentProvider() { mUriToFilename = new HashMap<String, String>();
diff --git a/base/android/junit/src/org/chromium/base/ResettersForTestingTest.java b/base/android/junit/src/org/chromium/base/ResettersForTestingTest.java index 5365846..4f5dbfade 100644 --- a/base/android/junit/src/org/chromium/base/ResettersForTestingTest.java +++ b/base/android/junit/src/org/chromium/base/ResettersForTestingTest.java
@@ -43,7 +43,7 @@ private static class ResetsToNullAndIncrementsWithOneShotResetter { public static String str; public static int resetCount; - private static Runnable sResetter = + private static final Runnable sResetter = () -> { str = null; resetCount++;
diff --git a/base/android/junit/src/org/chromium/base/UnownedUserDataKeyTest.java b/base/android/junit/src/org/chromium/base/UnownedUserDataKeyTest.java index 66ad3c1..e4880549 100644 --- a/base/android/junit/src/org/chromium/base/UnownedUserDataKeyTest.java +++ b/base/android/junit/src/org/chromium/base/UnownedUserDataKeyTest.java
@@ -49,7 +49,7 @@ } private static class TestUnownedUserData implements UnownedUserData { - private List<UnownedUserDataHost> mDetachedHosts = new ArrayList<>(); + private final List<UnownedUserDataHost> mDetachedHosts = new ArrayList<>(); public boolean informOnDetachment = true;
diff --git a/base/android/junit/src/org/chromium/base/ValueChangedCallbackTest.java b/base/android/junit/src/org/chromium/base/ValueChangedCallbackTest.java index c4ec6db7..1559738 100644 --- a/base/android/junit/src/org/chromium/base/ValueChangedCallbackTest.java +++ b/base/android/junit/src/org/chromium/base/ValueChangedCallbackTest.java
@@ -22,7 +22,7 @@ private int mCallCount; private String mOldSuppliedString; private String mNewSuppliedString; - private ObservableSupplierImpl<String> mSupplier = new ObservableSupplierImpl<>(); + private final ObservableSupplierImpl<String> mSupplier = new ObservableSupplierImpl<>(); @Test public void testObserverCaching() {
diff --git a/base/android/junit/src/org/chromium/base/memory/MemoryPressureMonitorTest.java b/base/android/junit/src/org/chromium/base/memory/MemoryPressureMonitorTest.java index b030dc2..3ed6ca5 100644 --- a/base/android/junit/src/org/chromium/base/memory/MemoryPressureMonitorTest.java +++ b/base/android/junit/src/org/chromium/base/memory/MemoryPressureMonitorTest.java
@@ -53,7 +53,7 @@ } private static class TestPressureSupplier implements Supplier<Integer> { - private @MemoryPressureLevel Integer mPressure; + private final @MemoryPressureLevel Integer mPressure; private boolean mIsCalled; public TestPressureSupplier(@MemoryPressureLevel Integer pressure) {
diff --git a/base/android/junit/src/org/chromium/base/memory/MemoryPurgeManagerTest.java b/base/android/junit/src/org/chromium/base/memory/MemoryPurgeManagerTest.java index 470dc791..3cc39dbe 100644 --- a/base/android/junit/src/org/chromium/base/memory/MemoryPurgeManagerTest.java +++ b/base/android/junit/src/org/chromium/base/memory/MemoryPurgeManagerTest.java
@@ -30,7 +30,7 @@ @Config(manifest = Config.NONE) public class MemoryPurgeManagerTest { @Rule public FakeTimeTestRule mFakeTimeTestRule = new FakeTimeTestRule(); - private Callable<Integer> mGetCount = + private final Callable<Integer> mGetCount = () -> { return RecordHistogram.getHistogramTotalCountForTesting( MemoryPurgeManager.BACKGROUND_DURATION_HISTOGRAM_NAME);
diff --git a/base/android/junit/src/org/chromium/base/metrics/CachingUmaRecorderTest.java b/base/android/junit/src/org/chromium/base/metrics/CachingUmaRecorderTest.java index 56632b5..f973af2 100644 --- a/base/android/junit/src/org/chromium/base/metrics/CachingUmaRecorderTest.java +++ b/base/android/junit/src/org/chromium/base/metrics/CachingUmaRecorderTest.java
@@ -265,7 +265,7 @@ * #recordSparseHistogram(String, int)} }. */ private static class BlockingUmaRecorder extends NoopUmaRecorder { - public Lock lock = new ReentrantLock(); + public final Lock lock = new ReentrantLock(); @SuppressWarnings("LockNotBeforeTry") @Override
diff --git a/base/android/junit/src/org/chromium/base/supplier/OneshotSupplierImplTest.java b/base/android/junit/src/org/chromium/base/supplier/OneshotSupplierImplTest.java index 5de8d32..4b0b289 100644 --- a/base/android/junit/src/org/chromium/base/supplier/OneshotSupplierImplTest.java +++ b/base/android/junit/src/org/chromium/base/supplier/OneshotSupplierImplTest.java
@@ -25,7 +25,7 @@ @Config(shadows = {ShadowProcess.class}) @LooperMode(LooperMode.Mode.LEGACY) public class OneshotSupplierImplTest { - private OneshotSupplierImpl<String> mSupplier = new OneshotSupplierImpl<>(); + private final OneshotSupplierImpl<String> mSupplier = new OneshotSupplierImpl<>(); @Spy private Callback<String> mCallback1; @Spy private Callback<String> mCallback2;
diff --git a/base/android/junit/src/org/chromium/base/supplier/SyncOneshotSupplierImplTest.java b/base/android/junit/src/org/chromium/base/supplier/SyncOneshotSupplierImplTest.java index 80a1e59..52c5c806 100644 --- a/base/android/junit/src/org/chromium/base/supplier/SyncOneshotSupplierImplTest.java +++ b/base/android/junit/src/org/chromium/base/supplier/SyncOneshotSupplierImplTest.java
@@ -19,10 +19,10 @@ /** Unit tests for {@link SyncOneshotSupplierImpl}. */ @RunWith(BaseRobolectricTestRunner.class) public class SyncOneshotSupplierImplTest { - private SyncOneshotSupplierImpl<Integer> mSupplier = new SyncOneshotSupplierImpl<>(); + private final SyncOneshotSupplierImpl<Integer> mSupplier = new SyncOneshotSupplierImpl<>(); - private AtomicInteger mValue1 = new AtomicInteger(); - private AtomicInteger mValue2 = new AtomicInteger(); + private final AtomicInteger mValue1 = new AtomicInteger(); + private final AtomicInteger mValue2 = new AtomicInteger(); @Test @SmallTest
diff --git a/base/android/junit/src/org/chromium/base/task/ChromiumExecutorServiceFactoryTest.java b/base/android/junit/src/org/chromium/base/task/ChromiumExecutorServiceFactoryTest.java index 22a726e..bbb6fadc 100644 --- a/base/android/junit/src/org/chromium/base/task/ChromiumExecutorServiceFactoryTest.java +++ b/base/android/junit/src/org/chromium/base/task/ChromiumExecutorServiceFactoryTest.java
@@ -41,7 +41,7 @@ private final Runnable mMockRunnable = mock(Runnable.class); private ListeningScheduledExecutorService mExecutor; - private Runnable mSlowRunnable = + private final Runnable mSlowRunnable = () -> { mMockRunnable.run(); shadowOf(Looper.getMainLooper()).idleFor(Duration.ofSeconds(8));
diff --git a/base/containers/span_forward_internal.h b/base/containers/span_forward_internal.h index 65cf58c9..96ffc346d 100644 --- a/base/containers/span_forward_internal.h +++ b/base/containers/span_forward_internal.h
@@ -5,6 +5,10 @@ #ifndef BASE_CONTAINERS_SPAN_FORWARD_INTERNAL_H_ #define BASE_CONTAINERS_SPAN_FORWARD_INTERNAL_H_ +#include <stddef.h> + +#include <limits> + namespace base { // [span.syn]: Constants
diff --git a/base/test/android/java/src/org/chromium/base/InMemoryContentProvider.java b/base/test/android/java/src/org/chromium/base/InMemoryContentProvider.java index 260fba6..7c8d415 100644 --- a/base/test/android/java/src/org/chromium/base/InMemoryContentProvider.java +++ b/base/test/android/java/src/org/chromium/base/InMemoryContentProvider.java
@@ -29,7 +29,7 @@ public class InMemoryContentProvider extends ContentProvider { private static final String PREFIX = "content://org.chromium.native_test.inmemory/cache/"; - private PipeDataWriter mPipeDataWriter = + private final PipeDataWriter mPipeDataWriter = new ContentProvider.PipeDataWriter<byte[]>() { @Override public void writeDataToPipe(
diff --git a/base/test/android/java/src/org/chromium/base/TestDocumentsProvider.java b/base/test/android/java/src/org/chromium/base/TestDocumentsProvider.java index 7f54156..f77a09b 100644 --- a/base/test/android/java/src/org/chromium/base/TestDocumentsProvider.java +++ b/base/test/android/java/src/org/chromium/base/TestDocumentsProvider.java
@@ -33,7 +33,7 @@ public class TestDocumentsProvider extends DocumentsProvider { private static final String AUTHORITY = "org.chromium.native_test.docprov"; - private PipeDataWriter mPipeDataWriter = + private final PipeDataWriter mPipeDataWriter = new ContentProvider.PipeDataWriter<byte[]>() { @Override public void writeDataToPipe(
diff --git a/base/test/android/javatests/src/org/chromium/base/test/params/BaseJUnit4RunnerDelegate.java b/base/test/android/javatests/src/org/chromium/base/test/params/BaseJUnit4RunnerDelegate.java index 9b58344..eda8358f 100644 --- a/base/test/android/javatests/src/org/chromium/base/test/params/BaseJUnit4RunnerDelegate.java +++ b/base/test/android/javatests/src/org/chromium/base/test/params/BaseJUnit4RunnerDelegate.java
@@ -15,7 +15,7 @@ /** Class runner delegate that extends BaseJUnit4ClassRunner */ public final class BaseJUnit4RunnerDelegate extends BaseJUnit4ClassRunner implements ParameterizedRunnerDelegate { - private ParameterizedRunnerDelegateCommon mDelegateCommon; + private final ParameterizedRunnerDelegateCommon mDelegateCommon; public BaseJUnit4RunnerDelegate( Class<?> klass, ParameterizedRunnerDelegateCommon delegateCommon)
diff --git a/base/test/android/javatests/src/org/chromium/base/test/params/BlockJUnit4RunnerDelegate.java b/base/test/android/javatests/src/org/chromium/base/test/params/BlockJUnit4RunnerDelegate.java index 0cafc2b..9d252f6 100644 --- a/base/test/android/javatests/src/org/chromium/base/test/params/BlockJUnit4RunnerDelegate.java +++ b/base/test/android/javatests/src/org/chromium/base/test/params/BlockJUnit4RunnerDelegate.java
@@ -15,7 +15,7 @@ /** Parameterized class runner delegate that extends BlockJUnit4ClassRunner */ public final class BlockJUnit4RunnerDelegate extends BlockJUnit4ClassRunner implements ParameterizedRunnerDelegate { - private ParameterizedRunnerDelegateCommon mDelegateCommon; + private final ParameterizedRunnerDelegateCommon mDelegateCommon; public BlockJUnit4RunnerDelegate( Class<?> klass, ParameterizedRunnerDelegateCommon delegateCommon)
diff --git a/base/test/android/javatests/src/org/chromium/base/test/params/ParameterizedFrameworkMethod.java b/base/test/android/javatests/src/org/chromium/base/test/params/ParameterizedFrameworkMethod.java index faad23f..7c140dbc 100644 --- a/base/test/android/javatests/src/org/chromium/base/test/params/ParameterizedFrameworkMethod.java +++ b/base/test/android/javatests/src/org/chromium/base/test/params/ParameterizedFrameworkMethod.java
@@ -17,8 +17,8 @@ * represents the parameters for this test method */ public class ParameterizedFrameworkMethod extends FrameworkMethod { - private ParameterSet mParameterSet; - private String mName; + private final ParameterSet mParameterSet; + private final String mName; public ParameterizedFrameworkMethod( Method method, ParameterSet parameterSet, String classParameterSetName) {
diff --git a/base/test/android/javatests/src/org/chromium/base/test/transit/ConditionWaiter.java b/base/test/android/javatests/src/org/chromium/base/test/transit/ConditionWaiter.java index 535e0d6..9306b35 100644 --- a/base/test/android/javatests/src/org/chromium/base/test/transit/ConditionWaiter.java +++ b/base/test/android/javatests/src/org/chromium/base/test/transit/ConditionWaiter.java
@@ -50,7 +50,7 @@ private long mTimeStarted; private long mTimeUnfulfilled; private long mTimeFulfilled; - private StatusStore mStatusStore = new StatusStore(); + private final StatusStore mStatusStore = new StatusStore(); /** * Constructor.
diff --git a/base/test/android/javatests/src/org/chromium/base/test/transit/ElementFactory.java b/base/test/android/javatests/src/org/chromium/base/test/transit/ElementFactory.java index 944aa05..ac78b9b 100644 --- a/base/test/android/javatests/src/org/chromium/base/test/transit/ElementFactory.java +++ b/base/test/android/javatests/src/org/chromium/base/test/transit/ElementFactory.java
@@ -10,8 +10,8 @@ /** Fabricates new elements after a Condition is first fulfilled. */ @NullMarked public class ElementFactory { - private Elements mOwner; - private Callback<Elements.Builder> mDelayedDeclarations; + private final Elements mOwner; + private final Callback<Elements.Builder> mDelayedDeclarations; private boolean mIsProcessed; ElementFactory(Elements owner, Callback<Elements.Builder> delayedDeclarations) {
diff --git a/base/test/android/javatests/src/org/chromium/base/test/transit/FragmentElement.java b/base/test/android/javatests/src/org/chromium/base/test/transit/FragmentElement.java index 01c8aa06..352c302 100644 --- a/base/test/android/javatests/src/org/chromium/base/test/transit/FragmentElement.java +++ b/base/test/android/javatests/src/org/chromium/base/test/transit/FragmentElement.java
@@ -21,8 +21,8 @@ @NullMarked public class FragmentElement<FragmentT extends Fragment, ActivityT extends FragmentActivity> extends Element<FragmentT> { - private ActivityElement<ActivityT> mActivityElement; - private Class<FragmentT> mFragmentClass; + private final ActivityElement<ActivityT> mActivityElement; + private final Class<FragmentT> mFragmentClass; /** * Constructor.
diff --git a/base/test/android/javatests/src/org/chromium/base/test/transit/StatusStore.java b/base/test/android/javatests/src/org/chromium/base/test/transit/StatusStore.java index c497993e..807354dd 100644 --- a/base/test/android/javatests/src/org/chromium/base/test/transit/StatusStore.java +++ b/base/test/android/javatests/src/org/chromium/base/test/transit/StatusStore.java
@@ -18,7 +18,7 @@ /** Receives status updates and stores them as regions of equal updates. */ @NullMarked class StatusStore { - private ArrayList<StatusRegion> mStatusRegions = new ArrayList<>(); + private final ArrayList<StatusRegion> mStatusRegions = new ArrayList<>(); private @Nullable StatusRegion mLastRegion; private boolean mAnyErrorsReported; private boolean mAnyMessages; @@ -70,10 +70,10 @@ /** Represents one or more consecutive reports of the same status message. */ static class StatusRegion { - private @Status int mStatus; - private long mFirstTimestamp; + private final @Status int mStatus; + private final long mFirstTimestamp; private long mLastTimestamp; - private @Nullable String mMessage; + private final @Nullable String mMessage; private int mCount = 1; private StatusRegion(ConditionStatus firstStatus) {
diff --git a/base/test/android/javatests/src/org/chromium/base/test/transit/TrafficControl.java b/base/test/android/javatests/src/org/chromium/base/test/transit/TrafficControl.java index 6f90792..270e95c 100644 --- a/base/test/android/javatests/src/org/chromium/base/test/transit/TrafficControl.java +++ b/base/test/android/javatests/src/org/chromium/base/test/transit/TrafficControl.java
@@ -23,7 +23,7 @@ private static final List<Pair<String, String>> sAllStationNames = new ArrayList<>(); private static @Nullable String sCurrentTestCase; - private static List<Station<?>> sActiveStations = new ArrayList<>(); + private static final List<Station<?>> sActiveStations = new ArrayList<>(); static void notifyCreatedStation(Station<?> station) { sAllStationNames.add(Pair.create(sCurrentTestCase, station.getName()));
diff --git a/base/test/android/javatests/src/org/chromium/base/test/transit/TripUnitTest.java b/base/test/android/javatests/src/org/chromium/base/test/transit/TripUnitTest.java index c68a0b7..92c3ef8a 100644 --- a/base/test/android/javatests/src/org/chromium/base/test/transit/TripUnitTest.java +++ b/base/test/android/javatests/src/org/chromium/base/test/transit/TripUnitTest.java
@@ -90,7 +90,7 @@ public static class TestCondition extends ConditionWithResult<String> { public ConditionStatus mConditionStatus = Condition.awaiting("Waiting for a call to setConditionStatus"); - private String mDescription; + private final String mDescription; TestCondition(String description) { super(/* isRunOnUiThread= */ false);
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/CommandLineFlags.java b/base/test/android/javatests/src/org/chromium/base/test/util/CommandLineFlags.java index d461053..8ca53ef7 100644 --- a/base/test/android/javatests/src/org/chromium/base/test/util/CommandLineFlags.java +++ b/base/test/android/javatests/src/org/chromium/base/test/util/CommandLineFlags.java
@@ -44,7 +44,7 @@ Set.of(ENABLE_FEATURES, DISABLE_FEATURES, FORCE_FIELDTRIALS, FORCE_FIELDTRIAL_PARAMS); // Features set by original command-line --enable-features / --disable-features. - private static FieldTrials sOrigFieldTrials = new FieldTrials(); + private static final FieldTrials sOrigFieldTrials = new FieldTrials(); private static final Map<String, String> sActiveFlagPrevValues = new HashMap<>(); /** Adds command-line flags to the {@link org.chromium.base.CommandLine} for this test. */
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/PackageManagerWrapper.java b/base/test/android/javatests/src/org/chromium/base/test/util/PackageManagerWrapper.java index c469940..e7ea2db3 100644 --- a/base/test/android/javatests/src/org/chromium/base/test/util/PackageManagerWrapper.java +++ b/base/test/android/javatests/src/org/chromium/base/test/util/PackageManagerWrapper.java
@@ -36,7 +36,7 @@ * Context). */ public class PackageManagerWrapper extends PackageManager { - private PackageManager mWrapped; + private final PackageManager mWrapped; public PackageManagerWrapper(PackageManager wrapped) { super();
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/RawFailureHandler.java b/base/test/android/javatests/src/org/chromium/base/test/util/RawFailureHandler.java index dc32cac..ef766ad 100644 --- a/base/test/android/javatests/src/org/chromium/base/test/util/RawFailureHandler.java +++ b/base/test/android/javatests/src/org/chromium/base/test/util/RawFailureHandler.java
@@ -18,7 +18,7 @@ */ public class RawFailureHandler implements FailureHandler { - private static RawFailureHandler sInstance = new RawFailureHandler(); + private static final RawFailureHandler sInstance = new RawFailureHandler(); public static RawFailureHandler getInstance() { return sInstance;
diff --git a/base/test/android/javatests/src/org/chromium/base/test/util/ViewPrinter.java b/base/test/android/javatests/src/org/chromium/base/test/util/ViewPrinter.java index 82e511de..4a902b3 100644 --- a/base/test/android/javatests/src/org/chromium/base/test/util/ViewPrinter.java +++ b/base/test/android/javatests/src/org/chromium/base/test/util/ViewPrinter.java
@@ -265,7 +265,7 @@ * </pre> */ public static class TreeOutput { - private String mLabel; + private final String mLabel; private @Nullable List<TreeOutput> mChildren; public TreeOutput(String label) {
diff --git a/base/test/android/junit/src/org/chromium/base/test/params/ExampleParameterizedTest.java b/base/test/android/junit/src/org/chromium/base/test/params/ExampleParameterizedTest.java index 9a097a5..5178856 100644 --- a/base/test/android/junit/src/org/chromium/base/test/params/ExampleParameterizedTest.java +++ b/base/test/android/junit/src/org/chromium/base/test/params/ExampleParameterizedTest.java
@@ -24,14 +24,14 @@ @UseRunnerDelegate(BlockJUnit4RunnerDelegate.class) public class ExampleParameterizedTest { @ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = Arrays.asList( new ParameterSet().value("hello", "world").name("HelloWorld"), new ParameterSet().value("Xxxx", "Yyyy").name("XxxxYyyy"), new ParameterSet().value("aa", "yy").name("AaYy")); public static class MethodParamsA implements ParameterProvider { - private static List<ParameterSet> sMethodParamA = + private static final List<ParameterSet> sMethodParamA = Arrays.asList( new ParameterSet().value(1, 2).name("OneTwo"), new ParameterSet().value(2, 3).name("TwoThree"), @@ -44,7 +44,7 @@ } public static class MethodParamsB implements ParameterProvider { - private static List<ParameterSet> sMethodParamB = + private static final List<ParameterSet> sMethodParamB = Arrays.asList( new ParameterSet().value("a", "b").name("Ab"), new ParameterSet().value("b", "c").name("Bc"), @@ -57,8 +57,8 @@ } } - private String mStringA; - private String mStringB; + private final String mStringA; + private final String mStringB; public ExampleParameterizedTest(String a, String b) { mStringA = a;
diff --git a/base/test/android/junit/src/org/chromium/base/test/params/ParameterizedRunnerTest.java b/base/test/android/junit/src/org/chromium/base/test/params/ParameterizedRunnerTest.java index ec70085..b50b8d3 100644 --- a/base/test/android/junit/src/org/chromium/base/test/params/ParameterizedRunnerTest.java +++ b/base/test/android/junit/src/org/chromium/base/test/params/ParameterizedRunnerTest.java
@@ -51,9 +51,9 @@ @UseRunnerDelegate(BlockJUnit4RunnerDelegate.class) public static class BadTestClassWithMultipleClassParameter { - @ClassParameter private static List<ParameterSet> sParamA = new ArrayList<>(); + @ClassParameter private static final List<ParameterSet> sParamA = new ArrayList<>(); - @ClassParameter private static List<ParameterSet> sParamB = new ArrayList<>(); + @ClassParameter private static final List<ParameterSet> sParamB = new ArrayList<>(); } @Test(expected = ParameterizedRunner.IllegalParameterArgumentException.class)
diff --git a/base/test/android/junit/src/org/chromium/base/test/util/AnnotationProcessingUtilsTest.java b/base/test/android/junit/src/org/chromium/base/test/util/AnnotationProcessingUtilsTest.java index fe279a4..bd10ae6 100644 --- a/base/test/android/junit/src/org/chromium/base/test/util/AnnotationProcessingUtilsTest.java +++ b/base/test/android/junit/src/org/chromium/base/test/util/AnnotationProcessingUtilsTest.java
@@ -365,7 +365,7 @@ } private static class ClassWithRule { - @Rule Rule1 mRule = new Rule1(); + @Rule final Rule1 mRule = new Rule1(); @Test public void methodWithoutAnnotation() {}
diff --git a/build/android/gtest_apk/java/src/org/chromium/build/gtest_apk/NativeTestInstrumentationTestRunner.java b/build/android/gtest_apk/java/src/org/chromium/build/gtest_apk/NativeTestInstrumentationTestRunner.java index 0662593..7c97251 100644 --- a/build/android/gtest_apk/java/src/org/chromium/build/gtest_apk/NativeTestInstrumentationTestRunner.java +++ b/build/android/gtest_apk/java/src/org/chromium/build/gtest_apk/NativeTestInstrumentationTestRunner.java
@@ -49,12 +49,12 @@ // Default to no size limit. private static final int DEFAULT_SHARD_SIZE_LIMIT = 0; - private Handler mHandler = new Handler(); - private Bundle mLogBundle = new Bundle(); - private SparseArray<ShardMonitor> mMonitors = new SparseArray<ShardMonitor>(); + private final Handler mHandler = new Handler(); + private final Bundle mLogBundle = new Bundle(); + private final SparseArray<ShardMonitor> mMonitors = new SparseArray<ShardMonitor>(); private String mNativeTestActivity; private TestStatusReceiver mReceiver; - private Queue<String> mShards = new ArrayDeque<String>(); + private final Queue<String> mShards = new ArrayDeque<String>(); private long mShardNanoTimeout = DEFAULT_SHARD_NANO_TIMEOUT; private int mShardSizeLimit = DEFAULT_SHARD_SIZE_LIMIT; private File mStdoutFile; @@ -184,9 +184,9 @@ private class ShardMonitor implements Runnable { private static final int MONITOR_FREQUENCY_MS = 1000; - private long mExpirationNanoTime; - private int mPid; - private AtomicBoolean mStopped; + private final long mExpirationNanoTime; + private final int mPid; + private final AtomicBoolean mStopped; public ShardMonitor(int pid, long expirationNanoTime) { mPid = pid; @@ -254,7 +254,7 @@ private class ShardEnder implements Runnable { private static final int WAIT_FOR_DEATH_MILLIS = 10; - private int mPid; + private final int mPid; public ShardEnder(int pid) { mPid = pid;
diff --git a/cc/layers/layer_impl.cc b/cc/layers/layer_impl.cc index e2d15f7..68288967 100644 --- a/cc/layers/layer_impl.cc +++ b/cc/layers/layer_impl.cc
@@ -537,11 +537,13 @@ void LayerImpl::NoteLayerPropertyChanged() { layer_property_changed_not_from_property_trees_ = true; + SetNeedsPushProperties(); layer_tree_impl()->set_needs_update_draw_properties(); } void LayerImpl::NoteLayerPropertyChangedFromPropertyTrees() { layer_property_changed_from_property_trees_ = true; + SetNeedsPushProperties(); layer_tree_impl()->set_needs_update_draw_properties(); }
diff --git a/cc/mojo_embedder/async_layer_tree_frame_sink.cc b/cc/mojo_embedder/async_layer_tree_frame_sink.cc index c3b6661..0642a206 100644 --- a/cc/mojo_embedder/async_layer_tree_frame_sink.cc +++ b/cc/mojo_embedder/async_layer_tree_frame_sink.cc
@@ -317,15 +317,6 @@ ExportFrameTiming(); if (use_internal_begin_frame_source_) { - if (ack.preferred_frame_interval) { - const viz::BeginFrameArgs last_args = - begin_frame_source_->last_begin_frame_args(); - auto preferred_interval = ack.preferred_frame_interval > base::TimeDelta() - ? *ack.preferred_frame_interval - : last_args.interval; - internal_begin_frame_source_->OnUpdateVSyncParameters( - last_args.frame_time, preferred_interval); - } return; } compositor_frame_sink_ptr_->DidNotProduceFrame(ack);
diff --git a/cc/raster/gpu_raster_buffer_provider.cc b/cc/raster/gpu_raster_buffer_provider.cc index 287ecce..18dafe00 100644 --- a/cc/raster/gpu_raster_buffer_provider.cc +++ b/cc/raster/gpu_raster_buffer_provider.cc
@@ -104,13 +104,9 @@ viz::RasterContextProvider::ScopedRasterContextLock scoped_context( client_->worker_context_provider_, url.possibly_invalid_spec().c_str()); - gpu::raster::RasterInterface* ri = - client_->worker_context_provider_->RasterInterface(); PlaybackOnWorkerThread(raster_source, raster_full_rect, raster_dirty_rect, new_content_id, transform, playback_settings, url); - backing_->mailbox_sync_token = - viz::ClientResourceProvider::GenerateSyncTokenHelper(ri); backing_->returned_sync_token = gpu::SyncToken(); } @@ -327,6 +323,7 @@ gpu::raster::RasterInterface* ri = client_->worker_context_provider_->RasterInterface(); bool mailbox_needs_clear = false; + std::unique_ptr<gpu::RasterScopedAccess> ri_access; if (!backing_->shared_image()) { DCHECK(!backing_->returned_sync_token.HasData()); auto* sii = client_->sii_.get(); @@ -343,9 +340,13 @@ } backing_->CreateSharedImage(sii, flags, "GpuRasterTile"); mailbox_needs_clear = true; - ri->WaitSyncTokenCHROMIUM(sii->GenUnverifiedSyncToken().GetConstData()); + ri_access = backing_->shared_image()->BeginRasterAccess( + ri, sii->GenUnverifiedSyncToken(), + /*readonly=*/false); } else { - ri->WaitSyncTokenCHROMIUM(backing_->returned_sync_token.GetConstData()); + ri_access = backing_->shared_image()->BeginRasterAccess( + ri, backing_->returned_sync_token, + /*readonly=*/false); } // Assume legacy MSAA if sample count is positive. @@ -390,6 +391,8 @@ playback_settings.raster_inducing_scroll_offsets, const_cast<RasterSource*>(raster_source)->max_op_size_hint()); ri->EndRasterCHROMIUM(); + backing_->mailbox_sync_token = + gpu::RasterScopedAccess::EndAccess(std::move(ri_access)); } } // namespace cc
diff --git a/cc/resources/resource_pool_unittest.cc b/cc/resources/resource_pool_unittest.cc index f580ea1..2422497 100644 --- a/cc/resources/resource_pool_unittest.cc +++ b/cc/resources/resource_pool_unittest.cc
@@ -210,7 +210,7 @@ // Different size/format should allocate new resource. resource = resource_pool_->AcquireResource( - gfx::Size(50, 50), viz::SinglePlaneFormat::kLUMINANCE_8, color_space1); + gfx::Size(50, 50), viz::SinglePlaneFormat::kR_8, color_space1); EXPECT_EQ(2u, resource_pool_->GetTotalResourceCountForTesting()); CheckAndReturnResource(std::move(resource)); EXPECT_EQ(2u, resource_pool_->GetTotalResourceCountForTesting());
diff --git a/cc/trees/layer_tree_host_impl.cc b/cc/trees/layer_tree_host_impl.cc index 31da38d..3bf8070 100644 --- a/cc/trees/layer_tree_host_impl.cc +++ b/cc/trees/layer_tree_host_impl.cc
@@ -3206,7 +3206,6 @@ metadata.frame_interval_inputs.has_only_content_frame_interval_updates = frame->damage_reasons.empty(); - base::TimeDelta preferred_frame_interval; constexpr auto kFudgeDelta = base::Milliseconds(1); constexpr auto kTwiceOfDefaultInterval = viz::BeginFrameArgs::DefaultInterval() * 2; @@ -3228,12 +3227,13 @@ // reduction optimization is only applied when a webpage has two or more // videos, i.e., very likely a video conferencing scene. It doesn't apply // to general webpages. - preferred_frame_interval = kTwiceOfDefaultInterval; + metadata.preferred_frame_interval = kTwiceOfDefaultInterval; } else { // There are main-thread, high frequency impl-thread animations, or input // events. frame_rate_estimator_.WillDraw(CurrentBeginFrameArgs().frame_time); - preferred_frame_interval = frame_rate_estimator_.GetPreferredInterval(); + metadata.preferred_frame_interval = + frame_rate_estimator_.GetPreferredInterval(); } metadata.activation_dependencies = std::move(frame->activation_dependencies); @@ -3294,7 +3294,6 @@ DCHECK(frame->begin_frame_ack.frame_id.IsSequenceValid()); metadata.begin_frame_ack = frame->begin_frame_ack; - metadata.begin_frame_ack.preferred_frame_interval = preferred_frame_interval; viz::CompositorFrame compositor_frame; compositor_frame.metadata = std::move(metadata);
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn index 9d076c8..7428a98 100644 --- a/chrome/android/BUILD.gn +++ b/chrome/android/BUILD.gn
@@ -597,7 +597,6 @@ "//components/content_relationship_verification/android:java", "//components/content_settings/android:content_settings_enums_java", "//components/content_settings/android:java", - "//components/crash/android:anr_collector_java", "//components/crash/android:java", "//components/data_sharing/public:public_java", "//components/device_reauth:device_reauth_java_enums",
diff --git a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/AutofillKeyboardAccessoryViewBridge.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/AutofillKeyboardAccessoryViewBridge.java index 5a71adf..6b6ab44 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/AutofillKeyboardAccessoryViewBridge.java +++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/AutofillKeyboardAccessoryViewBridge.java
@@ -4,8 +4,6 @@ package org.chromium.chrome.browser.keyboard_accessory; -import android.content.Context; - import androidx.annotation.Nullable; import org.jni_zero.CalledByNative; @@ -31,7 +29,6 @@ private long mNativeAutofillKeyboardAccessory; private @Nullable ObservableSupplier<ManualFillingComponent> mManualFillingComponentSupplier; private @Nullable ManualFillingComponent mManualFillingComponent; - private @Nullable Context mContext; private final PropertyProvider<List<AutofillSuggestion>> mChipProvider = new PropertyProvider<>(AccessoryAction.AUTOFILL_SUGGESTION); private final Callback<ManualFillingComponent> mFillingComponentObserver = @@ -93,9 +90,6 @@ */ @CalledByNative private void init(long nativeAutofillKeyboardAccessory, WindowAndroid windowAndroid) { - mContext = windowAndroid.getActivity().get(); - assert mContext != null; - mManualFillingComponentSupplier = ManualFillingComponentSupplier.from(windowAndroid); if (mManualFillingComponentSupplier != null) { ManualFillingComponent currentFillingComponent = @@ -120,7 +114,6 @@ mManualFillingComponentSupplier.removeObserver(mFillingComponentObserver); } dismissed(); - mContext = null; } /**
diff --git a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingComponentBridge.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingComponentBridge.java index 262d8e21..7c405ba4 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingComponentBridge.java +++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingComponentBridge.java
@@ -37,7 +37,7 @@ class ManualFillingComponentBridge { private final SparseArray<PropertyProvider<AccessorySheetData>> mProviders = new SparseArray<>(); - private HashMap<Integer, PropertyProvider<Action[]>> mActionProviders = new HashMap<>(); + private final HashMap<Integer, PropertyProvider<Action[]>> mActionProviders = new HashMap<>(); private final WindowAndroid mWindowAndroid; private final WebContents mWebContents; private long mNativeView;
diff --git a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingCoordinator.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingCoordinator.java index 4dcd4f7..1d1b3475 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingCoordinator.java +++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingCoordinator.java
@@ -40,7 +40,7 @@ */ class ManualFillingCoordinator implements ManualFillingComponent { private final ManualFillingMediator mMediator = new ManualFillingMediator(); - private ObserverList<Observer> mObserverList = new ObserverList<>(); + private final ObserverList<Observer> mObserverList = new ObserverList<>(); public ManualFillingCoordinator() {}
diff --git a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingMediator.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingMediator.java index 9472e07..3696503 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingMediator.java +++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/ManualFillingMediator.java
@@ -94,8 +94,8 @@ private static final int MINIMAL_AVAILABLE_VERTICAL_SPACE = 128; // in DP. private static final int MINIMAL_AVAILABLE_HORIZONTAL_SPACE = 180; // in DP. - private SparseArray<AccessorySheetTabCoordinator> mSheets = new SparseArray<>(); - private PropertyModel mModel = ManualFillingProperties.createFillingModel(); + private final SparseArray<AccessorySheetTabCoordinator> mSheets = new SparseArray<>(); + private final PropertyModel mModel = ManualFillingProperties.createFillingModel(); private WindowAndroid mWindowAndroid; private ApplicationViewportInsetSupplier mApplicationViewportInsetSupplier; private final ObservableSupplierImpl<Integer> mBottomInsetSupplier =
diff --git a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryProperties.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryProperties.java index 426da3b..6f5367b 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryProperties.java +++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryProperties.java
@@ -102,7 +102,7 @@ int ACTION_CHIP = 4; } - private @Type int mType; + private final @Type int mType; private final @Nullable Action mAction; private final @StringRes int mCaptionId;
diff --git a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryRecyclerViewMcp.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryRecyclerViewMcp.java index c24a7e7e..3832aac 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryRecyclerViewMcp.java +++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/bar_component/KeyboardAccessoryRecyclerViewMcp.java
@@ -16,7 +16,7 @@ * @param <VH> The view holder type that shows items. */ class KeyboardAccessoryRecyclerViewMcp<T, VH> extends SimpleRecyclerViewMcp<T, VH> { - private ViewRecycler<VH> mViewRecycler; + private final ViewRecycler<VH> mViewRecycler; /** * View recycling interface.
diff --git a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/button_group_component/KeyboardAccessoryButtonGroupCoordinator.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/button_group_component/KeyboardAccessoryButtonGroupCoordinator.java index 4e49e65..891a39d 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/button_group_component/KeyboardAccessoryButtonGroupCoordinator.java +++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/button_group_component/KeyboardAccessoryButtonGroupCoordinator.java
@@ -79,7 +79,7 @@ } private class TemporarySheetOpenerBindings { - private PropertyModelChangeProcessor mMcp; + private final PropertyModelChangeProcessor mMcp; private ViewPager.OnPageChangeListener mOnPageChangeListener; TemporarySheetOpenerBindings(View view) {
diff --git a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/button_group_component/KeyboardAccessoryButtonGroupMediator.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/button_group_component/KeyboardAccessoryButtonGroupMediator.java index 8bee6cda..be9a5204 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/button_group_component/KeyboardAccessoryButtonGroupMediator.java +++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/button_group_component/KeyboardAccessoryButtonGroupMediator.java
@@ -33,7 +33,7 @@ KeyboardAccessoryCoordinator.TabSwitchingDelegate { private final PropertyModel mModel; private @Nullable AccessoryTabObserver mAccessoryTabObserver; - private Set<ViewPager.OnPageChangeListener> mPageChangeListeners = new HashSet<>(); + private final Set<ViewPager.OnPageChangeListener> mPageChangeListeners = new HashSet<>(); KeyboardAccessoryButtonGroupMediator(PropertyModel model) { mModel = model;
diff --git a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetMediator.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetMediator.java index fd5c0f1..572f787 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetMediator.java +++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetMediator.java
@@ -46,7 +46,7 @@ }; private final SheetVisibilityDelegate mSheetVisibilityDelegate; private final Context mContext; - private ObserverList<AccessorySheetVisualStateProvider.Observer> mVisualObservers = + private final ObserverList<AccessorySheetVisualStateProvider.Observer> mVisualObservers = new ObserverList<>(); AccessorySheetMediator(
diff --git a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AccessorySheetTabItemsModel.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AccessorySheetTabItemsModel.java index 1865ee2..33925d9 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AccessorySheetTabItemsModel.java +++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AccessorySheetTabItemsModel.java
@@ -86,8 +86,8 @@ int LOYALTY_CARD_INFO = 13; } - private Object mDataPiece; - private @Type int mType; + private final Object mDataPiece; + private final @Type int mType; AccessorySheetDataPiece(Object dataPiece, @Type int type) { mDataPiece = dataPiece;
diff --git a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/CreditCardAccessorySheetViewBinder.java b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/CreditCardAccessorySheetViewBinder.java index e00bcc2..dd0a5ff 100644 --- a/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/CreditCardAccessorySheetViewBinder.java +++ b/chrome/android/features/keyboard_accessory/internal/java/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/CreditCardAccessorySheetViewBinder.java
@@ -147,7 +147,7 @@ /** View which represents a single Google Wallet loyalty card and its fields. */ static class LoyaltyCardInfoViewHolder extends ElementViewHolder<KeyboardAccessoryData.LoyaltyCardInfo, LoyaltyCardInfoView> { - private Function<KeyboardAccessoryData.LoyaltyCardInfo, Drawable> + private final Function<KeyboardAccessoryData.LoyaltyCardInfo, Drawable> mLoyaltyCardDrawableFunction; LoyaltyCardInfoViewHolder(
diff --git a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/AutofillKeyboardAccessoryIntegrationTest.java b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/AutofillKeyboardAccessoryIntegrationTest.java index b0bac80..35d403e6 100644 --- a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/AutofillKeyboardAccessoryIntegrationTest.java +++ b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/AutofillKeyboardAccessoryIntegrationTest.java
@@ -73,7 +73,7 @@ private static final String TEST_PAGE = "/chrome/test/data/autofill/autofill_test_form.html"; - private ManualFillingTestHelper mHelper = new ManualFillingTestHelper(mActivityTestRule); + private final ManualFillingTestHelper mHelper = new ManualFillingTestHelper(mActivityTestRule); /** * This FakeKeyboard triggers as a regular keyboard but has no measurable height. This simulates
diff --git a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/all_passwords_bottom_sheet/AllPasswordsBottomSheetRenderTest.java b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/all_passwords_bottom_sheet/AllPasswordsBottomSheetRenderTest.java index 2135e0ca..ef0e86a 100644 --- a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/all_passwords_bottom_sheet/AllPasswordsBottomSheetRenderTest.java +++ b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/all_passwords_bottom_sheet/AllPasswordsBottomSheetRenderTest.java
@@ -82,7 +82,7 @@ private static final List<Credential> CREDENTIALS = List.of(ANA, NO_ONE, BOB); @ParameterAnnotations.ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = Arrays.asList( new ParameterSet().value(false, false).name("Default"), new ParameterSet().value(false, true).name("RTL"),
diff --git a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetRenderTest.java b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetRenderTest.java index 6e2259c..b21e04d 100644 --- a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetRenderTest.java +++ b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_component/AccessorySheetRenderTest.java
@@ -86,7 +86,7 @@ @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) public class AccessorySheetRenderTest { @ParameterAnnotations.ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = Arrays.asList( new ParameterSet().value(false, false).name("Default"), new ParameterSet().value(false, true).name("RTL"), @@ -97,7 +97,7 @@ // No @Rule since we only need the launching helpers. Adding the rule to the chain breaks with // any ParameterizedRunnerDelegate. - private BaseActivityTestRule<BlankUiTestActivity> mActivityTestRule = + private final BaseActivityTestRule<BlankUiTestActivity> mActivityTestRule = new BaseActivityTestRule<>(BlankUiTestActivity.class); @Rule
diff --git a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AccessorySheetTabViewTest.java b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AccessorySheetTabViewTest.java index 1bd90abd..177b912 100644 --- a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AccessorySheetTabViewTest.java +++ b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AccessorySheetTabViewTest.java
@@ -47,7 +47,7 @@ @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) public class AccessorySheetTabViewTest { private AccessorySheetTabItemsModel mModel; - private AtomicReference<RecyclerView> mView = new AtomicReference<>(); + private final AtomicReference<RecyclerView> mView = new AtomicReference<>(); @Rule public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule();
diff --git a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AddressAccessorySheetViewTest.java b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AddressAccessorySheetViewTest.java index 01ca343a..31ea3ecb 100644 --- a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AddressAccessorySheetViewTest.java +++ b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/AddressAccessorySheetViewTest.java
@@ -56,7 +56,7 @@ @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) public class AddressAccessorySheetViewTest { private AccessorySheetTabItemsModel mModel; - private AtomicReference<RecyclerView> mView = new AtomicReference<>(); + private final AtomicReference<RecyclerView> mView = new AtomicReference<>(); @Rule public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule();
diff --git a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/CreditCardAccessorySheetViewTest.java b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/CreditCardAccessorySheetViewTest.java index 637438c..bbb5d15 100644 --- a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/CreditCardAccessorySheetViewTest.java +++ b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/CreditCardAccessorySheetViewTest.java
@@ -77,7 +77,7 @@ Bitmap.createBitmap(100, 200, Bitmap.Config.ARGB_8888); private AccessorySheetTabItemsModel mModel; - private AtomicReference<RecyclerView> mView = new AtomicReference<>(); + private final AtomicReference<RecyclerView> mView = new AtomicReference<>(); @Rule public MockitoRule mMockitoRule = MockitoJUnit.rule();
diff --git a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetViewTest.java b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetViewTest.java index 9a6a91e..60bfc2c1 100644 --- a/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetViewTest.java +++ b/chrome/android/features/keyboard_accessory/javatests/src/org/chromium/chrome/browser/keyboard_accessory/sheet_tabs/PasswordAccessorySheetViewTest.java
@@ -67,7 +67,7 @@ @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) public class PasswordAccessorySheetViewTest { private AccessorySheetTabItemsModel mModel; - private AtomicReference<RecyclerView> mView = new AtomicReference<>(); + private final AtomicReference<RecyclerView> mView = new AtomicReference<>(); @Rule public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule();
diff --git a/chrome/android/features/tab_ui/java/res/drawable/tab_group_share_notice_bottom_sheet_illustration_bg.xml b/chrome/android/features/tab_ui/java/res/drawable/tab_group_share_notice_bottom_sheet_illustration_bg.xml index 90f4a4d..d9cfccf 100644 --- a/chrome/android/features/tab_ui/java/res/drawable/tab_group_share_notice_bottom_sheet_illustration_bg.xml +++ b/chrome/android/features/tab_ui/java/res/drawable/tab_group_share_notice_bottom_sheet_illustration_bg.xml
@@ -7,5 +7,5 @@ <shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="rectangle" > <solid android:color="@macro/sheet_container_bg_color"/> - <corners android:radius="12dp"/> + <corners android:radius="24dp"/> </shape> \ No newline at end of file
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/ArchivedTabsMessageService.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/ArchivedTabsMessageService.java index cc066e9..80b08b5 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/ArchivedTabsMessageService.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/ArchivedTabsMessageService.java
@@ -65,7 +65,7 @@ implements CustomMessageCardProvider, MessageUpdateObserver { static class ArchivedTabsMessageData implements MessageService.CustomMessageData { - private CustomMessageCardProvider mProvider; + private final CustomMessageCardProvider mProvider; public ArchivedTabsMessageData(CustomMessageCardProvider provider) { mProvider = provider; @@ -167,7 +167,7 @@ private TabModel mArchivedTabModel; private View mCustomCardView; private View mEndIconView; - private PropertyModel mCustomCardModel; + private final PropertyModel mCustomCardModel; private boolean mMessageSentToQueue; private OnTabSelectingListener mOnTabSelectingListener; private boolean mShowTwoStepIph;
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/ColorPickerMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/ColorPickerMediator.java index 0617d93..e09304c6 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/ColorPickerMediator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/ColorPickerMediator.java
@@ -16,7 +16,8 @@ /** Contains the logic to set the state of the model and react to color change clicks. */ public class ColorPickerMediator { private final @NonNull List<PropertyModel> mColorItems; - private ObservableSupplierImpl<Integer> mSelectedColorSupplier = new ObservableSupplierImpl<>(); + private final ObservableSupplierImpl<Integer> mSelectedColorSupplier = + new ObservableSupplierImpl<>(); /** * Contains the logic to set the state of the model and react to color change clicks. This
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/IphMessageService.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/IphMessageService.java index 6335bc54..d8d64c35 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/IphMessageService.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/IphMessageService.java
@@ -24,7 +24,7 @@ private final TabSwitcherIphController mIphController; private Tracker mTracker; - private Callback<Boolean> mInitializedCallback = + private final Callback<Boolean> mInitializedCallback = (result) -> { if (wouldTriggerIph()) { assert mTracker.isInitialized();
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/MessageCardProviderMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/MessageCardProviderMediator.java index 310d5aa..3b37bc5a 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/MessageCardProviderMediator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/MessageCardProviderMediator.java
@@ -43,9 +43,9 @@ private final Context mContext; private final Supplier<Profile> mProfileSupplier; - private Map<Integer, List<Message>> mMessageItems = new LinkedHashMap<>(); - private Map<Integer, Message> mShownMessageItems = new LinkedHashMap<>(); - private MessageCardView.DismissActionProvider mUiDismissActionProvider; + private final Map<Integer, List<Message>> mMessageItems = new LinkedHashMap<>(); + private final Map<Integer, Message> mShownMessageItems = new LinkedHashMap<>(); + private final MessageCardView.DismissActionProvider mUiDismissActionProvider; public MessageCardProviderMediator( Context context,
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/PriceDropTextResolver.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/PriceDropTextResolver.java index f992969..98dad59 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/PriceDropTextResolver.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/PriceDropTextResolver.java
@@ -18,8 +18,8 @@ /** A {@link TextResolver} for the {@link TabCardLabelView} when showing a price drop. */ public class PriceDropTextResolver implements TextResolver { - private String mPrice; - private String mPreviousPrice; + private final String mPrice; + private final String mPreviousPrice; /** * @param price The current price.
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabArchiveTimeDeltaPreference.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabArchiveTimeDeltaPreference.java index cf00a5a..7825d63 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabArchiveTimeDeltaPreference.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabArchiveTimeDeltaPreference.java
@@ -26,7 +26,7 @@ private static final int[] ARCHIVE_TIME_DELTA_DAYS_OPTS = new int[] {0, 7, 14, 21}; private static final String TIME_DELTA_HISTOGRAM = "Tabs.ArchiveSettings.TimeDeltaPreference"; - private RadioButtonWithDescription[] mRadioButtons = new RadioButtonWithDescription[4]; + private final RadioButtonWithDescription[] mRadioButtons = new RadioButtonWithDescription[4]; private TabArchiveSettings mTabArchiveSettings; public TabArchiveTimeDeltaPreference(Context context, AttributeSet attrs) {
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabCardLabelViewRenderTest.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabCardLabelViewRenderTest.java index 5c9f47f9..a0791eb 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabCardLabelViewRenderTest.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabCardLabelViewRenderTest.java
@@ -51,7 +51,7 @@ @Batch(Batch.PER_CLASS) public class TabCardLabelViewRenderTest { @ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = new NightModeTestUtils.NightModeParams().getParameters(); @Rule @@ -66,7 +66,7 @@ new BaseActivityTestRule<>(BlankUiTestActivity.class); private TabCardLabelView mTabCardLabelView; - private Runnable mCancelRunnable = CallbackUtils.emptyRunnable(); + private final Runnable mCancelRunnable = CallbackUtils.emptyRunnable(); public TabCardLabelViewRenderTest(boolean nightModeEnabled) { NightModeTestUtils.setUpNightModeForBlankUiTestActivity(nightModeEnabled);
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogCoordinator.java index ff7c611..510fb48 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogCoordinator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogCoordinator.java
@@ -95,17 +95,17 @@ private final BottomSheetController mBottomSheetController; private final UndoBarThrottle mUndoBarThrottle; private @Nullable final TabLabeller mTabLabeller; - private ObservableSupplierImpl<Boolean> mShowingOrAnimationSupplier = + private final ObservableSupplierImpl<Boolean> mShowingOrAnimationSupplier = new ObservableSupplierImpl<>(false); private final ObservableSupplierImpl<Token> mCurrentTabGroupId = new ObservableSupplierImpl<>(); - private TabContentManager mTabContentManager; + private final TabContentManager mTabContentManager; private TabListEditorCoordinator mTabListEditorCoordinator; private TabGridDialogView mDialogView; private ColorPickerCoordinator mColorPickerCoordinator; - private @Nullable SnackbarManager mSnackbarManager; + private final @Nullable SnackbarManager mSnackbarManager; private @Nullable SharedImageTilesCoordinator mSharedImageTilesCoordinator; private @Nullable AnchoredPopupWindow mColorIconPopupWindow; - private @Nullable TabSwitcherResetHandler mTabSwitcherResetHandler; + private final @Nullable TabSwitcherResetHandler mTabSwitcherResetHandler; private @Nullable Integer mUndoBarThrottleToken; TabGridDialogCoordinator(
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridItemTouchHelperCallback.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridItemTouchHelperCallback.java index 461251e..f4600e7 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridItemTouchHelperCallback.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGridItemTouchHelperCallback.java
@@ -65,7 +65,7 @@ private final ObservableSupplierImpl<RecyclerView> mRecyclerViewSupplier = new ObservableSupplierImpl<>(); private float mSwipeToDismissThreshold; - private float mLongPressDpCancelThreshold; + private final float mLongPressDpCancelThreshold; private float mMergeThreshold; private float mUngroupThreshold; // A bool to track whether an action such as swiping, group/ungroup and drag past a certain
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupListCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupListCoordinator.java index 52d8fc81..45b46c1 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupListCoordinator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupListCoordinator.java
@@ -67,7 +67,7 @@ private final SimpleRecyclerViewAdapter mSimpleRecyclerViewAdapter; private final TabListFaviconProvider mTabListFaviconProvider; - private TabGroupListMediator mTabGroupListMediator; + private final TabGroupListMediator mTabGroupListMediator; private @Nullable EdgeToEdgePadAdjuster mEdgeToEdgePadAdjuster; /**
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiOneshotSupplierUnitTest.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiOneshotSupplierUnitTest.java index ca627d2..de3e084 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiOneshotSupplierUnitTest.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupUiOneshotSupplierUnitTest.java
@@ -83,9 +83,9 @@ @Captor private ArgumentCaptor<TabObserver> mTabObserverCaptor; @Captor private ArgumentCaptor<Callback<Tab>> mActivityTabObserverCaptor; - private ObservableSupplierImpl<Boolean> mOmniboxFocusStateSupplier = + private final ObservableSupplierImpl<Boolean> mOmniboxFocusStateSupplier = new ObservableSupplierImpl<>(); - private OneshotSupplier<LayoutStateProvider> mLayoutStateProviderSupplier = + private final OneshotSupplier<LayoutStateProvider> mLayoutStateProviderSupplier = new OneshotSupplierImpl<>(); private TabGroupUiOneshotSupplier mTabGroupUiOneshotSupplier;
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorAction.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorAction.java index cf78885..b473d0a 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorAction.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorAction.java
@@ -124,8 +124,8 @@ private static final String EXPECTED_RESOURCE_TYPE_NAME = "plurals"; - private ObserverList<ActionObserver> mObsevers = new ObserverList<>(); - private PropertyModel mModel; + private final ObserverList<ActionObserver> mObsevers = new ObserverList<>(); + private final PropertyModel mModel; private Supplier<TabGroupModelFilter> mCurrentTabGroupModelFilterSupplier; private ActionDelegate mActionDelegate; private SelectionDelegate<TabListEditorItemSelectionId> mSelectionDelegate;
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorActionViewLayout.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorActionViewLayout.java index 6770ef05..b16598d 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorActionViewLayout.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorActionViewLayout.java
@@ -36,7 +36,7 @@ /** {@link ListMenuButton} for showing the {@link TabListEditorMenu}. */ private ListMenuButton mMenuButton; - private LinearLayout.LayoutParams mActionViewParams; + private final LinearLayout.LayoutParams mActionViewParams; private ActionViewLayoutDelegate mDelegate; private boolean mHasMenuOnlyItems;
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorBookmarkAction.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorBookmarkAction.java index a1881e15..0ede339 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorBookmarkAction.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorBookmarkAction.java
@@ -23,7 +23,7 @@ /** Bookmark action for the {@link TabListEditorMenu}. */ public class TabListEditorBookmarkAction extends TabListEditorAction { - private Activity mActivity; + private final Activity mActivity; private TabListEditorBookmarkActionDelegate mDelegate; /** Interface for passing params on bookmark action. */
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorLayout.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorLayout.java index 1707cd94..9fbffa4f 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorLayout.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorLayout.java
@@ -28,7 +28,7 @@ private boolean mIsInitialized; private boolean mIsShowing; - private Map<View, Integer> mAccessibilityImportanceMap = new HashMap<>(); + private final Map<View, Integer> mAccessibilityImportanceMap = new HashMap<>(); // TODO(meiliang): inflates R.layout.tab_list_editor_layout in // TabListEditorCoordinator.
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorMediator.java index 338b506..02891e4 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorMediator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorMediator.java
@@ -77,8 +77,8 @@ private @Nullable PropertyListModel<PropertyModel, PropertyKey> mActionListModel; private ListModelChangeProcessor mActionChangeProcessor; private TabListEditorMenu mTabListEditorMenu; - private SnackbarManager mSnackbarManager; - private BottomSheetController mBottomSheetController; + private final SnackbarManager mSnackbarManager; + private final BottomSheetController mBottomSheetController; private TabListEditorToolbar mTabListEditorToolbar; private TabListEditorCoordinator.NavigationProvider mNavigationProvider; private @TabActionState int mTabActionState;
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorMenu.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorMenu.java index 86597d8..44f164a5 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorMenu.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorMenu.java
@@ -47,15 +47,15 @@ int MENU_ITEM = 0; } - private Context mContext; + private final Context mContext; // Insertion ordering is important and for performance it is ok as size is very small. - private Map<Integer, TabListEditorMenuItem> mMenuItems = new LinkedHashMap<>(); + private final Map<Integer, TabListEditorMenuItem> mMenuItems = new LinkedHashMap<>(); - private View mContentView; - private ListView mListView; - private TabListEditorActionViewLayout mActionViewLayout; - private ModelList mModelList; - private ModelListAdapter mAdapter; + private final View mContentView; + private final ListView mListView; + private final TabListEditorActionViewLayout mActionViewLayout; + private final ModelList mModelList; + private final ModelListAdapter mAdapter; /** * @param context to use for accessing resources.
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorShareAction.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorShareAction.java index 772701c..9888c9bc 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorShareAction.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorShareAction.java
@@ -47,9 +47,9 @@ UrlConstants.CHROME_NATIVE_SCHEME, ContentUrlConstants.ABOUT_SCHEME)); private static Callback<Intent> sIntentCallbackForTesting; - private Context mContext; + private final Context mContext; private boolean mSkipUrlCheckForTesting; - private BroadcastReceiver mBroadcastReceiver; + private final BroadcastReceiver mBroadcastReceiver; // These values are persisted to logs. Entries should not be renumbered and // numeric values should never be reused.
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorTinkerTankAction.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorTinkerTankAction.java index 441725a0..cfff4c8 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorTinkerTankAction.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorTinkerTankAction.java
@@ -18,7 +18,7 @@ /** TinkerTank action for the {@link TabListEditorMenu}. */ public class TabListEditorTinkerTankAction extends TabListEditorAction { - private Activity mActivity; + private final Activity mActivity; /** * Create an action for share tabs to tinker tank.
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEmptyCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEmptyCoordinator.java index bd0e95cc..706a0cb2 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEmptyCoordinator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEmptyCoordinator.java
@@ -27,15 +27,15 @@ // @TODO(crbug.com/40910476) Add instrumentation test for TabListEmptyCoordinator class. class TabListEmptyCoordinator { public final long ILLUSTRATION_ANIMATION_DURATION_MS = 700L; - private ViewGroup mRootView; + private final ViewGroup mRootView; private View mEmptyView; private TextView mEmptyStateHeading; private TextView mEmptyStateSubheading; private ImageView mImageView; - private Context mContext; - private TabListModel mModel; - private ListObserver<Void> mListObserver; - private Callback<Runnable> mRunOnItemAnimatorFinished; + private final Context mContext; + private final TabListModel mModel; + private final ListObserver<Void> mListObserver; + private final Callback<Runnable> mRunOnItemAnimatorFinished; private boolean mIsTabSwitcherShowing; private boolean mIsListObserverAttached; private @Nullable TabListEmptyIllustrationAnimationManager mIllustrationAnimationManager;
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java index 6ec95983..7de808c 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java
@@ -358,7 +358,7 @@ } private static final String TAG = "TabListMediator"; - private static Map<Integer, Integer> sTabClosedFromMapTabClosedFromMap = new HashMap<>(); + private static final Map<Integer, Integer> sTabClosedFromMapTabClosedFromMap = new HashMap<>(); private final ValueChangedCallback<TabGroupModelFilter> mOnTabGroupModelFilterChanged = new ValueChangedCallback<>(this::onTabGroupModelFilterChanged);
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListOnScrollListener.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListOnScrollListener.java index 1c19a46..509dba8 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListOnScrollListener.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListOnScrollListener.java
@@ -14,7 +14,7 @@ * the state changes. */ public class TabListOnScrollListener extends RecyclerView.OnScrollListener { - private ObservableSupplierImpl<Boolean> mYOffsetNonZeroSupplier = + private final ObservableSupplierImpl<Boolean> mYOffsetNonZeroSupplier = new ObservableSupplierImpl<>(); public ObservableSupplier<Boolean> getYOffsetNonZeroSupplier() {
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabShareUtilsUnitTest.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabShareUtilsUnitTest.java index 5fbcbd2..d5cfbfb 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabShareUtilsUnitTest.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabShareUtilsUnitTest.java
@@ -54,7 +54,7 @@ @Mock IdentityManager mIdentityManager; @Mock CoreAccountInfo mCoreAccountInfo; - private LocalTabGroupId mLocalTabGroupId = new LocalTabGroupId(TAB_GROUP_ID); + private final LocalTabGroupId mLocalTabGroupId = new LocalTabGroupId(TAB_GROUP_ID); private SavedTabGroup mSavedTabGroup; private GroupDataOrFailureOutcome mGroupDataOutcome;
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMessageManagerUnitTest.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMessageManagerUnitTest.java index bc86005..5f320a9 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMessageManagerUnitTest.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherMessageManagerUnitTest.java
@@ -108,7 +108,7 @@ private final ObservableSupplierImpl<TabGroupModelFilter> mCurrentTabGroupModelFilterSupplier = new ObservableSupplierImpl<>(); - private ObservableSupplierImpl<EdgeToEdgeController> mEdgeToEdgeSupplier = + private final ObservableSupplierImpl<EdgeToEdgeController> mEdgeToEdgeSupplier = new ObservableSupplierImpl<>(); private TabSwitcherMessageManager mMessageManager; private MockTab mTab1;
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherPane.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherPane.java index 6f52e1c..82d57e6 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherPane.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherPane.java
@@ -106,7 +106,7 @@ private @Nullable OnSharedPreferenceChangeListener mPriceAnnotationsPrefListener; private @Nullable TabGroupSyncService mTabGroupSyncService; - private TabSwitcherDrawable mTabSwitcherDrawable; + private final TabSwitcherDrawable mTabSwitcherDrawable; /** * @param context The activity context.
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherPaneUnitTest.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherPaneUnitTest.java index a33f833..59302b2 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherPaneUnitTest.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherPaneUnitTest.java
@@ -172,14 +172,15 @@ private final Token mToken = new Token(1L, 2L); private Context mContext; - private ObservableSupplierImpl<Boolean> mHandleBackPressChangeSupplier = + private final ObservableSupplierImpl<Boolean> mHandleBackPressChangeSupplier = new ObservableSupplierImpl<>(); - private ObservableSupplierImpl<Boolean> mIsScrollingSupplier = new ObservableSupplierImpl<>(); - private OneshotSupplierImpl<ObservableSupplier<Boolean>> mIsScrollingSupplierSupplier = + private final ObservableSupplierImpl<Boolean> mIsScrollingSupplier = + new ObservableSupplierImpl<>(); + private final OneshotSupplierImpl<ObservableSupplier<Boolean>> mIsScrollingSupplierSupplier = new OneshotSupplierImpl<>(); - private ObservableSupplierImpl<EdgeToEdgeController> mEdgeToEdgeSupplier = + private final ObservableSupplierImpl<EdgeToEdgeController> mEdgeToEdgeSupplier = new ObservableSupplierImpl<>(); - private ObservableSupplierImpl<CompositorViewHolder> mCompositorViewHolderSupplier = + private final ObservableSupplierImpl<CompositorViewHolder> mCompositorViewHolderSupplier = new ObservableSupplierImpl<>(); private TabSwitcherPane mTabSwitcherPane; private MockTabModel mTabModel;
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/CloseAllTabsDialogTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/CloseAllTabsDialogTest.java index daf90cf..33bbf580 100644 --- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/CloseAllTabsDialogTest.java +++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/CloseAllTabsDialogTest.java
@@ -49,7 +49,7 @@ @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) public class CloseAllTabsDialogTest { @ParameterAnnotations.ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = Arrays.asList( new ParameterSet().value(false).name("NonIncognito"), new ParameterSet().value(true).name("Incognito"));
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/MessageCardProviderTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/MessageCardProviderTest.java index 6cd5821..72a11f7f 100644 --- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/MessageCardProviderTest.java +++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/MessageCardProviderTest.java
@@ -69,7 +69,8 @@ private MessageService mTestingService; private MessageService mPriceService; - private MessageCardView.DismissActionProvider mUiDismissActionProvider = (messageType) -> {}; + private final MessageCardView.DismissActionProvider mUiDismissActionProvider = + (messageType) -> {}; @Mock private PriceMessageService.PriceMessageData mPriceMessageData;
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/MessageCardViewBinderTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/MessageCardViewBinderTest.java index 7c8eadc..478141db 100644 --- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/MessageCardViewBinderTest.java +++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/MessageCardViewBinderTest.java
@@ -57,19 +57,19 @@ private ViewGroup mItemView; private PropertyModel mItemViewModel; private PropertyModelChangeProcessor mItemMCP; - private AtomicBoolean mReviewButtonClicked = new AtomicBoolean(); - private AtomicBoolean mDismissButtonClicked = new AtomicBoolean(); + private final AtomicBoolean mReviewButtonClicked = new AtomicBoolean(); + private final AtomicBoolean mDismissButtonClicked = new AtomicBoolean(); - private AtomicBoolean mMessageServiceReviewCallbackRan = new AtomicBoolean(); - private AtomicBoolean mMessageServiceDismissCallbackRan = new AtomicBoolean(); + private final AtomicBoolean mMessageServiceReviewCallbackRan = new AtomicBoolean(); + private final AtomicBoolean mMessageServiceDismissCallbackRan = new AtomicBoolean(); - private MessageCardView.ReviewActionProvider mUiReviewHandler = + private final MessageCardView.ReviewActionProvider mUiReviewHandler = () -> mReviewButtonClicked.set(true); - private MessageCardView.DismissActionProvider mUiDismissHandler = + private final MessageCardView.DismissActionProvider mUiDismissHandler = (int messageType) -> mDismissButtonClicked.set(true); - private MessageCardView.ReviewActionProvider mMessageServiceActionHandler = + private final MessageCardView.ReviewActionProvider mMessageServiceActionHandler = () -> mMessageServiceReviewCallbackRan.set(true); - private MessageCardView.DismissActionProvider mMessageServiceDismissHandler = + private final MessageCardView.DismissActionProvider mMessageServiceDismissHandler = (int messageType) -> mMessageServiceDismissCallbackRan.set(true); @BeforeClass
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/PriceCardViewTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/PriceCardViewTest.java index b3d12ad..7450e4ae 100644 --- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/PriceCardViewTest.java +++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/PriceCardViewTest.java
@@ -53,7 +53,7 @@ @Batch(Batch.PER_CLASS) public class PriceCardViewTest { @ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = new NightModeTestUtils.NightModeParams().getParameters(); @ClassRule
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/SelectableTabListEditorTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/SelectableTabListEditorTest.java index b805e3d..f3aecc9 100644 --- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/SelectableTabListEditorTest.java +++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/SelectableTabListEditorTest.java
@@ -159,7 +159,7 @@ @Mock private BottomSheetController mBottomSheetController; @Mock private TabGroupCreationDialogManager mCreationDialogManager; - private TabListEditorTestingRobot mRobot = new TabListEditorTestingRobot(); + private final TabListEditorTestingRobot mRobot = new TabListEditorTestingRobot(); private TabModelSelector mTabModelSelector; private TabListEditorCoordinator.TabListEditorController mTabListEditorController;
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogTest.java index 9b92c19..581d85a 100644 --- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogTest.java +++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabGridDialogTest.java
@@ -197,7 +197,7 @@ ActivityLifecycleMonitorRegistry.getInstance(); private boolean mHasReceivedSourceRect; - private TabListEditorTestingRobot mSelectionEditorRobot = new TabListEditorTestingRobot(); + private final TabListEditorTestingRobot mSelectionEditorRobot = new TabListEditorTestingRobot(); private ModalDialogManager mModalDialogManager; private PrefService mPrefService;
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorMenuTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorMenuTest.java index cf8ad3e4..ee4aa46 100644 --- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorMenuTest.java +++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorMenuTest.java
@@ -92,7 +92,7 @@ private static final Integer[] TAB_IDS = new Integer[] {TAB_ID_0, TAB_ID_1, TAB_ID_2}; @ParameterAnnotations.ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = new NightModeTestUtils.NightModeParams().getParameters(); @ClassRule @@ -160,7 +160,7 @@ private SelectionDelegate<TabListEditorItemSelectionId> mSelectionDelegate; @Mock private ActionDelegate mDelegate; - private List<Tab> mTabs = new ArrayList<>(); + private final List<Tab> mTabs = new ArrayList<>(); private TabListEditorToolbar mToolbar; private TabListEditorMenu mTabListEditorMenu; @@ -739,8 +739,8 @@ /** Helper for detecting menu shown popup events. */ static class PopupListener implements ListMenuHost.PopupMenuShownListener { - private CallbackHelper mShown = new CallbackHelper(); - private CallbackHelper mHidden = new CallbackHelper(); + private final CallbackHelper mShown = new CallbackHelper(); + private final CallbackHelper mHidden = new CallbackHelper(); @Override public void onPopupMenuShown() {
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabListViewHolderTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabListViewHolderTest.java index 9c78c146..d7d2aa98 100644 --- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabListViewHolderTest.java +++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabListViewHolderTest.java
@@ -190,7 +190,7 @@ @Mock private OptimizationGuideBridgeFactory.Natives mOptimizationGuideBridgeFactoryJniMock; @Mock private OptimizationGuideBridge mOptimizationGuideBridge; - private ThumbnailFetcher mMockThumbnailFetcher = + private final ThumbnailFetcher mMockThumbnailFetcher = new ThumbnailFetcher( new ThumbnailProvider() { @Override @@ -209,9 +209,9 @@ } }, Tab.INVALID_TAB_ID); - private AtomicInteger mThumbnailFetchedCount = new AtomicInteger(); + private final AtomicInteger mThumbnailFetchedCount = new AtomicInteger(); - private TabListMediator.TabActionListener mMockCloseListener = + private final TabListMediator.TabActionListener mMockCloseListener = new TabListMediator.TabActionListener() { @Override public void run(View view, int tabId, @Nullable MotionEvent triggeringMotionEvent) { @@ -223,10 +223,10 @@ public void run( View view, String syncId, @Nullable MotionEvent triggeringMotionEvent) {} }; - private AtomicBoolean mCloseClicked = new AtomicBoolean(); - private AtomicInteger mCloseTabId = new AtomicInteger(); + private final AtomicBoolean mCloseClicked = new AtomicBoolean(); + private final AtomicInteger mCloseTabId = new AtomicInteger(); - private TabListMediator.TabActionListener mMockSelectedListener = + private final TabListMediator.TabActionListener mMockSelectedListener = new TabListMediator.TabActionListener() { @Override public void run(View view, int tabId, @Nullable MotionEvent triggeringMotionEvent) { @@ -238,10 +238,10 @@ public void run( View view, String syncId, @Nullable MotionEvent triggeringMotionEvent) {} }; - private AtomicBoolean mSelectClicked = new AtomicBoolean(); - private AtomicInteger mSelectTabId = new AtomicInteger(); + private final AtomicBoolean mSelectClicked = new AtomicBoolean(); + private final AtomicInteger mSelectTabId = new AtomicInteger(); - private TabListMediator.TabActionListener mMockCreateGroupButtonListener = + private final TabListMediator.TabActionListener mMockCreateGroupButtonListener = new TabListMediator.TabActionListener() { @Override public void run(View view, int tabId, @Nullable MotionEvent triggeringMotionEvent) { @@ -253,8 +253,8 @@ public void run( View view, String syncId, @Nullable MotionEvent triggeringMotionEvent) {} }; - private AtomicBoolean mCreateGroupButtonClicked = new AtomicBoolean(); - private AtomicInteger mCreateGroupTabId = new AtomicInteger(); + private final AtomicBoolean mCreateGroupButtonClicked = new AtomicBoolean(); + private final AtomicInteger mCreateGroupTabId = new AtomicInteger(); private boolean mShouldReturnBitmap; @BeforeClass
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherLayoutTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherLayoutTest.java index bfebffe..26d3ea0 100644 --- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherLayoutTest.java +++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherLayoutTest.java
@@ -137,8 +137,8 @@ private String mUrl; private int mRepeat; - private List<WeakReference<Bitmap>> mAllBitmaps = new LinkedList<>(); - private Callback<Bitmap> mBitmapListener = + private final List<WeakReference<Bitmap>> mAllBitmaps = new LinkedList<>(); + private final Callback<Bitmap> mBitmapListener = (bitmap) -> mAllBitmaps.add(new WeakReference<>(bitmap)); private ModalDialogManager mModalDialogManager; @@ -323,7 +323,7 @@ } private static class ThumbnailAspectRatioAssertion implements ViewAssertion { - private double mExpectedRatio; + private final double mExpectedRatio; public static ThumbnailAspectRatioAssertion havingAspectRatio(double ratio) { return new ThumbnailAspectRatioAssertion(ratio);
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherThumbnailTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherThumbnailTest.java index d6196d6..abb72af0 100644 --- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherThumbnailTest.java +++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabSwitcherThumbnailTest.java
@@ -46,7 +46,7 @@ @Rule public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule(); - private ThumbnailFetcher mNullThumbnailFetcher = + private final ThumbnailFetcher mNullThumbnailFetcher = new ThumbnailFetcher( (tabId, thumbnailSize, isSelected, callback) -> callback.onResult(null), Tab.INVALID_TAB_ID); @@ -122,8 +122,8 @@ return new ThumbnailAspectRatioAssertion(ratio, position); } - private int mPosition; - private float mExpectedRatio; + private final int mPosition; + private final float mExpectedRatio; ThumbnailAspectRatioAssertion(float ratio, int position) { mExpectedRatio = ratio; @@ -152,7 +152,7 @@ return new ThumbnailHeightAssertion(position); } - private int mPosition; + private final int mPosition; ThumbnailHeightAssertion(int position) { mPosition = position;
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabUiTestHelper.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabUiTestHelper.java index 60c85f5b..81dc235 100644 --- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabUiTestHelper.java +++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/TabUiTestHelper.java
@@ -871,8 +871,8 @@ int TAB_SUGGESTION_MESSAGE = 1; } - private int mExpectedCount; - @ChildrenType private int mExpectedChildrenType; + private final int mExpectedCount; + @ChildrenType private final int mExpectedChildrenType; public static ChildrenCountAssertion havingTabCount(int tabCount) { return new ChildrenCountAssertion(ChildrenType.TAB, tabCount);
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/ArchivedTabsDialogCoordinatorUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/ArchivedTabsDialogCoordinatorUnitTest.java index 504678d..d80fc8349 100644 --- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/ArchivedTabsDialogCoordinatorUnitTest.java +++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/ArchivedTabsDialogCoordinatorUnitTest.java
@@ -128,13 +128,15 @@ private Activity mActivity; private ArchivedTabsDialogCoordinator mCoordinator; - private ObservableSupplierImpl<Integer> mTabCountSupplier = new ObservableSupplierImpl<>(1); - private ObservableSupplierImpl<EdgeToEdgeController> mEdgeToEdgeSupplier = + private final ObservableSupplierImpl<Integer> mTabCountSupplier = + new ObservableSupplierImpl<>(1); + private final ObservableSupplierImpl<EdgeToEdgeController> mEdgeToEdgeSupplier = new ObservableSupplierImpl<>(); - private OneshotSupplierImpl<PaneManager> mPaneManagerSupplier = new OneshotSupplierImpl<>(); - private OneshotSupplierImpl<TabGroupUiActionHandler> mTabGroupUiActionHandlerSupplier = + private final OneshotSupplierImpl<PaneManager> mPaneManagerSupplier = new OneshotSupplierImpl<>(); - private ObservableSupplierImpl<TabGroupModelFilter> mCurrentTabGroupModelFilterSupplier = + private final OneshotSupplierImpl<TabGroupUiActionHandler> mTabGroupUiActionHandlerSupplier = + new OneshotSupplierImpl<>(); + private final ObservableSupplierImpl<TabGroupModelFilter> mCurrentTabGroupModelFilterSupplier = new ObservableSupplierImpl<>(); @Before
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/ArchivedTabsMessageServiceUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/ArchivedTabsMessageServiceUnitTest.java index 32cc4826..bb43a743 100644 --- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/ArchivedTabsMessageServiceUnitTest.java +++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/ArchivedTabsMessageServiceUnitTest.java
@@ -98,10 +98,11 @@ private Activity mActivity; private ViewGroup mRootView; private ArchivedTabsMessageService mArchivedTabsMessageService; - private ObservableSupplierImpl<Integer> mTabCountSupplier = new ObservableSupplierImpl<>(); - private ObservableSupplierImpl<TabListCoordinator> mTabListCoordinatorSupplier = + private final ObservableSupplierImpl<Integer> mTabCountSupplier = new ObservableSupplierImpl<>(); - private ObservableSupplierImpl<EdgeToEdgeController> mEdgeToEdgeSupplier = + private final ObservableSupplierImpl<TabListCoordinator> mTabListCoordinatorSupplier = + new ObservableSupplierImpl<>(); + private final ObservableSupplierImpl<EdgeToEdgeController> mEdgeToEdgeSupplier = new ObservableSupplierImpl<>(); @Before
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/ColorPickerMediatorUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/ColorPickerMediatorUnitTest.java index 644ab81..b90f870 100644 --- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/ColorPickerMediatorUnitTest.java +++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/ColorPickerMediatorUnitTest.java
@@ -35,7 +35,7 @@ private Activity mActivity; private ColorPickerMediator mMediator; private List<Integer> mColorIds; - private List<PropertyModel> mColorItems = new ArrayList<>(); + private final List<PropertyModel> mColorItems = new ArrayList<>(); @Before public void setUp() {
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewBinderUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewBinderUnitTest.java index 85eb598..60797bcc 100644 --- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewBinderUnitTest.java +++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabGridViewBinderUnitTest.java
@@ -101,7 +101,7 @@ private PropertyModel mModel; private LayoutParams mLayoutParams; private BitmapDrawable mBitmapDrawable; - private PriceDrop mPriceDrop = new PriceDrop("$7", "$89"); + private final PriceDrop mPriceDrop = new PriceDrop("$7", "$89"); @Before public void setUp() {
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorActionUnitTestHelper.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorActionUnitTestHelper.java index e04321b..def7cf10 100644 --- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorActionUnitTestHelper.java +++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorActionUnitTestHelper.java
@@ -82,8 +82,8 @@ * {@link TabListEditorAction}. */ public static class TabListHolder { - private List<Tab> mSelectedTabs; - private List<Tab> mSelectedAndRelatedTabs; + private final List<Tab> mSelectedTabs; + private final List<Tab> mSelectedAndRelatedTabs; /** * @param selectedTabs the selected tabs in the TabListEditor.
diff --git a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java index 6d97ae2..2727bfa 100644 --- a/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java +++ b/chrome/android/features/tab_ui/junit/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediatorUnitTest.java
@@ -373,8 +373,8 @@ private SimpleRecyclerViewAdapter.ViewHolder mViewHolder2; private RecyclerView.ViewHolder mFakeViewHolder1; private RecyclerView.ViewHolder mFakeViewHolder2; - private View mItemView1 = mock(View.class); - private View mItemView2 = mock(View.class); + private final View mItemView1 = mock(View.class); + private final View mItemView2 = mock(View.class); private PriceDrop mPriceDrop; private PriceTabData mPriceTabData; private String mTab1Domain; @@ -4802,7 +4802,6 @@ assertEquals( TabListCoordinator.GRID_LAYOUT_SPAN_COUNT_MEDIUM, mMediator.getSpanCount(TabListCoordinator.MAX_SCREEN_WIDTH_MEDIUM_DP + 1)); - XrUtils.resetXrDeviceForTesting(); } @Test
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceCoordinator.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceCoordinator.java index 71dee6c..d456d96 100644 --- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceCoordinator.java +++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceCoordinator.java
@@ -114,21 +114,21 @@ private FeedSurfaceMediator mMediator; - private UiConfig mUiConfig; - private FrameLayout mRootView; + private final UiConfig mUiConfig; + private final FrameLayout mRootView; private boolean mIsActive; private int mHeaderCount; private int mHeaderIndex; - private View mHeaderView; - private int mToolbarHeight; + private final View mHeaderView; + private final int mToolbarHeight; // Used when Feed is enabled. - private @Nullable Profile mProfile; + private final @Nullable Profile mProfile; private @Nullable FeedSurfaceLifecycleManager mFeedSurfaceLifecycleManager; private @Nullable View mSigninPromoView; // Feed header fields. private @Nullable PropertyModel mSectionHeaderModel; - private @Nullable ViewGroup mViewportView; + private final @Nullable ViewGroup mViewportView; private @Nullable ListModelChangeProcessor< PropertyListModel<PropertyModel, PropertyKey>, SectionHeaderView, PropertyKey> mSectionHeaderListModelChangeProcessor; @@ -136,7 +136,7 @@ mSectionHeaderModelChangeProcessor; // Feed RecyclerView/xSurface fields. private @Nullable FeedListContentManager mContentManager; - private @Nullable RecyclerView mRecyclerView; + private final @Nullable RecyclerView mRecyclerView; private @Nullable FeedSurfaceScope mSurfaceScope; private @Nullable FeedSurfaceScopeDependencyProviderImpl mDependencyProvider; private @Nullable HybridListRenderer mHybridListRenderer; @@ -158,7 +158,7 @@ private boolean mWebFeedHasContent; private final ObservableSupplier<Integer> mTabStripHeightSupplier; - private Callback<Integer> mTabStripHeightChangeCallback; + private final Callback<Integer> mTabStripHeightChangeCallback; // Used to handle padding adjustment when edge to edge is enabled. private @Nullable EdgeToEdgePadAdjuster mEdgePadAdjuster;
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceMediator.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceMediator.java index 4c2f7c4f..ba94485 100644 --- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceMediator.java +++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceMediator.java
@@ -303,12 +303,12 @@ private @Nullable RecyclerView.OnScrollListener mStreamScrollListener; private final ObserverList<ScrollListener> mScrollListeners = new ObserverList<>(); - private HasContentListener mHasContentListener; + private final HasContentListener mHasContentListener; private ContentChangedListener mStreamContentChangedListener; private MemoryPressureCallback mMemoryPressureCallback; private @Nullable FeedSigninPromo mSigninPromo; private @Nullable SignInPromo mLegacySignInPromo; - private RecyclerViewAnimationFinishDetector mRecyclerViewAnimationFinishDetector = + private final RecyclerViewAnimationFinishDetector mRecyclerViewAnimationFinishDetector = new RecyclerViewAnimationFinishDetector(); private boolean mFeedEnabled; @@ -337,7 +337,7 @@ // Whether we're currently adding the streams. If this is true, streams should not be bound yet. // This avoids automatically binding the first stream when it's added. private boolean mSettingUpStreams; - private boolean mIsNewTabSearchEngineUrlAndroidEnabled; + private final boolean mIsNewTabSearchEngineUrlAndroidEnabled; private boolean mIsPropertiesInitializedForStream; private @ClosedReason int mClosedReason = ClosedReason.SUSPEND_APP; private final boolean mIsNewTabPageCustomizationEnabled; @@ -666,7 +666,7 @@ mStreamScrollListener = new RecyclerView.OnScrollListener() { - private RecyclerViewAnimationFinishDetector mAnimationFinishDetector = + private final RecyclerViewAnimationFinishDetector mAnimationFinishDetector = new RecyclerViewAnimationFinishDetector(); @Override
diff --git a/chrome/android/java/res/layout/custom_tile_edit_layout.xml b/chrome/android/java/res/layout/custom_tile_edit_layout.xml index 6fcb389..966c036 100644 --- a/chrome/android/java/res/layout/custom_tile_edit_layout.xml +++ b/chrome/android/java/res/layout/custom_tile_edit_layout.xml
@@ -11,46 +11,52 @@ android:layout_width="match_parent" android:layout_height="wrap_content"> - <LinearLayout + <ScrollView android:layout_width="match_parent" - android:layout_height="wrap_content" - android:layout_marginHorizontal="22dp" - android:layout_marginTop="24dp" - android:layout_marginBottom="0dp" - android:layout_gravity="center_horizontal" - android:orientation="vertical"> + android:layout_height="match_parent" > - <com.google.android.material.textfield.TextInputLayout - android:labelFor="@+id/name_field" - android:layout_height="wrap_content" + <LinearLayout android:layout_width="match_parent" - android:hint="@string/edit_shortcut_hint_name" - app:errorTextAppearance="@style/TextAppearance.ErrorCaption" - app:errorEnabled="true"> - - <com.google.android.material.textfield.TextInputEditText - android:id="@+id/name_field" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:imeOptions="flagNoExtractUi" - android:inputType="textCapSentences|textAutoCorrect" - android:singleLine="true" /> - </com.google.android.material.textfield.TextInputLayout> - - <com.google.android.material.textfield.TextInputLayout - android:labelFor="@+id/url_field" android:layout_height="wrap_content" - android:layout_width="match_parent" - android:hint="@string/edit_shortcut_hint_url" - app:errorTextAppearance="@style/TextAppearance.ErrorCaption" - app:errorEnabled="true"> + android:layout_marginHorizontal="22dp" + android:layout_marginTop="24dp" + android:layout_marginBottom="0dp" + android:layout_gravity="center_horizontal" + android:orientation="vertical"> - <com.google.android.material.textfield.TextInputEditText - android:id="@+id/url_field" - android:layout_width="match_parent" + <com.google.android.material.textfield.TextInputLayout + android:labelFor="@+id/name_field" android:layout_height="wrap_content" - android:imeOptions="flagNoExtractUi" - android:singleLine="true" /> - </com.google.android.material.textfield.TextInputLayout> - </LinearLayout> + android:layout_width="match_parent" + android:hint="@string/edit_shortcut_hint_name" + app:errorTextAppearance="@style/TextAppearance.ErrorCaption" + app:errorEnabled="true"> + + <com.google.android.material.textfield.TextInputEditText + android:id="@+id/name_field" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:imeOptions="flagNoExtractUi" + android:inputType="textCapSentences|textAutoCorrect" + android:singleLine="true" /> + </com.google.android.material.textfield.TextInputLayout> + + <com.google.android.material.textfield.TextInputLayout + android:labelFor="@+id/url_field" + android:layout_height="wrap_content" + android:layout_width="match_parent" + android:hint="@string/edit_shortcut_hint_url" + app:errorTextAppearance="@style/TextAppearance.ErrorCaption" + app:errorEnabled="true"> + + <com.google.android.material.textfield.TextInputEditText + android:id="@+id/url_field" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:imeOptions="flagNoExtractUi" + android:singleLine="true" /> + </com.google.android.material.textfield.TextInputLayout> + + </LinearLayout> + </ScrollView> </org.chromium.chrome.browser.suggestions.tile.tile_edit_dialog.CustomTileEditView>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ActivityTabProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/ActivityTabProvider.java index 9e13dcd..8f57a87 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ActivityTabProvider.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ActivityTabProvider.java
@@ -72,7 +72,7 @@ private @Nullable LayoutStateProvider mLayoutStateProvider; /** The observer watching scene changes in the active layout. */ - private LayoutStateObserver mLayoutStateObserver; + private final LayoutStateObserver mLayoutStateObserver; /** A handle to the {@link TabModelSelector}. */ private @Nullable TabModelSelector mTabModelSelector;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeBackgroundService.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeBackgroundService.java index dc17818..959803dc 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeBackgroundService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeBackgroundService.java
@@ -11,6 +11,7 @@ /** See {@link ChromeBackgroundServiceImpl}. */ @NullMarked public class ChromeBackgroundService extends SplitCompatGcmTaskService { + @SuppressWarnings("FieldCanBeFinal") // @IdentifierNameString requires non-final private static @IdentifierNameString String sImplClassName = "org.chromium.chrome.browser.ChromeBackgroundServiceImpl";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeBaseAppCompatActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeBaseAppCompatActivity.java index f9e4ad8..6a9c9f1 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeBaseAppCompatActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeBaseAppCompatActivity.java
@@ -120,7 +120,7 @@ new OneshotSupplierImpl<>(); private NightModeStateProvider mNightModeStateProvider; - private LinkedHashSet<Integer> mThemeResIds = new LinkedHashSet<>(); + private final LinkedHashSet<Integer> mThemeResIds = new LinkedHashSet<>(); private ServiceTracingProxyProvider mServiceTracingProxyProvider; private InsetObserver mInsetObserver; // Created in #onCreate
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeStrictMode.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeStrictMode.java index 2a7f9bf..6eea2d79 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeStrictMode.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeStrictMode.java
@@ -39,9 +39,9 @@ private static final double MAX_UPLOADS_PER_SESSION = 3; private static boolean sIsStrictModeAlreadyConfigured; - private static List<Violation> sCachedViolations = + private static final List<Violation> sCachedViolations = Collections.synchronizedList(new ArrayList<>()); - private static AtomicInteger sNumUploads = new AtomicInteger(); + private static final AtomicInteger sNumUploads = new AtomicInteger(); /** * Always process the violation on the UI thread. This ensures other crash reports are not
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java index d544d7d..817db4f0 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -315,7 +315,6 @@ import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.Arrays; -import java.util.LinkedHashMap; import java.util.List; import java.util.Locale; import java.util.Map; @@ -402,7 +401,7 @@ * instances. */ private static class CipherLazyHolder { - private static CipherFactory sCipherInstance = new CipherFactory(); + private static final CipherFactory sCipherInstance = new CipherFactory(); } /** @@ -1594,11 +1593,10 @@ * @return Whether the Intent was successfully handled. */ private boolean maybeHandleGroupUrlsIntent(Intent intent, TabGroupMetadata tabGroupMetadata) { - final LinkedHashMap<Integer, String> tabIdsToUrls = tabGroupMetadata.tabIdsToUrls; @TabOpenType int tabOpenType = IntentHandler.getTabOpenType(intent); - ArrayList<Tab> tabs = new ArrayList(); - for (Map.Entry<Integer, String> entry : tabIdsToUrls.entrySet()) { + ArrayList<Tab> tabs = new ArrayList<>(); + for (Map.Entry<Integer, String> entry : tabGroupMetadata.tabIdsToUrls) { int tabId = entry.getKey(); String url = entry.getValue(); assert tabId != Tab.INVALID_TAB_ID : "Invalid tab ID";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/IntentHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/IntentHandler.java index c38d99b0..d35a8f91 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/IntentHandler.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/IntentHandler.java
@@ -78,7 +78,6 @@ import java.lang.annotation.RetentionPolicy; import java.util.ArrayList; import java.util.Iterator; -import java.util.LinkedHashMap; import java.util.List; import java.util.Locale; import java.util.Map; @@ -917,8 +916,8 @@ } // Check url validity and remove invalid urls if needed. - LinkedHashMap tabIdsToUrls = tabGroupMetadata.tabIdsToUrls; - Iterator<Entry<Integer, String>> iterator = tabIdsToUrls.entrySet().iterator(); + List<Entry<Integer, String>> tabIdsToUrls = tabGroupMetadata.tabIdsToUrls; + Iterator<Entry<Integer, String>> iterator = tabIdsToUrls.iterator(); while (iterator.hasNext()) { Map.Entry<Integer, String> entry = iterator.next(); String url = entry.getValue();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/LaunchIntentDispatcher.java b/chrome/android/java/src/org/chromium/chrome/browser/LaunchIntentDispatcher.java index 54edc56..b230d653 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/LaunchIntentDispatcher.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/LaunchIntentDispatcher.java
@@ -73,7 +73,7 @@ private static final String TAG = "ActivityDispatcher"; private final Activity mActivity; - private Intent mIntent; + private final Intent mIntent; @IntDef({Action.CONTINUE, Action.FINISH_ACTIVITY, Action.FINISH_ACTIVITY_REMOVE_TASK}) @Retention(RetentionPolicy.SOURCE)
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/SwipeRefreshHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/SwipeRefreshHandler.java index db1a655..91a173e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/SwipeRefreshHandler.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/SwipeRefreshHandler.java
@@ -115,9 +115,9 @@ private SwipeRefreshLayout mSwipeRefreshLayout; // The Tab where the swipe occurs. - private Tab mTab; + private final Tab mTab; - private EmptyTabObserver mTabObserver; + private final EmptyTabObserver mTabObserver; // The container view the SwipeRefreshHandler instance is currently // associated with.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/TabGroupUsageTracker.java b/chrome/android/java/src/org/chromium/chrome/browser/TabGroupUsageTracker.java index aad939f..0bab0d4a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/TabGroupUsageTracker.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/TabGroupUsageTracker.java
@@ -24,7 +24,7 @@ private final ActivityLifecycleDispatcher mActivityLifecycleDispatcher; private final TabModelSelector mTabModelSelector; private final Supplier<Boolean> mIsWarmOnResumeSupplier; - private CallbackController mCallbackController = new CallbackController(); + private final CallbackController mCallbackController = new CallbackController(); /** * @param activityLifecycleDispatcher The {@link ActivityLifecycleDispatcher} for the activity.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/TabUsageTracker.java b/chrome/android/java/src/org/chromium/chrome/browser/TabUsageTracker.java index 9059364..56b7397 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/TabUsageTracker.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/TabUsageTracker.java
@@ -43,7 +43,7 @@ private final TabModelSelector mModelSelector; private @Nullable TabModelSelectorTabModelObserver mTabModelSelectorTabModelObserver; private boolean mApplicationResumed; - private CallbackController mCallbackController = new CallbackController(); + private final CallbackController mCallbackController = new CallbackController(); /** * This method is used to initialize the TabUsageTracker.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/UndoRefocusHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/UndoRefocusHelper.java index 9be7bb9..f089d2d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/UndoRefocusHelper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/UndoRefocusHelper.java
@@ -37,7 +37,7 @@ private int mSelectedTabIdWhenTabClosed = Tab.INVALID_TAB_ID; private boolean mTabSwitcherActive; private Callback<LayoutManagerImpl> mLayoutManagerSupplierCallback; - private boolean mIsTablet; + private final boolean mIsTablet; private int mActivePendingTabClosures; private final List<Set<Tab>> mTabsClosedTogether = new ArrayList<>();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/bluetooth/BluetoothNotificationService.java b/chrome/android/java/src/org/chromium/chrome/browser/app/bluetooth/BluetoothNotificationService.java index 7d68a12a..6230d969 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/app/bluetooth/BluetoothNotificationService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/bluetooth/BluetoothNotificationService.java
@@ -11,6 +11,7 @@ /** See {@link BluetoothNotificationServiceImpl}. */ @NullMarked public class BluetoothNotificationService extends SplitCompatService { + @SuppressWarnings("FieldCanBeFinal") // @IdentifierNameString requires non-final private static @IdentifierNameString String sImplClassName = "org.chromium.chrome.browser.app.bluetooth.BluetoothNotificationServiceImpl";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/bluetooth/BluetoothNotificationServiceImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/app/bluetooth/BluetoothNotificationServiceImpl.java index 638cb54..30a2c5d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/app/bluetooth/BluetoothNotificationServiceImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/bluetooth/BluetoothNotificationServiceImpl.java
@@ -16,7 +16,7 @@ * Bluetooth device or scanning for nearby Bluetooth devices. */ public class BluetoothNotificationServiceImpl extends BluetoothNotificationService.Impl { - private BluetoothNotificationManagerDelegate mManagerDelegate = + private final BluetoothNotificationManagerDelegate mManagerDelegate = new BluetoothNotificationManagerDelegate() { @Override public Intent createTrustedBringTabToFrontIntent(int tabId) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/bookmarks/BookmarkEditActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/app/bookmarks/BookmarkEditActivity.java index 33b9e3af..930abdb 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/app/bookmarks/BookmarkEditActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/bookmarks/BookmarkEditActivity.java
@@ -70,7 +70,7 @@ private MenuItem mDeleteButton; private FrameLayout mFolderPickerRowContainer; - private BookmarkUiPrefs.Observer mBookmarkUiPrefsObserver = + private final BookmarkUiPrefs.Observer mBookmarkUiPrefsObserver = new BookmarkUiPrefs.Observer() { @Override public void onBookmarkRowDisplayPrefChanged( @@ -79,7 +79,7 @@ } }; - private BookmarkModelObserver mBookmarkModelObserver = + private final BookmarkModelObserver mBookmarkModelObserver = new BookmarkModelObserver() { @Override public void bookmarkModelChanged() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/download/home/DownloadActivityLauncher.java b/chrome/android/java/src/org/chromium/chrome/browser/app/download/home/DownloadActivityLauncher.java index 4565e42e..754fa10 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/app/download/home/DownloadActivityLauncher.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/download/home/DownloadActivityLauncher.java
@@ -35,7 +35,7 @@ private static final String EXTRA_SHOW_PREFETCHED_CONTENT = "org.chromium.chrome.browser.download.SHOW_PREFETCHED_CONTENT"; private @DownloadActivityStatus int mActivityStatus = DownloadActivityStatus.NOT_CREATED; - private List<Callback<Activity>> mActivityCallbacks = new ArrayList(); + private final List<Callback<Activity>> mActivityCallbacks = new ArrayList(); /** A set of states that represent the last state change of an Activity. */ @Retention(RetentionPolicy.SOURCE)
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/download/home/DownloadPage.java b/chrome/android/java/src/org/chromium/chrome/browser/app/download/home/DownloadPage.java index b8c0606..07b6b2a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/app/download/home/DownloadPage.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/download/home/DownloadPage.java
@@ -26,7 +26,7 @@ private ActivityStateListener mActivityStateListener; private DownloadManagerCoordinator mDownloadCoordinator; - private String mTitle; + private final String mTitle; /** * Create a new instance of the downloads page.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/serial/SerialNotificationService.java b/chrome/android/java/src/org/chromium/chrome/browser/app/serial/SerialNotificationService.java index 1b59671..c53806f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/app/serial/SerialNotificationService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/serial/SerialNotificationService.java
@@ -11,6 +11,7 @@ /** See {@link SerialNotificationServiceImpl}. */ @NullMarked public class SerialNotificationService extends SplitCompatService { + @SuppressWarnings("FieldCanBeFinal") // @IdentifierNameString requires non-final private static @IdentifierNameString String sImplClassName = "org.chromium.chrome.browser.app.serial.SerialNotificationServiceImpl";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/serial/SerialNotificationServiceImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/app/serial/SerialNotificationServiceImpl.java index 2a67c7b..ca41b0b7 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/app/serial/SerialNotificationServiceImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/serial/SerialNotificationServiceImpl.java
@@ -14,7 +14,7 @@ /** Service that manages the WebSerial notification when a website is connected to a serial port. */ public class SerialNotificationServiceImpl extends SerialNotificationService.Impl { - private SerialNotificationManagerDelegate mManagerDelegate = + private final SerialNotificationManagerDelegate mManagerDelegate = new SerialNotificationManagerDelegate() { @Override public Intent createTrustedBringTabToFrontIntent(int tabId) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/tab_activity_glue/ReparentingTabGroupTask.java b/chrome/android/java/src/org/chromium/chrome/browser/app/tab_activity_glue/ReparentingTabGroupTask.java index 06fc6088..7d5d6f61 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/app/tab_activity_glue/ReparentingTabGroupTask.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/tab_activity_glue/ReparentingTabGroupTask.java
@@ -24,7 +24,7 @@ /** Handles the setup of the Intent to move an entire tab group to a different activity. */ @NullMarked public class ReparentingTabGroupTask { - private TabGroupMetadata mTabGroupMetadata; + private final TabGroupMetadata mTabGroupMetadata; /** * @param tabGroupMetadata {@link TabGroupMetadata} object contains the tab group properties.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/usb/UsbNotificationService.java b/chrome/android/java/src/org/chromium/chrome/browser/app/usb/UsbNotificationService.java index b90eb0d3..0f913101 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/app/usb/UsbNotificationService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/usb/UsbNotificationService.java
@@ -11,6 +11,7 @@ /** See {@link UsbNotificationServiceImpl}. */ @NullMarked public class UsbNotificationService extends SplitCompatService { + @SuppressWarnings("FieldCanBeFinal") // @IdentifierNameString requires non-final private static @IdentifierNameString String sImplClassName = "org.chromium.chrome.browser.app.usb.UsbNotificationServiceImpl";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/usb/UsbNotificationServiceImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/app/usb/UsbNotificationServiceImpl.java index 4ace5c8..99d1297 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/app/usb/UsbNotificationServiceImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/usb/UsbNotificationServiceImpl.java
@@ -17,7 +17,7 @@ * to a USB device. */ public class UsbNotificationServiceImpl extends UsbNotificationService.Impl { - private UsbNotificationManagerDelegate mManagerDelegate = + private final UsbNotificationManagerDelegate mManagerDelegate = new UsbNotificationManagerDelegate() { @Override public Intent createTrustedBringTabToFrontIntent(int tabId) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/iban/AutofillSaveIbanBottomSheetCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/iban/AutofillSaveIbanBottomSheetCoordinator.java index 20f2f79..ae9f05e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/iban/AutofillSaveIbanBottomSheetCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/iban/AutofillSaveIbanBottomSheetCoordinator.java
@@ -42,7 +42,7 @@ private final Context mContext; private final AutofillSaveIbanBottomSheetMediator mMediator; private final AutofillSaveIbanBottomSheetView mView; - private PropertyModel mModel; + private final PropertyModel mModel; protected EditText mNickname; /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/iban/AutofillSaveIbanBottomSheetMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/iban/AutofillSaveIbanBottomSheetMediator.java index d8f3e524..70c883b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/iban/AutofillSaveIbanBottomSheetMediator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/iban/AutofillSaveIbanBottomSheetMediator.java
@@ -43,7 +43,7 @@ private final BottomSheetController mBottomSheetController; private final LayoutStateProvider mLayoutStateProvider; private final TabModel mTabModel; - private boolean mIsServerSave; + private final boolean mIsServerSave; private boolean mFinished; /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/save_card/AutofillSaveCardBottomSheetCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/save_card/AutofillSaveCardBottomSheetCoordinator.java index 74b948c..a6f60b15d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/save_card/AutofillSaveCardBottomSheetCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/save_card/AutofillSaveCardBottomSheetCoordinator.java
@@ -43,7 +43,7 @@ private final Context mContext; private final AutofillSaveCardBottomSheetView mView; private final AutofillSaveCardBottomSheetMediator mMediator; - private PropertyModel mModel; + private final PropertyModel mModel; /** * Creates the coordinator.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/settings/AutofillProfilesFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/settings/AutofillProfilesFragment.java index 4e9f913..f3729fa 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/settings/AutofillProfilesFragment.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/settings/AutofillProfilesFragment.java
@@ -54,7 +54,7 @@ /** Autofill profiles fragment, which allows the user to edit autofill profiles. */ public class AutofillProfilesFragment extends ChromeBaseSettingsFragment implements PersonalDataManager.PersonalDataManagerObserver { - private Delegate mAddressEditorDelegate = + private final Delegate mAddressEditorDelegate = new Delegate() { // User has either created a new address, or edited an existing address. // We should save changes in any case.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/autofill/settings/CreditCardScannerManager.java b/chrome/android/java/src/org/chromium/chrome/browser/autofill/settings/CreditCardScannerManager.java index 6700fe4..dea31dc 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/autofill/settings/CreditCardScannerManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/autofill/settings/CreditCardScannerManager.java
@@ -91,7 +91,7 @@ private final CreditCardScanner mScanner; private final Delegate mDelegate; private @ScanResult int mScanResult; - private Set<FieldType> mFieldsFilledByScanner; + private final Set<FieldType> mFieldsFilledByScanner; private boolean mScanResultLogged; public CreditCardScannerManager(Delegate delegate) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/automotivetoolbar/AutomotiveBackButtonToolbarCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/automotivetoolbar/AutomotiveBackButtonToolbarCoordinator.java index 5ba24671a..e3997e3 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/automotivetoolbar/AutomotiveBackButtonToolbarCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/automotivetoolbar/AutomotiveBackButtonToolbarCoordinator.java
@@ -57,7 +57,7 @@ private Animation mShowOnSwipeToolbarAnimation; private Animation mHideOnSwipeToolbarAnimation; private boolean mIsFullscreen; - private boolean mIsVerticalToolbar; + private final boolean mIsVerticalToolbar; private boolean mIsAnimationActive; interface OnSwipeCallback { @@ -68,7 +68,7 @@ void handleBackSwipe(); } - private OnSwipeCallback mOnSwipeCallback = + private final OnSwipeCallback mOnSwipeCallback = new OnSwipeCallback() { @Override public void handleSwipe() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/automotivetoolbar/EdgeSwipeGestureDetector.java b/chrome/android/java/src/org/chromium/chrome/browser/automotivetoolbar/EdgeSwipeGestureDetector.java index c9accd0..10b227c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/automotivetoolbar/EdgeSwipeGestureDetector.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/automotivetoolbar/EdgeSwipeGestureDetector.java
@@ -36,8 +36,8 @@ private final float mEdgeWidthPx; private final float mSwipeThreshold; - private AutomotiveBackButtonToolbarCoordinator.OnSwipeCallback mOnSwipeCallback; - private GestureDetector mDetector; + private final AutomotiveBackButtonToolbarCoordinator.OnSwipeCallback mOnSwipeCallback; + private final GestureDetector mDetector; private boolean mIsReadyForNewScroll; private final GestureDetector.SimpleOnGestureListener mSwipeGestureListener =
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/backup/ChromeBackupAgent.java b/chrome/android/java/src/org/chromium/chrome/browser/backup/ChromeBackupAgent.java index be38bc0d..bc75930 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/backup/ChromeBackupAgent.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/backup/ChromeBackupAgent.java
@@ -11,6 +11,7 @@ /** See {@link ChromeBackupAgentImpl}. */ @NullMarked public class ChromeBackupAgent extends SplitCompatBackupAgent { + @SuppressWarnings("FieldCanBeFinal") // @IdentifierNameString requires non-final private static @IdentifierNameString String sImplClassName = "org.chromium.chrome.browser.backup.ChromeBackupAgentImpl";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/base/SplitChromeApplication.java b/chrome/android/java/src/org/chromium/chrome/browser/base/SplitChromeApplication.java index c9b0281..a87d0d4 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/base/SplitChromeApplication.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/base/SplitChromeApplication.java
@@ -34,12 +34,18 @@ @NullMarked public class SplitChromeApplication extends SplitCompatApplication { + @SuppressWarnings("FieldCanBeFinal") // @IdentifierNameString requires non-final private static @IdentifierNameString String sImplClassName = "org.chromium.chrome.browser.ChromeApplicationImpl"; + + @SuppressWarnings("FieldCanBeFinal") // @IdentifierNameString requires non-final private static @IdentifierNameString String sChromePreloadName = "org.chromium.chrome.browser.ChromeTabbedActivity$Preload"; + + @SuppressWarnings("FieldCanBeFinal") // @IdentifierNameString requires non-final private static @IdentifierNameString String sGoogle3PreloadName = "org.chromium.chrome.modules.google3.Google3ModuleEntryImpl"; + private static final Object sSplitLock = new Object(); private static final ArraySet<String> sCachedSplits = new ArraySet<>();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatBackupAgent.java b/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatBackupAgent.java index 3295761..1d4aa09 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatBackupAgent.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatBackupAgent.java
@@ -21,7 +21,7 @@ */ @NullMarked public class SplitCompatBackupAgent extends BackupAgent { - private String mBackupAgentClassName; + private final String mBackupAgentClassName; private Impl mImpl; public SplitCompatBackupAgent(String backupAgentClassName) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatContentProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatContentProvider.java index f00a384..17bfd649 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatContentProvider.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatContentProvider.java
@@ -28,7 +28,7 @@ public class SplitCompatContentProvider extends ContentProvider { private final Object mImplLock = new Object(); private @Nullable Impl mImpl; - private String mContentProviderClassName; + private final String mContentProviderClassName; public SplitCompatContentProvider(String contentProviderClassName) { mContentProviderClassName = contentProviderClassName;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatCustomTabsService.java b/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatCustomTabsService.java index a7c8f96..654ee13 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatCustomTabsService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatCustomTabsService.java
@@ -29,7 +29,7 @@ */ @NullMarked public class SplitCompatCustomTabsService extends CustomTabsService { - private String mServiceClassName; + private final String mServiceClassName; private Impl mImpl; public SplitCompatCustomTabsService(String serviceClassName) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatGcmListenerService.java b/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatGcmListenerService.java index 83183af..0ce12c9 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatGcmListenerService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatGcmListenerService.java
@@ -19,7 +19,7 @@ */ @NullMarked public class SplitCompatGcmListenerService extends FirebaseMessagingService { - private String mServiceClassName; + private final String mServiceClassName; private Impl mImpl; public SplitCompatGcmListenerService(String serviceClassName) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatGcmTaskService.java b/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatGcmTaskService.java index 399eed6..d21b88e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatGcmTaskService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatGcmTaskService.java
@@ -18,7 +18,7 @@ */ @NullMarked public class SplitCompatGcmTaskService extends GcmTaskService { - private String mServiceClassName; + private final String mServiceClassName; private Impl mImpl; public SplitCompatGcmTaskService(String serviceClassName) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatIntentService.java b/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatIntentService.java index aca980d..3c858d9 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatIntentService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatIntentService.java
@@ -17,7 +17,7 @@ */ @NullMarked public class SplitCompatIntentService extends IntentService { - private String mServiceClassName; + private final String mServiceClassName; private Impl mImpl; public SplitCompatIntentService(String serviceClassName, String name) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatJobService.java b/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatJobService.java index 2f9b947..f3329efb 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatJobService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatJobService.java
@@ -20,8 +20,8 @@ */ @NullMarked public class SplitCompatJobService extends JobService { - private String mServiceClassName; - private String mSplitName; + private final String mServiceClassName; + private final String mSplitName; private Impl mImpl; public SplitCompatJobService(String serviceClassName) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatMinidumpUploadJobService.java b/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatMinidumpUploadJobService.java index 0e90d0e..b6d2944 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatMinidumpUploadJobService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatMinidumpUploadJobService.java
@@ -18,7 +18,7 @@ */ @NullMarked public class SplitCompatMinidumpUploadJobService extends MinidumpUploadJobService { - private String mServiceClassName; + private final String mServiceClassName; private Impl mImpl; public SplitCompatMinidumpUploadJobService(String serviceClassName) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatRemoteViewsService.java b/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatRemoteViewsService.java index 484e76c1..5f4e8f4 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatRemoteViewsService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatRemoteViewsService.java
@@ -17,7 +17,7 @@ */ @NullMarked public class SplitCompatRemoteViewsService extends RemoteViewsService { - private String mServiceClassName; + private final String mServiceClassName; private Impl mImpl; public SplitCompatRemoteViewsService(String serviceClassName) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatService.java b/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatService.java index 38da51e..a43a79e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/base/SplitCompatService.java
@@ -19,7 +19,7 @@ */ @NullMarked public class SplitCompatService extends Service { - private String mServiceClassName; + private final String mServiceClassName; private Impl mImpl; public SplitCompatService(String serviceClassName) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/base/SplitMonochromeApplication.java b/chrome/android/java/src/org/chromium/chrome/browser/base/SplitMonochromeApplication.java index eb248c9..643f717 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/base/SplitMonochromeApplication.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/base/SplitMonochromeApplication.java
@@ -17,6 +17,7 @@ * SplitChromeApplication} for more info. */ public class SplitMonochromeApplication extends SplitChromeApplication { + @SuppressWarnings("FieldCanBeFinal") // @IdentifierNameString requires non-final private static @IdentifierNameString String sImplClassName = "org.chromium.chrome.browser.MonochromeApplicationImpl";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/bookmarkswidget/BookmarkWidgetService.java b/chrome/android/java/src/org/chromium/chrome/browser/bookmarkswidget/BookmarkWidgetService.java index 5c60a325..9989fde 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/bookmarkswidget/BookmarkWidgetService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/bookmarkswidget/BookmarkWidgetService.java
@@ -11,6 +11,7 @@ /** See {@link BookmarkWidgetServiceImpl}. */ @NullMarked public class BookmarkWidgetService extends SplitCompatRemoteViewsService { + @SuppressWarnings("FieldCanBeFinal") // @IdentifierNameString requires non-final private static @IdentifierNameString String sImplClassName = "org.chromium.chrome.browser.bookmarkswidget.BookmarkWidgetServiceImpl";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/browserservices/ui/controller/trustedwebactivity/TwaVerifier.java b/chrome/android/java/src/org/chromium/chrome/browser/browserservices/ui/controller/trustedwebactivity/TwaVerifier.java index f65ba4e..5434250 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/browserservices/ui/controller/trustedwebactivity/TwaVerifier.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/browserservices/ui/controller/trustedwebactivity/TwaVerifier.java
@@ -40,7 +40,7 @@ private boolean mDestroyed; /** All the origins that have been successfully verified. */ - private Set<Origin> mVerifiedOrigins = new HashSet<>(); + private final Set<Origin> mVerifiedOrigins = new HashSet<>(); public TwaVerifier( ActivityLifecycleDispatcher lifecycleDispatcher,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/browserservices/ui/splashscreen/SplashController.java b/chrome/android/java/src/org/chromium/chrome/browser/browserservices/ui/splashscreen/SplashController.java index 129c390a..cc51e4f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/browserservices/ui/splashscreen/SplashController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/browserservices/ui/splashscreen/SplashController.java
@@ -89,12 +89,12 @@ private long mSplashShownTimestamp; /** Indicates whether translucency should be removed. */ - private boolean mIsWindowInitiallyTranslucent; + private final boolean mIsWindowInitiallyTranslucent; /** Whether translucency was removed. */ private boolean mRemovedTranslucency; - private ObserverList<SplashscreenObserver> mObservers; + private final ObserverList<SplashscreenObserver> mObservers; public SplashController( Activity activity,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/browserservices/ui/splashscreen/webapps/WebappSplashController.java b/chrome/android/java/src/org/chromium/chrome/browser/browserservices/ui/splashscreen/webapps/WebappSplashController.java index 56e8f1b..b9f21ee 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/browserservices/ui/splashscreen/webapps/WebappSplashController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/browserservices/ui/splashscreen/webapps/WebappSplashController.java
@@ -32,9 +32,9 @@ public class WebappSplashController implements SplashDelegate { public static final int HIDE_ANIMATION_DURATION_MS = 300; - private SplashController mSplashController; - private TabObserverRegistrar mTabObserverRegistrar; - private WebappInfo mWebappInfo; + private final SplashController mSplashController; + private final TabObserverRegistrar mTabObserverRegistrar; + private final WebappInfo mWebappInfo; private WebApkSplashNetworkErrorObserver mWebApkNetworkErrorObserver;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/BrowsingDataCounterBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/BrowsingDataCounterBridge.java index 727f152..7780e41 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/BrowsingDataCounterBridge.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/BrowsingDataCounterBridge.java
@@ -27,7 +27,7 @@ } private long mNativeBrowsingDataCounterBridge; - private BrowsingDataCounterCallback mCallback; + private final BrowsingDataCounterCallback mCallback; /** * Initializes BrowsingDataCounterBridge.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataFetcher.java b/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataFetcher.java index 8ee0861..10ff96a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataFetcher.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/ClearBrowsingDataFetcher.java
@@ -16,7 +16,7 @@ BrowsingDataBridge.OtherFormsOfBrowsingHistoryListener, Parcelable { // This is a constant on the C++ side. - private int mMaxImportantSites; + private final int mMaxImportantSites; // This is the sorted list of important registerable domains. If null, then we haven't finished // fetching them yet. private String[] mSortedImportantDomains;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/ConfirmImportantSitesDialogFragment.java b/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/ConfirmImportantSitesDialogFragment.java index d16e066..83cd360a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/ConfirmImportantSitesDialogFragment.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/browsing_data/ConfirmImportantSitesDialogFragment.java
@@ -60,7 +60,7 @@ implements AdapterView.OnItemClickListener { private final String[] mDomains; private final int mFaviconSize; - private RoundedIconGenerator mIconGenerator; + private final RoundedIconGenerator mIconGenerator; private ClearBrowsingDataAdapter( String[] domains, String[] faviconURLs, Resources resources) { @@ -203,13 +203,13 @@ private String[] mImportantDomains; /** Map of the reasons the above important domains were chosen. */ - private Map<String, Integer> mImportantDomainsReasons; + private final Map<String, Integer> mImportantDomainsReasons; /** Array of favicon urls to use for each important domain above. */ private String[] mFaviconURLs; /** The map of domains to the checked state, where true is checked. */ - private Map<String, Boolean> mCheckedState; + private final Map<String, Boolean> mCheckedState; /** The alert dialog shown to the user. */ private AlertDialog mDialog;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorSurfaceManagerImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorSurfaceManagerImpl.java index f8c32fb..3ff5300 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorSurfaceManagerImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorSurfaceManagerImpl.java
@@ -39,7 +39,7 @@ */ class CompositorSurfaceManagerImpl implements SurfaceHolder.Callback2, CompositorSurfaceManager { private static class SurfaceState { - public SurfaceView surfaceView; + public final SurfaceView surfaceView; // Do we expect a surfaceCreated? public boolean createPending; @@ -126,7 +126,7 @@ private SurfaceState mRequestedByClient; // Client that we notify about surface change events. - private SurfaceManagerCallbackTarget mClient; + private final SurfaceManagerCallbackTarget mClient; // View to which we'll attach the SurfaceView. private final ViewGroup mParentView;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java index e83ee29f..4bb87ae 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/CompositorViewHolder.java
@@ -1797,7 +1797,7 @@ */ private class CompositorAccessibilityProvider extends ExploreByTouchHelper { private final float mDpToPx; - List<VirtualView> mVirtualViews = new ArrayList<>(); + final List<VirtualView> mVirtualViews = new ArrayList<>(); private final Rect mPlaceHolderRect = new Rect(0, 0, 1, 1); private static final String PLACE_HOLDER_STRING = ""; private final RectF mTouchTarget = new RectF();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/LayerTitleCache.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/LayerTitleCache.java index b56edd1..ef3e1ea 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/LayerTitleCache.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/LayerTitleCache.java
@@ -66,7 +66,7 @@ private final ResourceManager mResourceManager; private FaviconHelper mFaviconHelper; - private DefaultFaviconHelper mDefaultFaviconHelper; + private final DefaultFaviconHelper mDefaultFaviconHelper; /** Responsible for building titles on light themes or standard tabs. */ protected final TitleBitmapFactory mStandardTitleBitmapFactory;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelBase.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelBase.java index d6a2857..d74f489 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelBase.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelBase.java
@@ -110,7 +110,7 @@ protected final float mPxToDp; /** The height of the Toolbar in dp. */ - private float mToolbarHeightDp; + private final float mToolbarHeightDp; /** The background color of the Bar. */ private final @ColorInt int mBarBackgroundColor; @@ -560,7 +560,7 @@ private float mBarHeight; private boolean mIsBarBorderVisible; - private float mBarBorderHeight; + private final float mBarBorderHeight; private float mCloseIconOpacity; private float mCloseIconWidth; @@ -719,7 +719,7 @@ private float mProgressBarOpacity; private boolean mIsProgressBarVisible; - private float mProgressBarHeight; + private final float mProgressBarHeight; private float mProgressBarCompletion; /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelContent.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelContent.java index a8d6761..98a35e2 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelContent.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelContent.java
@@ -75,7 +75,7 @@ private long mNativeOverlayPanelContentPtr; /** The activity that this content is contained in. */ - private Activity mActivity; + private final Activity mActivity; /** Observer used for tracking loading and navigation. */ private WebContentsObserver mWebContentsObserver; @@ -109,10 +109,10 @@ private boolean mIsContentViewShowing; /** The observer used by this object to inform implementers of different events. */ - private OverlayPanelContentDelegate mContentDelegate; + private final OverlayPanelContentDelegate mContentDelegate; /** Used to observe progress bar events. */ - private OverlayPanelContentProgressObserver mProgressObserver; + private final OverlayPanelContentProgressObserver mProgressObserver; /** If a URL is set to delayed load (load on user interaction), it will be stored here. */ private String mPendingUrl;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelManager.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelManager.java index 76f2595..b61cf95c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelManager.java
@@ -60,7 +60,7 @@ * If a panel was being shown and another panel with higher priority was requested to show, * the lower priority one is stored here. */ - private Queue<OverlayPanel> mSuppressedPanels; + private final Queue<OverlayPanel> mSuppressedPanels; /** When a panel is suppressed, this is the panel waiting for the close animation to finish. */ private OverlayPanel mPendingPanel;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchBarControl.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchBarControl.java index 448eebd4..c609424 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchBarControl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchBarControl.java
@@ -55,7 +55,7 @@ private final ContextualSearchCardIconControl mCardIconControl; /** The {@link ContextualSearchImageControl} for the panel. */ - private ContextualSearchImageControl mImageControl; + private final ContextualSearchImageControl mImageControl; /** * The opacity of the Bar's Search Context.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanel.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanel.java index a15d75f..25a23dc 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanel.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchPanel.java
@@ -111,7 +111,7 @@ private boolean mHasContentBeenTouched; /** The compositor layer used for drawing the panel. */ - private ContextualSearchSceneLayer mSceneLayer; + private final ContextualSearchSceneLayer mSceneLayer; /** * A ScrimManager for adjusting the Status Bar's brightness when a scrim is present (when the
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchQuickActionControl.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchQuickActionControl.java index 18e8983..520800b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchQuickActionControl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchQuickActionControl.java
@@ -40,7 +40,7 @@ * number or launching Maps for a street address. */ public class ContextualSearchQuickActionControl extends ViewResourceInflater { - private Context mContext; + private final Context mContext; private String mQuickActionUri; private int mQuickActionCategory; private int mToolbarBackgroundColor;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/RelatedSearchesControl.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/RelatedSearchesControl.java index 113ae39..d5590ce 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/RelatedSearchesControl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/RelatedSearchesControl.java
@@ -91,7 +91,7 @@ private float mViewY; /** The reference to the host for this part of the panel (callbacks to the Panel). */ - private RelatedSearchesSectionHost mPanelSectionHost; + private final RelatedSearchesSectionHost mPanelSectionHost; /** The number of chips that have been selected so far. */ private int mChipsSelected;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/StaticLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/StaticLayout.java index e8dcb5f..13c2dc1 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/StaticLayout.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/StaticLayout.java
@@ -49,8 +49,8 @@ public class StaticLayout extends Layout { public static final String TAG = "StaticLayout"; - private boolean mHandlesTabLifecycles; - private boolean mNeedsOffsetTag; + private final boolean mHandlesTabLifecycles; + private final boolean mNeedsOffsetTag; private final Context mContext; private final LayoutManagerHost mViewHost; @@ -64,8 +64,8 @@ private TabModelSelectorTabModelObserver mTabModelSelectorTabModelObserver; private TabModelSelectorTabObserver mTabModelSelectorTabObserver; - private BrowserControlsStateProvider mBrowserControlsStateProvider; - private BrowserControlsStateProvider.Observer mBrowserControlsStateProviderObserver; + private final BrowserControlsStateProvider mBrowserControlsStateProvider; + private final BrowserControlsStateProvider.Observer mBrowserControlsStateProviderObserver; private final Supplier<TopUiThemeColorProvider> mTopUiThemeColorProvider; @@ -73,7 +73,7 @@ private static Integer sToolbarTextBoxBackgroundColorForTesting; - private float mPxToDp; + private final float mPxToDp; /** * Creates an instance of the {@link StaticLayout}.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/ToolbarSwipeLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/ToolbarSwipeLayout.java index d7b0e96..da1f16f9 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/ToolbarSwipeLayout.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/ToolbarSwipeLayout.java
@@ -77,13 +77,13 @@ private TopToolbarOverlayCoordinator mLeftToolbarOverlay; private TopToolbarOverlayCoordinator mRightToolbarOverlay; - private ObservableSupplierImpl<Tab> mLeftTabSupplier; - private ObservableSupplierImpl<Tab> mRightTabSupplier; + private final ObservableSupplierImpl<Tab> mLeftTabSupplier; + private final ObservableSupplierImpl<Tab> mRightTabSupplier; private final ViewGroup mContentContainer; // Whether or not to show the toolbar. - private boolean mMoveToolbar; + private final boolean mMoveToolbar; // Offsets are in pixels [0, width]. private float mOffsetStart;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/components/TintedCompositorButton.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/components/TintedCompositorButton.java index 9780f554..5b600d86 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/components/TintedCompositorButton.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/components/TintedCompositorButton.java
@@ -15,7 +15,7 @@ /** Class for a CompositorButton that uses tint instead of multiple drawable resources. */ public class TintedCompositorButton extends CompositorButton { - private Context mContext; + private final Context mContext; private @ColorInt int mBackgroundDefaultTint; private @ColorInt int mBackgroundPressedTint;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/eventfilter/AreaMotionEventFilter.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/eventfilter/AreaMotionEventFilter.java index 7f61245..f99d03e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/eventfilter/AreaMotionEventFilter.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/eventfilter/AreaMotionEventFilter.java
@@ -29,7 +29,7 @@ private boolean mHoverExitedArea; /** The handler for this instance that is used to notify owner of events/actions. */ - private MotionEventHandler mHandler; + private final MotionEventHandler mHandler; /** * Creates a {@link AreaMotionEventFilter}.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/eventfilter/MotionEventFilter.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/eventfilter/MotionEventFilter.java index 0782149..19a1c1d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/eventfilter/MotionEventFilter.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/eventfilter/MotionEventFilter.java
@@ -27,8 +27,8 @@ private boolean mInLongPress; private boolean mSeenFirstScrollEvent; private int mButtons; - private LongPressRunnable mLongPressRunnable = new LongPressRunnable(); - private Handler mLongPressHandler = new Handler(); + private final LongPressRunnable mLongPressRunnable = new LongPressRunnable(); + private final Handler mLongPressHandler = new Handler(); /** A runnable to send a delayed long press. */ private class LongPressRunnable implements Runnable {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/AnimationInterruptorUnitTest.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/AnimationInterruptorUnitTest.java index e41d0f7..3ca80fc 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/AnimationInterruptorUnitTest.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/AnimationInterruptorUnitTest.java
@@ -48,9 +48,9 @@ @Captor private ArgumentCaptor<LayoutStateObserver> mLayoutStateObserverCaptor; @Captor private ArgumentCaptor<TabObserver> mTabObserverCaptor; - private UserDataHost mUserDataHost = new UserDataHost(); - private ObservableSupplierImpl<Tab> mCurrentTabSupplier = new ObservableSupplierImpl<>(); - private ObservableSupplierImpl<Boolean> mScrimVisibilitySupplier = + private final UserDataHost mUserDataHost = new UserDataHost(); + private final ObservableSupplierImpl<Tab> mCurrentTabSupplier = new ObservableSupplierImpl<>(); + private final ObservableSupplierImpl<Boolean> mScrimVisibilitySupplier = new ObservableSupplierImpl<>(); private AnimationInterruptor mAnimationInterruptor; private int mInterruptCount;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/NewBackgroundTabAnimationHostView.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/NewBackgroundTabAnimationHostView.java index dc25447..ec3a4bbb 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/NewBackgroundTabAnimationHostView.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/NewBackgroundTabAnimationHostView.java
@@ -146,19 +146,20 @@ mIsTopToolbar = isTopToolbar; mFakeTabSwitcherButton.setTabCount(tabCount, isIncognito); + Context context = getContext(); + @BrandedColorScheme + int brandedColorScheme = + ThemeUtils.getBrandedColorScheme(context, backgroundColor, isIncognito); + mFakeTabSwitcherButton.setBrandedColorScheme(brandedColorScheme); + Rect tabSwitcherRect = new Rect(); boolean tabSwitcherButtonIsVisible = tabSwitcherButton.getGlobalVisibleRect(tabSwitcherRect); int horizontalMargin = tabSwitcherRect.left; int verticalMargin = toolbarHeight - statusBarHeight; - Context context = getContext(); if (tabSwitcherButtonIsVisible || !isNtp) { mAnimationType = AnimationType.DEFAULT; - @BrandedColorScheme - int brandedColorScheme = - ThemeUtils.getBrandedColorScheme(context, backgroundColor, isIncognito); - mFakeTabSwitcherButton.setBrandedColorScheme(brandedColorScheme); mFakeTabSwitcherButton.setButtonColor(backgroundColor); mFakeTabSwitcherButton.setNotificationIconStatus( tabSwitcherButton.shouldShowNotificationIcon());
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/NewTabAnimationLayoutUnitTest.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/NewTabAnimationLayoutUnitTest.java index 6fb6a6e..9a9e2579 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/NewTabAnimationLayoutUnitTest.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/phone/NewTabAnimationLayoutUnitTest.java
@@ -117,10 +117,10 @@ @Mock private View mToolbar; @Mock private NewTabPage mNtp; - private ObservableSupplierImpl<Tab> mCurrentTabSupplier = new ObservableSupplierImpl<>(); - private ObservableSupplierImpl<CompositorViewHolder> mCompositorViewHolderSupplier = + private final ObservableSupplierImpl<Tab> mCurrentTabSupplier = new ObservableSupplierImpl<>(); + private final ObservableSupplierImpl<CompositorViewHolder> mCompositorViewHolderSupplier = new ObservableSupplierImpl<>(); - private ObservableSupplierImpl<Boolean> mScrimVisibilitySupplier = + private final ObservableSupplierImpl<Boolean> mScrimVisibilitySupplier = new ObservableSupplierImpl<>(); private NewTabAnimationLayout mNewTabAnimationLayout; private FrameLayout mContentContainer;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java index 5540646c..4fd1174 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelper.java
@@ -423,7 +423,7 @@ * The {@link Supplier} for the width of a tab based on the number of tabs and the available * space on the tab strip. Constricted by MIN_TAB_WIDTH_DP and MAX_TAB_WIDTH_DP. */ - private ObservableSupplierImpl<Float> mCachedTabWidthSupplier = + private final ObservableSupplierImpl<Float> mCachedTabWidthSupplier = new ObservableSupplierImpl<>(0f); // Reorder State @@ -462,7 +462,7 @@ // Tab menu item IDs public static final int ID_CLOSE_ALL_TABS = 0; - private Context mContext; + private final Context mContext; // Animation states. True while the relevant animations are running, and false otherwise. private boolean mMultiStepTabCloseAnimRunning; @@ -519,20 +519,20 @@ // Tab context menu. @Nullable private TabContextMenuCoordinator mTabContextMenuCoordinator; @Nullable private TabGroupListBottomSheetCoordinator mTabGroupListBottomSheetCoordinator; - @NonNull private MultiInstanceManager mMultiInstanceManager; + @NonNull private final MultiInstanceManager mMultiInstanceManager; // Tab group share. @NonNull private DataSharingService mDataSharingService; @NonNull private CollaborationService mCollaborationService; - @Nullable private DataSharingTabManager mDataSharingTabManager; + @Nullable private final DataSharingTabManager mDataSharingTabManager; @Nullable private DataSharingService.Observer mDataSharingObserver; @Nullable private TabGroupSyncService mTabGroupSyncService; @Nullable private TabGroupSyncService.Observer mTabGroupSyncObserver; - private ModalDialogManager mModalDialogManager; + private final ModalDialogManager mModalDialogManager; // IPH on tab strip. private TabStripIphController mTabStripIphController; - private List<QueuedIph> mQueuedIphList = new ArrayList<>(); + private final List<QueuedIph> mQueuedIphList = new ArrayList<>(); @FunctionalInterface interface QueuedIph {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java index a0e03645..d312a259 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperManager.java
@@ -213,7 +213,7 @@ private final float mDensity; private int mOrientation; @Nullable private TintedCompositorButton mModelSelectorButton; - private Context mContext; + private final Context mContext; private float mStripTransitionScrimOpacity; private Animator mFadeTransitionAnimator; // This will be set only when a strip height transition runs to update the strip visibility and @@ -223,7 +223,7 @@ private final StatusBarColorController mStatusBarColorController; private TabStripSceneLayer mTabStripTreeProvider; private TabStripEventHandler mTabStripEventHandler; - private TabSwitcherLayoutObserver mTabSwitcherLayoutObserver; + private final TabSwitcherLayoutObserver mTabSwitcherLayoutObserver; private final View mToolbarControlContainer; private final ViewStub mTabHoverCardViewStub; @Nullable private TooltipManager mTooltipManager; @@ -240,7 +240,7 @@ private final DesktopWindowStateManager mDesktopWindowStateManager; // 3-dots menu button with tab strip end padding - private float mStripEndPadding; + private final float mStripEndPadding; private TabModelSelectorTabModelObserver mTabModelSelectorTabModelObserver; private TabModelSelectorTabObserver mTabModelSelectorTabObserver; private final Callback<TabModel> mCurrentTabModelObserver = @@ -254,7 +254,7 @@ private final ObservableSupplier<LayerTitleCache> mLayerTitleCacheSupplier; private final BrowserControlsStateProvider mBrowserControlsStateProvider; private final Callback<Integer> mStripVisibilityStateObserver; - private ObservableSupplierImpl<Integer> mStripVisibilityStateSupplier; + private final ObservableSupplierImpl<Integer> mStripVisibilityStateSupplier; // Drag-Drop @Nullable private TabDragSource mTabDragSource;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutTab.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutTab.java index 8160c3e..5e57c39 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutTab.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutTab.java
@@ -171,7 +171,7 @@ // Preallocated private final RectF mClosePlacement = new RectF(); - private ObserverList<Observer> mObservers = new ObserverList<>(); + private final ObserverList<Observer> mObservers = new ObserverList<>(); /** * Create a {@link StripLayoutTab} that represents the {@link Tab} with an id of {@code id}.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/TabGroupContextMenuCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/TabGroupContextMenuCoordinator.java index e261c2d..2a8db4f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/TabGroupContextMenuCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/TabGroupContextMenuCoordinator.java
@@ -84,8 +84,8 @@ // updated or default title. private String mCurrentModifiedTitle; private boolean mIsPresetTitleUsed; - private WindowAndroid mWindowAndroid; - private KeyboardVisibilityDelegate.KeyboardVisibilityListener mKeyboardVisibilityListener; + private final WindowAndroid mWindowAndroid; + private final KeyboardVisibilityDelegate.KeyboardVisibilityListener mKeyboardVisibilityListener; protected CollaborationService mCollaborationService; private final TabGroupModelFilterObserver mTabGroupModelFilterObserver = new TabGroupModelFilterObserver() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/TabLoadTracker.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/TabLoadTracker.java index bb8f5a2..d57cac7 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/TabLoadTracker.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/TabLoadTracker.java
@@ -66,7 +66,7 @@ return mLoading; } - private Runnable mLoadFinishedRunnable = + private final Runnable mLoadFinishedRunnable = new Runnable() { @Override public void run() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/reorder/GroupReorderStrategy.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/reorder/GroupReorderStrategy.java index 23b677a..9078a68 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/reorder/GroupReorderStrategy.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/reorder/GroupReorderStrategy.java
@@ -35,7 +35,7 @@ /** Tab group reorder - drag collapsed or expanded group within the tab strip. */ public class GroupReorderStrategy extends ReorderStrategyBase { private StripLayoutGroupTitle mInteractingGroupTitle; - private ArrayList<StripLayoutView> mInteractingViews = new ArrayList<>(); + private final ArrayList<StripLayoutView> mInteractingViews = new ArrayList<>(); private StripLayoutTab mSelectedTab; private StripLayoutTab mFirstTabInGroup; private StripLayoutTab mLastTabInGroup;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/reorder/SourceViewDragDropReorderStrategy.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/reorder/SourceViewDragDropReorderStrategy.java index 87915e53..2040c63e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/reorder/SourceViewDragDropReorderStrategy.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/reorder/SourceViewDragDropReorderStrategy.java
@@ -372,7 +372,7 @@ } private class GroupReorderSubStrategy extends ReorderSubStrategy { - List<StripLayoutView> mViewsBeingDragged = new ArrayList<>(); + final List<StripLayoutView> mViewsBeingDragged = new ArrayList<>(); GroupReorderSubStrategy(ReorderStrategy groupReorderStrategy) { super(groupReorderStrategy);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/reorder/StripDragShadowView.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/reorder/StripDragShadowView.java index 7da8f76..2f058d8 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/reorder/StripDragShadowView.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/reorder/StripDragShadowView.java
@@ -78,7 +78,7 @@ // Internal State private int mSourceWidthPx; - private int mSourceHeightPx; + private final int mSourceHeightPx; private int mWidthPx; private int mHeightPx; private float mProgress;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/reorder/TabDragSource.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/reorder/TabDragSource.java index 7dd910c..ac45b7ad 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/reorder/TabDragSource.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/overlays/strip/reorder/TabDragSource.java
@@ -773,9 +773,9 @@ @VisibleForTesting static class TabDragShadowBuilder extends View.DragShadowBuilder { // Touch offset for drag shadow view. - private PointF mDragShadowOffset; + private final PointF mDragShadowOffset; // Source initiating drag - to call updateDragShadow(). - private View mDragSourceView; + private final View mDragSourceView; // Whether drag shadow should be shown. private boolean mShowDragShadow;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contacts_picker/ChromePickerAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/contacts_picker/ChromePickerAdapter.java index 720956c2..4cccf5b7d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contacts_picker/ChromePickerAdapter.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contacts_picker/ChromePickerAdapter.java
@@ -38,7 +38,7 @@ private final Profile mProfile; // The profile data cache to consult when figuring out the signed in user. - private ProfileDataCache mProfileDataCache; + private final ProfileDataCache mProfileDataCache; // Whether an observer for ProfileDataCache has been registered. private boolean mObserving;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator.java index ccdc0f5..ce795c2 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ChromeContextMenuPopulator.java
@@ -97,7 +97,7 @@ private final @ContextMenuMode int mMode; private final Supplier<ShareDelegate> mShareDelegateSupplier; private final ContextMenuParams mParams; - private ContextMenuNativeDelegate mNativeDelegate; + private final ContextMenuNativeDelegate mNativeDelegate; private static final String LENS_SUPPORT_STATUS_HISTOGRAM_NAME = "ContextMenu.LensSupportStatus"; private final boolean mIsDownloadRestrictedByPolicy;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuChipController.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuChipController.java index 7c9f0c69..3ca60ec 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuChipController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuChipController.java
@@ -23,10 +23,10 @@ /** A controller to handle chip construction and cross-app communication. */ class ContextMenuChipController implements View.OnClickListener { - private View mAnchorView; + private final View mAnchorView; private ChipView mChipView; private AnchoredPopupWindow mPopupWindow; - private Context mContext; + private final Context mContext; private ChipRenderParams mChipRenderParams; private final Runnable mDismissContextMenuCallback;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuCoordinator.java index 4118be92..e5f87363 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuCoordinator.java
@@ -78,10 +78,10 @@ private ContextMenuHeaderCoordinator mHeaderCoordinator; private ContextMenuListView mListView; - private float mTopContentOffsetPx; + private final float mTopContentOffsetPx; private ContextMenuDialog mDialog; private Runnable mOnMenuClosed; - private ContextMenuNativeDelegate mNativeDelegate; + private final ContextMenuNativeDelegate mNativeDelegate; private boolean mIsInterestTargetWithShiftedMenu; /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuHeaderCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuHeaderCoordinator.java index 949288d..6f6c6315 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuHeaderCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuHeaderCoordinator.java
@@ -25,7 +25,7 @@ import org.chromium.ui.modelutil.PropertyModel; class ContextMenuHeaderCoordinator { - private PropertyModel mModel; + private final PropertyModel mModel; ContextMenuHeaderCoordinator( Activity activity,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuHeaderMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuHeaderMediator.java index 93f8b6c..076df4a05 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuHeaderMediator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/ContextMenuHeaderMediator.java
@@ -33,10 +33,10 @@ import org.chromium.url.GURL; class ContextMenuHeaderMediator implements View.OnClickListener { - private PropertyModel mModel; + private final PropertyModel mModel; - private Context mContext; - private GURL mPlainUrl; + private final Context mContext; + private final GURL mPlainUrl; ContextMenuHeaderMediator( Context context,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/LensChipDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/LensChipDelegate.java index 6189267..b95f787 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/LensChipDelegate.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextmenu/LensChipDelegate.java
@@ -19,9 +19,9 @@ /** The class to handle Lens chip data and actions. */ public class LensChipDelegate implements ChipDelegate { - private static LensController sLensController = LensController.getInstance(); + private static final LensController sLensController = LensController.getInstance(); private static boolean sShouldSkipIsEnabledCheckForTesting; - private boolean mIsChipSupported; + private final boolean mIsChipSupported; private LensQueryParams mLensQueryParams; private ContextMenuNativeDelegate mNativeDelegate; private Callback<Integer> mOnChipClickedCallback;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java index 8491906..4919616 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManager.java
@@ -166,8 +166,8 @@ // The panel. private ContextualSearchPanel mSearchPanel; - private ObservableSupplierImpl<OverlayPanelStateProvider> mOverlayPanelStateProviderSupplier = - new ObservableSupplierImpl<>(); + private final ObservableSupplierImpl<OverlayPanelStateProvider> + mOverlayPanelStateProviderSupplier = new ObservableSupplierImpl<>(); // The native manager associated with this object. private long mNativeContextualSearchManagerPtr; @@ -227,7 +227,7 @@ private int mSelectAroundCaretCounter; /** A means of accessing the currently active tab. */ - private Supplier<Tab> mTabSupplier; + private final Supplier<Tab> mTabSupplier; /** A means of observing scene changes and attaching overlays. */ private LayoutManagerImpl mLayoutManager;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchRequest.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchRequest.java index 07b5a54..ba97a449 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchRequest.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchRequest.java
@@ -35,7 +35,7 @@ private boolean mIsLowPriority; private boolean mHasFailedLowPriorityLoad; private boolean mIsTranslationForced; - private boolean mIsFullSearchUrlProvided; + private final boolean mIsFullSearchUrlProvided; private static final String GWS_NORMAL_PRIORITY_SEARCH_PATH = "search"; private static final String GWS_LOW_PRIORITY_SEARCH_PATH = "s";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchTabHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchTabHelper.java index d29a76d..85ae086 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchTabHelper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchTabHelper.java
@@ -71,7 +71,7 @@ /** Whether the current default search engine is Google. Is {@code null} if not inited. */ private Boolean mIsDefaultSearchEngineGoogle; - private Callback<ContextualSearchManager> mManagerCallback; + private final Callback<ContextualSearchManager> mManagerCallback; /** The ReadAloudController supplier to get the active playback tab supplier when available. */ private ObservableSupplier<ReadAloudController> mReadAloudControllerSupplier;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/crash/ChromeMinidumpUploadJobService.java b/chrome/android/java/src/org/chromium/chrome/browser/crash/ChromeMinidumpUploadJobService.java index 95bfdc8..e2256c38 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/crash/ChromeMinidumpUploadJobService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/crash/ChromeMinidumpUploadJobService.java
@@ -12,6 +12,7 @@ /** See {@link ChromeMinidumpUploadJobServiceImpl}. */ @NullMarked public class ChromeMinidumpUploadJobService extends SplitCompatMinidumpUploadJobService { + @SuppressWarnings("FieldCanBeFinal") // @IdentifierNameString requires non-final private static @IdentifierNameString String sImplClassName = "org.chromium.chrome.browser.crash.ChromeMinidumpUploadJobServiceImpl";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/crash/MinidumpUploadService.java b/chrome/android/java/src/org/chromium/chrome/browser/crash/MinidumpUploadService.java index d16ce04..1b98255 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/crash/MinidumpUploadService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/crash/MinidumpUploadService.java
@@ -13,6 +13,7 @@ public class MinidumpUploadService extends SplitCompatIntentService { private static final String TAG = "MinidmpUploadService"; + @SuppressWarnings("FieldCanBeFinal") // @IdentifierNameString requires non-final private static @IdentifierNameString String sImplClassName = "org.chromium.chrome.browser.crash.MinidumpUploadServiceImpl";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/crash/MinidumpUploadServiceImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/crash/MinidumpUploadServiceImpl.java index 5b486cbc..525d2d6 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/crash/MinidumpUploadServiceImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/crash/MinidumpUploadServiceImpl.java
@@ -68,8 +68,8 @@ private static final int FAILURE = 0; private static final int SUCCESS = 1; - private static AtomicBoolean sBrowserCrashMetricsInitialized = new AtomicBoolean(); - private static AtomicBoolean sDidBrowserCrashRecently = new AtomicBoolean(); + private static final AtomicBoolean sBrowserCrashMetricsInitialized = new AtomicBoolean(); + private static final AtomicBoolean sDidBrowserCrashRecently = new AtomicBoolean(); @StringDef({ProcessType.BROWSER, ProcessType.RENDERER, ProcessType.GPU, ProcessType.OTHER}) @Retention(RetentionPolicy.SOURCE)
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabRootUiCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabRootUiCoordinator.java index 43cef22..2e17f8d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabRootUiCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/BaseCustomTabRootUiCoordinator.java
@@ -143,10 +143,10 @@ private @Nullable TrackingProtectionSnackbarController mTrackingProtectionSnackbarController; private @Nullable EdgeToEdgeSupplier.ChangeObserver mEdgeToEdgeChangeObserver; - private @NonNull Runnable mOpenInBrowserRunnable; - private @Nullable DesktopWindowStateManager mDesktopWindowStateManager; + private final @NonNull Runnable mOpenInBrowserRunnable; + private final @Nullable DesktopWindowStateManager mDesktopWindowStateManager; private @Nullable WebAppHeaderLayoutCoordinator mWebAppHeaderLayoutCoordinator; - private Supplier<BrowserServicesThemeColorProvider> mWebAppThemeColorProvider; + private final Supplier<BrowserServicesThemeColorProvider> mWebAppThemeColorProvider; // TODO(crbug.com/402213312): This can be NonNull once the flag is enabled by default. private @Nullable CustomTabToolbarButtonsCoordinator mToolbarButtonsCoordinator;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomButtonParamsImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomButtonParamsImpl.java index d712e714..274606f7 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomButtonParamsImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomButtonParamsImpl.java
@@ -45,12 +45,12 @@ private static final String TAG = "CustomTabs"; private final PendingIntent mPendingIntent; - private int mId; + private final int mId; private Bitmap mIcon; private String mDescription; - private boolean mShouldTint; + private final boolean mShouldTint; private boolean mIsOnToolbar; - private @ButtonType int mType; + private final @ButtonType int mType; @VisibleForTesting static final String SHOW_ON_TOOLBAR = "android.support.customtabs.customaction.SHOW_ON_TOOLBAR";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java index 5d01dfb..a487b08 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabActivity.java
@@ -90,7 +90,7 @@ ChromeFeatureList.sCctBlockTouchesDuringEnterAnimation.isEnabled(); private boolean mIsEnterAnimationCompleted; - private CustomTabActivityTabProvider.Observer mTabChangeObserver = + private final CustomTabActivityTabProvider.Observer mTabChangeObserver = new CustomTabActivityTabProvider.Observer() { @Override public void onInitialTabCreated(@NonNull Tab tab, int mode) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabAdaptiveToolbarBehavior.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabAdaptiveToolbarBehavior.java index bd8307c..e377dc0 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabAdaptiveToolbarBehavior.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabAdaptiveToolbarBehavior.java
@@ -27,12 +27,12 @@ /** Implements CustomTab-specific behavior of adaptive toolbar button. */ public class CustomTabAdaptiveToolbarBehavior implements AdaptiveToolbarBehavior { - private Context mContext; - private ActivityTabProvider mActivityTabProvider; - private Drawable mOpenInBrowserButton; - private Runnable mOpenInBrowserRunnable; - private Runnable mRegisterVoiceSearchRunnable; - private List<CustomButtonParams> mToolbarCustomButtons; + private final Context mContext; + private final ActivityTabProvider mActivityTabProvider; + private final Drawable mOpenInBrowserButton; + private final Runnable mOpenInBrowserRunnable; + private final Runnable mRegisterVoiceSearchRunnable; + private final List<CustomButtonParams> mToolbarCustomButtons; private final Set<Integer> mValidButtons; public CustomTabAdaptiveToolbarBehavior(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabBottomBarDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabBottomBarDelegate.java index 81e0ee41..d60bf31d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabBottomBarDelegate.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabBottomBarDelegate.java
@@ -97,7 +97,7 @@ */ private int mBottomBarHeightOverride = -1; - private OnClickListener mBottomBarClickListener = + private final OnClickListener mBottomBarClickListener = new OnClickListener() { @Override public void onClick(View v) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabIntentDataProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabIntentDataProvider.java index 3e18f835..354a0508 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabIntentDataProvider.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabIntentDataProvider.java
@@ -281,7 +281,7 @@ private final SessionHolder<CustomTabsSessionToken> mSession; private final boolean mIsTrustedIntent; private final Intent mKeepAliveServiceIntent; - private Bundle mAnimationBundle; + private final Bundle mAnimationBundle; private final int mUiType; private final int mTitleVisibilityState; @@ -296,22 +296,22 @@ @Nullable private final TrustedWebActivityDisplayMode mTrustedWebActivityDisplayMode; @Nullable private String mUrlToLoad; - private boolean mEnableUrlBarHiding; + private final boolean mEnableUrlBarHiding; private boolean mInteractWithBackground; private List<CustomButtonParams> mCustomButtonParams; private Drawable mCloseButtonIcon; - private boolean mIsCloseButtonEnabled; - private List<Pair<String, PendingIntent>> mMenuEntries = new ArrayList<>(); + private final boolean mIsCloseButtonEnabled; + private final List<Pair<String, PendingIntent>> mMenuEntries = new ArrayList<>(); private boolean mShowShareItemInMenu; - private List<CustomButtonParams> mToolbarButtons = new ArrayList<>(1); - private List<CustomButtonParams> mBottombarButtons = new ArrayList<>(2); - private List<CustomButtonParams> mGoogleBottomBarButtons = new ArrayList<>(); - private RemoteViews mRemoteViews; - @ActivitySideSheetDecorationType private int mSideSheetDecorationType; - @ActivitySideSheetRoundedCornersPosition private int mSideSheetRoundedCornersPosition; - private int[] mClickableViewIds; - private PendingIntent mRemoteViewsPendingIntent; - private PendingIntent mSecondaryToolbarSwipeUpPendingIntent; + private final List<CustomButtonParams> mToolbarButtons = new ArrayList<>(1); + private final List<CustomButtonParams> mBottombarButtons = new ArrayList<>(2); + private final List<CustomButtonParams> mGoogleBottomBarButtons = new ArrayList<>(); + private final RemoteViews mRemoteViews; + @ActivitySideSheetDecorationType private final int mSideSheetDecorationType; + @ActivitySideSheetRoundedCornersPosition private final int mSideSheetRoundedCornersPosition; + private final int[] mClickableViewIds; + private final PendingIntent mRemoteViewsPendingIntent; + private final PendingIntent mSecondaryToolbarSwipeUpPendingIntent; private PendingIntent.OnFinished mOnFinishedForTesting; private @DisplayMode.EnumType int mResolvedDisplayMode = DisplayMode.UNDEFINED;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabObserver.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabObserver.java index 33cb5e6..0b752f9 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabObserver.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabObserver.java
@@ -39,7 +39,7 @@ public class CustomTabObserver extends EmptyTabObserver { private final CustomTabsConnection mCustomTabsConnection; private final SessionHolder<?> mSession; - private final boolean mOpenedByChrome; + private final NavigationInfoCaptureTrigger mNavigationInfoCaptureTrigger = new NavigationInfoCaptureTrigger(this::captureNavigationInfo); @@ -100,7 +100,7 @@ } public CustomTabObserver(boolean openedByChrome, SessionHolder<?> token) { - mOpenedByChrome = openedByChrome; + boolean mOpenedByChrome = openedByChrome; mCustomTabsConnection = mOpenedByChrome ? null : CustomTabsConnection.getInstance(); mSession = token; resetPageLoadTracking();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabOrientationController.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabOrientationController.java index e7d699b..9b384b5 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabOrientationController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabOrientationController.java
@@ -19,7 +19,7 @@ */ public class CustomTabOrientationController { private final ActivityWindowAndroid mActivityWindowAndroid; - private int mLockScreenOrientation; + private final int mLockScreenOrientation; public CustomTabOrientationController( ActivityWindowAndroid windowAndroid,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabTaskDescriptionIconGenerator.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabTaskDescriptionIconGenerator.java index efeace95..f0ef8f9 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabTaskDescriptionIconGenerator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabTaskDescriptionIconGenerator.java
@@ -18,8 +18,8 @@ private static final int APP_ICON_TEXT_SIZE_DP = 30; private static final int APP_ICON_DEFAULT_BACKGROUND_COLOR = 0xFF323232; - private Context mContext; - private int mMinSizePx; + private final Context mContext; + private final int mMinSizePx; /** The page URL for which {@link #mGeneratedIcon} was generated. */ private GURL mGeneratedPageUrl;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnectionService.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnectionService.java index 7b1835f..a49f88d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnectionService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsConnectionService.java
@@ -11,6 +11,7 @@ /** See {@link CustomTabsConnectionServiceImpl}. */ @NullMarked public class CustomTabsConnectionService extends SplitCompatCustomTabsService { + @SuppressWarnings("FieldCanBeFinal") // @IdentifierNameString requires non-final private static @IdentifierNameString String sImplClassName = "org.chromium.chrome.browser.customtabs.CustomTabsConnectionServiceImpl";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsFeatureUsage.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsFeatureUsage.java index f08877fb..deecc95 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsFeatureUsage.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabsFeatureUsage.java
@@ -157,7 +157,7 @@ } /** Tracks whether we have written each enum or not. */ - private BitSet mUsed = new BitSet(CustomTabsFeature.COUNT); + private final BitSet mUsed = new BitSet(CustomTabsFeature.COUNT); /** Logs the usage of the given feature, if enabled. */ void log(@CustomTabsFeature int feature) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/ContentGestureListener.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/ContentGestureListener.java index c038a69..a149392 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/ContentGestureListener.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/ContentGestureListener.java
@@ -40,10 +40,10 @@ private @GestureState int mState; - private VelocityTracker mVelocityTracker; - private DragEventCallback mCallback; - private Supplier<Tab> mTab; - private BooleanSupplier mIsFullyExpanded; + private final VelocityTracker mVelocityTracker; + private final DragEventCallback mCallback; + private final Supplier<Tab> mTab; + private final BooleanSupplier mIsFullyExpanded; /** * Constructor.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabBottomSheetStrategy.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabBottomSheetStrategy.java index ddbb5fc8..a50dbdd 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabBottomSheetStrategy.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabBottomSheetStrategy.java
@@ -111,7 +111,7 @@ private GestureDetector mGestureDetector; private ContentGestureListener mGestureHandler; - private TabAnimator mTabAnimator; + private final TabAnimator mTabAnimator; private @HeightStatus int mStatus = HeightStatus.INITIAL_HEIGHT; @@ -120,7 +120,7 @@ private Runnable mSoftKeyboardRunnable; private boolean mStopShowingSpinner; private boolean mRestoreAfterFindPage; - private boolean mContentScrollMayResizeTab; + private final boolean mContentScrollMayResizeTab; // Y offset when a dragging gesture/animation starts. private int mMoveStartY;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabDisplayManager.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabDisplayManager.java index db66167..eebcb2b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabDisplayManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabDisplayManager.java
@@ -74,8 +74,8 @@ private CustomTabToolbarButtonsCoordinator mToolbarButtonsCoordinator; private PartialCustomTabHandleStrategyFactory mHandleStrategyFactory; private SizeStrategyCreator mSizeStrategyCreator = this::createSizeStrategy; - private Supplier<TouchEventProvider> mTouchEventProvider; - private Supplier<Tab> mTab; + private final Supplier<TouchEventProvider> mTouchEventProvider; + private final Supplier<Tab> mTab; private boolean mIsInPip; private final BooleanSupplier mIsEnteringPip;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabHandleStrategy.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabHandleStrategy.java index 9e109a67..bb26e4f61 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabHandleStrategy.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabHandleStrategy.java
@@ -35,12 +35,12 @@ private float mLastPosY; private float mDeltaY; private boolean mSeenFirstMoveOrDown; - private VelocityTracker mVelocityTracker; + private final VelocityTracker mVelocityTracker; private Runnable mCloseHandler; - private BooleanSupplier mIsFullHeight; - private Supplier<Integer> mStatus; - private DragEventCallback mDragEventCallback; + private final BooleanSupplier mIsFullHeight; + private final Supplier<Integer> mStatus; + private final DragEventCallback mDragEventCallback; /** Callback for drag events. */ interface DragEventCallback {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabInputMethodWrapper.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabInputMethodWrapper.java index 3ece6a5..3992923 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabInputMethodWrapper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabInputMethodWrapper.java
@@ -21,8 +21,8 @@ * trigger PCCT height change when the soft keyboard appears. */ public class PartialCustomTabInputMethodWrapper implements InputMethodManagerWrapper { - private InputMethodManagerWrapper mWrapper; - private Callback<Runnable> mShowSoftKeyInputCallback; + private final InputMethodManagerWrapper mWrapper; + private final Callback<Runnable> mShowSoftKeyInputCallback; public PartialCustomTabInputMethodWrapper( Context context, WindowAndroid window, Callback<Runnable> softKeyInputCallback) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabSideSheetStrategy.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabSideSheetStrategy.java index 24ef633..714ac14 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabSideSheetStrategy.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabSideSheetStrategy.java
@@ -59,7 +59,7 @@ private final int mRoundedCornersPosition; private boolean mIsMaximized; - private int mDecorationType; + private final int mDecorationType; private boolean mSlideDownAnimation; // Slide down to bottom when closing the sheet. private boolean mSheetOnRight; private CustomTabToolbarButtonsCoordinator mToolbarButtonsCoordinator;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbar.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbar.java index e086670..408d6fe 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbar.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbar.java
@@ -171,7 +171,7 @@ private LocationBarModel mLocationBarModel; private BrowserStateBrowserControlsVisibilityDelegate mBrowserControlsVisibilityDelegate; private @Nullable CustomTabCaptureStateToken mLastCustomTabCaptureStateToken; - private ObserverList<Callback<Integer>> mContainerVisibilityChangeObserverList = + private final ObserverList<Callback<Integer>> mContainerVisibilityChangeObserverList = new ObserverList<>(); private @Nullable CustomTabFeatureOverridesManager mFeatureOverridesManager; @@ -375,7 +375,6 @@ posParams.availableWidth -= locationBarMinWidth; - mCloseButtonPosition = mIntentDataProvider.getCloseButtonPosition(); if (mCloseButton == null && mIntentDataProvider.isCloseButtonEnabled()) { layoutInflater.inflate(R.layout.custom_tab_close_button, this, true); mCloseButton = findViewById(R.id.close_button);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarButtonsCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarButtonsCoordinator.java index 06df415a..f5cf5e0 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarButtonsCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarButtonsCoordinator.java
@@ -62,7 +62,10 @@ var minimizeButton = getMinimizeButtonData( mMinimizeButtonAvailable && minimizeDelegate != null, minimizeDelegate); - mModel = CustomTabToolbarButtonsProperties.create(customActionButtons, minimizeButton); + int closeButtonPosition = intentDataProvider.getCloseButtonPosition(); + mModel = + CustomTabToolbarButtonsProperties.create( + customActionButtons, minimizeButton, closeButtonPosition); PropertyModelChangeProcessor.create(mModel, view, viewBinder); mCustomActionButtonsMcp = new ListModelChangeProcessor<>(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarButtonsProperties.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarButtonsProperties.java index 9e0d9c0b..8032b43a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarButtonsProperties.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarButtonsProperties.java
@@ -7,10 +7,13 @@ import android.graphics.drawable.Drawable; import android.view.View.OnClickListener; +import androidx.browser.customtabs.CustomTabsIntent.CloseButtonPosition; + import org.chromium.chrome.browser.customtabs.features.partialcustomtab.PartialCustomTabSideSheetStrategy.MaximizeButtonCallback; import org.chromium.ui.modelutil.PropertyKey; import org.chromium.ui.modelutil.PropertyListModel; import org.chromium.ui.modelutil.PropertyModel; +import org.chromium.ui.modelutil.PropertyModel.ReadableIntPropertyKey; import org.chromium.ui.modelutil.PropertyModel.ReadableObjectPropertyKey; import org.chromium.ui.modelutil.PropertyModel.WritableBooleanPropertyKey; import org.chromium.ui.modelutil.PropertyModel.WritableObjectPropertyKey; @@ -82,14 +85,22 @@ public static final WritableObjectPropertyKey<MinimizeButtonData> MINIMIZE_BUTTON = new WritableObjectPropertyKey<>(); + /** Property key for the close button position. See {@link CloseButtonPosition}. */ + public static final ReadableIntPropertyKey CLOSE_BUTTON_POSITION = new ReadableIntPropertyKey(); + public static PropertyModel create( PropertyListModel<PropertyModel, PropertyKey> customActionButtons, - MinimizeButtonData minimizeButtonData) { + MinimizeButtonData minimizeButtonData, + @CloseButtonPosition int closeButtonPosition) { return new PropertyModel.Builder( - CUSTOM_ACTION_BUTTONS, SIDE_SHEET_MAXIMIZE_BUTTON, MINIMIZE_BUTTON) + CUSTOM_ACTION_BUTTONS, + SIDE_SHEET_MAXIMIZE_BUTTON, + MINIMIZE_BUTTON, + CLOSE_BUTTON_POSITION) .with(CUSTOM_ACTION_BUTTONS, customActionButtons) .with(SIDE_SHEET_MAXIMIZE_BUTTON, new SideSheetMaximizeButtonData()) .with(MINIMIZE_BUTTON, minimizeButtonData) + .with(CLOSE_BUTTON_POSITION, closeButtonPosition) .build(); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarButtonsViewBinder.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarButtonsViewBinder.java index 5043128..1ee9a23 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarButtonsViewBinder.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarButtonsViewBinder.java
@@ -4,6 +4,7 @@ package org.chromium.chrome.browser.customtabs.features.toolbar; +import static org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbarButtonsProperties.CLOSE_BUTTON_POSITION; import static org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbarButtonsProperties.CUSTOM_ACTION_BUTTONS; import static org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbarButtonsProperties.DESCRIPTION; import static org.chromium.chrome.browser.customtabs.features.toolbar.CustomTabToolbarButtonsProperties.ICON; @@ -47,6 +48,9 @@ if (minimizeButton != null) { minimizeButton.setOnClickListener(model.get(MINIMIZE_BUTTON).clickListener); } + } else if (propertyKey == CLOSE_BUTTON_POSITION) { + view.setCloseButtonPosition(model.get(CLOSE_BUTTON_POSITION)); + view.reinflateAndRepositionToolbarElements(); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/device_dialog/ChromeBluetoothChooserAndroidDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/device_dialog/ChromeBluetoothChooserAndroidDelegate.java index 7310fa43..cef136f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/device_dialog/ChromeBluetoothChooserAndroidDelegate.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/device_dialog/ChromeBluetoothChooserAndroidDelegate.java
@@ -13,7 +13,7 @@ /** The implementation of {@link BluetoothChooserAndroidDelegate} for Chrome. */ public class ChromeBluetoothChooserAndroidDelegate implements BluetoothChooserAndroidDelegate { - private Profile mProfile; + private final Profile mProfile; @CalledByNative ChromeBluetoothChooserAndroidDelegate(Profile profile) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/device_dialog/ChromeBluetoothScanningPromptAndroidDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/device_dialog/ChromeBluetoothScanningPromptAndroidDelegate.java index 155ebd2..8ef85d9 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/device_dialog/ChromeBluetoothScanningPromptAndroidDelegate.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/device_dialog/ChromeBluetoothScanningPromptAndroidDelegate.java
@@ -15,7 +15,7 @@ public class ChromeBluetoothScanningPromptAndroidDelegate implements BluetoothScanningPromptAndroidDelegate { - private Profile mProfile; + private final Profile mProfile; @CalledByNative ChromeBluetoothScanningPromptAndroidDelegate(Profile profile) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/display_cutout/DisplayCutoutTabHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/display_cutout/DisplayCutoutTabHelper.java index f57b5d43..2145165 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/display_cutout/DisplayCutoutTabHelper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/display_cutout/DisplayCutoutTabHelper.java
@@ -34,7 +34,7 @@ private static final Class<DisplayCutoutTabHelper> USER_DATA_KEY = DisplayCutoutTabHelper.class; /** The tab that this object belongs to. */ - private Tab mTab; + private final Tab mTab; @VisibleForTesting DisplayCutoutController mCutoutController; @@ -78,7 +78,7 @@ @VisibleForTesting static class ChromeDisplayCutoutDelegate implements DisplayCutoutController.Delegate { - private Tab mTab; + private final Tab mTab; ChromeDisplayCutoutDelegate(Tab tab) { mTab = tab;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadBroadcastManager.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadBroadcastManager.java index 7b1f073..af994bb 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadBroadcastManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadBroadcastManager.java
@@ -11,6 +11,7 @@ /** See {@link DownloadBroadcastManagerImpl}. */ @NullMarked public class DownloadBroadcastManager extends SplitCompatService { + @SuppressWarnings("FieldCanBeFinal") // @IdentifierNameString requires non-final private static @IdentifierNameString String sImplClassName = "org.chromium.chrome.browser.download.DownloadBroadcastManagerImpl";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadForegroundService.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadForegroundService.java index 7471a50..9ea9bdf1 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadForegroundService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadForegroundService.java
@@ -11,6 +11,7 @@ /** See {@link DownloadForegroundServiceImpl}. */ @NullMarked public class DownloadForegroundService extends SplitCompatService { + @SuppressWarnings("FieldCanBeFinal") // @IdentifierNameString requires non-final private static @IdentifierNameString String sImplClassName = "org.chromium.chrome.browser.download.DownloadForegroundServiceImpl";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadItem.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadItem.java index b2b0778..ca9fdb3 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadItem.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadItem.java
@@ -24,7 +24,7 @@ */ public class DownloadItem { private final ContentId mContentId = new ContentId(); - private boolean mUseAndroidDownloadManager; + private final boolean mUseAndroidDownloadManager; private DownloadInfo mDownloadInfo; private long mDownloadId = DownloadConstants.INVALID_DOWNLOAD_ID; private long mStartTime;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java index 2d85f04..2aecc17 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java
@@ -128,8 +128,8 @@ private final ObserverList<DownloadObserver> mDownloadObservers = new ObserverList<>(); - private OMADownloadHandler mOMADownloadHandler; - private DownloadSnackbarController mDownloadSnackbarController; + private final OMADownloadHandler mOMADownloadHandler; + private final DownloadSnackbarController mDownloadSnackbarController; private DownloadMessageUiController mMessageUiController; private long mNativeDownloadManagerService; // Flag to track if we need to post a task to update download notifications.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java index 3ca5a3ab..89bf462 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java
@@ -99,11 +99,11 @@ private static DownloadNotificationService sInstanceForTesting; - private BaseNotificationManagerProxy mNotificationManager; + private final BaseNotificationManagerProxy mNotificationManager; private Bitmap mDownloadSuccessLargeIcon; - private DownloadSharedPreferenceHelper mDownloadSharedPreferenceHelper; + private final DownloadSharedPreferenceHelper mDownloadSharedPreferenceHelper; private DownloadForegroundServiceManager mDownloadForegroundServiceManager; - private DownloadUserInitiatedTaskManager mDownloadUserInitiatedTaskManager; + private final DownloadUserInitiatedTaskManager mDownloadUserInitiatedTaskManager; private static class LazyHolder { private static final DownloadNotificationService INSTANCE =
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationUmaHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationUmaHelper.java index 547634f..bb1e03d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationUmaHelper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationUmaHelper.java
@@ -33,7 +33,7 @@ int NUM_ENTRIES = 3; } - private static List<String> sInteractions = + private static final List<String> sInteractions = Arrays.asList( ACTION_NOTIFICATION_CLICKED, // Opening a download where // LegacyHelpers.isLegacyDownload.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadSharedPreferenceHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadSharedPreferenceHelper.java index c7240b935..7c61e72a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadSharedPreferenceHelper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadSharedPreferenceHelper.java
@@ -28,7 +28,7 @@ new ArrayList<DownloadSharedPreferenceEntry>(); private final ObserverList<Observer> mObservers = new ObserverList<>(); - private SharedPreferencesManager mSharedPrefs; + private final SharedPreferencesManager mSharedPrefs; // "Initialization on demand holder idiom" private static class LazyHolder {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadUserInitiatedTaskManager.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadUserInitiatedTaskManager.java index 6057e0a..b77f2e8 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadUserInitiatedTaskManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadUserInitiatedTaskManager.java
@@ -58,7 +58,7 @@ * maintaining a boolean {@code mHasUnseenCallbacks} which is set when a new callback is * received. */ - private Map<Integer, TaskFinishedCallback> mTaskNotificationCallbacks = new HashMap<>(); + private final Map<Integer, TaskFinishedCallback> mTaskNotificationCallbacks = new HashMap<>(); /** * Accounts for callbacks for jobs started that haven't yet been attached with a notification.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DuplicateDownloadClickableSpan.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DuplicateDownloadClickableSpan.java index 6a2fc82..94313802 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/DuplicateDownloadClickableSpan.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DuplicateDownloadClickableSpan.java
@@ -25,7 +25,7 @@ private final @Nullable Runnable mRunnable; private final OtrProfileId mOtrProfileId; private final String mFilePath; - private @DownloadOpenSource int mSource; + private final @DownloadOpenSource int mSource; /** * Constructor.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/OfflineContentAvailabilityStatusProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/download/OfflineContentAvailabilityStatusProvider.java index 983f2c9..429be05 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/OfflineContentAvailabilityStatusProvider.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/OfflineContentAvailabilityStatusProvider.java
@@ -27,10 +27,10 @@ private static OfflineContentAvailabilityStatusProvider sInstance; // Keeps track of suggested content. - private Set<ContentId> mSuggestedItems = new HashSet<>(); + private final Set<ContentId> mSuggestedItems = new HashSet<>(); // Keeps track of persistent content, i.e. non-transient content, including prefetch, downloads, // offline pages, etc. The idea is that this set will be empty iff Download Home would be empty. - private Set<ContentId> mPersistentItems = new HashSet<>(); + private final Set<ContentId> mPersistentItems = new HashSet<>(); /** * @return An {@link OfflineContentAvailabilityStatusProvider} instance singleton. If one
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/externalnav/IntentWithRequestMetadataHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/externalnav/IntentWithRequestMetadataHandler.java index 80bd18a..2a725f9 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/externalnav/IntentWithRequestMetadataHandler.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/externalnav/IntentWithRequestMetadataHandler.java
@@ -30,7 +30,7 @@ private static final Object INSTANCE_LOCK = new Object(); private static IntentWithRequestMetadataHandler sIntentWithRequestMetadataHandler; - private SecureRandom mSecureRandom = new SecureRandom(); + private final SecureRandom mSecureRandom = new SecureRandom(); private RequestMetadata mRequestMetadata; private byte[] mIntentToken; private String mUri;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/feedback/ScreenshotTask.java b/chrome/android/java/src/org/chromium/chrome/browser/feedback/ScreenshotTask.java index 0cef0bf..9b2e5bb1 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/feedback/ScreenshotTask.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/feedback/ScreenshotTask.java
@@ -38,7 +38,7 @@ private boolean mDone; private Bitmap mBitmap; private Runnable mCallback; - private @ScreenshotMode int mScreenshotMode; + private final @ScreenshotMode int mScreenshotMode; /** * Creates a {@link ScreenshotTask} instance that, will grab a screenshot of {@code activity}.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/findinpage/FindToolbar.java b/chrome/android/java/src/org/chromium/chrome/browser/findinpage/FindToolbar.java index aa5454d..587821cb 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/findinpage/FindToolbar.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/findinpage/FindToolbar.java
@@ -110,7 +110,7 @@ private @FindLocationBarState int mCurrentState = FindLocationBarState.HIDDEN; private @FindLocationBarState int mDesiredState = FindLocationBarState.HIDDEN; - private Handler mHandler = new Handler(); + private final Handler mHandler = new Handler(); /** Subclasses EditText in order to intercept BACK key presses. */ @SuppressLint("Instantiatable")
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunFlowSequencer.java b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunFlowSequencer.java index 04043bf..c05247d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunFlowSequencer.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/firstrun/FirstRunFlowSequencer.java
@@ -96,12 +96,11 @@ OneshotSupplier<ProfileProvider> profileSupplier); } - /** * The delegate to be used by the Sequencer. By default, it's an instance of * {@link FirstRunFlowSequencerDelegate}, unless it's overridden by {@code sDelegateForTesting}. */ - private FirstRunFlowSequencerDelegate mDelegate; + private final FirstRunFlowSequencerDelegate mDelegate; /** If not null, creates {@code mDelegate} for this object during tests. */ private static DelegateFactoryForTesting sDelegateFactoryForTesting;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/BrowserControlsManager.java b/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/BrowserControlsManager.java index 30ae892e..f1d9aad 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/BrowserControlsManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/BrowserControlsManager.java
@@ -96,7 +96,7 @@ private final ObserverList<BrowserControlsStateProvider.Observer> mControlsObservers = new ObserverList<>(); - private FullscreenHtmlApiHandlerBase mHtmlApiHandler; + private final FullscreenHtmlApiHandlerBase mHtmlApiHandler; @Nullable private Tab mTab; /** The animator for the Android browser controls. */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandlerBase.java b/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandlerBase.java index a326a5b1..2cc08ce 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandlerBase.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/fullscreen/FullscreenHtmlApiHandlerBase.java
@@ -118,7 +118,7 @@ private boolean mDisplayEdgeToEdgeFullscreenToBeExited; private boolean mIsInMultiWindowMode; - private FullscreenMultiWindowModeObserver mMultiWindowModeObserver; + private final FullscreenMultiWindowModeObserver mMultiWindowModeObserver; private boolean mNotifyOnNextExit;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/NavigationHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/NavigationHandler.java index 8e5d2f2..eaa6a686 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/NavigationHandler.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/NavigationHandler.java
@@ -103,7 +103,7 @@ private final Handler mHandler = new Handler(); private GestureDetector mDetector; - private View.OnAttachStateChangeListener mAttachStateListener; + private final View.OnAttachStateChangeListener mAttachStateListener; private final BackActionDelegate mBackActionDelegate; @Nullable private TabOnBackGestureHandler mTabOnBackGestureHandler; private Tab mTab; @@ -111,7 +111,7 @@ private @GestureState int mState; - private PropertyModel mModel; + private final PropertyModel mModel; // Total horizontal pull offset for a swipe gesture. private float mPullOffsetX; @@ -123,7 +123,7 @@ private int mIncorrectEdgeSwipeCount; private boolean mBackGestureForTabHistoryInProgress; private boolean mStartNavDuringOngoingGesture; - private TabObserver mTabObserver = + private final TabObserver mTabObserver = new EmptyTabObserver() { @Override public void onDidStartNavigationInPrimaryMainFrame(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/NavigationSheetCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/NavigationSheetCoordinator.java index 5efc9efa..60a37cad 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/NavigationSheetCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/NavigationSheetCoordinator.java
@@ -109,7 +109,7 @@ // Metrics. True if sheet was opened from long-press on back button. private boolean mOpenedAsPopup; - private Profile mProfile; + private final Profile mProfile; /** Construct a new NavigationSheet. */ NavigationSheetCoordinator(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/SideSlideLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/SideSlideLayout.java index 462a1f9c..f324ba2 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/SideSlideLayout.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/SideSlideLayout.java
@@ -94,7 +94,7 @@ // True while side gesture is in progress. private boolean mIsBeingDragged; - private NavigationBubble mArrowView; + private final NavigationBubble mArrowView; private int mArrowViewWidth; // Start position for animation moving the UI back to original offset.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryContentManager.java b/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryContentManager.java index 27b28b9..917ca8e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryContentManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryContentManager.java
@@ -136,14 +136,14 @@ private final @Nullable Runnable mOpenHistoryItemCallback; // TODO(crbug.com/388201374): Remove the nullability once the feature is launched. private @Nullable final SigninPromoCoordinator mHistorySyncPromoCoordinator; - private HistoryAdapter mHistoryAdapter; - private RecyclerView mRecyclerView; + private final HistoryAdapter mHistoryAdapter; + private final RecyclerView mRecyclerView; private LargeIconBridge mLargeIconBridge; - private SelectionDelegate<HistoryItem> mSelectionDelegate; + private final SelectionDelegate<HistoryItem> mSelectionDelegate; private boolean mShouldShowPrivacyDisclaimers; - private boolean mLaunchedForApp; - private PrefChangeRegistrar mPrefChangeRegistrar; - private String mAppId; + private final boolean mLaunchedForApp; + private final PrefChangeRegistrar mPrefChangeRegistrar; + private final String mAppId; private AppFilterCoordinator mAppFilterSheet; private AppInfo mCurrentApp; private long mAppQueryStartMs;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryManager.java b/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryManager.java index 316b0f0..0f12cc6 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryManager.java
@@ -73,7 +73,7 @@ private final InfoHeaderPref mHeaderPref; private final String mAppId; - private ViewGroup mRootView; + private final ViewGroup mRootView; private ViewGroup mContentView; @Nullable private final SelectableListLayout<HistoryItem> mSelectableListLayout; private HistoryContentManager mContentManager;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryPage.java b/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryPage.java index 7ad517e..1c67655 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryPage.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/history/HistoryPage.java
@@ -20,7 +20,7 @@ /** Native page for managing browsing history. */ public class HistoryPage extends BasicNativePage { private HistoryManager mHistoryManager; - private String mTitle; + private final String mTitle; /** * Create a new instance of the history page.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/homepage/settings/RadioButtonGroupHomepagePreference.java b/chrome/android/java/src/org/chromium/chrome/browser/homepage/settings/RadioButtonGroupHomepagePreference.java index 40cfaac..9e59e1e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/homepage/settings/RadioButtonGroupHomepagePreference.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/homepage/settings/RadioButtonGroupHomepagePreference.java
@@ -41,13 +41,13 @@ private String mCustomizedText; /** Whether the RadioButtonGroup is enabled. */ - private boolean mIsEnabled; + private final boolean mIsEnabled; /** Whether the option for to {@link HomepageOption#ENTRY_CHROME_NTP} is visible. */ - private boolean mIsNtpOptionVisible; + private final boolean mIsNtpOptionVisible; /** Whether the option for to {@link HomepageOption#ENTRY_CUSTOM_URI} is visible. */ - private boolean mIsCustomizedOptionVisible; + private final boolean mIsCustomizedOptionVisible; /** * Created the data structure for {@link RadioButtonGroupHomepagePreference} to communicate
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/hub/HubLayoutUnitTest.java b/chrome/android/java/src/org/chromium/chrome/browser/hub/HubLayoutUnitTest.java index ff824b91..68c03ec 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/hub/HubLayoutUnitTest.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/hub/HubLayoutUnitTest.java
@@ -180,7 +180,7 @@ private SyncOneshotSupplierImpl<HubLayoutAnimator> mHubLayoutAnimatorSupplier; private Supplier<TabModelSelector> mTabModelSelectorSupplier; - private ObservableSupplierImpl<Pane> mPaneSupplier = new ObservableSupplierImpl<>(); + private final ObservableSupplierImpl<Pane> mPaneSupplier = new ObservableSupplierImpl<>(); private HubShowPaneHelper mHubShowPaneHelper; @Before @@ -348,7 +348,6 @@ public void tearDown() { mHubLayout.destroy(); mActionTester.tearDown(); - XrUtils.resetXrDeviceForTesting(); } @Test
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/identity_disc/IdentityDiscController.java b/chrome/android/java/src/org/chromium/chrome/browser/identity_disc/IdentityDiscController.java index 8239c8d..95d3b4f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/identity_disc/IdentityDiscController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/identity_disc/IdentityDiscController.java
@@ -85,8 +85,8 @@ // ProfileDataCache facilitates retrieving profile picture. private ProfileDataCache mProfileDataCache; - private ButtonDataImpl mButtonData; - private ObserverList<ButtonDataObserver> mObservers = new ObserverList<>(); + private final ButtonDataImpl mButtonData; + private final ObserverList<ButtonDataObserver> mObservers = new ObserverList<>(); private boolean mNativeIsInitialized; private boolean mIsTabNtp;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/incognito/IncognitoNotificationService.java b/chrome/android/java/src/org/chromium/chrome/browser/incognito/IncognitoNotificationService.java index 4d0ccda..bb30710 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/incognito/IncognitoNotificationService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/incognito/IncognitoNotificationService.java
@@ -13,6 +13,7 @@ public class IncognitoNotificationService extends SplitCompatIntentService { private static final String TAG = "incognito_notification"; + @SuppressWarnings("FieldCanBeFinal") // @IdentifierNameString requires non-final private static @IdentifierNameString String sImplClassName = "org.chromium.chrome.browser.incognito.IncognitoNotificationServiceImpl";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/AutofillSaveCardInfoBar.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/AutofillSaveCardInfoBar.java index 5fb8f63..d567a32 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/AutofillSaveCardInfoBar.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/AutofillSaveCardInfoBar.java
@@ -41,9 +41,9 @@ private final long mNativeAutofillSaveCardInfoBar; private final List<CardDetail> mCardDetails = new ArrayList<>(); private int mIconDrawableId = -1; - private String mTitleText; + private final String mTitleText; private String mDescriptionText; - private boolean mIsGooglePayBrandingEnabled; + private final boolean mIsGooglePayBrandingEnabled; private final LinkedList<LegalMessageLine> mLegalMessageLines = new LinkedList<LegalMessageLine>();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/AutofillVirtualCardEnrollmentInfoBar.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/AutofillVirtualCardEnrollmentInfoBar.java index f342392e..f980562 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/AutofillVirtualCardEnrollmentInfoBar.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/AutofillVirtualCardEnrollmentInfoBar.java
@@ -38,7 +38,7 @@ private Bitmap mIssuerIcon; private String mCardLabel; private int mIconDrawableId = -1; - private String mTitleText; + private final String mTitleText; private String mDescriptionText; private String mLearnMoreLinkText; private final LinkedList<LegalMessageLine> mGoogleLegalMessageLines =
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/KnownInterceptionDisclosureInfoBar.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/KnownInterceptionDisclosureInfoBar.java index 23e1bbbf..76372018 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/KnownInterceptionDisclosureInfoBar.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/KnownInterceptionDisclosureInfoBar.java
@@ -18,7 +18,7 @@ * standard ConfirmInfoBar to provide a description as well as a title. */ public class KnownInterceptionDisclosureInfoBar extends ConfirmInfoBar { - private String mDescription; + private final String mDescription; /** * Creates and begins the process for showing a KnownInterceptionDisclosureInfoBar.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/infobar/PermissionInfoBar.java b/chrome/android/java/src/org/chromium/chrome/browser/infobar/PermissionInfoBar.java index f6b10dc..43fb1a4 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/infobar/PermissionInfoBar.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/infobar/PermissionInfoBar.java
@@ -45,16 +45,16 @@ private boolean mIsExpanded; /** The text of the link shown in the compact state. */ - private String mCompactLinkText; + private final String mCompactLinkText; /** The message text in the compact state. */ - private String mCompactMessage; + private final String mCompactMessage; /** The secondary text shown below the message in the expanded state. */ - private String mDescription; + private final String mDescription; /** The text of the `Learn more` link shown in the expanded state after the description. */ - private String mLearnMoreLinkText; + private final String mLearnMoreLinkText; protected PermissionInfoBar( WindowAndroid window,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java index 883769c..bd9b5d8 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java
@@ -112,7 +112,6 @@ import org.chromium.components.browser_ui.share.ClipboardImageFileProvider; import org.chromium.components.browser_ui.share.ShareImageFileUtils; import org.chromium.components.content_capture.PlatformContentCaptureController; -import org.chromium.components.crash.anr.AnrCollector; import org.chromium.components.crash.browser.ChildProcessCrashObserver; import org.chromium.components.embedder_support.util.UrlUtilities; import org.chromium.components.minidump_uploader.CrashFileManager; @@ -219,7 +218,7 @@ @CallSuper protected void handlePreNativeInitialization() { ChromeCachedFlags.getInstance().setFullListOfFlags(); - setProcessStateSummaryForAnrs(false); + setProcessStateSummaryForAnrs(); } /** @@ -433,7 +432,6 @@ QuickActionSearchWidgetProvider.initialize(); PrivacyPreferencesManagerImpl.getInstance().onNativeInitialized(); - setProcessStateSummaryForAnrs(true); // Give BookmarkModel a provider of PartnerBookmark.BookmarkIterator so that // PartnerBookmarksShim can be loaded lazily when BookmarkModel is needed. @@ -537,28 +535,26 @@ /** * We use the Android API to store key information which we can't afford to have wrong on our - * ANR reports. So, we set the version number, and the main .so file's Build ID once native has - * been loaded. Then, when we query Android for any ANRs that have happened, we can also pull - * these key fields. + * ANR reports. So, in this function, we store the version number before the native is loaded. + * Once native starts to load, AnrCollector.java will store the main .so file's Build ID and the + * list of Finch experiments in addition to the version number. Then, when we query Android for + * any ANRs that have happened, we can also pull these key fields. * * <p>We are limited to 128 bytes in ProcessStateSummary, so we only store the most important * things that can change between the ANR happening and an upload (when the rest of the metadata * is gathered). Some fields we ignore because they won't change (eg. which channel or what the - * .so filename is) and some we ignore because they aren't as critical (eg. experiments). In the - * future, we could make this point to a file where we would write out all our crash keys, and - * thus get full fidelity. + * .so filename is) and some we ignore because they aren't as critical. In the future, we could + * make this point to a file where we would write out all our crash keys, and thus get full + * fidelity. */ - protected void setProcessStateSummaryForAnrs(boolean includeNative) { + protected void setProcessStateSummaryForAnrs() { if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { ActivityManager am = (ActivityManager) ContextUtils.getApplicationContext() .getSystemService(Context.ACTIVITY_SERVICE); - String summary = VersionInfo.getProductVersion(); - if (includeNative) { - summary += "," + AnrCollector.getSharedLibraryBuildId(); - } - am.setProcessStateSummary(summary.getBytes(StandardCharsets.UTF_8)); + byte[] version = VersionInfo.getProductVersion().getBytes(StandardCharsets.UTF_8); + am.setProcessStateSummary(version); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/FullscreenVideoPictureInPictureController.java b/chrome/android/java/src/org/chromium/chrome/browser/media/FullscreenVideoPictureInPictureController.java index 2c3e387..d539fef2 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/media/FullscreenVideoPictureInPictureController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/media/FullscreenVideoPictureInPictureController.java
@@ -121,7 +121,7 @@ private long mLastOnEnteredTimeMillis; /** Runnable that will update our autopip config. */ - private Runnable mUpdateAutoPipRunnable = this::updateAutoPictureInPictureStatusIfNeeded; + private final Runnable mUpdateAutoPipRunnable = this::updateAutoPictureInPictureStatusIfNeeded; /** Do we believe that media is currently playing or not? */ private boolean mIsPlaying;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/MediaCaptureNotificationService.java b/chrome/android/java/src/org/chromium/chrome/browser/media/MediaCaptureNotificationService.java index 0c6848f2..ee523e0 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/media/MediaCaptureNotificationService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/media/MediaCaptureNotificationService.java
@@ -11,6 +11,7 @@ /** See {@link MediaCaptureNotificationServiceImpl}. */ @NullMarked public class MediaCaptureNotificationService extends SplitCompatService { + @SuppressWarnings("FieldCanBeFinal") // @IdentifierNameString requires non-final private static @IdentifierNameString String sImplClassName = "org.chromium.chrome.browser.media.MediaCaptureNotificationServiceImpl";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/ui/ChromeMediaNotificationControllerDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/media/ui/ChromeMediaNotificationControllerDelegate.java index cd8fdd50d..9ae8f7a0 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/media/ui/ChromeMediaNotificationControllerDelegate.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/media/ui/ChromeMediaNotificationControllerDelegate.java
@@ -35,7 +35,7 @@ /** A class that provides Chrome-specific behavior to {@link MediaNotificationController}. */ class ChromeMediaNotificationControllerDelegate implements MediaNotificationController.Delegate { - private int mNotificationId; + private final int mNotificationId; @VisibleForTesting static class NotificationOptions { @@ -79,7 +79,7 @@ */ @VisibleForTesting abstract static class ListenerServiceImpl extends SplitCompatService.Impl { - private int mNotificationId; + private final int mNotificationId; ListenerServiceImpl(int notificationId) { mNotificationId = notificationId; @@ -159,7 +159,7 @@ super.onDestroy(); } - private BroadcastReceiver mAudioBecomingNoisyReceiver = + private final BroadcastReceiver mAudioBecomingNoisyReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/media/ui/ChromeMediaNotificationControllerServices.java b/chrome/android/java/src/org/chromium/chrome/browser/media/ui/ChromeMediaNotificationControllerServices.java index 2bc3ca0..a7203f8 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/media/ui/ChromeMediaNotificationControllerServices.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/media/ui/ChromeMediaNotificationControllerServices.java
@@ -13,6 +13,7 @@ public class ChromeMediaNotificationControllerServices { /** See {@link ChromeMediaNotificationControllerDelegate$PlaybackListenerServiceImpl}. */ public static class PlaybackListenerService extends SplitCompatService { + @SuppressWarnings("FieldCanBeFinal") // @IdentifierNameString requires non-final private static @IdentifierNameString String sImplClassName = "org.chromium.chrome.browser.media.ui." + "ChromeMediaNotificationControllerDelegate$PlaybackListenerServiceImpl"; @@ -24,6 +25,7 @@ /** See {@link ChromeMediaNotificationControllerDelegate$PresentationListenerServiceImpl}. */ public static class PresentationListenerService extends SplitCompatService { + @SuppressWarnings("FieldCanBeFinal") // @IdentifierNameString requires non-final private static @IdentifierNameString String sImplClassName = "org.chromium.chrome.browser.media.ui." + "ChromeMediaNotificationControllerDelegate$PresentationListenerServiceImpl"; @@ -35,6 +37,7 @@ /** See {@link ChromeMediaNotificationControllerDelegate$CastListenerServiceImpl}. */ public static class CastListenerService extends SplitCompatService { + @SuppressWarnings("FieldCanBeFinal") // @IdentifierNameString requires non-final private static @IdentifierNameString String sImplClassName = "org.chromium.chrome.browser.media.ui." + "ChromeMediaNotificationControllerDelegate$CastListenerServiceImpl";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/messages/ChromeMessageQueueMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/messages/ChromeMessageQueueMediator.java index d741dd3..c32eec4f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/messages/ChromeMessageQueueMediator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/messages/ChromeMessageQueueMediator.java
@@ -46,7 +46,7 @@ private MessageContainerCoordinator mContainerCoordinator; private BrowserControlsManager mBrowserControlsManager; private int mBrowserControlsToken = TokenHolder.INVALID_TOKEN; - private BrowserControlsObserver mBrowserControlsObserver; + private final BrowserControlsObserver mBrowserControlsObserver; @Nullable private LayoutStateProvider mLayoutStateProvider; @Nullable private ActivityTabProvider mActivityTabProvider; @Nullable private ModalDialogManager mModalDialogManager; @@ -59,7 +59,7 @@ private boolean mIsDestroyed; - private LayoutStateObserver mLayoutStateObserver = + private final LayoutStateObserver mLayoutStateObserver = new LayoutStateObserver() { private int mToken = TokenHolder.INVALID_TOKEN; @@ -80,7 +80,7 @@ } }; - private ModalDialogManagerObserver mModalDialogManagerObserver = + private final ModalDialogManagerObserver mModalDialogManagerObserver = new ModalDialogManagerObserver() { private int mToken = TokenHolder.INVALID_TOKEN; @@ -100,7 +100,7 @@ } }; - private PauseResumeWithNativeObserver mPauseResumeWithNativeObserver = + private final PauseResumeWithNativeObserver mPauseResumeWithNativeObserver = new PauseResumeWithNativeObserver() { private int mToken = TokenHolder.INVALID_TOKEN; @@ -120,7 +120,7 @@ } }; - private EmptyBottomSheetObserver mBottomSheetObserver = + private final EmptyBottomSheetObserver mBottomSheetObserver = new EmptyBottomSheetObserver() { private int mToken = TokenHolder.INVALID_TOKEN;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManagerApi31.java b/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManagerApi31.java index 74f86d2..b268958 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManagerApi31.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManagerApi31.java
@@ -94,13 +94,13 @@ @VisibleForTesting protected final int mMaxInstances; - private ObservableSupplier<ModalDialogManager> mModalDialogManagerSupplier; + private final ObservableSupplier<ModalDialogManager> mModalDialogManagerSupplier; // Instance ID for the activity associated with this manager. private int mInstanceId = INVALID_WINDOW_ID; private Tab mActiveTab; - private TabObserver mActiveTabObserver = + private final TabObserver mActiveTabObserver = new EmptyTabObserver() { @Override public void onTitleUpdated(Tab tab) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/native_page/NativePageAssassin.java b/chrome/android/java/src/org/chromium/chrome/browser/native_page/NativePageAssassin.java index 62b1e5d..9df44c23f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/native_page/NativePageAssassin.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/native_page/NativePageAssassin.java
@@ -32,7 +32,7 @@ * The most recently hidden tabs, limited to MAX_RECENT_TABS elements, ordered from oldest to * newest. Visible tabs are not included in this list. */ - private ArrayList<WeakReference<Tab>> mRecentTabs = + private final ArrayList<WeakReference<Tab>> mRecentTabs = new ArrayList<WeakReference<Tab>>(MAX_RECENT_TABS + 1); private NativePageAssassin() {}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/net/connectivitydetector/ConnectivityDetector.java b/chrome/android/java/src/org/chromium/chrome/browser/net/connectivitydetector/ConnectivityDetector.java index f9361bb..6d8c3e2 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/net/connectivitydetector/ConnectivityDetector.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/net/connectivitydetector/ConnectivityDetector.java
@@ -205,7 +205,7 @@ /** |mObserver| will be null after destruction. */ @Nullable private Observer mObserver; - private Delegate mDelegate; + private final Delegate mDelegate; // Name of the client used for recording histograms. private final String mClientName; @@ -218,7 +218,7 @@ ConnectivityCheckingStage.NOT_STARTED; // The delay time, in milliseconds, before we can send next http probe request. private int mConnectivityCheckDelayMs; - private Handler mHandler; + private final Handler mHandler; private Runnable mRunnable; public ConnectivityDetector(Observer observer, String clientName) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationIntentInterceptorService.java b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationIntentInterceptorService.java index 42f4d45..c40d850 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationIntentInterceptorService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationIntentInterceptorService.java
@@ -20,6 +20,7 @@ public class NotificationIntentInterceptorService extends SplitCompatIntentService { private static final String TAG = NotificationIntentInterceptorService.class.getSimpleName(); + @SuppressWarnings("FieldCanBeFinal") // @IdentifierNameString requires non-final private static @IdentifierNameString String sImplClassName = "org.chromium.chrome.browser.notifications.NotificationIntentInterceptor$ServiceImpl";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationJobService.java b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationJobService.java index 43adbbff..7337c73 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationJobService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationJobService.java
@@ -11,6 +11,7 @@ /** See {@link NotificationJobServiceImpl}. */ @NullMarked public class NotificationJobService extends SplitCompatJobService { + @SuppressWarnings("FieldCanBeFinal") // @IdentifierNameString requires non-final private static @IdentifierNameString String sImplClassName = "org.chromium.chrome.browser.notifications.NotificationJobServiceImpl";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridge.java index 5349831..283ab2a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridge.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationPlatformBridge.java
@@ -140,7 +140,7 @@ // b) however, we won't suppress new notifications from this origin anymore, // c) in the case the user choses to "Undo", we will only be able to restore the notification // they originally clicked "Unsubscribe" on. - private static Map<String, Map<String, Notification>> + private static final Map<String, Map<String, Notification>> sOriginsWithProvisionallyRevokedPermissions = new HashMap<String, Map<String, Notification>>();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationService.java b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationService.java index a830b8e4..e6bf7b43 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/notifications/NotificationService.java
@@ -20,6 +20,7 @@ public class NotificationService extends SplitCompatIntentService { private static final String TAG = NotificationService.class.getSimpleName(); + @SuppressWarnings("FieldCanBeFinal") // @IdentifierNameString requires non-final private static @IdentifierNameString String sImplClassName = "org.chromium.chrome.browser.notifications.NotificationServiceImpl";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/notifications/scheduler/DisplayAgent.java b/chrome/android/java/src/org/chromium/chrome/browser/notifications/scheduler/DisplayAgent.java index fc67c615..aeb685e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/notifications/scheduler/DisplayAgent.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/notifications/scheduler/DisplayAgent.java
@@ -91,8 +91,8 @@ private static class NotificationData { public final String title; public final String message; - public HashMap<Integer /*@IconType*/, IconBundle> icons = new HashMap<>(); - public ArrayList<Button> buttons = new ArrayList<>(); + public final HashMap<Integer /*@IconType*/, IconBundle> icons = new HashMap<>(); + public final ArrayList<Button> buttons = new ArrayList<>(); private NotificationData(String title, String message) { this.title = title; @@ -134,7 +134,7 @@ * notification. */ private static class SystemData { - public @SchedulerClientType int type; + public final @SchedulerClientType int type; public final String guid; public SystemData(@SchedulerClientType int type, String guid) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/IncognitoNewTabPage.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/IncognitoNewTabPage.java index 6300a0e4..1c3bf013 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/IncognitoNewTabPage.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/IncognitoNewTabPage.java
@@ -38,12 +38,12 @@ private final Profile mProfile; private final int mIncognitoNtpBackgroundColor; - private String mTitle; + private final String mTitle; protected IncognitoNewTabPageView mIncognitoNewTabPageView; private boolean mIsLoaded; - private IncognitoNewTabPageManager mIncognitoNewTabPageManager; + private final IncognitoNewTabPageManager mIncognitoNewTabPageManager; private IncognitoCookieControlsManager mCookieControlsManager; private IncognitoCookieControlsManager.Observer mCookieControlsObserver; private EdgeToEdgePadAdjuster mEdgeToEdgePadAdjuster;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java index 0e203fd..6d2084c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPage.java
@@ -182,7 +182,8 @@ private ViewGroup mSingleTabCardContainer; @Nullable private HomeModulesCoordinator mHomeModulesCoordinator; @Nullable private ViewGroup mHomeModulesContainer; - private ObservableSupplierImpl<Tab> mMostRecentTabSupplier = new ObservableSupplierImpl<>(); + private final ObservableSupplierImpl<Tab> mMostRecentTabSupplier = + new ObservableSupplierImpl<>(); @Nullable private Point mContextMenuStartPosition; private final Activity mActivity; @@ -194,13 +195,13 @@ @Nullable private SearchResumptionModuleCoordinator mSearchResumptionModuleCoordinator; private NtpSmoothTransitionDelegate mSmoothTransitionDelegate; - private CallbackController mCallbackController = new CallbackController(); + private final CallbackController mCallbackController = new CallbackController(); @VisibleForTesting public static class NtpSmoothTransitionDelegate implements SmoothTransitionDelegate { private static final int SMOOTH_TRANSITION_DURATION_MS = 100; - private View mView; + private final View mView; private Animator mAnimator; private ObservableSupplier<Integer> mRestoringState; private boolean mAnimatorStarted;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageLayout.java index 9ec477dc..184a73948 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageLayout.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageLayout.java
@@ -121,7 +121,7 @@ private FeedSurfaceScrollDelegate mScrollDelegate; - private int mTileViewWidth; + private final int mTileViewWidth; private Integer mInitialTileNum; private Boolean mIsMvtAllFilledLandscape; private Boolean mIsMvtAllFilledPortrait;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageScrollView.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageScrollView.java index b2f3de92..75533fc 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageScrollView.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/NewTabPageScrollView.java
@@ -22,7 +22,7 @@ */ public class NewTabPageScrollView extends FadingEdgeScrollView { - private GestureDetector mGestureDetector; + private final GestureDetector mGestureDetector; /** Constructor needed to inflate from XML. */ public NewTabPageScrollView(Context context, AttributeSet attrs) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsPage.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsPage.java index 6476094..cd8e1046 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsPage.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsPage.java
@@ -67,7 +67,7 @@ private final ObservableSupplier<Integer> mTabStripHeightSupplier; private final ObservableSupplier<EdgeToEdgeController> mEdgeToEdgeSupplier; - private Callback<Integer> mTabStripHeightChangeCallback; + private final Callback<Integer> mTabStripHeightChangeCallback; private SmoothTransitionDelegate mSmoothTransitionDelegate; private EdgeToEdgePadAdjuster mPadAdjuster;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsRowAdapter.java b/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsRowAdapter.java index fe2311f4..a54c62e2 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsRowAdapter.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ntp/RecentTabsRowAdapter.java
@@ -133,7 +133,7 @@ new ArrayMap<>(FaviconLocality.NUM_ENTRIES); private final int mFaviconSize; private boolean mHasForeignDataRecorded; - private RoundedIconGenerator mIconGenerator; + private final RoundedIconGenerator mIconGenerator; /** * A generic group of objects to be shown in the RecentTabsRowAdapter, such as the list of
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/ClientId.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/ClientId.java index e4887223..6ead1598 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/ClientId.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/ClientId.java
@@ -10,8 +10,8 @@ /** Object to hold a client identifier for an offline page. */ public class ClientId { - private String mNamespace; - private String mId; + private final String mNamespace; + private final String mId; public ClientId(String namespace, String id) { mNamespace = namespace;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java index 469436e..f212464 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtils.java
@@ -68,7 +68,7 @@ * be garbage collected without worrying about this map. The RecentTabTracker is held here so * that it can be destroyed when the Activity gets a new TabModelSelector. */ - private static Map<Activity, RecentTabTracker> sTabModelObservers = new HashMap<>(); + private static final Map<Activity, RecentTabTracker> sTabModelObservers = new HashMap<>(); /** * Interface for implementation of offline page utilities, that can be implemented for testing. @@ -732,8 +732,7 @@ */ private static class RecentTabTracker extends TabModelSelectorTabModelObserver { /** The single, stateless TabRestoreTracker instance to monitor all tab restores. */ - - private TabModelSelector mTabModelSelector; + private final TabModelSelector mTabModelSelector; public RecentTabTracker(TabModelSelector selector) { super(selector);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/PublishPageCallback.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/PublishPageCallback.java index 7b3656e..3d0c19e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/PublishPageCallback.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/PublishPageCallback.java
@@ -16,9 +16,9 @@ * processing for sharing. */ public class PublishPageCallback implements Callback<String> { - private Callback<ShareParams> mShareCallback; + private final Callback<ShareParams> mShareCallback; OfflinePageItem mPage; - private WindowAndroid mWindow; + private final WindowAndroid mWindow; /** Create a callback for use when page publishing is completed. */ public PublishPageCallback(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/SavePageRequest.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/SavePageRequest.java index 684207b..55b076b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/SavePageRequest.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/SavePageRequest.java
@@ -12,13 +12,13 @@ @JNINamespace("offline_pages::android") public class SavePageRequest { // Int representation of the org.chromium.components.offlinepages.RequestState enum. - private int mRequestState; - private long mRequestId; - private String mUrl; - private ClientId mClientId; - private OfflinePageOrigin mOrigin; + private final int mRequestState; + private final long mRequestId; + private final String mUrl; + private final ClientId mClientId; + private final OfflinePageOrigin mOrigin; // Int representation of SavePageRequest::AutoFetchNotificationState - private int mAutoFetchNotificationState; + private final int mAutoFetchNotificationState; /** * Creates a SavePageRequest that's a copy of the C++ side version.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/indicator/OfflineDetector.java b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/indicator/OfflineDetector.java index 6fb5de1..7d769d9a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/indicator/OfflineDetector.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/offlinepages/indicator/OfflineDetector.java
@@ -68,9 +68,9 @@ // True if the network is offline as detected by the connectivity detector. private boolean mIsOfflineLastReportedByConnectivityDetector; - private Context mContext; + private final Context mContext; private Handler mHandler; - private Runnable mUpdateOfflineStatusIndicatorDelayedRunnable; + private final Runnable mUpdateOfflineStatusIndicatorDelayedRunnable; // Used to inform the client when the system changes between online and offline. A value of true // is given when the system is offline, and a value of false is given when the system is online.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/omaha/UpdateMenuItemHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/omaha/UpdateMenuItemHelper.java index 46817e1..2d20f8e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/omaha/UpdateMenuItemHelper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/omaha/UpdateMenuItemHelper.java
@@ -50,7 +50,7 @@ private static UpdateMenuItemHelper sInstanceForTesting; private static ProfileKeyedMap<UpdateMenuItemHelper> sProfileMap; - private static Object sGetInstanceLock = new Object(); + private static final Object sGetInstanceLock = new Object(); private final Profile mProfile; private final ObserverList<Runnable> mObservers = new ObserverList<>();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/password_manager/PasswordManagerDialogMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/password_manager/PasswordManagerDialogMediator.java index df99ee79..1f9f42b20 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/password_manager/PasswordManagerDialogMediator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/password_manager/PasswordManagerDialogMediator.java
@@ -26,14 +26,14 @@ private final View mAndroidContentView; private final BrowserControlsStateProvider mBrowserControlsStateProvider; - private PropertyModel.Builder mHostDialogModelBuilder; + private final PropertyModel.Builder mHostDialogModelBuilder; private PropertyModel mHostDialogModel; private PropertyModel mModel; private Resources mResources; private @ModalDialogManager.ModalDialogType int mDialogType; private static class DialogClickHandler implements ModalDialogProperties.Controller { - private Callback<Integer> mCallback; + private final Callback<Integer> mCallback; DialogClickHandler(Callback<Integer> onClick) { mCallback = onClick;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/password_manager/settings/ManualCallbackDelayer.java b/chrome/android/java/src/org/chromium/chrome/browser/password_manager/settings/ManualCallbackDelayer.java index 6af90b2..372bf764 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/password_manager/settings/ManualCallbackDelayer.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/password_manager/settings/ManualCallbackDelayer.java
@@ -12,7 +12,7 @@ */ public final class ManualCallbackDelayer implements CallbackDelayer { /** The callbacks to be run within {@link runCallbacksSynchronously}.*/ - private List<Runnable> mCallbacks = new ArrayList<>(); + private final List<Runnable> mCallbacks = new ArrayList<>(); @Override public void delay(Runnable callback) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/password_manager/settings/PasswordSettings.java b/chrome/android/java/src/org/chromium/chrome/browser/password_manager/settings/PasswordSettings.java index 9cda327e..b85fa80 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/password_manager/settings/PasswordSettings.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/password_manager/settings/PasswordSettings.java
@@ -136,7 +136,7 @@ private final ObservableSupplierImpl<String> mPageTitle = new ObservableSupplierImpl<>(); /** For controlling the UX flow of exporting passwords. */ - private ExportFlow mExportFlow = new ExportFlow(PasswordAccessLossWarningType.NONE); + private final ExportFlow mExportFlow = new ExportFlow(PasswordAccessLossWarningType.NONE); public ExportFlow getExportFlowForTesting() { return mExportFlow;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/AutofillContact.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/AutofillContact.java index e03a4fb..c8c8e2d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/payments/AutofillContact.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/AutofillContact.java
@@ -19,9 +19,9 @@ private final AutofillProfile mProfile; private final Context mContext; private int mCompletionStatus; - private boolean mRequestName; - private boolean mRequestPhone; - private boolean mRequestEmail; + private final boolean mRequestName; + private final boolean mRequestPhone; + private final boolean mRequestEmail; @Nullable private String mPayerName; @Nullable private String mPayerPhone; @Nullable private String mPayerEmail;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestHeader.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestHeader.java index ebfd6165..c411f77 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestHeader.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestHeader.java
@@ -27,7 +27,7 @@ /** This class represents a bar to display at the top of the payment request UI. */ public class PaymentRequestHeader extends FrameLayout { private final @ColorInt int mBackgroundColor; - private Context mContext; + private final Context mContext; /** Constructor for when the PaymentRequestHeader is inflated from XML. */ public PaymentRequestHeader(Context context, AttributeSet attrs) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestSection.java b/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestSection.java index 2606263..0af808d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestSection.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/payments/ui/PaymentRequestSection.java
@@ -547,7 +547,7 @@ private final List<TextView> mLineItemAmountsForTest = new ArrayList<>(); /** The runnable used to fade out the mUpdatedView. */ - private Runnable mFadeOutRunnable = + private final Runnable mFadeOutRunnable = new Runnable() { @Override public void run() { @@ -560,7 +560,7 @@ }; /** The Handler used to post the mFadeOutRunnables. */ - private Handler mHandler = new Handler(); + private final Handler mHandler = new Handler(); public LineItemBreakdownSection( Context context, String sectionName, SectionDelegate delegate, String updatedText) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/DecoderService.java b/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/DecoderService.java index 77bf961..1a45915d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/DecoderService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/photo_picker/DecoderService.java
@@ -11,6 +11,7 @@ /** See {@link DecoderServiceImpl}. */ @NullMarked public class DecoderService extends SplitCompatService { + @SuppressWarnings("FieldCanBeFinal") // @IdentifierNameString requires non-final private static @IdentifierNameString String sImplClassName = "org.chromium.chrome.browser.photo_picker.DecoderServiceImpl";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxSurveyController.java b/chrome/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxSurveyController.java index 1772c4f..db14200 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxSurveyController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxSurveyController.java
@@ -141,12 +141,12 @@ .build(); private ActivityTabTabObserver mActivityTabTabObserver; - private Activity mActivity; - private ActivityLifecycleDispatcher mActivityLifecycleDispatcher; + private final Activity mActivity; + private final ActivityLifecycleDispatcher mActivityLifecycleDispatcher; private PropertyModel mMessage; - private TabModelSelector mTabModelSelector; - private MessageDispatcher mMessageDispatcher; - private Profile mProfile; + private final TabModelSelector mTabModelSelector; + private final MessageDispatcher mMessageDispatcher; + private final Profile mProfile; private boolean mHasSeenNtp; private boolean mOverrideChannelForTesting; private int mChannelForTesting;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/privacy_sandbox/TrackingProtectionSnackbarController.java b/chrome/android/java/src/org/chromium/chrome/browser/privacy_sandbox/TrackingProtectionSnackbarController.java index 7f433f0..7431ee9 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/privacy_sandbox/TrackingProtectionSnackbarController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/privacy_sandbox/TrackingProtectionSnackbarController.java
@@ -39,7 +39,7 @@ private final CookieControlsBridge mCookieControlsBridge; private final @ActivityType int mActivityType; private final ReentrantLock mLock = new ReentrantLock(); - private SnackbarController mSnackbarController = + private final SnackbarController mSnackbarController = new SnackbarController() { @Override public void onDismissNoAction(Object actionData) {} @@ -52,8 +52,8 @@ private boolean mTrackingProtectionControlsVisible; private boolean mTrackingProtectionBlocked; private int mBlockingStatus3pcd; - private TrackingProtectionSnackbarLimiter mTrackingProtectionLimiter; - private WebContents mWebContents; + private final TrackingProtectionSnackbarLimiter mTrackingProtectionLimiter; + private final WebContents mWebContents; /** * Creates the {@link TrackingProtectionSnackbarController} object.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/provider/ChromeBrowserProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/provider/ChromeBrowserProvider.java index e2ac425f9..4370354 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/provider/ChromeBrowserProvider.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/provider/ChromeBrowserProvider.java
@@ -11,6 +11,7 @@ /** See {@link ChromeBrowserProviderImpl}. */ @NullMarked public class ChromeBrowserProvider extends SplitCompatContentProvider { + @SuppressWarnings("FieldCanBeFinal") // @IdentifierNameString requires non-final private static @IdentifierNameString String sImplClassName = "org.chromium.chrome.browser.provider.ChromeBrowserProviderImpl";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/provider/PageContentProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/provider/PageContentProvider.java index 4fce2f7..175426c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/provider/PageContentProvider.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/provider/PageContentProvider.java
@@ -11,6 +11,7 @@ /** See {@link PageContentProviderImpl}. */ @NullMarked public class PageContentProvider extends SplitCompatContentProvider { + @SuppressWarnings("FieldCanBeFinal") // @IdentifierNameString requires non-final private static @IdentifierNameString String sImplClassName = "org.chromium.chrome.browser.provider.PageContentProviderImpl";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/safe_browsing/SafeBrowsingSettingsNavigation.java b/chrome/android/java/src/org/chromium/chrome/browser/safe_browsing/SafeBrowsingSettingsNavigation.java index 5473c757..d8507ed 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/safe_browsing/SafeBrowsingSettingsNavigation.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/safe_browsing/SafeBrowsingSettingsNavigation.java
@@ -4,13 +4,16 @@ package org.chromium.chrome.browser.safe_browsing; import android.content.Context; +import android.content.Intent; import org.jni_zero.CalledByNative; +import org.chromium.base.IntentUtils; import org.chromium.chrome.browser.safe_browsing.metrics.SettingsAccessPoint; import org.chromium.chrome.browser.safe_browsing.settings.SafeBrowsingSettingsFragment; import org.chromium.chrome.browser.settings.SettingsNavigationFactory; import org.chromium.components.browser_ui.settings.SettingsNavigation; +import org.chromium.components.permissions.OsAdditionalSecurityPermissionUtil; import org.chromium.ui.base.WindowAndroid; /** Bridge between Java and native SafeBrowsing code to launch the Safe Browsing settings page. */ @@ -29,4 +32,20 @@ SafeBrowsingSettingsFragment.class, SafeBrowsingSettingsFragment.createArguments(accessPoint)); } + + @CalledByNative + private static void showAdvancedProtectionSettings(WindowAndroid window) { + if (window == null) return; + Context currentContext = window.getContext().get(); + + var additionalSecurityProvider = OsAdditionalSecurityPermissionUtil.getProviderInstance(); + if (additionalSecurityProvider == null) { + return; + } + Intent intent = additionalSecurityProvider.getIntentForOsAdvancedProtectionSettings(); + if (intent == null) { + return; + } + IntentUtils.safeStartActivity(currentContext, intent); + } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/safety_check/SafetyCheckUpdatesDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/safety_check/SafetyCheckUpdatesDelegateImpl.java index 549549c..edb94085 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/safety_check/SafetyCheckUpdatesDelegateImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/safety_check/SafetyCheckUpdatesDelegateImpl.java
@@ -21,7 +21,7 @@ * modularized as well, this class will not be needed anymore. */ public class SafetyCheckUpdatesDelegateImpl implements SafetyCheckUpdatesDelegate { - private OmahaService mOmaha; + private final OmahaService mOmaha; /** * Creates a new instance of the glue class to be passed to {@link SafetyCheckSettingsFragment}.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivityClientImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivityClientImpl.java index 17ecb01..2cfc46be 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivityClientImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/searchwidget/SearchActivityClientImpl.java
@@ -51,8 +51,8 @@ private final @IntentOrigin int mOrigin; private static class IntentBuilderImpl implements IntentBuilder { - private Intent mIntent; - private @IntentOrigin int mOrigin; + private final Intent mIntent; + private final @IntentOrigin int mOrigin; private @SearchType int mSearchType; IntentBuilderImpl(Context context, int origin) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/segmentation_platform/ContextualPageActionController.java b/chrome/android/java/src/org/chromium/chrome/browser/segmentation_platform/ContextualPageActionController.java index b1132b1..303b72b3 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/segmentation_platform/ContextualPageActionController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/segmentation_platform/ContextualPageActionController.java
@@ -65,7 +65,7 @@ } private final ObservableSupplier<Profile> mProfileSupplier; - private ObservableSupplier<Tab> mTabSupplier; + private final ObservableSupplier<Tab> mTabSupplier; private final AdaptiveToolbarButtonController mAdaptiveToolbarButtonController; private CurrentTabObserver mCurrentTabObserver; private SignalAccumulator mSignalAccumulator;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/services/gcm/ChromeGcmListenerService.java b/chrome/android/java/src/org/chromium/chrome/browser/services/gcm/ChromeGcmListenerService.java index 9bc55f8..6afadd1 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/services/gcm/ChromeGcmListenerService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/services/gcm/ChromeGcmListenerService.java
@@ -17,6 +17,7 @@ @SuppressLint("MissingFirebaseInstanceTokenRefresh") @NullMarked public class ChromeGcmListenerService extends SplitCompatGcmListenerService { + @SuppressWarnings("FieldCanBeFinal") // @IdentifierNameString requires non-final private static @IdentifierNameString String sImplClassName = "org.chromium.chrome.browser.services.gcm.ChromeGcmListenerServiceImpl";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/services/gcm/GCMBackgroundService.java b/chrome/android/java/src/org/chromium/chrome/browser/services/gcm/GCMBackgroundService.java index 2dcbb41c..2f4f111 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/services/gcm/GCMBackgroundService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/services/gcm/GCMBackgroundService.java
@@ -13,6 +13,7 @@ public class GCMBackgroundService extends SplitCompatIntentService { private static final String TAG = "GCMBackgroundService"; + @SuppressWarnings("FieldCanBeFinal") // @IdentifierNameString requires non-final private static @IdentifierNameString String sImplClassName = "org.chromium.chrome.browser.services.gcm.GCMBackgroundServiceImpl";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/share/ShareHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/share/ShareHelper.java index 222f2e7..af53c00 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/share/ShareHelper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/share/ShareHelper.java
@@ -347,8 +347,8 @@ * saving the chosen component. */ private static class SaveComponentCallback implements TargetChosenCallback { - private TargetChosenCallback mOriginalCallback; - private Profile mProfile; + private final TargetChosenCallback mOriginalCallback; + private final Profile mProfile; public SaveComponentCallback( @Nullable Profile profile, @Nullable TargetChosenCallback originalCallback) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/AppRestrictionSupplier.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/AppRestrictionSupplier.java index 24090c2b..2064d5e4 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/signin/AppRestrictionSupplier.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/AppRestrictionSupplier.java
@@ -49,8 +49,8 @@ private boolean mInitialized; private boolean mHasAppRestriction; private long mCompletionElapsedRealtimeMs; - private Queue<Callback<Boolean>> mCallbacks = new LinkedList<>(); - private Queue<Callback<Long>> mCompletionTimeCallbacks = new LinkedList<>(); + private final Queue<Callback<Boolean>> mCallbacks = new LinkedList<>(); + private final Queue<Callback<Long>> mCompletionTimeCallbacks = new LinkedList<>(); private AsyncTask<Boolean> mFetchAppRestrictionAsyncTask;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninCheckerProvider.java b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninCheckerProvider.java index dfde5bed..5e9a19bb 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninCheckerProvider.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/signin/SigninCheckerProvider.java
@@ -15,7 +15,7 @@ /** This class is used to get a singleton instance of {@link SigninChecker}. */ public final class SigninCheckerProvider { - private static ProfileKeyedMap<SigninChecker> sProfileMap = + private static final ProfileKeyedMap<SigninChecker> sProfileMap = ProfileKeyedMap.createMapOfDestroyables(); private static SigninChecker sInstanceForTesting;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/site_settings/CookieControlsServiceBridge.java b/chrome/android/java/src/org/chromium/chrome/browser/site_settings/CookieControlsServiceBridge.java index e722891..4d97a88 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/site_settings/CookieControlsServiceBridge.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/site_settings/CookieControlsServiceBridge.java
@@ -36,7 +36,7 @@ } private long mNativeCookieControlsServiceBridge; - private CookieControlsServiceObserver mObserver; + private final CookieControlsServiceObserver mObserver; /** * Initializes a CookieControlsServiceBridge instance.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorCoordinator.java index e1d201c..9e21149 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorCoordinator.java
@@ -47,16 +47,16 @@ default void onStatusIndicatorShowAnimationEnd() {} } - private StatusIndicatorMediator mMediator; - private StatusIndicatorSceneLayer mSceneLayer; + private final StatusIndicatorMediator mMediator; + private final StatusIndicatorSceneLayer mSceneLayer; private boolean mIsShowing; private Runnable mRemoveOnLayoutChangeListener; private int mResourceId; private ViewResourceAdapter mResourceAdapter; - private ResourceManager mResourceManager; + private final ResourceManager mResourceManager; private boolean mResourceRegistered; - private Activity mActivity; - private Callback<Runnable> mRequestRender; + private final Activity mActivity; + private final Callback<Runnable> mRequestRender; private boolean mInitialized; /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorMediator.java index 9a27655..f58fc953 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorMediator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorMediator.java
@@ -34,15 +34,15 @@ private static final int UPDATE_COLOR_TRANSITION_DURATION_MS = 400; private PropertyModel mModel; - private BrowserControlsStateProvider mBrowserControlsStateProvider; - private HashSet<StatusIndicatorCoordinator.StatusIndicatorObserver> mObservers = + private final BrowserControlsStateProvider mBrowserControlsStateProvider; + private final HashSet<StatusIndicatorCoordinator.StatusIndicatorObserver> mObservers = new HashSet<>(); private final TabObscuringHandler mTabObscuringHandler; - private Supplier<Integer> mStatusBarWithoutIndicatorColorSupplier; + private final Supplier<Integer> mStatusBarWithoutIndicatorColorSupplier; private Runnable mOnShowAnimationEnd; private Runnable mRegisterResource; private Runnable mUnregisterResource; - private Supplier<Boolean> mCanAnimateNativeBrowserControls; + private final Supplier<Boolean> mCanAnimateNativeBrowserControls; private Callback<Runnable> mInvalidateCompositorView; private Runnable mRequestLayout;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorSceneLayer.java b/chrome/android/java/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorSceneLayer.java index d2847e4..16de100 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorSceneLayer.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/status_indicator/StatusIndicatorSceneLayer.java
@@ -32,7 +32,7 @@ private int mResourceId; /** The {@link BrowserControlsStateProvider} to access browser controls offsets. */ - private BrowserControlsStateProvider mBrowserControlsStateProvider; + private final BrowserControlsStateProvider mBrowserControlsStateProvider; private boolean mIsVisible;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/UrlSimilarityScorer.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/UrlSimilarityScorer.java index 93566fa..d23c852 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/UrlSimilarityScorer.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/UrlSimilarityScorer.java
@@ -70,7 +70,7 @@ public static final int SCORE_REF_MATCH = 1; // These are the same ones used in VisitSegmentDatabase::ComputeSegmentName(). - private static Set<String> sDiscardableHostPrefixes = + private static final Set<String> sDiscardableHostPrefixes = new HashSet<>(Arrays.asList("www", "m", "mobile", "touch")); private final GURL mKeyUrl;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/mostvisited/MostVisitedSitesMetadataUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/mostvisited/MostVisitedSitesMetadataUtils.java index ef2bf33..34a4a89 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/mostvisited/MostVisitedSitesMetadataUtils.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/mostvisited/MostVisitedSitesMetadataUtils.java
@@ -49,8 +49,8 @@ private static final int CACHE_VERSION = 1; private static File sStateDirectory; - private static String sStateDirName = "top_sites"; - private static String sStateFileName = "top_sites"; + private static final String STATE_DIR_NAME = "top_sites"; + private static final String STATE_FILENAME = "top_sites"; private Runnable mCurrentTask; private Runnable mPendingTask; @@ -98,7 +98,7 @@ public static List<Tile> restoreFileToSuggestionLists() throws IOException { List<Tile> tiles; try { - byte[] listData = restoreFileToBytes(getOrCreateTopSitesDirectory(), sStateFileName); + byte[] listData = restoreFileToBytes(getOrCreateTopSitesDirectory(), STATE_FILENAME); tiles = deserializeTopSitesData(listData); } catch (IOException e) { getOrCreateTopSitesDirectory().delete(); @@ -132,7 +132,7 @@ try { byte[] listData = serializeTopSitesData(suggestionTiles); saveSuggestionListsToFile( - getOrCreateTopSitesDirectory(), sStateFileName, listData); + getOrCreateTopSitesDirectory(), STATE_FILENAME, listData); } catch (IOException e) { Log.e(TAG, "Fail to save file."); } @@ -265,7 +265,7 @@ if (sStateDirectory == null) { sStateDirectory = ContextUtils.getApplicationContext() - .getDir(sStateDirName, Context.MODE_PRIVATE); + .getDir(STATE_DIR_NAME, Context.MODE_PRIVATE); } } return sStateDirectory;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/MostVisitedTilesMediator.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/MostVisitedTilesMediator.java index 52bbb5c8..f36fd70 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/MostVisitedTilesMediator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/MostVisitedTilesMediator.java
@@ -53,9 +53,9 @@ private boolean mSearchProviderHasLogo = true; private TemplateUrlService mTemplateUrlService; - private int mLateralMarginSum; + private final int mLateralMarginSum; private final int mTileViewEdgePaddingForTablet; - private int mTileViewIntervalPaddingForTablet; + private final int mTileViewIntervalPaddingForTablet; public MostVisitedTilesMediator( Resources resources,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/TileGroup.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/TileGroup.java index 425e61f..78517b72 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/TileGroup.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/TileGroup.java
@@ -329,7 +329,7 @@ */ private SparseArray<List<Tile>> mTileSections = createEmptyTileData(); - private PendingChanges mPendingChanges = new PendingChanges(); + private final PendingChanges mPendingChanges = new PendingChanges(); private boolean mHasReceivedData;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/TileInteractionDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/TileInteractionDelegateImpl.java index c50d9791..e063bae 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/TileInteractionDelegateImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/TileInteractionDelegateImpl.java
@@ -43,7 +43,7 @@ private final TileGroup.CustomTileModificationDelegate mCustomTileModificationDelegate; private final int mPrerenderDelay; private final Tile mTile; - private AndroidPrerenderManager mAndroidPrerenderManager; + private final AndroidPrerenderManager mAndroidPrerenderManager; private @Nullable Runnable mOnClickRunnable; private @Nullable Runnable mOnRemoveRunnable;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/TilesLinearLayout.java b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/TilesLinearLayout.java index 836caab5..a2514c2 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/TilesLinearLayout.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/suggestions/tile/TilesLinearLayout.java
@@ -25,7 +25,7 @@ */ @NullMarked public class TilesLinearLayout extends LinearLayout { - private List<TileView> mTileList = new ArrayList<TileView>(); + private final List<TileView> mTileList = new ArrayList<TileView>(); protected float mNonTileViewsTotalWidthDp;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncErrorNotifier.java b/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncErrorNotifier.java index 295311054..3f73303 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncErrorNotifier.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/sync/SyncErrorNotifier.java
@@ -57,7 +57,7 @@ private static final String TAG = "SyncUI"; - private static ProfileKeyedMap<SyncErrorNotifier> sProfileMap = + private static final ProfileKeyedMap<SyncErrorNotifier> sProfileMap = new ProfileKeyedMap<>(ProfileKeyedMap.NO_REQUIRED_CLEANUP_ACTION); private final BaseNotificationManagerProxy mNotificationManager;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateClientImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateClientImpl.java index 511d399..c06887c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateClientImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateClientImpl.java
@@ -23,7 +23,7 @@ * Tab. */ public class InterceptNavigationDelegateClientImpl implements InterceptNavigationDelegateClient { - private TabImpl mTab; + private final TabImpl mTab; private final TabObserver mTabObserver; private InterceptNavigationDelegateImpl mInterceptNavigationDelegate;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateTabHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateTabHelper.java index 4401ae9..085eb48a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateTabHelper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateTabHelper.java
@@ -13,7 +13,7 @@ InterceptNavigationDelegateTabHelper.class; private InterceptNavigationDelegateImpl mInterceptNavigationDelegate; - private InterceptNavigationDelegateClientImpl mInterceptNavigationDelegateClient; + private final InterceptNavigationDelegateClientImpl mInterceptNavigationDelegateClient; public static void setDelegateForTesting(Tab tab, InterceptNavigationDelegateImpl delegate) { InterceptNavigationDelegateTabHelper helper =
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabArchiveSettings.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabArchiveSettings.java index 1cd7f9a..3d0e1f9 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabArchiveSettings.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabArchiveSettings.java
@@ -55,7 +55,7 @@ ChromePreferenceKeys.TAB_DECLUTTER_AUTO_DELETE_ENABLED, ChromePreferenceKeys.TAB_DECLUTTER_AUTO_DELETE_TIME_DELTA_HOURS); - private SharedPreferences.OnSharedPreferenceChangeListener mPrefsListener = + private final SharedPreferences.OnSharedPreferenceChangeListener mPrefsListener = new SharedPreferences.OnSharedPreferenceChangeListener() { @Override public void onSharedPreferenceChanged(SharedPreferences sharedPrefs, String key) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java index df836a31..553e275 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabImpl.java
@@ -175,7 +175,7 @@ * The {@link TabViewManager} associated with this Tab that is responsible for managing custom * views. */ - private TabViewManagerImpl mTabViewManager; + private final TabViewManagerImpl mTabViewManager; /** A list of Tab observers. These are used to broadcast Tab events to listeners. */ @VisibleForTesting(otherwise = VisibleForTesting.PRIVATE) @@ -236,7 +236,7 @@ private TabDelegateFactory mDelegateFactory; /** Listens for views related to the tab to be attached or detached. */ - private OnAttachStateChangeListener mAttachStateChangeListener; + private final OnAttachStateChangeListener mAttachStateChangeListener; /** Whether the tab can currently be interacted with. */ private boolean mInteractableState;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabStateBrowserControlsVisibilityDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabStateBrowserControlsVisibilityDelegate.java index 68a99aa..1a040228 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabStateBrowserControlsVisibilityDelegate.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabStateBrowserControlsVisibilityDelegate.java
@@ -63,7 +63,7 @@ mTab.addObserver( new EmptyTabObserver() { @SuppressLint("HandlerLeak") - private Handler mHandler = + private final Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabViewManagerImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabViewManagerImpl.java index f5806f91..741420f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabViewManagerImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabViewManagerImpl.java
@@ -56,7 +56,7 @@ } } - private PriorityQueue<TabViewProvider> mTabViewProviders; + private final PriorityQueue<TabViewProvider> mTabViewProviders; private TabImpl mTab; private View mCurrentView; private DestroyableObservableSupplier<Rect> mMarginSupplier;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/BottomAttachedUiObserver.java b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/BottomAttachedUiObserver.java index 6583028f..8b07d0ca 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/BottomAttachedUiObserver.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/BottomAttachedUiObserver.java
@@ -101,7 +101,7 @@ private boolean mOverlayPanelVisible; @PanelState private int mOverlayPanelState; - private Optional<OmniboxSuggestionsVisualState> mOmniboxSuggestionsVisualState; + private final Optional<OmniboxSuggestionsVisualState> mOmniboxSuggestionsVisualState; private boolean mOmniboxSuggestionsVisible; private @Nullable @ColorInt Integer mOmniboxSuggestionsColor;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegate.java index 1b6dfab..aa34445 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegate.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedAppMenuPropertiesDelegate.java
@@ -80,7 +80,7 @@ */ private @Nullable IncognitoReauthController mIncognitoReauthController; - private CallbackController mIncognitoReauthCallbackController = new CallbackController(); + private final CallbackController mIncognitoReauthCallbackController = new CallbackController(); public TabbedAppMenuPropertiesDelegate( Context context,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java index 2516182..c21cf1caf 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabbed_mode/TabbedRootUiCoordinator.java
@@ -275,7 +275,7 @@ private @Nullable BookmarkBarVisibilityProvider mBookmarkBarVisibilityProvider; private @Nullable LoadingFullscreenCoordinator mLoadingFullscreenCoordinator; private @Nullable BookmarkOpener mBookmarkOpener; - private @NonNull ObservableSupplier<BookmarkManagerOpener> mBookmarkManagerOpenerSupplier; + private final @NonNull ObservableSupplier<BookmarkManagerOpener> mBookmarkManagerOpenerSupplier; private @NonNull AdvancedProtectionCoordinator mAdvancedProtectionCoordinator; private final @NonNull KeyboardFocusRowManager mKeyboardFocusRowManager; private CharSequence mApplicationLabel;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/PendingTabClosureManager.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/PendingTabClosureManager.java index 7cde195..ebb692d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/PendingTabClosureManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/PendingTabClosureManager.java
@@ -228,12 +228,12 @@ private boolean mIsCommittingAllTabClosures; /** The {@link TabModel} that this {@link PendingTabClosureManager} operates on. */ - private TabModel mTabModel; + private final TabModel mTabModel; - private PendingTabClosureDelegate mDelegate; + private final PendingTabClosureDelegate mDelegate; /** Representation of a set of tabs that were closed together. */ - private LinkedList<TabClosureEvent> mTabClosureEvents = new LinkedList<>(); + private final LinkedList<TabClosureEvent> mTabClosureEvents = new LinkedList<>(); /** * A {@link TabList} that represents the complete list of {@link Tab}s. This is so that
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorImpl.java index 9a81199a..404913f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorImpl.java
@@ -50,8 +50,8 @@ private final Context mContext; private final @Nullable ModalDialogManager mModalDialogManager; - private boolean mIsUndoSupported; - private NextTabPolicySupplier mNextTabPolicySupplier; + private final boolean mIsUndoSupported; + private final NextTabPolicySupplier mNextTabPolicySupplier; private TabContentManager mTabContentManager; private RecentlyClosedBridge mRecentlyClosedBridge; private Tab mVisibleTab;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistenceFileInfo.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistenceFileInfo.java index e87e644..b3ec707 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistenceFileInfo.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistenceFileInfo.java
@@ -13,10 +13,10 @@ /** Contains representations of stored Tab data, sufficient to identify said Tab data in storage. */ public class TabPersistenceFileInfo { // List of identifiers for TabState files. - private List<TabStateFileInfo> mTabStateFileInfos = new LinkedList<>(); + private final List<TabStateFileInfo> mTabStateFileInfos = new LinkedList<>(); // List of metadata files. - private List<String> mMetadataFiles = new LinkedList<>(); + private final List<String> mMetadataFiles = new LinkedList<>(); public void addTabStateFileInfo(int tabId, boolean isEncrypted) { mTabStateFileInfos.add(new TabStateFileInfo(tabId, isEncrypted));
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistentStore.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistentStore.java index fc21349..30d8449 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistentStore.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabPersistentStore.java
@@ -355,11 +355,11 @@ private SparseIntArray mNormalTabsRestored; private SparseIntArray mIncognitoTabsRestored; - private SequencedTaskRunner mSequencedTaskRunner; + private final SequencedTaskRunner mSequencedTaskRunner; private AsyncTask<DataInputStream> mPrefetchTabListTask; - private List<Pair<AsyncTask<DataInputStream>, String>> mPrefetchTabListToMergeTasks; + private final List<Pair<AsyncTask<DataInputStream>, String>> mPrefetchTabListToMergeTasks; // A set of filenames which are tracked to merge. - private Set<String> mMergedFileNames; + private final Set<String> mMergedFileNames; private TabModelSelectorMetadata mLastSavedMetadata; // Tracks whether this TabPersistentStore's tabs are being loaded. @@ -1614,10 +1614,10 @@ } private class SaveTabTask extends AsyncTask<Void> { - Tab mTab; - int mId; + final Tab mTab; + final int mId; TabState mState; - boolean mEncrypted; + final boolean mEncrypted; boolean mStateSaved; SaveTabTask(Tab tab) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabRemoverImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabRemoverImpl.java index e9c44dbc..8df2e6a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabRemoverImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabRemoverImpl.java
@@ -228,7 +228,7 @@ private static class RemoveTabHandler implements TabModelRemoverFlowHandler { private final TabGroupModelFilter mTabGroupModelFilter; private final Tab mTabToRemove; - private @Nullable TabModelActionListener mListener; + private final @Nullable TabModelActionListener mListener; RemoveTabHandler( @NonNull TabGroupModelFilter tabGroupModelFilter,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicy.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicy.java index e59f253..9069ace1 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicy.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabbedModeTabPersistencePolicy.java
@@ -458,7 +458,7 @@ private String[] mTabFileNames; private String[] mThumbnailFileNames; - private Supplier<SparseBooleanArray> mOtherTabSupplier; + private final Supplier<SparseBooleanArray> mOtherTabSupplier; private SparseBooleanArray mOtherTabIds; // Tab in use by other selectors, not be deleted. CleanUpTabStateDataTask(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java index ebd0cc3..4b841d2 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java
@@ -221,7 +221,7 @@ private final TopUiThemeColorProvider mTopUiThemeColorProvider; private final Supplier<EphemeralTabCoordinator> mEphemeralTabCoordinatorSupplier; private AppThemeColorProvider mAppThemeColorProvider; - private SettableThemeColorProvider mCustomTabThemeColorProvider; + private final SettableThemeColorProvider mCustomTabThemeColorProvider; private final TopToolbarCoordinator mToolbar; private final ToolbarControlContainer mControlContainer; private final View mToolbarHairline; @@ -241,7 +241,7 @@ private final ConstraintsProxy mConstraintsProxy = new ConstraintsProxy(); private ObservableSupplierImpl<BottomControlsCoordinator> mBottomControlsCoordinatorSupplier = new ObservableSupplierImpl<>(); - private ObservableSupplierImpl<Boolean> mSuppressToolbarSceneLayerSupplier = + private final ObservableSupplierImpl<Boolean> mSuppressToolbarSceneLayerSupplier = new ObservableSupplierImpl<>(false); private TabModelSelector mTabModelSelector; private final Callback<TabModel> mCurrentTabModelObserver; @@ -260,16 +260,16 @@ private LayoutManagerImpl mLayoutManager; - private BookmarkModelObserver mBookmarksObserver; - private FindToolbarObserver mFindToolbarObserver; + private final BookmarkModelObserver mBookmarksObserver; + private final FindToolbarObserver mFindToolbarObserver; private LayoutStateProvider mLayoutStateProvider; - private LayoutStateProvider.LayoutStateObserver mLayoutStateObserver; + private final LayoutStateProvider.LayoutStateObserver mLayoutStateObserver; private OneshotSupplier<LayoutStateProvider> mLayoutStateProviderSupplier; private CallbackController mCallbackController = new CallbackController(); private final ActionBarDelegate mActionBarDelegate; - private ActionModeController mActionModeController; + private final ActionModeController mActionModeController; private final Callback<Boolean> mUrlFocusChangedCallback; private final Handler mHandler = new Handler(); private final AppCompatActivity mActivity; @@ -280,7 +280,7 @@ private final BrowserControlsSizer mBrowserControlsSizer; private final FullscreenManager mFullscreenManager; private final ObservableSupplier<EdgeToEdgeController> mEdgeToEdgeControllerSupplier; - private LocationBarFocusScrimHandler mLocationBarFocusHandler; + private final LocationBarFocusScrimHandler mLocationBarFocusHandler; private ComponentCallbacks mComponentCallbacks; private final LoadProgressCoordinator mProgressBarCoordinator; private final ToolbarTabControllerImpl mToolbarTabController; @@ -288,7 +288,7 @@ private MenuButtonCoordinator mOverviewModeMenuButtonCoordinator; private HomepageManager.HomepageStateListener mHomepageStateListener; private final Supplier<ModalDialogManager> mModalDialogManagerSupplier; - private StatusBarColorController mStatusBarColorController; + private final StatusBarColorController mStatusBarColorController; private final ActivityLifecycleDispatcher mActivityLifecycleDispatcher; private final BottomSheetController mBottomSheetController; private final DataSharingTabManager mDataSharingTabManager; @@ -308,7 +308,7 @@ private @Nullable BackButtonCoordinator mBackButtonCoordinator; private @Nullable ExtensionToolbarManager mExtensionToolbarManager; - private BrowserStateBrowserControlsVisibilityDelegate mControlsVisibilityDelegate; + private final BrowserStateBrowserControlsVisibilityDelegate mControlsVisibilityDelegate; private int mFullscreenFocusToken = TokenHolder.INVALID_TOKEN; private int mFullscreenFindInPageToken = TokenHolder.INVALID_TOKEN; @@ -326,16 +326,16 @@ private final ScrimManager mScrimManager; - private OneshotSupplier<Boolean> mPromoShownOneshotSupplier; - private OverlayPanelManagerObserver mOverlayPanelManagerObserver; - private ObservableSupplierImpl<Boolean> mOverlayPanelVisibilitySupplier = + private final OneshotSupplier<Boolean> mPromoShownOneshotSupplier; + private final OverlayPanelManagerObserver mOverlayPanelManagerObserver; + private final ObservableSupplierImpl<Boolean> mOverlayPanelVisibilitySupplier = new ObservableSupplierImpl<>(); private ObservableSupplierImpl<Integer> mTabStripHeightSupplier; private TabStripHeightObserver mTabStripHeightObserver; - private @Nullable DesktopWindowStateManager mDesktopWindowStateManager; - private @Nullable MultiInstanceManager mMultiInstanceManager; - private OneshotSupplierImpl<TabStripTransitionDelegate> mTabStripTransitionDelegateSupplier = - new OneshotSupplierImpl<>(); + private final @Nullable DesktopWindowStateManager mDesktopWindowStateManager; + private final @Nullable MultiInstanceManager mMultiInstanceManager; + private final OneshotSupplierImpl<TabStripTransitionDelegate> + mTabStripTransitionDelegateSupplier = new OneshotSupplierImpl<>(); private @Nullable TabGroupUiOneshotSupplier mTabGroupUiOneshotSupplier; @@ -354,12 +354,13 @@ private boolean mBackGestureInProgress; private boolean mStartNavDuringOngoingGesture; - private WindowAndroid.ProgressBarConfig.Provider mProgressBarConfigProvider; + private final WindowAndroid.ProgressBarConfig.Provider mProgressBarConfigProvider; // Supplier of the offset, relative to the bottom of the viewport, of the bottom-anchored // toolbar. This value is only meaningful when the current ControlsPosition is BOTTOM. private final ObservableSupplierImpl<Integer> mBottomToolbarControlsOffsetSupplier = new ObservableSupplierImpl<>(0); - private FormFieldFocusedSupplier mFormFieldFocusedSupplier = new FormFieldFocusedSupplier(); + private final FormFieldFocusedSupplier mFormFieldFocusedSupplier = + new FormFieldFocusedSupplier(); private final View mProgressBarContainer; private @Nullable ObservableSupplier<Integer> mBookmarkBarHeightSupplier; private boolean mInTabSwitcherTransition;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tracing/TracingController.java b/chrome/android/java/src/org/chromium/chrome/browser/tracing/TracingController.java index e418f8c..43b86dc 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tracing/TracingController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tracing/TracingController.java
@@ -86,7 +86,7 @@ // Only set while a trace is in progress to avoid leaking native resources. private TracingControllerAndroid mNativeController; - private ObserverList<Observer> mObservers = new ObserverList<>(); + private final ObserverList<Observer> mObservers = new ObserverList<>(); private @State int mState = State.INITIALIZING; private Set<String> mKnownCategories; private File mTracingTempFile; @@ -367,7 +367,7 @@ } private static class TracingTempFileDeletion implements Runnable { - private File mTempFile; + private final File mTempFile; public TracingTempFileDeletion(File file) { mTempFile = file;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tracing/TracingNotificationService.java b/chrome/android/java/src/org/chromium/chrome/browser/tracing/TracingNotificationService.java index f184f0e3..01bf3979 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tracing/TracingNotificationService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tracing/TracingNotificationService.java
@@ -13,6 +13,7 @@ public class TracingNotificationService extends SplitCompatIntentService { private static final String TAG = "tracing_notification"; + @SuppressWarnings("FieldCanBeFinal") // @IdentifierNameString requires non-final private static @IdentifierNameString String sImplClassName = "org.chromium.chrome.browser.tracing.TracingNotificationServiceImpl";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/BottomSheetManager.java b/chrome/android/java/src/org/chromium/chrome/browser/ui/BottomSheetManager.java index 0c7ff15..ba883d2 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ui/BottomSheetManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ui/BottomSheetManager.java
@@ -55,21 +55,21 @@ private final ExpandedSheetHelper mExpandedSheetHelper; /** A browser controls manager for polling browser controls offsets. */ - private BrowserControlsVisibilityManager mBrowserControlsVisibilityManager; + private final BrowserControlsVisibilityManager mBrowserControlsVisibilityManager; /** * A handle to the {@link ManagedBottomSheetController} this class manages interactions with. */ - private ManagedBottomSheetController mSheetController; + private final ManagedBottomSheetController mSheetController; /** A mechanism for accessing the currently active tab. */ - private ActivityTabProvider mTabProvider; + private final ActivityTabProvider mTabProvider; /** A supplier of a snackbar manager for the bottom sheet. */ - private Supplier<SnackbarManager> mSnackbarManager; + private final Supplier<SnackbarManager> mSnackbarManager; /** The manager for overlay panels to attach listeners to. */ - private Supplier<OverlayPanelManager> mOverlayPanelManager; + private final Supplier<OverlayPanelManager> mOverlayPanelManager; /** The last known activity tab, if available. */ private Tab mLastActivityTab;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/ExpandedSheetHelperImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/ui/ExpandedSheetHelperImpl.java index b723fef..df00453 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ui/ExpandedSheetHelperImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ui/ExpandedSheetHelperImpl.java
@@ -26,13 +26,13 @@ private int mTabModalToken = TokenHolder.INVALID_TOKEN; /** A delegate that provides the functionality of obscuring all tabs. */ - private TabObscuringHandler mTabObscuringHandler; + private final TabObscuringHandler mTabObscuringHandler; /** A token held while the bottom sheet is obscuring all visible tabs. */ private TabObscuringHandler.Token mTabObscuringToken; /** A supplier of the activity's dialog manager. */ - private Supplier<ModalDialogManager> mDialogManager; + private final Supplier<ModalDialogManager> mDialogManager; public ExpandedSheetHelperImpl( Supplier<ModalDialogManager> dialogManager, TabObscuringHandler tabObscuringHandler) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/IncognitoRestoreAppLaunchDrawBlocker.java b/chrome/android/java/src/org/chromium/chrome/browser/ui/IncognitoRestoreAppLaunchDrawBlocker.java index cd6d02b..2cab73a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ui/IncognitoRestoreAppLaunchDrawBlocker.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ui/IncognitoRestoreAppLaunchDrawBlocker.java
@@ -81,7 +81,7 @@ /** * The {@link CallbackController} for any callbacks that may run after the class is destroyed. */ - private CallbackController mCallbackController = new CallbackController(); + private final CallbackController mCallbackController = new CallbackController(); /** * A callback to add a {@link TabModelSelectorObserver} which notifies about the event when the
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 66c01ff..e094962b4 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
@@ -33,7 +33,7 @@ private final CaptureOverlayTabObserver mTabObserver = new CaptureOverlayTabObserver(); private View mOverlayView; - private SparseArray<Tab> mCapturedTabs = new SparseArray<Tab>(); + private final SparseArray<Tab> mCapturedTabs = new SparseArray<Tab>(); private Tab mVisibleTab; private class CaptureOverlayTabObserver extends EmptyTabObserver {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/usage_stats/EventTracker.java b/chrome/android/java/src/org/chromium/chrome/browser/usage_stats/EventTracker.java index 562bd01..8e667ae 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/usage_stats/EventTracker.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/usage_stats/EventTracker.java
@@ -21,7 +21,7 @@ */ public class EventTracker { private final UsageStatsBridge mBridge; - private Promise<List<WebsiteEvent>> mRootPromise; + private final Promise<List<WebsiteEvent>> mRootPromise; public EventTracker(UsageStatsBridge bridge) { mBridge = bridge;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/usage_stats/TokenTracker.java b/chrome/android/java/src/org/chromium/chrome/browser/usage_stats/TokenTracker.java index 30264d1f..2e04dab 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/usage_stats/TokenTracker.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/usage_stats/TokenTracker.java
@@ -15,9 +15,9 @@ /** Class that tracks the mapping between tokens and fully-qualified domain names (FQDNs). */ public class TokenTracker { - private Promise<Map<String, String>> mRootPromise; + private final Promise<Map<String, String>> mRootPromise; private TokenGenerator mTokenGenerator; - private UsageStatsBridge mBridge; + private final UsageStatsBridge mBridge; public TokenTracker(UsageStatsBridge bridge) { mBridge = bridge;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/usage_stats/UsageStatsService.java b/chrome/android/java/src/org/chromium/chrome/browser/usage_stats/UsageStatsService.java index b20639e..ebad192 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/usage_stats/UsageStatsService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/usage_stats/UsageStatsService.java
@@ -34,19 +34,19 @@ public class UsageStatsService implements Destroyable { private static final String TAG = "UsageStatsService"; - private static ProfileKeyedMap<UsageStatsService> sProfileMap = + private static final ProfileKeyedMap<UsageStatsService> sProfileMap = ProfileKeyedMap.createMapOfDestroyables( ProfileKeyedMap.ProfileSelection.REDIRECTED_TO_ORIGINAL); - private Profile mProfile; - private EventTracker mEventTracker; - private SuspensionTracker mSuspensionTracker; - private TokenTracker mTokenTracker; - private UsageStatsBridge mBridge; + private final Profile mProfile; + private final EventTracker mEventTracker; + private final SuspensionTracker mSuspensionTracker; + private final TokenTracker mTokenTracker; + private final UsageStatsBridge mBridge; // PageViewObservers are scoped to a given ChromeTabbedActivity, but UsageStatsService isn't. To // allow for GC of the observer to happen when the activity goes away, we only hold weak // references here. - private List<WeakReference<PageViewObserver>> mPageViewObservers; + private final List<WeakReference<PageViewObserver>> mPageViewObservers; private DigitalWellbeingClient mClient; private boolean mOptInState;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/vr/ArCompositorDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/vr/ArCompositorDelegateImpl.java index 816eca1..48647fb 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/vr/ArCompositorDelegateImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/vr/ArCompositorDelegateImpl.java
@@ -19,9 +19,9 @@ /** Concrete, Chrome-specific implementation of ArCompositorDelegate interface. */ public class ArCompositorDelegateImpl implements ArCompositorDelegate { - private ChromeActivity mActivity; - private CompositorViewHolder mCompositorViewHolder; - private CompositorView mCompositorView; + private final ChromeActivity mActivity; + private final CompositorViewHolder mCompositorViewHolder; + private final CompositorView mCompositorView; ArCompositorDelegateImpl(WebContents webContents) { mActivity = ChromeActivity.fromWebContents(webContents);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/vr/VrCompositorDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/vr/VrCompositorDelegateImpl.java index a01b525..77780da 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/vr/VrCompositorDelegateImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/vr/VrCompositorDelegateImpl.java
@@ -17,8 +17,8 @@ /** Concrete, Chrome-specific implementation of VrCompositorDelegate interface. */ public class VrCompositorDelegateImpl implements VrCompositorDelegate { - private CompositorView mCompositorView; - private ObservableSupplier<TabModelSelector> mTabModelSelectorSupplier; + private final CompositorView mCompositorView; + private final ObservableSupplier<TabModelSelector> mTabModelSelectorSupplier; VrCompositorDelegateImpl(WebContents webContents) { ChromeActivity activity = ChromeActivity.fromWebContents(webContents);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkServiceClient.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkServiceClient.java index b0a5da7..d62d931 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkServiceClient.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkServiceClient.java
@@ -80,7 +80,7 @@ private static WebApkServiceClient sInstance; /** Manages connections between the browser application and WebAPK services. */ - private WebApkServiceConnectionManager mConnectionManager; + private final WebApkServiceConnectionManager mConnectionManager; public static WebApkServiceClient getInstance() { if (sInstance == null) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkSplashNetworkErrorObserver.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkSplashNetworkErrorObserver.java index 33ec506..8ce5933 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkSplashNetworkErrorObserver.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkSplashNetworkErrorObserver.java
@@ -21,7 +21,7 @@ * URL. */ public class WebApkSplashNetworkErrorObserver extends EmptyTabObserver { - private Activity mActivity; + private final Activity mActivity; private WebApkOfflineDialog mOfflineDialog; private boolean mDidShowNetworkErrorDialog;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateManager.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateManager.java index 8093023e..ad0dd82 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateManager.java
@@ -93,7 +93,7 @@ private static Integer sIconThresholdForTesting; /** The activity context to use. */ - private Context mContext; + private final Context mContext; /** The minimum shell version the WebAPK needs to be using. */ private static int sWebApkTargetShellVersion;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateReportAbuseDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateReportAbuseDialog.java index 24d57a3..86f5e910 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateReportAbuseDialog.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkUpdateReportAbuseDialog.java
@@ -36,25 +36,25 @@ private static final String TAG = "UpdateReportAbuseDlg"; // The Activity context to use. - private Context mActivityContext; + private final Context mActivityContext; // The modal dialog manager to use. - private ModalDialogManager mModalDialogManager; + private final ModalDialogManager mModalDialogManager; // The short name of the app the user is uninstalling. - private String mAppShortName; + private final String mAppShortName; // The package name for the app the user is uninstalling. - private String mAppPackageName; + private final String mAppPackageName; // Whether to show the checkbox for reporting abuse. - private boolean mShowAbuseCheckbox; + private final boolean mShowAbuseCheckbox; // When checked, the app will not just be uninstalled, but also reported for abuse. private CheckBox mReportAbuseCheckBox; // Notifies the parent (dialog beneath us) that uninstalling was the action taken by the user. - private Callback mOnUninstallCallback; + private final Callback mOnUninstallCallback; public WebApkUpdateReportAbuseDialog( Context activityContext,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappCustomTabTimeSpentLogger.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappCustomTabTimeSpentLogger.java index 517b8e2..04c5a4fb 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappCustomTabTimeSpentLogger.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappCustomTabTimeSpentLogger.java
@@ -16,8 +16,8 @@ * customtabs package. */ public class WebappCustomTabTimeSpentLogger { - private long mStartTime; - private @LaunchSourceType int mActivityType; + private final long mStartTime; + private final @LaunchSourceType int mActivityType; private WebappCustomTabTimeSpentLogger(@LaunchSourceType int activityType) { mActivityType = activityType;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappLaunchCauseMetrics.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappLaunchCauseMetrics.java index bc508a0..077aadb 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappLaunchCauseMetrics.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappLaunchCauseMetrics.java
@@ -15,7 +15,7 @@ /** LaunchCauseMetrics for WebappActivity. */ public class WebappLaunchCauseMetrics extends LaunchCauseMetrics { - @Nullable private WebappInfo mWebappInfo; + @Nullable private final WebappInfo mWebappInfo; public WebappLaunchCauseMetrics(Activity activity, @Nullable WebappInfo info) { super(activity);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappRegistry.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappRegistry.java index 915b1f5c..8812b1ce 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappRegistry.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebappRegistry.java
@@ -78,9 +78,9 @@ private boolean mIsInitialized; /** Maps webapp ids to storages. */ - private Map<String, WebappDataStorage> mStorages; + private final Map<String, WebappDataStorage> mStorages; - private SharedPreferences mPreferences; + private final SharedPreferences mPreferences; private InstalledWebappPermissionStore mPermissionStore; /**
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ActivityTabProviderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ActivityTabProviderTest.java index d4006b7..6338662 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/ActivityTabProviderTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ActivityTabProviderTest.java
@@ -87,7 +87,7 @@ private ChromeTabbedActivity mActivity; private ActivityTabProvider mProvider; private Tab mActivityTab; - private CallbackHelper mActivityTabChangedHelper = new CallbackHelper(); + private final CallbackHelper mActivityTabChangedHelper = new CallbackHelper(); @Before public void setUp() throws Exception {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ChromeTabbedActivityTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ChromeTabbedActivityTest.java index dfc3a96..9e7a9e3 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/ChromeTabbedActivityTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ChromeTabbedActivityTest.java
@@ -79,7 +79,6 @@ import java.lang.ref.WeakReference; import java.util.ArrayList; -import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -91,9 +90,9 @@ private static final Token TAB_GROUP_ID = new Token(2L, 2L); private static final String TAB_GROUP_TITLE = "Regrouped tabs"; private static final int ROOT_ID = 1; - private static final LinkedHashMap<Integer, String> TAB_IDS_TO_URLS = - new LinkedHashMap<>( - Map.ofEntries( + private static final ArrayList<Map.Entry<Integer, String>> TAB_IDS_TO_URLS = + new ArrayList<>( + List.of( Map.entry(1, "https://www.amazon.com/"), Map.entry(2, "https://www.youtube.com/"), Map.entry(3, "https://www.facebook.com/"))); @@ -606,13 +605,13 @@ // Verify urls of the grouped tabs. Criteria.checkThat( tabModel.getTabAt(1).getUrl().getSpec(), - Matchers.equalTo(TAB_IDS_TO_URLS.get(1))); + Matchers.equalTo(TAB_IDS_TO_URLS.get(0).getValue())); Criteria.checkThat( tabModel.getTabAt(2).getUrl().getSpec(), - Matchers.equalTo(TAB_IDS_TO_URLS.get(2))); + Matchers.equalTo(TAB_IDS_TO_URLS.get(1).getValue())); Criteria.checkThat( tabModel.getTabAt(3).getUrl().getSpec(), - Matchers.equalTo(TAB_IDS_TO_URLS.get(3))); + Matchers.equalTo(TAB_IDS_TO_URLS.get(2).getValue())); // Verify the tabs are grouped with the correct rootId and tabGroupId. Tab firstGroupedTab = tabModel.getTabAt(1);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/InstalledAppTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/InstalledAppTest.java index 00dfac23..004406de 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/InstalledAppTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/InstalledAppTest.java
@@ -46,7 +46,7 @@ /** Waits until the JavaScript code supplies a result. */ private class InstalledAppUpdateWaiter extends EmptyTabObserver { - private CallbackHelper mCallbackHelper; + private final CallbackHelper mCallbackHelper; private String mStatus; public InstalledAppUpdateWaiter() {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/LauncherShortcutTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/LauncherShortcutTest.java index faffafd..f3e4fd5 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/LauncherShortcutTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/LauncherShortcutTest.java
@@ -76,7 +76,7 @@ ChromeTransitTestRules.freshChromeTabbedActivityRule(); private TabModelSelector mTabModelSelector; - private CallbackHelper mTabAddedCallback = new CallbackHelper(); + private final CallbackHelper mTabAddedCallback = new CallbackHelper(); @Before public void setUp() {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/PopularUrlsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/PopularUrlsTest.java index d84c7cf7..592a5e3 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/PopularUrlsTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/PopularUrlsTest.java
@@ -122,7 +122,7 @@ } private static class RunStatus { - private File mFile; + private final File mFile; private int mIteration; private int mPage; private String mUrl;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/PwaRestoreBottomSheetTestUtils.java b/chrome/android/javatests/src/org/chromium/chrome/browser/PwaRestoreBottomSheetTestUtils.java index fbdaf24..cf9ae08 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/PwaRestoreBottomSheetTestUtils.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/PwaRestoreBottomSheetTestUtils.java
@@ -18,7 +18,7 @@ /** Static methods for use in tests to manipulate the PWA App list for restoring. */ @JNINamespace("webapps") public class PwaRestoreBottomSheetTestUtils { - private static CallbackHelper sCallbackHelper = new CallbackHelper(); + private static final CallbackHelper sCallbackHelper = new CallbackHelper(); public static void waitForWebApkDatabaseInitialization() throws Exception { ThreadUtils.runOnUiThreadBlocking(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/TabObserverTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/TabObserverTest.java index d896cb5..a484b512 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/TabObserverTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/TabObserverTest.java
@@ -43,7 +43,7 @@ public class TabObserverTest { /** A {@Link TabObserver} that has callback helpers for each event. */ private static class TestTabObserver extends EmptyTabObserver { - private CallbackHelper mInteractabilityHelper = new CallbackHelper(); + private final CallbackHelper mInteractabilityHelper = new CallbackHelper(); @Override public void onInteractabilityChanged(Tab tab, boolean isInteractable) {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/TabThemeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/TabThemeTest.java index 3329e7a..145e1d0 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/TabThemeTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/TabThemeTest.java
@@ -61,7 +61,7 @@ /** A WebContentsObserver for watching changes in the theme color. */ private static class ThemeColorWebContentsObserver implements ThemeColorObserver { - private CallbackHelper mCallbackHelper; + private final CallbackHelper mCallbackHelper; private int mColor; public ThemeColorWebContentsObserver() {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/TabsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/TabsTest.java index 1dd85c47..a5c8e08 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/TabsTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/TabsTest.java
@@ -585,7 +585,7 @@ } private static class FocusListener implements View.OnFocusChangeListener { - private View mView; + private final View mView; private int mTimesFocused; private int mTimesUnfocused;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/app/bookmarks/BookmarkEditTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/app/bookmarks/BookmarkEditTest.java index cdb8d54..120e0b04 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/app/bookmarks/BookmarkEditTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/app/bookmarks/BookmarkEditTest.java
@@ -73,15 +73,15 @@ private static BookmarkId sOtherNode; private static BookmarkEditActivity sBookmarkEditActivity; - private static CallbackHelper sDestroyedCallback = new CallbackHelper(); - private static ActivityStateListener sActivityStateListener = + private static final CallbackHelper sDestroyedCallback = new CallbackHelper(); + private static final ActivityStateListener sActivityStateListener = new ActivityStateListener() { @Override public void onActivityStateChange(Activity activity, int newState) { if (newState == ActivityState.DESTROYED) sDestroyedCallback.notifyCalled(); } }; - private CallbackHelper mModelChangedCallback = new CallbackHelper(); + private final CallbackHelper mModelChangedCallback = new CallbackHelper(); @Before public void setUp() throws TimeoutException {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/app/bookmarks/BookmarkTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/app/bookmarks/BookmarkTest.java index 35397c5..d8472c6 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/app/bookmarks/BookmarkTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/app/bookmarks/BookmarkTest.java
@@ -109,6 +109,7 @@ import org.chromium.chrome.browser.preferences.ChromeSharedPreferences; import org.chromium.chrome.browser.sync.SyncServiceFactory; import org.chromium.chrome.browser.tab.Tab; +import org.chromium.chrome.browser.ui.signin.signin_promo.SigninPromoCoordinator; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.R; import org.chromium.chrome.test.transit.ChromeTransitTestRules; @@ -1242,8 +1243,10 @@ @Test @MediumTest - @DisabledTest(message = "crbug.com/413079613") public void testTopLevelFolders() throws Exception { + // NOTE: Hide promos to ensure top level-folders will fit the viewport. + SigninPromoCoordinator.disablePromoForTesting(); + BookmarkPromoHeader.forcePromoVisibilityForTesting(false); openBookmarkManager(); onViewWaiting(allOf(withText("Mobile bookmarks"), isDisplayed())); onViewWaiting(allOf(withText("Reading list"), isDisplayed()));
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/app/tabmodel/ArchivedTabModelOrchestratorTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/app/tabmodel/ArchivedTabModelOrchestratorTest.java index 9a9b177..bff52ab 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/app/tabmodel/ArchivedTabModelOrchestratorTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/app/tabmodel/ArchivedTabModelOrchestratorTest.java
@@ -82,7 +82,7 @@ private static final String TEST_PATH_2 = "/chrome/test/data/android/google.html"; private static class FakeDeferredStartupHandler extends DeferredStartupHandler { - private List<Runnable> mTasks = new ArrayList<>(); + private final List<Runnable> mTasks = new ArrayList<>(); @Override public void addDeferredTask(Runnable task) {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/app/tabmodel/ArchivedTabsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/app/tabmodel/ArchivedTabsTest.java index afd26338..b46dc143 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/app/tabmodel/ArchivedTabsTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/app/tabmodel/ArchivedTabsTest.java
@@ -50,7 +50,7 @@ @DisableFeatures(ChromeFeatureList.ANDROID_TAB_DECLUTTER_ARCHIVE_ALL_BUT_ACTIVE) public class ArchivedTabsTest { private static class FakeDeferredStartupHandler extends DeferredStartupHandler { - private List<Runnable> mTasks = new ArrayList<>(); + private final List<Runnable> mTasks = new ArrayList<>(); @Override public void addDeferredTask(Runnable task) {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/SaveUpdateAddressProfilePromptRenderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/SaveUpdateAddressProfilePromptRenderTest.java index b56ecda..cb84c7d3 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/SaveUpdateAddressProfilePromptRenderTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/SaveUpdateAddressProfilePromptRenderTest.java
@@ -64,7 +64,7 @@ ChromeTransitTestRules.freshChromeTabbedActivityRule(); @ParameterAnnotations.ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = new NightModeTestUtils.NightModeParams().getParameters(); @Rule
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/settings/AutofillPaymentMethodsFragmentCardBenefitsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/settings/AutofillPaymentMethodsFragmentCardBenefitsTest.java index d3b68a9..931c8e7 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/settings/AutofillPaymentMethodsFragmentCardBenefitsTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/settings/AutofillPaymentMethodsFragmentCardBenefitsTest.java
@@ -55,7 +55,7 @@ /** Provides parameters for testing card benefit preference with different flag combinations. */ public static class CardBenefitsPreferenceTestParams implements ParameterProvider { - private static List<ParameterSet> sCardBenefitsPreferenceTestParams = + private static final List<ParameterSet> sCardBenefitsPreferenceTestParams = Arrays.asList( new ParameterSet() .value(true, true)
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/vcn/AutofillVcnEnrollBottomSheetRenderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/vcn/AutofillVcnEnrollBottomSheetRenderTest.java index 089f343..70ef91e 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/vcn/AutofillVcnEnrollBottomSheetRenderTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/autofill/vcn/AutofillVcnEnrollBottomSheetRenderTest.java
@@ -86,7 +86,7 @@ private final boolean mIsNightMode; @ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = ImmutableList.of( new ParameterSet().value(false, false).name("LTR"), new ParameterSet().value(true, false).name("RTL"),
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/CompositorVisibilityTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/CompositorVisibilityTest.java index 16b597b8..01d7462 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/CompositorVisibilityTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/CompositorVisibilityTest.java
@@ -35,7 +35,7 @@ private CompositorView mCompositorView; - private LayoutRenderHost mRenderHost = + private final LayoutRenderHost mRenderHost = new LayoutRenderHost() { @Override public void requestRender() {}
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelManagerTest.java index d343879f4..26b29b9 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelManagerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelManagerTest.java
@@ -75,8 +75,8 @@ /** Mocks the ContextualSearchPanel, so it doesn't create WebContents. */ private static class MockOverlayPanel extends OverlayPanel { - private @PanelPriority int mPriority; - private boolean mCanBeSuppressed; + private final @PanelPriority int mPriority; + private final boolean mCanBeSuppressed; private ViewGroup mContainerView; private DynamicResourceLoader mResourceLoader;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/content_settings/ContentSettingsObserverTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/content_settings/ContentSettingsObserverTest.java index 7cecf1e..013106b 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/content_settings/ContentSettingsObserverTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/content_settings/ContentSettingsObserverTest.java
@@ -40,7 +40,7 @@ public class ContentSettingsObserverTest { @Rule public final ChromeBrowserTestRule mBrowserTestRule = new ChromeBrowserTestRule(); - private CallbackHelper mCallbackHelper = new CallbackHelper(); + private final CallbackHelper mCallbackHelper = new CallbackHelper(); private String mLastPrimaryPattern; private String mLastSecondaryPattern;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuRenderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuRenderTest.java index c6fcd2a..b8f3dfea 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuRenderTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextmenu/ContextMenuRenderTest.java
@@ -52,7 +52,7 @@ @Batch(Batch.PER_CLASS) public class ContextMenuRenderTest { @ParameterAnnotations.ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = new NightModeTestUtils.NightModeParams().getParameters(); @ClassRule
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchInstrumentationBase.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchInstrumentationBase.java index 5304659..bf4b735 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchInstrumentationBase.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchInstrumentationBase.java
@@ -186,7 +186,7 @@ /** Selection controller that mocks out anything to do with a WebContents. */ private static class MockCSSelectionController extends ContextualSearchSelectionController { - private StubbedSelectionPopupController mPopupController; + private final StubbedSelectionPopupController mPopupController; public MockCSSelectionController( ChromeActivity activity, ContextualSearchSelectionHandler handler) {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchInternalStateControllerWrapper.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchInternalStateControllerWrapper.java index d984399..5834d39b 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchInternalStateControllerWrapper.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchInternalStateControllerWrapper.java
@@ -37,8 +37,8 @@ InternalState.RESOLVING, InternalState.SHOWING_RESOLVED_LONG_PRESS_SEARCH); - private List<Integer> mStartedStates = new ArrayList<Integer>(); - private List<Integer> mFinishedStates = new ArrayList<Integer>(); + private final List<Integer> mStartedStates = new ArrayList<Integer>(); + private final List<Integer> mFinishedStates = new ArrayList<Integer>(); /** * Creates a wrapper around a {@link ContextualSearchInternalStateController} with the given
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java index 5014e9b8..0093d48b 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchManagerTest.java
@@ -1017,8 +1017,8 @@ /** Monitor user action UMA recording operations. */ private static class UserActionMonitor extends UserActionTester { // TODO(donnd): merge into UserActionTester. See https://crbug.com/1103757. - private Set<String> mUserActionPrefixes; - private Map<String, Integer> mUserActionCounts; + private final Set<String> mUserActionPrefixes; + private final Map<String, Integer> mUserActionCounts; /** * @param userActionPrefixes A set of plain prefix strings for user actions to monitor.
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/crash/MinidumpUploadServiceTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/crash/MinidumpUploadServiceTest.java index aa04b38..6ea956b 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/crash/MinidumpUploadServiceTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/crash/MinidumpUploadServiceTest.java
@@ -200,7 +200,7 @@ private static class MinidumpPreparationContext extends AdvancedMockContext { /** Field used in overridden versions of startService() so we can support retries. */ - protected MinidumpUploadServiceImpl mService; + protected final MinidumpUploadServiceImpl mService; public MinidumpPreparationContext(Context targetContext) { this(targetContext, null);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/AuthTabTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/AuthTabTest.java index fae51fd..9d47eee 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/AuthTabTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/AuthTabTest.java
@@ -54,7 +54,7 @@ private String mTestPage; private EmbeddedTestServer mTestServer; private AuthTabIntent.AuthResult mLastAuthResult; - private CallbackHelper mAuthResultCallbackHelper = new CallbackHelper(); + private final CallbackHelper mAuthResultCallbackHelper = new CallbackHelper(); @Before public void setUp() {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabAutoplayUnmutedTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabAutoplayUnmutedTest.java index 7a5c223..db60c7b0 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabAutoplayUnmutedTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabAutoplayUnmutedTest.java
@@ -41,7 +41,7 @@ .value(ActivityType.TRUSTED_WEB_ACTIVITY) .name("TrustedWebActivity")); - private @ActivityType int mActivityType; + private final @ActivityType int mActivityType; @Rule public final ChromeActivityTestRule<?> mActivityTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabDeferredStartupTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabDeferredStartupTest.java index cf9cc27..529ae2d 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabDeferredStartupTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabDeferredStartupTest.java
@@ -64,7 +64,7 @@ } static class InitialTabCreationObserver extends CustomTabActivityTabProvider.Observer { - private TabObserver mObserver; + private final TabObserver mObserver; public InitialTabCreationObserver(TabObserver observer) { mObserver = observer; @@ -81,7 +81,7 @@ ApplicationStatus.ActivityStateListener, InflationObserver { private BaseCustomTabActivity mActivity; - private TabObserver mObserver; + private final TabObserver mObserver; public NewTabObserver(TabObserver observer) { mObserver = observer; @@ -135,9 +135,9 @@ super.queueDeferredTasksOnIdleHandler(); } - private CallbackHelper mHelper; - private PageLoadFinishedTabObserver mObserver; - private ChromeActivityTestRule<?> mActivityTestRule; + private final CallbackHelper mHelper; + private final PageLoadFinishedTabObserver mObserver; + private final ChromeActivityTestRule<?> mActivityTestRule; } @ClassParameter @@ -149,7 +149,7 @@ .value(ActivityType.TRUSTED_WEB_ACTIVITY) .name("TrustedWebActivity")); - private @ActivityType int mActivityType; + private final @ActivityType int mActivityType; @Rule public final ChromeActivityTestRule<?> mActivityTestRule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabTabPersistencePolicyTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabTabPersistencePolicyTest.java index e14f00c..d53c58c 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabTabPersistencePolicyTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/CustomTabTabPersistencePolicyTest.java
@@ -84,7 +84,7 @@ private TestTabModelDirectory mMockDirectory; private AdvancedMockContext mAppContext; - private SequencedTaskRunner mSequencedTaskRunner = + private final SequencedTaskRunner mSequencedTaskRunner = PostTask.createSequencedTaskRunner(TaskTraits.USER_VISIBLE); @Before
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/MismatchNotificationControllerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/MismatchNotificationControllerTest.java index e8bcf9a..672ea1a 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/MismatchNotificationControllerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/MismatchNotificationControllerTest.java
@@ -65,7 +65,7 @@ private int mCloseType; - private CallbackHelper mCloseCallbackHelper = new CallbackHelper(); + private final CallbackHelper mCloseCallbackHelper = new CallbackHelper(); @Before public void setUp() {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/content/TabObserverRegistrarTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/content/TabObserverRegistrarTest.java index 969a7e23..d92ec0c 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/content/TabObserverRegistrarTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/customtabs/content/TabObserverRegistrarTest.java
@@ -40,7 +40,7 @@ @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) public class TabObserverRegistrarTest { private static class LoadUrlTabObserver extends CustomTabTabObserver { - private List<String> mUrlLoadRequests = new ArrayList<>(); + private final List<String> mUrlLoadRequests = new ArrayList<>(); List<String> getLoadUrlRequests() { return mUrlLoadRequests;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/device_dialog/BluetoothChooserDialogTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/device_dialog/BluetoothChooserDialogTest.java index d45ea2b..f1f0d91 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/device_dialog/BluetoothChooserDialogTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/device_dialog/BluetoothChooserDialogTest.java
@@ -83,7 +83,7 @@ private int mRestartSearchCount; private class TestBluetoothChooserDialogJni implements BluetoothChooserDialog.Natives { - private BluetoothChooserDialog mBluetoothChooserDialog; + private final BluetoothChooserDialog mBluetoothChooserDialog; TestBluetoothChooserDialogJni(BluetoothChooserDialog dialog) { mBluetoothChooserDialog = dialog; @@ -606,7 +606,7 @@ } private static class TestAndroidPermissionDelegate implements AndroidPermissionDelegate { - Dialog mDialog; + final Dialog mDialog; PermissionCallback mCallback; String[] mPermissionsRequested; public boolean mLocationGranted;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/device_dialog/SerialChooserDialogTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/device_dialog/SerialChooserDialogTest.java index 05c7f6ba..ca50621 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/device_dialog/SerialChooserDialogTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/device_dialog/SerialChooserDialogTest.java
@@ -459,7 +459,7 @@ } private static class TestAndroidPermissionDelegate implements AndroidPermissionDelegate { - Dialog mDialog; + final Dialog mDialog; PermissionCallback mCallback; String[] mPermissionsRequested; public boolean mLocationGranted;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/dom_distiller/DistilledPagePrefsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/dom_distiller/DistilledPagePrefsTest.java index 8ffe93f..7e3e247 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/dom_distiller/DistilledPagePrefsTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/dom_distiller/DistilledPagePrefsTest.java
@@ -244,11 +244,11 @@ private static class TestingObserver implements DistilledPagePrefs.Observer { private final AtomicInteger mFontFamily = new AtomicInteger(); - private Semaphore mFontFamilySemaphore = new Semaphore(0); + private final Semaphore mFontFamilySemaphore = new Semaphore(0); private final AtomicInteger mTheme = new AtomicInteger(); - private Semaphore mThemeSemaphore = new Semaphore(0); + private final Semaphore mThemeSemaphore = new Semaphore(0); private final AtomicDouble mFontScaling = new AtomicDouble(); - private Semaphore mFontScalingSemaphore = new Semaphore(0); + private final Semaphore mFontScalingSemaphore = new Semaphore(0); public TestingObserver() {}
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadLocationChangeEnd2EndTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadLocationChangeEnd2EndTest.java index 8bd9e73..dc4de88 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadLocationChangeEnd2EndTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadLocationChangeEnd2EndTest.java
@@ -95,7 +95,7 @@ /** Matches the {@link DirectoryOption} used in the {@link DownloadDirectoryAdapter}. */ private static class DirectoryOptionMatcher extends TypeSafeMatcher<DirectoryOption> { - private Matcher<String> mNameMatcher; + private final Matcher<String> mNameMatcher; public DirectoryOptionMatcher(Matcher<String> nameMatcher) { mNameMatcher = nameMatcher;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadNotificationServiceTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadNotificationServiceTest.java index 2de74f3..e68cc9b 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadNotificationServiceTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadNotificationServiceTest.java
@@ -43,7 +43,7 @@ private MockDownloadNotificationService mDownloadNotificationService; private DownloadForegroundServiceManagerTest.MockDownloadForegroundServiceManager mDownloadForegroundServiceManager; - private OtrProfileId mPrimaryOtrProfileId = OtrProfileId.getPrimaryOtrProfileId(); + private final OtrProfileId mPrimaryOtrProfileId = OtrProfileId.getPrimaryOtrProfileId(); @Before public void setUp() {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/download/OMADownloadHandlerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/download/OMADownloadHandlerTest.java index 37d5fcfc..84bc0fa 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/download/OMADownloadHandlerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/download/OMADownloadHandlerTest.java
@@ -144,7 +144,7 @@ /** Helper class to verify the result of {@DownloadManagerDelegate.queryDownloadResult}. */ private static class DownloadQueryResultVerifier implements Callback<DownloadQueryResult> { - private int mExpectedDownloadStatus; + private final int mExpectedDownloadStatus; public boolean mQueryCompleted;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/download/TestDownloadDirectoryProvider.java b/chrome/android/javatests/src/org/chromium/chrome/browser/download/TestDownloadDirectoryProvider.java index ec5ecbb..5eb986c 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/download/TestDownloadDirectoryProvider.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/download/TestDownloadDirectoryProvider.java
@@ -12,7 +12,7 @@ /** Used to provide arbitary number of download directories in tests. */ public class TestDownloadDirectoryProvider extends DownloadDirectoryProvider { - private ArrayList<DirectoryOption> mDirectoryOptions; + private final ArrayList<DirectoryOption> mDirectoryOptions; public TestDownloadDirectoryProvider(ArrayList<DirectoryOption> dirs) { super();
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/download/dialogs/DownloadDialogIncognitoTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/download/dialogs/DownloadDialogIncognitoTest.java index 54e1d28..33e6a236 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/download/dialogs/DownloadDialogIncognitoTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/download/dialogs/DownloadDialogIncognitoTest.java
@@ -62,7 +62,7 @@ private ModalDialogManager mModalDialogManager; - private Callback<Boolean> mResultCallback = Mockito.mock(Callback.class); + private final Callback<Boolean> mResultCallback = Mockito.mock(Callback.class); @Before public void setUpTest() throws Exception {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/UrlOverridingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/UrlOverridingTest.java index 8812c1a..ef4f0d9 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/UrlOverridingTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/externalnav/UrlOverridingTest.java
@@ -293,7 +293,7 @@ private static class TestContext extends ContextWrapper { private boolean mResolveToNonBrowserPackage; private boolean mResolveToTrustedCaller; - private String mNonBrowserPackageName; + private final String mNonBrowserPackageName; private String mHostToMatch; private String mSchemeToMatch; private IntentFilter mFilterForHostMatch;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/firstrun/FirstRunIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/firstrun/FirstRunIntegrationTest.java index 2a6df96..47cc71d3 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/firstrun/FirstRunIntegrationTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/firstrun/FirstRunIntegrationTest.java
@@ -142,7 +142,7 @@ private Instrumentation mInstrumentation; private Context mContext; - private FirstRunActivityTestObserver mTestObserver = new FirstRunActivityTestObserver(); + private final FirstRunActivityTestObserver mTestObserver = new FirstRunActivityTestObserver(); private Activity mLastActivity; @Before @@ -1389,7 +1389,7 @@ */ private static class TestFirstRunFlowSequencerDelegate extends FirstRunFlowSequencer.FirstRunFlowSequencerDelegate { - private FirstRunPagesTestCase mTestCase; + private final FirstRunPagesTestCase mTestCase; public TestFirstRunFlowSequencerDelegate( FirstRunPagesTestCase testCase, OneshotSupplier<ProfileProvider> profileProvider) {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/gesturenav/GestureNavigationTestUtils.java b/chrome/android/javatests/src/org/chromium/chrome/browser/gesturenav/GestureNavigationTestUtils.java index ece83ca..c47ee4f 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/gesturenav/GestureNavigationTestUtils.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/gesturenav/GestureNavigationTestUtils.java
@@ -16,7 +16,7 @@ private final ChromeTabbedActivityTestRule mActivityTestRule; private final NavigationHandler mNavigationHandler; private final HistoryNavigationLayout mNavigationLayout; - private float mEdgeWidthPx; + private final float mEdgeWidthPx; public GestureNavigationTestUtils(ChromeTabbedActivityTestRule rule) { mActivityTestRule = rule;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/gesturenav/NavigationTransitionsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/gesturenav/NavigationTransitionsTest.java index e1497a68..09983907 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/gesturenav/NavigationTransitionsTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/gesturenav/NavigationTransitionsTest.java
@@ -116,7 +116,7 @@ private Runnable mRelease; @ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = Arrays.asList( new ParameterSet() .value(NavigationTransitionsTest.NAVIGATION_MODE_THREE_BUTTON) @@ -125,7 +125,7 @@ .value(NavigationTransitionsTest.NAVIGATION_MODE_GESTURAL) .name("Gestural")); - private int mTestNavigationMode; + private final int mTestNavigationMode; private static class ScreenshotCallback implements ScreenshotCaptureTestHelper.NavScreenshotCallback { @@ -161,8 +161,8 @@ } private class ReleaseController { - private Runnable mRelease; - private String mExpectedUrl; + private final Runnable mRelease; + private final String mExpectedUrl; public ReleaseController(Runnable release, String expectedUrl) { mRelease = release;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/incognito/IncognitoDownloadLeakageTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/incognito/IncognitoDownloadLeakageTest.java index 399c5ba..8e824ea 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/incognito/IncognitoDownloadLeakageTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/incognito/IncognitoDownloadLeakageTest.java
@@ -70,13 +70,10 @@ */ @RunWith(ParameterizedRunner.class) @UseRunnerDelegate(ChromeJUnit4RunnerDelegate.class) -@CommandLineFlags.Add({ - ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, - ChromeSwitches.DISABLE_ALL_IPH -}) +@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE, ChromeSwitches.DISABLE_ALL_IPH}) public class IncognitoDownloadLeakageTest { private String mDownloadTestPage; - private final String mDownloadedFileName = "test.gzip"; + private static final String DOWNLOADED_FILE_NAME = "test.gzip"; private static final File DOWNLOAD_DIRECTORY = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS); @@ -84,13 +81,13 @@ "/chrome/test/data/android/download/get.html"; private EmbeddedTestServer mTestServer; - private CallbackHelper mHttpDownloadFinishedCallback = new CallbackHelper(); - private CallbackHelper mRetrieveDownloadsCallback = new CallbackHelper(); + private final CallbackHelper mHttpDownloadFinishedCallback = new CallbackHelper(); + private final CallbackHelper mRetrieveDownloadsCallback = new CallbackHelper(); private List<DownloadItem> mOffTheRecordDownloadItems; private List<DownloadItem> mRegularDownloadItems; - private DownloadManagerService.DownloadObserver mTestDownloadManagerServiceObserver = + private final DownloadManagerService.DownloadObserver mTestDownloadManagerServiceObserver = new DownloadManagerService.DownloadObserver() { @Override public void onAllDownloadsRetrieved( @@ -116,7 +113,7 @@ public void onAddOrReplaceDownloadSharedPreferenceEntry(ContentId id) {} }; - private OfflineContentProvider.Observer mTestDownloadBackendObserver = + private final OfflineContentProvider.Observer mTestDownloadBackendObserver = new OfflineContentProvider.Observer() { @Override public void onItemsAdded(List<OfflineItem> items) {} @@ -165,12 +162,12 @@ DownloadPromptStatus.DONT_SHOW); }); - deleteFilesInDownloadDirectory(mDownloadedFileName); + deleteFilesInDownloadDirectory(DOWNLOADED_FILE_NAME); } @After public void tearDown() { - deleteFilesInDownloadDirectory(mDownloadedFileName); + deleteFilesInDownloadDirectory(DOWNLOADED_FILE_NAME); ThreadUtils.runOnUiThreadBlocking( () -> DownloadManagerService.getDownloadManagerService() @@ -230,7 +227,7 @@ startDownload(incognitoTab); // Check the file is downloaded - assertTrue(hasFileDownloaded(mDownloadedFileName)); + assertTrue(hasFileDownloaded(DOWNLOADED_FILE_NAME)); // Retrieve downloads from the incognito DownloadService. ThreadUtils.runOnUiThreadBlocking( @@ -279,7 +276,7 @@ startDownload(incognitoTab1); // Check the file is downloaded - assertTrue(hasFileDownloaded(mDownloadedFileName)); + assertTrue(hasFileDownloaded(DOWNLOADED_FILE_NAME)); // Retrieve downloads from the incognito DownloadService. ThreadUtils.runOnUiThreadBlocking(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/InfoBarContainerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/InfoBarContainerTest.java index 3bb1f408..87f2790 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/InfoBarContainerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/infobar/InfoBarContainerTest.java
@@ -72,7 +72,7 @@ // URL takes longer to load for batch tests where the activity is reused across rests private static final long EXTENDED_LOAD_TIMEOUT = 10L; private static final String MESSAGE_TEXT = "Ding dong. Woof. Translate french? Bears!"; - private static EmbeddedTestServer sTestServer = sActivityTestRule.getTestServer(); + private static final EmbeddedTestServer sTestServer = sActivityTestRule.getTestServer(); private static final class TestListener implements SimpleConfirmInfoBarBuilder.Listener { public final CallbackHelper dismissedCallback = new CallbackHelper();
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/jsdialog/JavascriptAppModalDialogTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/jsdialog/JavascriptAppModalDialogTest.java index 994c1169..ee85b63 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/jsdialog/JavascriptAppModalDialogTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/jsdialog/JavascriptAppModalDialogTest.java
@@ -295,7 +295,7 @@ } private static class TapGestureStateListener extends GestureStateListener { - private CallbackHelper mCallbackHelper = new CallbackHelper(); + private final CallbackHelper mCallbackHelper = new CallbackHelper(); public int getCallCount() { return mCallbackHelper.getCallCount();
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/media/PictureInPictureActivityTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/media/PictureInPictureActivityTest.java index 1a8e903..79b6dff 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/media/PictureInPictureActivityTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/media/PictureInPictureActivityTest.java
@@ -89,11 +89,11 @@ private Tab mTab; // Source rect hint that we'll provide as the video element position. - private Rect mSourceRectHint = new Rect(100, 200, 300, 400); + private final Rect mSourceRectHint = new Rect(100, 200, 300, 400); // Helper to capture the source rect hint bounds that PictureInPictureActivity would like to use // for `makeEnterIntoPip`, if any. - private PictureInPictureActivity.LaunchIntoPipHelper mLaunchIntoPipHelper = + private final PictureInPictureActivity.LaunchIntoPipHelper mLaunchIntoPipHelper = new PictureInPictureActivity.LaunchIntoPipHelper() { @Override public Bundle build(Context activityContext, Rect bounds) {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/net/connectivitydetector/ConnectivityDetectorDelegateStub.java b/chrome/android/javatests/src/org/chromium/chrome/browser/net/connectivitydetector/ConnectivityDetectorDelegateStub.java index 2896e86..5e0bd43 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/net/connectivitydetector/ConnectivityDetectorDelegateStub.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/net/connectivitydetector/ConnectivityDetectorDelegateStub.java
@@ -7,7 +7,7 @@ /** Stub of ConnectivityDetector.Delegate for testing purpose. */ public class ConnectivityDetectorDelegateStub implements ConnectivityDetector.Delegate { private @ConnectivityDetector.ConnectionState int mConnectionStateFromSystem; - private boolean mSkipHttpProbes; + private final boolean mSkipHttpProbes; public ConnectivityDetectorDelegateStub( @ConnectivityDetector.ConnectionState int connectionStateFromSystem,
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/net/connectivitydetector/ConnectivityDetectorTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/net/connectivitydetector/ConnectivityDetectorTest.java index 6d33246..f012ef5 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/net/connectivitydetector/ConnectivityDetectorTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/net/connectivitydetector/ConnectivityDetectorTest.java
@@ -35,10 +35,10 @@ private ConnectivityDetector mConnectivityDetector; private @ConnectivityDetector.ConnectionState int mConnectionState = ConnectivityDetector.ConnectionState.NONE; - private Semaphore mSemaphore = new Semaphore(0); + private final Semaphore mSemaphore = new Semaphore(0); // This test focuses on testing ConnectivityDetector functionalities, including http probes. // So don't skip http probes here. - private ConnectivityDetectorDelegateStub mConnectivityDetectorDelegate = + private final ConnectivityDetectorDelegateStub mConnectivityDetectorDelegate = new ConnectivityDetectorDelegateStub( ConnectivityDetector.ConnectionState.NO_INTERNET, /* skipHttpProbes= */ false);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/IncognitoDescriptionViewRenderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/IncognitoDescriptionViewRenderTest.java index 15dd1a2..fefb39c 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/IncognitoDescriptionViewRenderTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/ntp/IncognitoDescriptionViewRenderTest.java
@@ -47,7 +47,7 @@ }) public class IncognitoDescriptionViewRenderTest { @ParameterAnnotations.ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = new NightModeTestUtils.NightModeParams().getParameters(); @ClassRule
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/MHTMLPageTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/MHTMLPageTest.java index 4f85e39..bb6c32d 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/MHTMLPageTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/MHTMLPageTest.java
@@ -54,7 +54,7 @@ * receive the update. */ private static class TestNewDownloadBackendObserver implements OfflineContentProvider.Observer { - private Semaphore mSemaphore; + private final Semaphore mSemaphore; TestNewDownloadBackendObserver(Semaphore semaphore) { mSemaphore = semaphore;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageAutoFetchTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageAutoFetchTest.java index d82594c5..bc3837cd 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageAutoFetchTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageAutoFetchTest.java
@@ -83,7 +83,7 @@ private Profile mProfile; private OfflinePageBridge mOfflinePageBridge; - private CallbackHelper mPageAddedHelper = new CallbackHelper(); + private final CallbackHelper mPageAddedHelper = new CallbackHelper(); private OfflinePageItem mAddedPage; private WebServer mWebServer;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtilsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtilsTest.java index 3b0e3e5..dcc630d 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtilsTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/offlinepages/OfflinePageUtilsTest.java
@@ -198,7 +198,7 @@ * a semaphore to clear when the callback is finally called. */ static class TestShareCallback implements Callback<ShareParams> { - private Semaphore mSemaphore; + private final Semaphore mSemaphore; private String mText; public TestShareCallback(Semaphore semaphore) {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/OmniboxUrlEmphasizerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/OmniboxUrlEmphasizerTest.java index 086bd69..aa677c9b 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/OmniboxUrlEmphasizerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/OmniboxUrlEmphasizerTest.java
@@ -65,8 +65,8 @@ /** Convenience class for testing a URL emphasized by OmniboxUrlEmphasizer.emphasizeUrl(). */ private static class EmphasizedUrlSpanHelper { - UrlEmphasisSpan mSpan; - Spannable mParent; + final UrlEmphasisSpan mSpan; + final Spannable mParent; private EmphasizedUrlSpanHelper(UrlEmphasisSpan span, Spannable parent) { mSpan = span;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxPedalsRenderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxPedalsRenderTest.java index 39cfb5e..b8db2b74 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxPedalsRenderTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxPedalsRenderTest.java
@@ -49,7 +49,7 @@ @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) public class OmniboxPedalsRenderTest { @ParameterAnnotations.ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = List.of( new ParameterSet().value(false).name("LiteMode_RegularTab"), new ParameterSet().value(true).name("NightMode_RegularTab"));
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoViewTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoViewTest.java index 93cc0d5..889b24ca 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoViewTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/page_info/PageInfoViewTest.java
@@ -171,14 +171,14 @@ private static final int DAYS_UNTIL_EXPIRATION = 33; - private static String[] sCookieDataTypes = { + private static final String[] sCookieDataTypes = { "Cookie", "LocalStorage", "ServiceWorker", "CacheStorage", "IndexedDb", "FileSystem" }; // June 4, 2021 12:00:00 GMT+00:00 - private static long sTimestampJune4 = 1622808000000L; + private static final long TIMESTAMP_JUNE_4 = 1622808000000L; // April 4, 2021 12:00:00 GMT+00:00 - private static long sTimestampApril4 = 1617537600000L; + private static final long TIMESTAMPE_APRIL_4 = 1617537600000L; /** * Parameter provider for testing the different timestamps for the history section's "last @@ -193,14 +193,14 @@ List<ParameterSet> parameters = new ArrayList<>(); // ParameterSet = {timestamp, string} - timestamp = CalendarUtils.getStartOfDay(sTimestampJune4).getTime().getTime(); + timestamp = CalendarUtils.getStartOfDay(TIMESTAMP_JUNE_4).getTime().getTime(); parameters.add( new ParameterSet() .value( timestamp, res.getString(R.string.page_info_history_last_visit_today)) .name("Today")); - timestamp = sTimestampJune4 - 1 * DateUtils.DAY_IN_MILLIS; + timestamp = TIMESTAMP_JUNE_4 - 1 * DateUtils.DAY_IN_MILLIS; parameters.add( new ParameterSet() .value( @@ -208,7 +208,7 @@ res.getString(R.string.page_info_history_last_visit_yesterday)) .name("Yesterday")); int offset = random.nextInt(6) + 2; - timestamp = sTimestampJune4 - offset * DateUtils.DAY_IN_MILLIS; + timestamp = TIMESTAMP_JUNE_4 - offset * DateUtils.DAY_IN_MILLIS; parameters.add( new ParameterSet() .value( @@ -219,11 +219,11 @@ parameters.add( new ParameterSet() .value( - sTimestampApril4, + TIMESTAMPE_APRIL_4, res.getString( R.string.page_info_history_last_visit_date, StringUtils.dateToHeaderString( - new Date(sTimestampApril4)))) + new Date(TIMESTAMPE_APRIL_4)))) .name("ExactDay")); return parameters; } @@ -509,8 +509,8 @@ private void addSomeHistoryEntries() { StubbedHistoryProvider historyProvider = new StubbedHistoryProvider(); // Need to always have the same dates for render tests. - historyProvider.addItem(StubbedHistoryProvider.createHistoryItem(1, sTimestampApril4)); - historyProvider.addItem(StubbedHistoryProvider.createHistoryItem(1, sTimestampJune4)); + historyProvider.addItem(StubbedHistoryProvider.createHistoryItem(1, TIMESTAMPE_APRIL_4)); + historyProvider.addItem(StubbedHistoryProvider.createHistoryItem(1, TIMESTAMP_JUNE_4)); HistoryContentManager.setProviderForTests(historyProvider); PageInfoHistoryController.setProviderForTests(historyProvider); } @@ -1773,7 +1773,7 @@ PageInfoHistoryController.setProviderForTests(historyProvider); PageInfoHistoryController.setClockForTesting( () -> { - return sTimestampJune4; + return TIMESTAMP_JUNE_4; }); loadUrlAndOpenPageInfo( @@ -1786,7 +1786,7 @@ @MediumTest public void testHistorySubpageItemClick() throws Exception { StubbedHistoryProvider historyProvider = new StubbedHistoryProvider(); - historyProvider.addItem(StubbedHistoryProvider.createHistoryItem(1, sTimestampJune4)); + historyProvider.addItem(StubbedHistoryProvider.createHistoryItem(1, TIMESTAMP_JUNE_4)); HistoryContentManager.setProviderForTests(historyProvider); PageInfoHistoryController.setProviderForTests(historyProvider); loadUrlAndOpenPageInfo(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/settings/CredentialManagerIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/settings/CredentialManagerIntegrationTest.java index 3e80f47f..86d18ec 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/settings/CredentialManagerIntegrationTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/settings/CredentialManagerIntegrationTest.java
@@ -70,7 +70,7 @@ public SettingsActivityTestRule<MainSettings> mSettingsActivityTestRule = new SettingsActivityTestRule<>(MainSettings.class); - private FakeCredentialManagerLauncherFactoryImpl mFakeLauncherFactory = + private final FakeCredentialManagerLauncherFactoryImpl mFakeLauncherFactory = new FakeCredentialManagerLauncherFactoryImpl(); final PayloadCallbackHelper<PendingIntent> mSuccessCallbackHelper =
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/settings/PasswordsPreferenceAccessLossTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/settings/PasswordsPreferenceAccessLossTest.java index e43698b2c..7ee6eec 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/settings/PasswordsPreferenceAccessLossTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/password_manager/settings/PasswordsPreferenceAccessLossTest.java
@@ -74,7 +74,7 @@ @Mock private PasswordManagerUtilBridge.Natives mPasswordManagerUtilBridgeJniMock; @ParameterAnnotations.ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = Arrays.asList( new ParameterSet() .value(PasswordAccessLossWarningType.NO_GMS_CORE, "NoGmsCore") @@ -94,7 +94,7 @@ SettingsActivityPublicTransitEntryPoints mEntryPoints = new SettingsActivityPublicTransitEntryPoints(mSettingsActivityTestRule); - private @PasswordAccessLossWarningType int mWarningType; + private final @PasswordAccessLossWarningType int mWarningType; public PasswordsPreferenceAccessLossTest( @PasswordAccessLossWarningType int warningType, String name) {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentDetailsUpdateServiceHelperTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentDetailsUpdateServiceHelperTest.java index b213873f..8f16df6 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentDetailsUpdateServiceHelperTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentDetailsUpdateServiceHelperTest.java
@@ -92,7 +92,7 @@ private boolean mBound; private IPaymentDetailsUpdateService mPaymentDetailsUpdateService; - private ServiceConnection mConnection = + private final ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName className, IBinder service) { @@ -274,7 +274,7 @@ private boolean mMethodChangeListenerNotified; private boolean mShippingOptionChangeListenerNotified; private boolean mShippingAddressChangeListenerNotified; - private PaymentRequestUpdateEventListener mUpdateListener = + private final PaymentRequestUpdateEventListener mUpdateListener = new FakePaymentRequestUpdateEventListener(); private class FakePaymentRequestUpdateEventListener
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestTestRule.java b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestTestRule.java index 33473d4..a2d8dc4 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestTestRule.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/payments/PaymentRequestTestRule.java
@@ -146,8 +146,8 @@ private final CallbackHelper mRendererClosedMojoConnection; private ChromePaymentRequestDelegateImpl mChromePaymentRequestDelegateImpl; private PaymentRequestUi mUi; - private FakeClock mClock; - private InputProtector mInputProtector; + private final FakeClock mClock; + private final InputProtector mInputProtector; private final boolean mDelayStartActivity; private boolean mAutoAdvanceInputProtectorClock;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/permissions/PermissionPromptRenderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/permissions/PermissionPromptRenderTest.java index 78062e9..1e93f6cd 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/permissions/PermissionPromptRenderTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/permissions/PermissionPromptRenderTest.java
@@ -52,13 +52,13 @@ }) public class PermissionPromptRenderTest { @ParameterAnnotations.ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = new NightModeTestUtils.NightModeParams().getParameters(); private static final String TEST_FILE = "/content/test/data/android/geolocation.html"; private static final int TEST_PORT = 12345; - private boolean mNightModeEnabled; + private final boolean mNightModeEnabled; @Rule public PermissionTestRule mPermissionRule = new PermissionTestRule(); @Rule
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/permissions/PermissionTestRule.java b/chrome/android/javatests/src/org/chromium/chrome/browser/permissions/PermissionTestRule.java index 1c4e363a..13db94c2 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/permissions/PermissionTestRule.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/permissions/PermissionTestRule.java
@@ -76,8 +76,8 @@ * of times. The page title is expected to be of the form <prefix>: <count>. */ public static class PermissionUpdateWaiter extends EmptyTabObserver { - private CallbackHelper mCallbackHelper; - private String mPrefix; + private final CallbackHelper mCallbackHelper; + private final String mPrefix; private String mExpectedTitle; private final ChromeActivity mActivity;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/printing/PrintingControllerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/printing/PrintingControllerTest.java index ee447058..4db02c9 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/printing/PrintingControllerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/printing/PrintingControllerTest.java
@@ -110,8 +110,8 @@ } private static class TemporaryFileHandler implements AutoCloseable { - private File mTempFile; - private ParcelFileDescriptor mFileDescriptor; + private final File mTempFile; + private final ParcelFileDescriptor mFileDescriptor; public TemporaryFileHandler() throws IOException { mTempFile = File.createTempFile(TEMP_FILE_NAME, TEMP_FILE_EXTENSION); @@ -140,7 +140,7 @@ } private static class PrintingControllerImplPdfWritingDone extends PrintingControllerImpl { - private WaitForOnWriteHelper mWaitForOnWrite; + private final WaitForOnWriteHelper mWaitForOnWrite; public PrintingControllerImplPdfWritingDone(WaitForOnWriteHelper waitForOnWrite) { mWaitForOnWrite = waitForOnWrite;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/screenshot_monitor/ScreenshotMonitorTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/screenshot_monitor/ScreenshotMonitorTest.java index 0b7de7b..a10ea332 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/screenshot_monitor/ScreenshotMonitorTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/screenshot_monitor/ScreenshotMonitorTest.java
@@ -56,7 +56,7 @@ private TestScreenshotMonitorDelegate mTestScreenshotMonitorDelegate; private ContentObserver mContentObserver; - private MockContentResolver mMockContentResolver = new MockContentResolver(); + private final MockContentResolver mMockContentResolver = new MockContentResolver(); @Mock private DisplayAndroid mDisplayAndroid;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/search_engines/DefaultSearchEngineDialogHelperTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/search_engines/DefaultSearchEngineDialogHelperTest.java index 12c5500..9f245b3 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/search_engines/DefaultSearchEngineDialogHelperTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/search_engines/DefaultSearchEngineDialogHelperTest.java
@@ -48,8 +48,8 @@ } private static class TestTemplateUrl extends TemplateUrl { - private String mShortName; - private String mKeyword; + private final String mShortName; + private final String mKeyword; public TestTemplateUrl(String shortName, String keyword) { super(0);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/searchwidget/SearchWidgetProviderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/searchwidget/SearchWidgetProviderTest.java index ef33d3ef..ceca0ba 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/searchwidget/SearchWidgetProviderTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/searchwidget/SearchWidgetProviderTest.java
@@ -52,7 +52,7 @@ public static final int[] ALL_IDS = {11684, 20170525}; public final List<Pair<Integer, RemoteViews>> mViews = new ArrayList<>(); - private Context mContext; + private final Context mContext; private TestDelegate(Context context) { super(context);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/signin/FullscreenSigninAndHistorySyncIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/signin/FullscreenSigninAndHistorySyncIntegrationTest.java index e25c9eb..e8ead2a 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/signin/FullscreenSigninAndHistorySyncIntegrationTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/signin/FullscreenSigninAndHistorySyncIntegrationTest.java
@@ -116,7 +116,7 @@ private @SigninAccessPoint int mSigninAccessPoint = SigninAccessPoint.SIGNIN_PROMO; private @HistorySyncConfig.OptInMode int mHistoryOptInMode = HistorySyncConfig.OptInMode.OPTIONAL; - private SigninTestUtil.CustomDeviceLockActivityLauncher mDeviceLockActivityLauncher = + private final SigninTestUtil.CustomDeviceLockActivityLauncher mDeviceLockActivityLauncher = new SigninTestUtil.CustomDeviceLockActivityLauncher(); @Before
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninFirstRunFragmentRenderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninFirstRunFragmentRenderTest.java index e13124e0b..8149bcdd 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninFirstRunFragmentRenderTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/signin/SigninFirstRunFragmentRenderTest.java
@@ -84,7 +84,7 @@ public class SigninFirstRunFragmentRenderTest { /** Parameter provider for night mode state and device orientation. */ public static class NightModeAndOrientationParameterProvider implements ParameterProvider { - private static List<ParameterSet> sParams = + private static final List<ParameterSet> sParams = Arrays.asList( new ParameterSet() .value(/* firstArg= */ false, Configuration.ORIENTATION_PORTRAIT)
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/CookieControlsBridgeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/CookieControlsBridgeTest.java index ee784f3..11873ec 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/CookieControlsBridgeTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/CookieControlsBridgeTest.java
@@ -54,7 +54,7 @@ public static final String COOKIE_CONTROLS_BATCH_NAME = "cookie_controls"; private class TestCallbackHandler implements CookieControlsObserver { - private CallbackHelper mHelper; + private final CallbackHelper mHelper; public TestCallbackHandler(CallbackHelper helper) { mHelper = helper;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/CookieControlsServiceBridgeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/CookieControlsServiceBridgeTest.java index 0e21b5f5..8f355b14 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/CookieControlsServiceBridgeTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/CookieControlsServiceBridgeTest.java
@@ -42,7 +42,7 @@ public class CookieControlsServiceBridgeTest { private class TestCallbackHandler implements CookieControlsServiceBridge.CookieControlsServiceObserver { - private CallbackHelper mHelper; + private final CallbackHelper mHelper; public TestCallbackHandler(CallbackHelper helper) { mHelper = helper;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/FakeRwsPrivacySandboxBridge.java b/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/FakeRwsPrivacySandboxBridge.java index e1e9328..e60ca1d 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/FakeRwsPrivacySandboxBridge.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/FakeRwsPrivacySandboxBridge.java
@@ -23,7 +23,7 @@ // Owner of the one RWS group represented by the fake bridge private final String mRwsOwner; private final Set<String> mRwsMembers; - private final String mGoogleEmbeddedPrivacyPolicyURL = + private static final String GOOGLE_EMBEDDED_PRIVACY_POLICY_U_R_L = "https://policies.google.com/privacy/embedded"; public FakeRwsPrivacySandboxBridge(String rwsOwner, Set<String> rwsMembers) { @@ -131,6 +131,6 @@ @Override public String getEmbeddedPrivacyPolicyURL(int domainType, int colorScheme, String locale) { - return mGoogleEmbeddedPrivacyPolicyURL; + return GOOGLE_EMBEDDED_PRIVACY_POLICY_U_R_L; } }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/SingleWebsiteSettingsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/SingleWebsiteSettingsTest.java index b2116cf..0e283c3d7 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/SingleWebsiteSettingsTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/SingleWebsiteSettingsTest.java
@@ -313,8 +313,8 @@ /** Test case class that check whether a toggle exists for a given content setting. */ private static class SingleExceptionTestCase { - @ContentSettingValues int mContentSettingValue; - @ContentSettingsType.EnumType int mContentSettingsType; + @ContentSettingValues final int mContentSettingValue; + @ContentSettingsType.EnumType final int mContentSettingsType; private SettingsActivity mSettingsActivity;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/WebsitePermissionsFetcherTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/WebsitePermissionsFetcherTest.java index 76dade3..b93664f 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/WebsitePermissionsFetcherTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/site_settings/WebsitePermissionsFetcherTest.java
@@ -721,7 +721,7 @@ // Otherwise, just update count in the assert. // TODO(https://b/332704817): Add test for Tracking Protection content setting after Android // integration. - assertEquals(119, ContentSettingsType.MAX_VALUE); + assertEquals(120, ContentSettingsType.MAX_VALUE); websitePreferenceBridge.addContentSettingException( new ContentSettingException( ContentSettingsType.COOKIES,
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateTest.java index 06c63ec..983fbee 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/InterceptNavigationDelegateTest.java
@@ -83,10 +83,10 @@ private static final long LONG_MAX_TIME_TO_WAIT_IN_MS = 20000; private ChromeActivity mActivity; - private List<NavigationHandle> mNavParamHistory = new ArrayList<>(); - private List<ExternalNavigationParams> mExternalNavParamHistory = new ArrayList<>(); + private final List<NavigationHandle> mNavParamHistory = new ArrayList<>(); + private final List<ExternalNavigationParams> mExternalNavParamHistory = new ArrayList<>(); private EmbeddedTestServer mTestServer; - private CallbackHelper mSubframeExternalProtocolCalled = new CallbackHelper(); + private final CallbackHelper mSubframeExternalProtocolCalled = new CallbackHelper(); private GURL mSubframeRedirectTarget; class TestExternalNavigationHandler extends ExternalNavigationHandler {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/LevelDBPersistedDataStorageTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/LevelDBPersistedDataStorageTest.java index bb842c9..477d640 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/LevelDBPersistedDataStorageTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/state/LevelDBPersistedDataStorageTest.java
@@ -49,7 +49,7 @@ private static final String NAMESPACES[] = {"namespace1", "namesapce2"}; - private LevelDBPersistedDataStorage[] mPersistedDataStorage = + private final LevelDBPersistedDataStorage[] mPersistedDataStorage = new LevelDBPersistedDataStorage[2]; @Before
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/RestoreMigrateTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/RestoreMigrateTest.java index 227896022..c0544a69 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/RestoreMigrateTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/RestoreMigrateTest.java
@@ -103,7 +103,7 @@ } static class AdvancedMockContextWithTestDir extends AdvancedMockContext { - private File mFileTestDir; + private final File mFileTestDir; AdvancedMockContextWithTestDir(Context base) { super(base);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorObserverTestRule.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorObserverTestRule.java index 13bd766..6ab4f0ac 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorObserverTestRule.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorObserverTestRule.java
@@ -183,7 +183,7 @@ /** Test TabModel that exposes the needed capabilities for testing. */ public static class TabModelSelectorTestTabModel extends TabModelImpl implements IncognitoTabModelInternal { - private Set<TabModelObserver> mObserverSet = new HashSet<>(); + private final Set<TabModelObserver> mObserverSet = new HashSet<>(); public TabModelSelectorTestTabModel( Profile profile,
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreTest.java index 6bd49b52..7d6bd942 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TabPersistentStoreTest.java
@@ -132,12 +132,12 @@ private static final int NEW_ROOT_ID = 42; private static class TabRestoredDetails { - public int index; - public int id; - public String url; - public boolean isStandardActiveIndex; - public boolean isIncognitoActiveIndex; - public Boolean isIncognito; + public final int index; + public final int id; + public final String url; + public final boolean isStandardActiveIndex; + public final boolean isIncognitoActiveIndex; + public final Boolean isIncognito; /** Store information about a Tab that's been restored. */ TabRestoredDetails(
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TestTabModelDirectory.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TestTabModelDirectory.java index 076cf0e2e..83af6b0 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TestTabModelDirectory.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/TestTabModelDirectory.java
@@ -88,22 +88,22 @@ "chrome-native://newtab/", "New tab", "AAABPK1gIpkAAAQYFAQAAAAAAAACAAAAAAAAAB0AAABjaHJvbWU6Ly9uZXd0YWIvI21vc3RfdmlzaXRlZAAAAA" - + "AAAAAHAAAATgBlAHcAIAB0AGEAYgAAADQBAAAwAQAACwAAADoAAABjAGgAcgBvAG0AZQA6AC8ALwBuAGUAdw" - + "B0AGEAYgAvACMAbQBvAHMAdABfAHYAaQBzAGkAdABlAGQAAAA6AAAAYwBoAHIAbwBtAGUAOgAvAC8AbgBlAH" - + "cAdABhAGIALwAjAG0AbwBzAHQAXwB2AGkAcwBpAHQAZQBkAAAA/////wAAAAD//////////wgAAAAAAAAAAA" - + "AAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAAgAAAAAAAAAAAAAQMYvST4F1QQAxy9JPgXVBAABAAAAMgAAAP" - + "8BPwBvPwFTCGZvbGRlcklkPwFTATM/AVMRc2VsZWN0ZWRQYW5lSW5kZXg/AUkCewIAAAAAAAAA//////////" - + "8IAAAAAAAAAAAAAEABAAAAAAAAAAYAAAEVAAAAaHR0cDovL3d3dy5nb29nbGUuY2EvAAAAAAAAAAYAAABHAG" - + "8AbwBnAGwAZQAUAgAAEAIAAAsAAAAqAAAAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGcAbwBvAGcAbABlAC4AYw" - + "BhAC8AAAAiAAAAaAB0AHQAcAA6AC8ALwBnAG8AbwBnAGwAZQAuAGMAYQAvAAAA/////wAAAAAMAAAARwBvAG" - + "8AZwBsAGUA/////wgAAAAAAAAAAAAAAAAAAAACAAAAAQAAAAAAAAD/////AwAAAAYAAABjAHMAaQAAABAAAA" - + "B0AGUAeAB0AGEAcgBlAGEA/////wgAAAAAAAAAAAAAQHu+oD4F1QQAfL6gPgXVBAAAAAAAAAAAAP////////" - + "//CAAAAAAAAAAAAABAAQAAAAEAAAALAAAAFgAAAGEAYgBvAHUAdAA6AGIAbABhAG4AawAAABYAAABhAGIAbw" - + "B1AHQAOgBiAGwAYQBuAGsAAAAIAAAAdwBnAGoAZgD///////////////8IAAAAAAAAAAAAAAAAAAAAAAAAAA" - + "AAAAAAAAAAKgAAAGgAdAB0AHAAOgAvAC8AdwB3AHcALgBnAG8AbwBnAGwAZQAuAGMAYQAvAAAAAAAAAAgAAA" - + "AAAAAAAADwP32+oD4F1QQAfr6gPgXVBAAAAAAAAAAAAP////8qAAAAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAG" - + "cAbwBvAGcAbABlAC4AYwBhAC8AAAAIAAAAAAAAAAAA8D8BAAAAAAAAAAEAAAAdAAAAY2hyb21lOi8vbmV3dG" - + "FiLyNtb3N0X3Zpc2l0ZWQAAAAAAAAAEQAAAGh0dHA6Ly9nb29nbGUuY2EvAAAAAAAAAP////8AAA=="); + + "AAAAAHAAAATgBlAHcAIAB0AGEAYgAAADQBAAAwAQAACwAAADoAAABjAGgAcgBvAG0AZQA6AC8ALwBuAGUAdw" + + "B0AGEAYgAvACMAbQBvAHMAdABfAHYAaQBzAGkAdABlAGQAAAA6AAAAYwBoAHIAbwBtAGUAOgAvAC8AbgBlAH" + + "cAdABhAGIALwAjAG0AbwBzAHQAXwB2AGkAcwBpAHQAZQBkAAAA/////wAAAAD//////////wgAAAAAAAAAAA" + + "AAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAAgAAAAAAAAAAAAAQMYvST4F1QQAxy9JPgXVBAABAAAAMgAAAP" + + "8BPwBvPwFTCGZvbGRlcklkPwFTATM/AVMRc2VsZWN0ZWRQYW5lSW5kZXg/AUkCewIAAAAAAAAA//////////" + + "8IAAAAAAAAAAAAAEABAAAAAAAAAAYAAAEVAAAAaHR0cDovL3d3dy5nb29nbGUuY2EvAAAAAAAAAAYAAABHAG" + + "8AbwBnAGwAZQAUAgAAEAIAAAsAAAAqAAAAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGcAbwBvAGcAbABlAC4AYw" + + "BhAC8AAAAiAAAAaAB0AHQAcAA6AC8ALwBnAG8AbwBnAGwAZQAuAGMAYQAvAAAA/////wAAAAAMAAAARwBvAG" + + "8AZwBsAGUA/////wgAAAAAAAAAAAAAAAAAAAACAAAAAQAAAAAAAAD/////AwAAAAYAAABjAHMAaQAAABAAAA" + + "B0AGUAeAB0AGEAcgBlAGEA/////wgAAAAAAAAAAAAAQHu+oD4F1QQAfL6gPgXVBAAAAAAAAAAAAP////////" + + "//CAAAAAAAAAAAAABAAQAAAAEAAAALAAAAFgAAAGEAYgBvAHUAdAA6AGIAbABhAG4AawAAABYAAABhAGIAbw" + + "B1AHQAOgBiAGwAYQBuAGsAAAAIAAAAdwBnAGoAZgD///////////////8IAAAAAAAAAAAAAAAAAAAAAAAAAA" + + "AAAAAAAAAAKgAAAGgAdAB0AHAAOgAvAC8AdwB3AHcALgBnAG8AbwBnAGwAZQAuAGMAYQAvAAAAAAAAAAgAAA" + + "AAAAAAAADwP32+oD4F1QQAfr6gPgXVBAAAAAAAAAAAAP////8qAAAAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAG" + + "cAbwBvAGcAbABlAC4AYwBhAC8AAAAIAAAAAAAAAAAA8D8BAAAAAAAAAAEAAAAdAAAAY2hyb21lOi8vbmV3dG" + + "FiLyNtb3N0X3Zpc2l0ZWQAAAAAAAAAEQAAAGh0dHA6Ly9nb29nbGUuY2EvAAAAAAAAAP////8AAA=="); /** * Contains information about an M18 tab for http://google.com. When used for testing, the @@ -117,18 +117,18 @@ "http://www.google.com/", "Google", "AAABPLD4wNkAAALk4AIAAAAAAAACAAAAAQAAAB0AAABjaHJvbWU6Ly9uZXd0YWIvI21vc3RfdmlzaXRlZAAAAA" - + "AAAAAHAAAATgBlAHcAIAB0AGEAYgAAADQBAAAwAQAACwAAADoAAABjAGgAcgBvAG0AZQA6AC8ALwBuAGUAdw" - + "B0AGEAYgAvACMAbQBvAHMAdABfAHYAaQBzAGkAdABlAGQAAAA6AAAAYwBoAHIAbwBtAGUAOgAvAC8AbgBlAH" - + "cAdABhAGIALwAjAG0AbwBzAHQAXwB2AGkAcwBpAHQAZQBkAAAA/////wAAAAD//////////wgAAAAAAAAAAA" - + "AAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAAgAAAAAAAAAAAAAQHuHvz0F1QQAfIe/PQXVBAABAAAAMgAAAP" - + "8BPwBvPwFTCGZvbGRlcklkPwFTATM/AVMRc2VsZWN0ZWRQYW5lSW5kZXg/AUkCewIAAAAAAAAA//////////" - + "8IAAAAAAAAAAAAAEABAAAAAAAAAAgAAAAWAAAAaHR0cDovL3d3dy5nb29nbGUuY29tLwAAAAAAAAYAAABHAG" - + "8AbwBnAGwAZQDcAAAA2AAAAAsAAAAsAAAAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGcAbwBvAGcAbABlAC4AYw" - + "BvAG0ALwAsAAAAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGcAbwBvAGcAbABlAC4AYwBvAG0ALwD/////AAAAAP" - + "//////////CAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAP////8AAAAACAAAAAAAAMCcguc/o8IqPgXVBA" - + "Ckwio+BdUEAAAAAAAAAAAA//////////8IAAAAAAAAwJyC5z8AAAAAAAAAAAgAAAAdAAAAY2hyb21lOi8vbm" - + "V3dGFiLyNtb3N0X3Zpc2l0ZWQAAAAAAAAAFgAAAGh0dHA6Ly93d3cuZ29vZ2xlLmNvbS8AAAAAAAD/////AA" - + "A="); + + "AAAAAHAAAATgBlAHcAIAB0AGEAYgAAADQBAAAwAQAACwAAADoAAABjAGgAcgBvAG0AZQA6AC8ALwBuAGUAdw" + + "B0AGEAYgAvACMAbQBvAHMAdABfAHYAaQBzAGkAdABlAGQAAAA6AAAAYwBoAHIAbwBtAGUAOgAvAC8AbgBlAH" + + "cAdABhAGIALwAjAG0AbwBzAHQAXwB2AGkAcwBpAHQAZQBkAAAA/////wAAAAD//////////wgAAAAAAAAAAA" + + "AAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAAgAAAAAAAAAAAAAQHuHvz0F1QQAfIe/PQXVBAABAAAAMgAAAP" + + "8BPwBvPwFTCGZvbGRlcklkPwFTATM/AVMRc2VsZWN0ZWRQYW5lSW5kZXg/AUkCewIAAAAAAAAA//////////" + + "8IAAAAAAAAAAAAAEABAAAAAAAAAAgAAAAWAAAAaHR0cDovL3d3dy5nb29nbGUuY29tLwAAAAAAAAYAAABHAG" + + "8AbwBnAGwAZQDcAAAA2AAAAAsAAAAsAAAAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGcAbwBvAGcAbABlAC4AYw" + + "BvAG0ALwAsAAAAaAB0AHQAcAA6AC8ALwB3AHcAdwAuAGcAbwBvAGcAbABlAC4AYwBvAG0ALwD/////AAAAAP" + + "//////////CAAAAAAAAAAAAAAAAAAAAAAAAAABAAAAAAAAAP////8AAAAACAAAAAAAAMCcguc/o8IqPgXVBA" + + "Ckwio+BdUEAAAAAAAAAAAA//////////8IAAAAAAAAwJyC5z8AAAAAAAAAAAgAAAAdAAAAY2hyb21lOi8vbm" + + "V3dGFiLyNtb3N0X3Zpc2l0ZWQAAAAAAAAAFgAAAGh0dHA6Ly93d3cuZ29vZ2xlLmNvbS8AAAAAAAD/////AA" + + "A="); public static final TabStateInfo M26_GOOGLE_COM = new TabStateInfo( @@ -138,17 +138,17 @@ "http://www.google.com/", "Google", "AAABPK2JhPQAAALg3AIAAAAAAAACAAAAAQAAAAAAAAAdAAAAY2hyb21lOi8vbmV3dGFiLyNtb3N0X3Zpc2l0ZW" - + "QAAAAHAAAATgBlAHcAIAB0AGEAYgAAACQBAAAgAQAADQAAADoAAABjAGgAcgBvAG0AZQA6AC8ALwBuAGUAdw" - + "B0AGEAYgAvACMAbQBvAHMAdABfAHYAaQBzAGkAdABlAGQAAAA6AAAAYwBoAHIAbwBtAGUAOgAvAC8AbgBlAH" - + "cAdABhAGIALwAjAG0AbwBzAHQAXwB2AGkAcwBpAHQAZQBkAAAA/////wAAAAD//////////wgAAAAAAAAAAA" - + "AAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAAgAAAAAAAAAAADwP2hSNuEF1QQAaVI24QXVBAABAAAAMgAAAP" - + "8CPwBvPwFTCGZvbGRlcklkPwFTATM/AVMRc2VsZWN0ZWRQYW5lSW5kZXg/AUkCewIAAAAAAAAA//////////" - + "8AAAAABgAAAAAAAAAAAAAAAQAAAB0AAABjaHJvbWU6Ly9uZXd0YWIvI21vc3RfdmlzaXRlZAAAAAAAAABaa9" - + "YpnDMuAAEAAAAWAAAAaHR0cDovL3d3dy5nb29nbGUuY29tLwAABgAAAEcAbwBvAGcAbABlAMQAAADAAAAADQ" - + "AAACwAAABoAHQAdABwADoALwAvAHcAdwB3AC4AZwBvAG8AZwBsAGUALgBjAG8AbQAvACQAAABoAHQAdABwAD" - + "oALwAvAGcAbwBvAGcAbABlAC4AYwBvAG0ALwD/////AAAAAP//////////CAAAAAAAAAAAAAAAAAAAAAAAAA" - + "ABAAAAAAAAAP////8AAAAACAAAAAAAAMCcgtc/XIjK4gXVBABdiMriBdUEAAAAAAAAAAAA//////////8AAA" - + "AAAQAAAgAAAAAAAAAAAQAAABIAAABodHRwOi8vZ29vZ2xlLmNvbS8AAAAAAABIAVIrnDMuAP////8AAA=="); + + "QAAAAHAAAATgBlAHcAIAB0AGEAYgAAACQBAAAgAQAADQAAADoAAABjAGgAcgBvAG0AZQA6AC8ALwBuAGUAdw" + + "B0AGEAYgAvACMAbQBvAHMAdABfAHYAaQBzAGkAdABlAGQAAAA6AAAAYwBoAHIAbwBtAGUAOgAvAC8AbgBlAH" + + "cAdABhAGIALwAjAG0AbwBzAHQAXwB2AGkAcwBpAHQAZQBkAAAA/////wAAAAD//////////wgAAAAAAAAAAA" + + "AAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAAgAAAAAAAAAAADwP2hSNuEF1QQAaVI24QXVBAABAAAAMgAAAP" + + "8CPwBvPwFTCGZvbGRlcklkPwFTATM/AVMRc2VsZWN0ZWRQYW5lSW5kZXg/AUkCewIAAAAAAAAA//////////" + + "8AAAAABgAAAAAAAAAAAAAAAQAAAB0AAABjaHJvbWU6Ly9uZXd0YWIvI21vc3RfdmlzaXRlZAAAAAAAAABaa9" + + "YpnDMuAAEAAAAWAAAAaHR0cDovL3d3dy5nb29nbGUuY29tLwAABgAAAEcAbwBvAGcAbABlAMQAAADAAAAADQ" + + "AAACwAAABoAHQAdABwADoALwAvAHcAdwB3AC4AZwBvAG8AZwBsAGUALgBjAG8AbQAvACQAAABoAHQAdABwAD" + + "oALwAvAGcAbwBvAGcAbABlAC4AYwBvAG0ALwD/////AAAAAP//////////CAAAAAAAAAAAAAAAAAAAAAAAAA" + + "ABAAAAAAAAAP////8AAAAACAAAAAAAAMCcgtc/XIjK4gXVBABdiMriBdUEAAAAAAAAAAAA//////////8AAA" + + "AAAQAAAgAAAAAAAAAAAQAAABIAAABodHRwOi8vZ29vZ2xlLmNvbS8AAAAAAABIAVIrnDMuAP////8AAA=="); public static final TabStateInfo M26_GOOGLE_CA = new TabStateInfo( @@ -158,18 +158,18 @@ "http://www.google.ca/", "Google", "AAABPK2J90YAAALs6AIAAAAAAAACAAAAAQAAAAAAAAAdAAAAY2hyb21lOi8vbmV3dGFiLyNtb3N0X3Zpc2l0ZW" - + "QAAAAHAAAATgBlAHcAIAB0AGEAYgAAACQBAAAgAQAADQAAADoAAABjAGgAcgBvAG0AZQA6AC8ALwBuAGUAdw" - + "B0AGEAYgAvACMAbQBvAHMAdABfAHYAaQBzAGkAdABlAGQAAAA6AAAAYwBoAHIAbwBtAGUAOgAvAC8AbgBlAH" - + "cAdABhAGIALwAjAG0AbwBzAHQAXwB2AGkAcwBpAHQAZQBkAAAA/////wAAAAD//////////wgAAAAAAAAAAA" - + "AAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAAgAAAAAAAAAAADwP9eU9OIF1QQA2JT04gXVBAABAAAAMgAAAP" - + "8CPwBvPwFTCGZvbGRlcklkPwFTATM/AVMRc2VsZWN0ZWRQYW5lSW5kZXg/AUkCewIAAAAAAAAA//////////" - + "8AAAAABgAAAAAAAAAAAAAAAQAAAB0AAABjaHJvbWU6Ly9uZXd0YWIvI21vc3RfdmlzaXRlZAAAAAAAAADl8o" - + "QrnDMuAAEAAAAVAAAAaHR0cDovL3d3dy5nb29nbGUuY2EvAAAABgAAAEcAbwBvAGcAbABlAMwAAADIAAAADQ" - + "AAACoAAABoAHQAdABwADoALwAvAHcAdwB3AC4AZwBvAG8AZwBsAGUALgBjAGEALwAAACoAAABoAHQAdABwAD" - + "oALwAvAHcAdwB3AC4AZwBvAG8AZwBsAGUALgBjAGEALwAAAP////8AAAAA//////////8IAAAAAAAAAAAAAA" - + "AAAAAAAAAAAAEAAAAAAAAA/////wAAAAAIAAAAAAAAAAAA8D9VtDjjBdUEAFa0OOMF1QQAAAAAAAAAAAD///" - + "///////wAAAAABAAAAAAAAAAAAAAABAAAAFQAAAGh0dHA6Ly93d3cuZ29vZ2xlLmNhLwAAAAAAAAD8oBUsnD" - + "MuAP////8AAA=="); + + "QAAAAHAAAATgBlAHcAIAB0AGEAYgAAACQBAAAgAQAADQAAADoAAABjAGgAcgBvAG0AZQA6AC8ALwBuAGUAdw" + + "B0AGEAYgAvACMAbQBvAHMAdABfAHYAaQBzAGkAdABlAGQAAAA6AAAAYwBoAHIAbwBtAGUAOgAvAC8AbgBlAH" + + "cAdABhAGIALwAjAG0AbwBzAHQAXwB2AGkAcwBpAHQAZQBkAAAA/////wAAAAD//////////wgAAAAAAAAAAA" + + "AAAAAAAAAAAAAAAQAAAAAAAAD/////AAAAAAgAAAAAAAAAAADwP9eU9OIF1QQA2JT04gXVBAABAAAAMgAAAP" + + "8CPwBvPwFTCGZvbGRlcklkPwFTATM/AVMRc2VsZWN0ZWRQYW5lSW5kZXg/AUkCewIAAAAAAAAA//////////" + + "8AAAAABgAAAAAAAAAAAAAAAQAAAB0AAABjaHJvbWU6Ly9uZXd0YWIvI21vc3RfdmlzaXRlZAAAAAAAAADl8o" + + "QrnDMuAAEAAAAVAAAAaHR0cDovL3d3dy5nb29nbGUuY2EvAAAABgAAAEcAbwBvAGcAbABlAMwAAADIAAAADQ" + + "AAACoAAABoAHQAdABwADoALwAvAHcAdwB3AC4AZwBvAG8AZwBsAGUALgBjAGEALwAAACoAAABoAHQAdABwAD" + + "oALwAvAHcAdwB3AC4AZwBvAG8AZwBsAGUALgBjAGEALwAAAP////8AAAAA//////////8IAAAAAAAAAAAAAA" + + "AAAAAAAAAAAAEAAAAAAAAA/////wAAAAAIAAAAAAAAAAAA8D9VtDjjBdUEAFa0OOMF1QQAAAAAAAAAAAD///" + + "///////wAAAAABAAAAAAAAAAAAAAABAAAAFQAAAGh0dHA6Ly93d3cuZ29vZ2xlLmNhLwAAAAAAAAD8oBUsnD" + + "MuAP////8AAA=="); public static final TabStateInfo V2_BAIDU = new TabStateInfo( @@ -179,12 +179,12 @@ "http://www.baidu.com/", "百度一下", "AAABTbBCEBcAAAFkYAEAAAAAAAABAAAAAAAAAFABAABMAQAAAAAAABUAAABodHRwOi8vd3d3LmJhaWR1LmNvbS" - + "8AAAAEAAAAfnamXgBOC07IAAAAxAAAABYAAAAAAAAAKgAAAGgAdAB0AHAAOgAvAC8AdwB3AHcALgBiAGEAaQ" - + "BkAHUALgBjAG8AbQAvAAAA/////wAAAAAAAAAAIgAAAGgAdAB0AHAAOgAvAC8AYgBhAGkAZAB1AC4AYwBvAG" - + "0ALwAAAAAAAAAIAAAAAAAAwJyC1z9MWRSCeBcFAE1ZFIJ4FwUAS1kUgngXBQABAAAACAAAAAAAAAAAAAAACA" - + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wAAAAAAAAAIAAAAABEAAABodHRwOi8vYmFpZHUuY29tLwAAAA" - + "EAAAARAAAAaHR0cDovL2JhaWR1LmNvbS8AAAAAAAAA7Nyiyg52LgAAAAAAyAAAAAEAAAD/////AAAAAAACAA" - + "AAAAAAAAAA"); + + "8AAAAEAAAAfnamXgBOC07IAAAAxAAAABYAAAAAAAAAKgAAAGgAdAB0AHAAOgAvAC8AdwB3AHcALgBiAGEAaQ" + + "BkAHUALgBjAG8AbQAvAAAA/////wAAAAAAAAAAIgAAAGgAdAB0AHAAOgAvAC8AYgBhAGkAZAB1AC4AYwBvAG" + + "0ALwAAAAAAAAAIAAAAAAAAwJyC1z9MWRSCeBcFAE1ZFIJ4FwUAS1kUgngXBQABAAAACAAAAAAAAAAAAAAACA" + + "AAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/////wAAAAAAAAAIAAAAABEAAABodHRwOi8vYmFpZHUuY29tLwAAAA" + + "EAAAARAAAAaHR0cDovL2JhaWR1LmNvbS8AAAAAAAAA7Nyiyg52LgAAAAAAyAAAAAEAAAD/////AAAAAAACAA" + + "AAAAAAAAAA"); public static final TabStateInfo V2_DUCK_DUCK_GO = new TabStateInfo( @@ -194,11 +194,11 @@ "https://duckduckgo.com/", "DuckDuckGo", "AAABTbBCExUAAAFAPAEAAAAAAAABAAAAAAAAACwBAAAoAQAAAAAAABcAAABodHRwczovL2R1Y2tkdWNrZ28uY2" - + "9tLwAKAAAARAB1AGMAawBEAHUAYwBrAEcAbwCoAAAApAAAABYAAAAAAAAALgAAAGgAdAB0AHAAcwA6AC8ALw" - + "BkAHUAYwBrAGQAdQBjAGsAZwBvAC4AYwBvAG0ALwAAAP////8AAAAAAAAAAP////8AAAAACAAAAAAAAAAAAA" - + "AAlVAhgngXBQCWUCGCeBcFAJdQIYJ4FwUAAQAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAA" - + "AAAP////8AAAAAAAAACAAAAAAAAAAAAQAAABYAAABodHRwOi8vZHVja2R1Y2tnby5jb20vAAAAAAAAmoGoyg" - + "52LgAAAAAAyAAAAAEAAAD/////AAAAAAACAAAAAAAAAAAA"); + + "9tLwAKAAAARAB1AGMAawBEAHUAYwBrAEcAbwCoAAAApAAAABYAAAAAAAAALgAAAGgAdAB0AHAAcwA6AC8ALw" + + "BkAHUAYwBrAGQAdQBjAGsAZwBvAC4AYwBvAG0ALwAAAP////8AAAAAAAAAAP////8AAAAACAAAAAAAAAAAAA" + + "AAlVAhgngXBQCWUCGCeBcFAJdQIYJ4FwUAAQAAAAgAAAAAAAAAAAAAAAgAAAAAAAAAAAAAAAAAAAAAAAAAAA" + + "AAAP////8AAAAAAAAACAAAAAAAAAAAAQAAABYAAABodHRwOi8vZHVja2R1Y2tnby5jb20vAAAAAAAAmoGoyg" + + "52LgAAAAAAyAAAAAEAAAD/////AAAAAAACAAAAAAAAAAAA"); public static final TabStateInfo V2_HAARETZ = new TabStateInfo( @@ -208,10 +208,10 @@ "http://www.haaretz.co.il/", "חדשות, ידיעות מהארץ והעולם - עיתון הארץ", "AAABTbBhcJQAAAD49AAAAAAAAAABAAAAAAAAAOQAAADgAAAAAAAAABkAAABodHRwOi8vd3d3LmhhYXJldHouY2" - + "8uaWwvAAAAJwAAANcF0wXpBdUF6gUsACAA2QXTBdkF4gXVBeoFIADeBdQF0AXoBeUFIADVBdQF4gXVBdwF3Q" - + "UgAC0AIADiBdkF6gXVBd8FIADUBdAF6AXlBQAAAAAAAAAAAAgAAAAAGQAAAGh0dHA6Ly93d3cuaGFhcmV0ei" - + "5jby5pbC8AAAABAAAAGQAAAGh0dHA6Ly93d3cuaGFhcmV0ei5jby5pbC8AAAAAAAAAJ7hFRQ92LgAAAAAAyA" - + "AAAAEAAAD/////AAAAAAACAAAAAAAAAAAA"); + + "8uaWwvAAAAJwAAANcF0wXpBdUF6gUsACAA2QXTBdkF4gXVBeoFIADeBdQF0AXoBeUFIADVBdQF4gXVBdwF3Q" + + "UgAC0AIADiBdkF6gXVBd8FIADUBdAF6AXlBQAAAAAAAAAAAAgAAAAAGQAAAGh0dHA6Ly93d3cuaGFhcmV0ei" + + "5jby5pbC8AAAABAAAAGQAAAGh0dHA6Ly93d3cuaGFhcmV0ei5jby5pbC8AAAAAAAAAJ7hFRQ92LgAAAAAAyA" + + "AAAAEAAAD/////AAAAAAACAAAAAAAAAAAA"); public static final TabStateInfo V2_TEXTAREA = new TabStateInfo( @@ -221,18 +221,18 @@ "http://textarea.org/", "textarea", "AAABSPI9OA8AAALs6AIAAAAAAAACAAAAAQAAACABAAAcAQAAAAAAABcAAABjaHJvbWUtbmF0aXZlOi8vbmV3dG" - + "FiLwAHAAAATgBlAHcAIAB0AGEAYgAAAKQAAACgAAAAFQAAAAAAAAAuAAAAYwBoAHIAbwBtAGUALQBuAGEAdA" - + "BpAHYAZQA6AC8ALwBuAGUAdwB0AGEAYgAvAAAA/////wAAAAAAAAAA/////wAAAAAIAAAAAAAAAAAA8D8EkS" - + "Y/8gQFAAWRJj/yBAUABpEmP/IEBQABAAAACAAAAAAAAAAAAPC/CAAAAAAAAAAAAPC/AAAAAAAAAAD/////AA" - + "AAAAYAAAAAAAAAAAAAAAEAAAAXAAAAY2hyb21lLW5hdGl2ZTovL25ld3RhYi8AAAAAAMnUrIeIYy4AAAAAAA" - + "AAAAC0AQAAsAEAAAEAAAAUAAAAaHR0cDovL3RleHRhcmVhLm9yZy8IAAAAdABlAHgAdABhAHIAZQBhAEABAA" - + "A8AQAAFQAAAAAAAAAoAAAAaAB0AHQAcAA6AC8ALwB0AGUAeAB0AGEAcgBlAGEALgBvAHIAZwAvAP////8AAA" - + "AAAAAAAP////8HAAAAYAAAAAoADQA/ACUAIABXAGUAYgBLAGkAdAAgAHMAZQByAGkAYQBsAGkAegBlAGQAIA" - + "BmAG8AcgBtACAAcwB0AGEAdABlACAAdgBlAHIAcwBpAG8AbgAgADgAIAAKAA0APQAmABAAAABOAG8AIABvAH" - + "cAbgBlAHIAAgAAADEAAAAAAAAAEAAAAHQAZQB4AHQAYQByAGUAYQACAAAAMQAAAAAAAAAIAAAAAAAAAAAAAA" - + "AHkSY/8gQFAAiRJj/yBAUABpEmP/IEBQABAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAD///" - + "//AAAAAAEAAAIAAAAAAAAAAAEAAAAUAAAAaHR0cDovL3RleHRhcmVhLm9yZy8AAAAANKvVh4hjLgAAAAAAyA" - + "AAAP////8AAAAAAAIAAAAAAAAAAwE="); + + "FiLwAHAAAATgBlAHcAIAB0AGEAYgAAAKQAAACgAAAAFQAAAAAAAAAuAAAAYwBoAHIAbwBtAGUALQBuAGEAdA" + + "BpAHYAZQA6AC8ALwBuAGUAdwB0AGEAYgAvAAAA/////wAAAAAAAAAA/////wAAAAAIAAAAAAAAAAAA8D8EkS" + + "Y/8gQFAAWRJj/yBAUABpEmP/IEBQABAAAACAAAAAAAAAAAAPC/CAAAAAAAAAAAAPC/AAAAAAAAAAD/////AA" + + "AAAAYAAAAAAAAAAAAAAAEAAAAXAAAAY2hyb21lLW5hdGl2ZTovL25ld3RhYi8AAAAAAMnUrIeIYy4AAAAAAA" + + "AAAAC0AQAAsAEAAAEAAAAUAAAAaHR0cDovL3RleHRhcmVhLm9yZy8IAAAAdABlAHgAdABhAHIAZQBhAEABAA" + + "A8AQAAFQAAAAAAAAAoAAAAaAB0AHQAcAA6AC8ALwB0AGUAeAB0AGEAcgBlAGEALgBvAHIAZwAvAP////8AAA" + + "AAAAAAAP////8HAAAAYAAAAAoADQA/ACUAIABXAGUAYgBLAGkAdAAgAHMAZQByAGkAYQBsAGkAegBlAGQAIA" + + "BmAG8AcgBtACAAcwB0AGEAdABlACAAdgBlAHIAcwBpAG8AbgAgADgAIAAKAA0APQAmABAAAABOAG8AIABvAH" + + "cAbgBlAHIAAgAAADEAAAAAAAAAEAAAAHQAZQB4AHQAYQByAGUAYQACAAAAMQAAAAAAAAAIAAAAAAAAAAAAAA" + + "AHkSY/8gQFAAiRJj/yBAUABpEmP/IEBQABAAAACAAAAAAAAAAAAAAACAAAAAAAAAAAAAAAAAAAAAAAAAD///" + + "//AAAAAAEAAAIAAAAAAAAAAAEAAAAUAAAAaHR0cDovL3RleHRhcmVhLm9yZy8AAAAANKvVh4hjLgAAAAAAyA" + + "AAAP////8AAAAAAAIAAAAAAAAAAwE="); /** * Tab model metadata file containing information about multiple tabs, with Baidu selected. @@ -257,9 +257,9 @@ V2_TEXTAREA }, "AAAABAAAAAf/////AAAAAwAAAAEAFmh0dHA6Ly93d3cuZ29vZ2xlLmNvbS8AAAACABZodHRw" - + "Oi8vd3d3Lmdvb2dsZS5jb20vAAAAAwAVaHR0cDovL3d3dy5nb29nbGUuY2EvAAAABAAVaHR0" - + "cDovL3d3dy5iYWlkdS5jb20vAAAABQAXaHR0cHM6Ly9kdWNrZHVja2dvLmNvbS8AAAAGABlo" - + "dHRwOi8vd3d3LmhhYXJldHouY28uaWwvAAAABwAUaHR0cDovL3RleHRhcmVhLm9yZy8="); + + "Oi8vd3d3Lmdvb2dsZS5jb20vAAAAAwAVaHR0cDovL3d3dy5nb29nbGUuY2EvAAAABAAVaHR0" + + "cDovL3d3dy5iYWlkdS5jb20vAAAABQAXaHR0cHM6Ly9kdWNrZHVja2dvLmNvbS8AAAAGABlo" + + "dHRwOi8vd3d3LmhhYXJldHouY28uaWwvAAAABwAUaHR0cDovL3RleHRhcmVhLm9yZy8="); /** Same as TAB_MODEL_METADATA_V4, but using the version 5 file format. */ public static final TabModelMetaDataInfo TAB_MODEL_METADATA_V5 = @@ -277,9 +277,9 @@ V2_TEXTAREA }, "AAAABQAAAAcAAAAA/////wAAAAMAAAABABZodHRwOi8vd3d3Lmdvb2dsZS5jb20vAAAAAgAWaHR0" - + "cDovL3d3dy5nb29nbGUuY29tLwAAAAMAFWh0dHA6Ly93d3cuZ29vZ2xlLmNhLwAAAAQAFWh0dHA6" - + "Ly93d3cuYmFpZHUuY29tLwAAAAUAF2h0dHBzOi8vZHVja2R1Y2tnby5jb20vAAAABgAZaHR0cDov" - + "L3d3dy5oYWFyZXR6LmNvLmlsLwAAAAcAFGh0dHA6Ly90ZXh0YXJlYS5vcmcv"); + + "cDovL3d3dy5nb29nbGUuY29tLwAAAAMAFWh0dHA6Ly93d3cuZ29vZ2xlLmNhLwAAAAQAFWh0dHA6" + + "Ly93d3cuYmFpZHUuY29tLwAAAAUAF2h0dHBzOi8vZHVja2R1Y2tnby5jb20vAAAABgAZaHR0cDov" + + "L3d3dy5oYWFyZXR6LmNvLmlsLwAAAAcAFGh0dHA6Ly90ZXh0YXJlYS5vcmcv"); /** * Similar to TAB_MODEL_METADATA_V5, but has a single Incognito tab. The tab state can't be @@ -301,10 +301,10 @@ V2_TEXTAREA }, "AAAABQAAAAgAAAABAAAAAAAAAAQAAAAIABRodHRwOi8vZXJmd29ybGQuY29tLwAAAAEAFmh0dHA6" - + "Ly93d3cuZ29vZ2xlLmNvbS8AAAACABZodHRwOi8vd3d3Lmdvb2dsZS5jb20vAAAAAwAVaHR0cDov" - + "L3d3dy5nb29nbGUuY2EvAAAABAAVaHR0cDovL3d3dy5iYWlkdS5jb20vAAAABQAXaHR0cHM6Ly9k" - + "dWNrZHVja2dvLmNvbS8AAAAGABlodHRwOi8vd3d3LmhhYXJldHouY28uaWwvAAAABwAUaHR0cDov" - + "L3RleHRhcmVhLm9yZy8="); + + "Ly93d3cuZ29vZ2xlLmNvbS8AAAACABZodHRwOi8vd3d3Lmdvb2dsZS5jb20vAAAAAwAVaHR0cDov" + + "L3d3dy5nb29nbGUuY2EvAAAABAAVaHR0cDovL3d3dy5iYWlkdS5jb20vAAAABQAXaHR0cHM6Ly9k" + + "dWNrZHVja2dvLmNvbS8AAAAGABlodHRwOi8vd3d3LmhhYXJldHouY28uaWwvAAAABwAUaHR0cDov" + + "L3RleHRhcmVhLm9yZy8="); /** Same as TAB_MODEL_METADATA_V4, but using the version 5 file format. */ public static final TabModelMetaDataInfo TAB_MODEL_METADATA_V5_NO_M18 = @@ -321,9 +321,9 @@ M26_GOOGLE_COM }, "AAAABQAAAAYAAAAA/////wAAAAQAAAAHABRodHRwOi8vdGV4dGFyZWEub3JnLwAAAAQAFWh0dHA6" - + "Ly93d3cuYmFpZHUuY29tLwAAAAUAF2h0dHBzOi8vZHVja2R1Y2tnby5jb20vAAAABgAZaHR0cDov" - + "L3d3dy5oYWFyZXR6LmNvLmlsLwAAAAMAFWh0dHA6Ly93d3cuZ29vZ2xlLmNhLwAAAAIAFmh0dHA6" - + "Ly93d3cuZ29vZ2xlLmNvbS8="); + + "Ly93d3cuYmFpZHUuY29tLwAAAAUAF2h0dHBzOi8vZHVja2R1Y2tnby5jb20vAAAABgAZaHR0cDov" + + "L3d3dy5oYWFyZXR6LmNvLmlsLwAAAAMAFWh0dHA6Ly93d3cuZ29vZ2xlLmNhLwAAAAIAFmh0dHA6" + + "Ly93d3cuZ29vZ2xlLmNvbS8="); // Active Tab is google.ca (M26_GOOGLE_CA) with Tab ID 1. // Other Tab in the Tab Model is google.com (M26_GOOGLE_COM) with Tab ID 3 @@ -355,10 +355,10 @@ V2_TEXTAREA.tabId, new TabStateInfo[] {V2_TEXTAREA, V2_DUCK_DUCK_GO}, "AAAABQAAAAQAAAACAAAAAQAAAAIAAAAGABJodHRwczovL2hlbGxvLmNvbS8AAAAHAA9odHRwOi8v" - + "Ym9vLmNvbS8AAAADABVodHRwczovL3RleHRhcmVhLm9yZy8AAAAEABdodHRwczovL2R1Y2tkdWNr" - + "Z28uY29tLw=="); + + "Ym9vLmNvbS8AAAADABVodHRwczovL3RleHRhcmVhLm9yZy8AAAAEABdodHRwczovL2R1Y2tkdWNr" + + "Z28uY29tLw=="); - private File mTestingDirectory; + private final File mTestingDirectory; private File mDataDirectory; /**
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/UndoTabModelTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/UndoTabModelTest.java index be24eba..710a7bb 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/UndoTabModelTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tabmodel/UndoTabModelTest.java
@@ -185,7 +185,7 @@ // Helper class that notifies after the tab is closed, and a tab restore service entry has been // created in tab restore service. private static class TabClosedObserver implements TabModelObserver { - private CallbackHelper mTabClosedCallback; + private final CallbackHelper mTabClosedCallback; public TabClosedObserver(CallbackHelper closedCallback) { mTabClosedCallback = closedCallback;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/top/TabSwitcherActionMenuRenderTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/top/TabSwitcherActionMenuRenderTest.java index d188c11..48dfb86 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/top/TabSwitcherActionMenuRenderTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/top/TabSwitcherActionMenuRenderTest.java
@@ -52,7 +52,7 @@ @ParameterAnnotations.UseRunnerDelegate(ChromeJUnit4RunnerDelegate.class) public class TabSwitcherActionMenuRenderTest { @ParameterAnnotations.ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = new NightModeTestUtils.NightModeParams().getParameters(); @Rule public final MockitoRule mMockitoRule = MockitoJUnit.rule();
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhoneTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhoneTest.java index 76c14cf..348e7b9 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhoneTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhoneTest.java
@@ -118,7 +118,7 @@ @Mock OptionalButtonCoordinator mOptionalButtonCoordinator; @Mock private SearchEngineUtils mSearchEngineUtils; - private Canvas mCanvas = new Canvas(); + private final Canvas mCanvas = new Canvas(); private ToolbarPhone mToolbar; private View mToolbarButtonsContainer; private MenuButton mMenuButton;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tracing/settings/TracingSettingsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tracing/settings/TracingSettingsTest.java index 5e294e4b..b03a263 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/tracing/settings/TracingSettingsTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tracing/settings/TracingSettingsTest.java
@@ -290,7 +290,7 @@ } public static class CategoryParams implements ParameterProvider { - private static List<ParameterSet> sParams = + private static final List<ParameterSet> sParams = Arrays.asList( new ParameterSet() .value(TracingSettings.UI_PREF_DEFAULT_CATEGORIES, "toplevel")
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrArAnchorsTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrArAnchorsTest.java index 3d7a6f7..57e5684 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrArAnchorsTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrArAnchorsTest.java
@@ -41,12 +41,12 @@ }) public class WebXrArAnchorsTest { @ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = ArTestRuleUtils.generateDefaultTestRuleParameters(); @Rule public RuleChain mRuleChain; - private ChromeActivityTestRule mTestRule; + private final ChromeActivityTestRule mTestRule; private WebXrArTestFramework mWebXrArTestFramework; public WebXrArAnchorsTest(Callable<ChromeActivityTestRule> callable) throws Exception {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrArCameraAccessTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrArCameraAccessTest.java index dcb1715..698e358 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrArCameraAccessTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrArCameraAccessTest.java
@@ -40,12 +40,12 @@ @MinAndroidSdkLevel(Build.VERSION_CODES.O) public class WebXrArCameraAccessTest { @ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = ArTestRuleUtils.generateDefaultTestRuleParameters(); @Rule public RuleChain mRuleChain; - private ChromeActivityTestRule mTestRule; + private final ChromeActivityTestRule mTestRule; private WebXrArTestFramework mWebXrArTestFramework; public WebXrArCameraAccessTest(Callable<ChromeActivityTestRule> callable) throws Exception {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrArDepthSensingTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrArDepthSensingTest.java index 846b53d..14563ad 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrArDepthSensingTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrArDepthSensingTest.java
@@ -38,12 +38,12 @@ }) public class WebXrArDepthSensingTest { @ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = ArTestRuleUtils.generateDefaultTestRuleParameters(); @Rule public RuleChain mRuleChain; - private ChromeActivityTestRule mTestRule; + private final ChromeActivityTestRule mTestRule; private WebXrArTestFramework mWebXrArTestFramework; public WebXrArDepthSensingTest(Callable<ChromeActivityTestRule> callable) throws Exception {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrArHitTestTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrArHitTestTest.java index 1410d05b..0fe87a2 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrArHitTestTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrArHitTestTest.java
@@ -38,12 +38,12 @@ }) public class WebXrArHitTestTest { @ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = ArTestRuleUtils.generateDefaultTestRuleParameters(); @Rule public RuleChain mRuleChain; - private ChromeActivityTestRule mTestRule; + private final ChromeActivityTestRule mTestRule; private WebXrArTestFramework mWebXrArTestFramework; public WebXrArHitTestTest(Callable<ChromeActivityTestRule> callable) throws Exception {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrArLightEstimationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrArLightEstimationTest.java index 46cf497..a3f000a 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrArLightEstimationTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrArLightEstimationTest.java
@@ -38,12 +38,12 @@ }) public class WebXrArLightEstimationTest { @ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = ArTestRuleUtils.generateDefaultTestRuleParameters(); @Rule public RuleChain mRuleChain; - private ChromeActivityTestRule mTestRule; + private final ChromeActivityTestRule mTestRule; private WebXrArTestFramework mWebXrArTestFramework; public WebXrArLightEstimationTest(Callable<ChromeActivityTestRule> callable) throws Exception {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrArSanityTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrArSanityTest.java index 93906cd4..0c679ed 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrArSanityTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrArSanityTest.java
@@ -46,12 +46,12 @@ Build.VERSION.SDK_INT >= Build.VERSION_CODES.O; @ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = ArTestRuleUtils.generateDefaultTestRuleParameters(); @Rule public RuleChain mRuleChain; - private ChromeActivityTestRule mTestRule; + private final ChromeActivityTestRule mTestRule; private WebXrArTestFramework mWebXrArTestFramework; public WebXrArSanityTest(Callable<ChromeActivityTestRule> callable) throws Exception {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrArSessionTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrArSessionTest.java index 0f4a3fd..f31164b 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrArSessionTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrArSessionTest.java
@@ -9,7 +9,6 @@ import androidx.test.filters.MediumTest; -import org.chromium.base.test.util.DisabledTest; import org.junit.Assert; import org.junit.Before; import org.junit.Rule; @@ -22,6 +21,7 @@ import org.chromium.base.test.params.ParameterSet; import org.chromium.base.test.params.ParameterizedRunner; import org.chromium.base.test.util.CommandLineFlags; +import org.chromium.base.test.util.DisabledTest; import org.chromium.chrome.browser.flags.ChromeSwitches; import org.chromium.chrome.browser.modaldialog.ChromeModalDialogTestUtils; import org.chromium.chrome.browser.vr.rules.XrActivityRestriction; @@ -45,12 +45,12 @@ }) public class WebXrArSessionTest { @ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = ArTestRuleUtils.generateDefaultTestRuleParameters(); @Rule public RuleChain mRuleChain; - private ChromeActivityTestRule mTestRule; + private final ChromeActivityTestRule mTestRule; private WebXrArTestFramework mWebXrArTestFramework; public WebXrArSessionTest(Callable<ChromeActivityTestRule> callable) throws Exception {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrArViewportScaleTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrArViewportScaleTest.java index 759fc67..f3404522 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrArViewportScaleTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrArViewportScaleTest.java
@@ -38,12 +38,12 @@ }) public class WebXrArViewportScaleTest { @ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = ArTestRuleUtils.generateDefaultTestRuleParameters(); @Rule public RuleChain mRuleChain; - private ChromeActivityTestRule mTestRule; + private final ChromeActivityTestRule mTestRule; private WebXrArTestFramework mWebXrArTestFramework; public WebXrArViewportScaleTest(Callable<ChromeActivityTestRule> callable) throws Exception {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrCardboardDeviceTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrCardboardDeviceTest.java index edeb0405..f5355a1 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrCardboardDeviceTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrCardboardDeviceTest.java
@@ -41,12 +41,12 @@ }) public class WebXrVrCardboardDeviceTest { @ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = VrCardboardTestRuleUtils.generateDefaultTestRuleParameters(); @Rule public RuleChain mRuleChain; - private ChromeActivityTestRule mTestRule; + private final ChromeActivityTestRule mTestRule; private WebXrVrTestFramework mWebXrVrTestFramework; public WebXrVrCardboardDeviceTest(Callable<ChromeActivityTestRule> callable) throws Exception {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrCardboardInputTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrCardboardInputTest.java index 9901a4ed..ac2cbb9 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrCardboardInputTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrCardboardInputTest.java
@@ -46,12 +46,12 @@ }) public class WebXrVrCardboardInputTest { @ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = VrCardboardTestRuleUtils.generateDefaultTestRuleParameters(); @Rule public RuleChain mRuleChain; - private ChromeActivityTestRule mTestRule; + private final ChromeActivityTestRule mTestRule; private WebXrVrTestFramework mWebXrVrTestFramework; public WebXrVrCardboardInputTest(Callable<ChromeActivityTestRule> callable) throws Exception {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrCardboardPermissionTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrCardboardPermissionTest.java index 2d4f3a4..d2d4f49 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrCardboardPermissionTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrCardboardPermissionTest.java
@@ -44,12 +44,12 @@ }) public class WebXrVrCardboardPermissionTest { @ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = VrCardboardTestRuleUtils.generateDefaultTestRuleParameters(); @Rule public RuleChain mRuleChain; - private ChromeActivityTestRule mTestRule; + private final ChromeActivityTestRule mTestRule; private WebXrVrPermissionTestFramework mWebXrVrPermissionTestFramework; public WebXrVrCardboardPermissionTest(Callable<ChromeActivityTestRule> callable)
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrCardboardQrCodeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrCardboardQrCodeTest.java index 249b64fc..28d011a0 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrCardboardQrCodeTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrCardboardQrCodeTest.java
@@ -40,12 +40,12 @@ }) public class WebXrVrCardboardQrCodeTest { @ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = VrCardboardTestRuleUtils.generateDefaultTestRuleParameters(); @Rule public RuleChain mRuleChain; - private ChromeActivityTestRule mTestRule; + private final ChromeActivityTestRule mTestRule; private WebXrVrTestFramework mWebXrVrTestFramework; public WebXrVrCardboardQrCodeTest(Callable<ChromeActivityTestRule> callable) throws Exception {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrCardboardTabTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrCardboardTabTest.java index b7fa4de..0995988 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrCardboardTabTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrCardboardTabTest.java
@@ -38,12 +38,12 @@ }) public class WebXrVrCardboardTabTest { @ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = VrCardboardTestRuleUtils.generateDefaultTestRuleParameters(); @Rule public RuleChain mRuleChain; - private ChromeActivityTestRule mTestRule; + private final ChromeActivityTestRule mTestRule; private WebXrVrTestFramework mWebXrVrTestFramework; public WebXrVrCardboardTabTest(Callable<ChromeActivityTestRule> callable) throws Exception {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrCardboardTransitionTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrCardboardTransitionTest.java index 65839be..72ed2a2 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrCardboardTransitionTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/WebXrVrCardboardTransitionTest.java
@@ -46,12 +46,12 @@ }) public class WebXrVrCardboardTransitionTest { @ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = VrCardboardTestRuleUtils.generateDefaultTestRuleParameters(); @Rule public RuleChain mRuleChain; - private ChromeActivityTestRule mTestRule; + private final ChromeActivityTestRule mTestRule; private WebXrVrTestFramework mWebXrVrTestFramework; public WebXrVrCardboardTransitionTest(Callable<ChromeActivityTestRule> callable)
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/XrTestFramework.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/XrTestFramework.java index 913ebef..72fc19b 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/XrTestFramework.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/XrTestFramework.java
@@ -93,7 +93,7 @@ int FAILED = 2; } - private ChromeActivityTestRule mRule; + private final ChromeActivityTestRule mRule; static final int getShortPollTimeout() { return getPollTimeout(1000);
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/rules/XrActivityRestrictionRule.java b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/rules/XrActivityRestrictionRule.java index 2bf00802..ed59403 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/vr/rules/XrActivityRestrictionRule.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/vr/rules/XrActivityRestrictionRule.java
@@ -17,7 +17,7 @@ * supported Activity types for the test. */ public class XrActivityRestrictionRule implements TestRule { - private @SupportedActivity int mCurrentRestriction; + private final @SupportedActivity int mCurrentRestriction; public XrActivityRestrictionRule(@SupportedActivity int currentRestriction) { mCurrentRestriction = currentRestriction;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/AddToHomescreenAddShortcutTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/AddToHomescreenAddShortcutTest.java index d455dd0..6dedd77 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/AddToHomescreenAddShortcutTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/AddToHomescreenAddShortcutTest.java
@@ -155,7 +155,7 @@ private String mTitle; // The type of of dialog expected to show (at the time of submission). - private @AppType int mExpectedDialogType; + private final @AppType int mExpectedDialogType; TestAddToHomescreenCoordinator( WebContents webContents,
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/AddToHomescreenInstallTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/AddToHomescreenInstallTest.java index 21a795d..fb711a3 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/AddToHomescreenInstallTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/AddToHomescreenInstallTest.java
@@ -68,7 +68,7 @@ private String mTitle; // The type of of dialog expected to show (at the time of submission). - private @AppType int mExpectedDialogType; + private final @AppType int mExpectedDialogType; TestAddToHomescreenCoordinator( WebContents webContents,
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/PwaRestoreBottomSheetIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/PwaRestoreBottomSheetIntegrationTest.java index b029fba..47420d6 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/PwaRestoreBottomSheetIntegrationTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/PwaRestoreBottomSheetIntegrationTest.java
@@ -62,17 +62,17 @@ public final ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule(); - private static @DisplayStage int sFlagValueMissing = DisplayStage.UNKNOWN_STATUS; + private static final @DisplayStage int sFlagValueMissing = DisplayStage.UNKNOWN_STATUS; private static final String ICON_URL1 = "/chrome/test/data/banners/256x256-green.png"; private static final String ICON_URL2 = "/chrome/test/data/banners/256x256-red.png"; - private static String[][] sDefaultApps = { + private static final String[][] sDefaultApps = { {"https://example.com/app1/", "App 1", ICON_URL1}, {"https://example.com/app2/", "App 2", ICON_URL2}, {"https://example.com/app3/", "App 3", ICON_URL1} }; - private static int[] sDefaultLastUsed = {1, 2, 3}; + private static final int[] sDefaultLastUsed = {1, 2, 3}; private static final String TAG = "PwaRestoreIntegrTest";
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/PwaUniversalInstallBottomSheetIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/PwaUniversalInstallBottomSheetIntegrationTest.java index 5230d7b..6b94060 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/PwaUniversalInstallBottomSheetIntegrationTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/PwaUniversalInstallBottomSheetIntegrationTest.java
@@ -76,9 +76,9 @@ private BottomSheetController mBottomSheetController; - private CallbackHelper mOnInstallCallback = new CallbackHelper(); - private CallbackHelper mOnAddShortcutCallback = new CallbackHelper(); - private CallbackHelper mOnOpenAppCallback = new CallbackHelper(); + private final CallbackHelper mOnInstallCallback = new CallbackHelper(); + private final CallbackHelper mOnAddShortcutCallback = new CallbackHelper(); + private final CallbackHelper mOnOpenAppCallback = new CallbackHelper(); @Before public void setUp() throws Exception {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerTest.java index 30ba501..55453d5 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerTest.java
@@ -168,9 +168,9 @@ * the constructor when it has been determined whether an update is needed. */ private class TestWebApkUpdateManager extends WebApkUpdateManager { - private CallbackHelper mWaiter; - private CallbackHelper mCompleteCallback; - private boolean mAcceptDialogIfAppears; + private final CallbackHelper mWaiter; + private final CallbackHelper mCompleteCallback; + private final boolean mAcceptDialogIfAppears; public TestWebApkUpdateManager( Activity activity,
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webauth/AuthenticatorTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webauth/AuthenticatorTest.java index 80a9812..14f6da8 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/webauth/AuthenticatorTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webauth/AuthenticatorTest.java
@@ -58,7 +58,7 @@ /** Waits until the JavaScript code supplies a result. */ private class AuthenticatorUpdateWaiter extends EmptyTabObserver { - private CallbackHelper mCallbackHelper; + private final CallbackHelper mCallbackHelper; private String mStatus; public AuthenticatorUpdateWaiter() {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webauth/Fido2CredentialRequestTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webauth/Fido2CredentialRequestTest.java index f63d381..f3c014d 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/webauth/Fido2CredentialRequestTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webauth/Fido2CredentialRequestTest.java
@@ -170,7 +170,7 @@ * testGetAssertion_with_param as input parameters. */ public static class ErrorTestParams implements ParameterProvider { - private static List<ParameterSet> sErrorTestParams = + private static final List<ParameterSet> sErrorTestParams = Arrays.asList( new ParameterSet() .value( @@ -236,7 +236,7 @@ } public static class SameOriginTestParams implements ParameterProvider { - private static List<ParameterSet> sSameOriginTestParams = + private static final List<ParameterSet> sSameOriginTestParams = Arrays.asList( new ParameterSet().value(true).name("SameOrigin"), new ParameterSet().value(false).name("CrossOrigin")); @@ -327,7 +327,7 @@ } private static class TestAuthenticatorImplJni implements InternalAuthenticator.Natives { - private Fido2ApiTestHelper.AuthenticatorCallback mCallback; + private final Fido2ApiTestHelper.AuthenticatorCallback mCallback; TestAuthenticatorImplJni(Fido2ApiTestHelper.AuthenticatorCallback callback) { mCallback = callback;
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/webshare/WebShareTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/webshare/WebShareTest.java index 0c788ffa3..ebb8ded7 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/webshare/WebShareTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/webshare/WebShareTest.java
@@ -66,7 +66,7 @@ /** Waits until the JavaScript code supplies a result. */ private static class WebShareUpdateWaiter extends EmptyTabObserver { - private CallbackHelper mCallbackHelper; + private final CallbackHelper mCallbackHelper; private String mStatus; public WebShareUpdateWaiter() {
diff --git a/chrome/android/javatests/src/org/chromium/chrome/test/smoke/ChromeTabSwitcherTest.java b/chrome/android/javatests/src/org/chromium/chrome/test/smoke/ChromeTabSwitcherTest.java index b36a740..9b87a87 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/test/smoke/ChromeTabSwitcherTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/test/smoke/ChromeTabSwitcherTest.java
@@ -42,13 +42,14 @@ private static final String TEST_PAGE = "/chrome/android/javatests/src/org/chromium/chrome/test/smoke/test.html"; - private IUi2Locator mTabSwitcherButton = Ui2Locators.withAnyResEntry(R.id.tab_switcher_button); + private final IUi2Locator mTabSwitcherButton = + Ui2Locators.withAnyResEntry(R.id.tab_switcher_button); - private IUi2Locator mHubToolbar = Ui2Locators.withAnyResEntry(R.id.hub_toolbar); + private final IUi2Locator mHubToolbar = Ui2Locators.withAnyResEntry(R.id.hub_toolbar); - private IUi2Locator mTabList = Ui2Locators.withAnyResEntry(R.id.tab_list_recycler_view); + private final IUi2Locator mTabList = Ui2Locators.withAnyResEntry(R.id.tab_list_recycler_view); - private FirstRunNavigator mFirstRunNavigator = new FirstRunNavigator(); + private final FirstRunNavigator mFirstRunNavigator = new FirstRunNavigator(); public static final long TIMEOUT_MS = 20000L; public static final long UI_CHECK_INTERVAL = 1000L;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/ChromeBaseAppCompatActivityUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/ChromeBaseAppCompatActivityUnitTest.java index e8e530e..2390416 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/ChromeBaseAppCompatActivityUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/ChromeBaseAppCompatActivityUnitTest.java
@@ -144,7 +144,6 @@ // Set XR environment. XrUtils.setXrDeviceForTesting(true); ChromeBaseAppCompatActivity.applyOverridesForXr(mContext, config); - XrUtils.resetXrDeviceForTesting(); float xrScaleUpFactor = (float) DisplayUtil.getUiDensityForXr(mContext, MOCK_REAL_DISPLAY_DENSITY_DPI) @@ -182,7 +181,6 @@ // Set XR environment. XrUtils.setXrDeviceForTesting(false); ChromeBaseAppCompatActivity.applyOverridesForXr(mContext, config); - XrUtils.resetXrDeviceForTesting(); assertEquals( "Density dpi should not be scaled up from the real display metric "
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateUnitTest.java index f04b8d2d..9b6cec2 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateUnitTest.java
@@ -132,11 +132,11 @@ @Mock private AppBannerManager.Natives mAppBannerManagerJniMock; @Mock private ReadAloudController mReadAloudController; @Mock private TranslateBridge.Natives mTranslateBridgeJniMock; - private OneshotSupplierImpl<LayoutStateProvider> mLayoutStateProviderSupplier = + private final OneshotSupplierImpl<LayoutStateProvider> mLayoutStateProviderSupplier = new OneshotSupplierImpl<>(); - private ObservableSupplierImpl<BookmarkModel> mBookmarkModelSupplier = + private final ObservableSupplierImpl<BookmarkModel> mBookmarkModelSupplier = new ObservableSupplierImpl<>(); - private ObservableSupplierImpl<ReadAloudController> mReadAloudControllerSupplier = + private final ObservableSupplierImpl<ReadAloudController> mReadAloudControllerSupplier = new ObservableSupplierImpl<>(); private AppMenuPropertiesDelegateImpl mAppMenuPropertiesDelegate;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/app/tabmodel/TabPersistentStoreIntegrationTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/app/tabmodel/TabPersistentStoreIntegrationTest.java index 2216138..3df31b2 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/app/tabmodel/TabPersistentStoreIntegrationTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/app/tabmodel/TabPersistentStoreIntegrationTest.java
@@ -115,7 +115,7 @@ @Mock private ActivityLifecycleDispatcher mActivityLifecycleDispatcher; @Mock private TabGroupSyncService mTabGroupSyncService; - private PausedExecutorService mExecutor = new PausedExecutorService(); + private final PausedExecutorService mExecutor = new PausedExecutorService(); @Before public void setUp() {
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/app/tabmodel/TabbedModeTabModelOrchestratorUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/app/tabmodel/TabbedModeTabModelOrchestratorUnitTest.java index 8eb3aa4..019c9d8 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/app/tabmodel/TabbedModeTabModelOrchestratorUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/app/tabmodel/TabbedModeTabModelOrchestratorUnitTest.java
@@ -72,7 +72,7 @@ @Captor private ArgumentCaptor<Runnable> mRunnableCaptor; @Captor private ArgumentCaptor<Supplier<TabModel>> mSupplierCaptor; - private OneshotSupplierImpl<ProfileProvider> mProfileProviderSupplier = + private final OneshotSupplierImpl<ProfileProvider> mProfileProviderSupplier = new OneshotSupplierImpl<>(); private CipherFactory mCipherFactory;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/autofill/settings/SettingsNavigationHelperTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/autofill/settings/SettingsNavigationHelperTest.java index c9958c45..30a6d64 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/autofill/settings/SettingsNavigationHelperTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/autofill/settings/SettingsNavigationHelperTest.java
@@ -40,7 +40,7 @@ @Mock private SettingsNavigation mMockLauncher; @Mock private Context mMockContext; - private UserActionTester mActionTester = new UserActionTester(); + private final UserActionTester mActionTester = new UserActionTester(); @Before public void setup() {
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/background_task_scheduler/NativeBackgroundTaskTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/background_task_scheduler/NativeBackgroundTaskTest.java index 74c744b..dc20dd3 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/background_task_scheduler/NativeBackgroundTaskTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/background_task_scheduler/NativeBackgroundTaskTest.java
@@ -138,7 +138,7 @@ private static class TaskFinishedCallback implements BackgroundTask.TaskFinishedCallback { private boolean mWasCalled; private boolean mNeedsReschedule; - private CountDownLatch mCallbackLatch; + private final CountDownLatch mCallbackLatch; TaskFinishedCallback() { mCallbackLatch = new CountDownLatch(1); @@ -171,10 +171,10 @@ @StartBeforeNativeResult private int mStartBeforeNativeResult; private boolean mWasOnStartTaskWithNativeCalled; private boolean mNeedsReschedulingAfterStop; - private CountDownLatch mStartWithNativeLatch; + private final CountDownLatch mStartWithNativeLatch; private boolean mWasOnStopTaskWithNativeCalled; private boolean mWasOnStopTaskBeforeNativeLoadedCalled; - private BrowserStartupController mBrowserStartupController; + private final BrowserStartupController mBrowserStartupController; public TestNativeBackgroundTask(BrowserStartupController controller) { super();
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/backup/ChromeBackupAgentTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/backup/ChromeBackupAgentTest.java index d29c4fe3c..18c07c86 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/backup/ChromeBackupAgentTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/backup/ChromeBackupAgentTest.java
@@ -155,7 +155,7 @@ private static final int DEFAULT_TRUE_BOOL_PREF_COUNT = 2; // Mutable map containing boolean preferences names and their values for the fake backup. - private Map<String, Boolean> mNativeBoolPrefBackupValues = + private final Map<String, Boolean> mNativeBoolPrefBackupValues = new BoolPrefBackupSerializer() .getAllowlistedPrefs().stream() .collect(Collectors.toMap(identity(), pref -> false));
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/browserservices/digitalgoods/MockTrustedWebActivityClient.java b/chrome/android/junit/src/org/chromium/chrome/browser/browserservices/digitalgoods/MockTrustedWebActivityClient.java index 5654699..35fe8178 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/browserservices/digitalgoods/MockTrustedWebActivityClient.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/browserservices/digitalgoods/MockTrustedWebActivityClient.java
@@ -25,8 +25,8 @@ * talking to the Digital Goods handler in the TWA shell, providing hardcoded responses. */ public class MockTrustedWebActivityClient { - private TrustedWebActivityClientWrappers.Connection mConnection; - private TrustedWebActivityClient mClient; + private final TrustedWebActivityClientWrappers.Connection mConnection; + private final TrustedWebActivityClient mClient; private Runnable mCallback; private int mVersion = 2;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/browserservices/ui/trustedwebactivity/DisclosureUiPickerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/browserservices/ui/trustedwebactivity/DisclosureUiPickerTest.java index 231b939..291c09e 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/browserservices/ui/trustedwebactivity/DisclosureUiPickerTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/browserservices/ui/trustedwebactivity/DisclosureUiPickerTest.java
@@ -66,7 +66,7 @@ new AutomotiveContextWrapperTestRule(); private DisclosureUiPicker mPicker; - private List<NotificationChannel> mEnabledChannels = new ArrayList<>(); + private final List<NotificationChannel> mEnabledChannels = new ArrayList<>(); @Before public void setUp() {
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/browserservices/ui/view/DisclosureInfobarTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/browserservices/ui/view/DisclosureInfobarTest.java index 1b96d42..dffad3f 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/browserservices/ui/view/DisclosureInfobarTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/browserservices/ui/view/DisclosureInfobarTest.java
@@ -41,7 +41,7 @@ @Mock public SnackbarManager mSnackbarManager; @Mock public TrustedWebActivityModel.DisclosureEventsCallback mCallback; - private TrustedWebActivityModel mModel = new TrustedWebActivityModel(); + private final TrustedWebActivityModel mModel = new TrustedWebActivityModel(); private DisclosureInfobar mInfobar; @Before
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/browserservices/ui/view/DisclosureNotificationTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/browserservices/ui/view/DisclosureNotificationTest.java index 7c231bb..5dcc0bda 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/browserservices/ui/view/DisclosureNotificationTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/browserservices/ui/view/DisclosureNotificationTest.java
@@ -53,7 +53,7 @@ @Mock public TrustedWebActivityModel.DisclosureEventsCallback mCallback; @Mock public NotificationManagerProxy mNotificationManager; - private TrustedWebActivityModel mModel = new TrustedWebActivityModel(); + private final TrustedWebActivityModel mModel = new TrustedWebActivityModel(); private DisclosureNotification mNotification; @Before
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/browserservices/ui/view/DisclosureSnackbarTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/browserservices/ui/view/DisclosureSnackbarTest.java index 9f81a728..d15732d0 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/browserservices/ui/view/DisclosureSnackbarTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/browserservices/ui/view/DisclosureSnackbarTest.java
@@ -39,7 +39,7 @@ @Mock public SnackbarManager mSnackbarManager; @Mock public TrustedWebActivityModel.DisclosureEventsCallback mCallback; - private TrustedWebActivityModel mModel = new TrustedWebActivityModel(); + private final TrustedWebActivityModel mModel = new TrustedWebActivityModel(); @Before public void setUp() {
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/layouts/SceneOverlayTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/layouts/SceneOverlayTest.java index 2973f1bf..2f88632 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/layouts/SceneOverlayTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/layouts/SceneOverlayTest.java
@@ -70,7 +70,7 @@ @Mock private SceneOverlay mOverlay6; @Mock private Layout mLayout; - private DisplayMetrics mDisplayMetrics = new DisplayMetrics(); + private final DisplayMetrics mDisplayMetrics = new DisplayMetrics(); private LayoutManagerImpl mLayoutManager; @Before
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/layouts/StaticLayoutUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/layouts/StaticLayoutUnitTest.java index e9415f0..df4bf5b 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/layouts/StaticLayoutUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/layouts/StaticLayoutUnitTest.java
@@ -107,7 +107,7 @@ private ArgumentCaptor<BrowserControlsStateProvider.Observer> mBrowserControlsStateProviderObserverCaptor; - private UserDataHost mUserDataHost = new UserDataHost(); + private final UserDataHost mUserDataHost = new UserDataHost(); @Mock private TopUiThemeColorProvider mTopUiThemeColorProvider; @Mock private View mTabView;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/ScrollingStripStackerUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/ScrollingStripStackerUnitTest.java index 5cb28668..4c30679 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/ScrollingStripStackerUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/ScrollingStripStackerUnitTest.java
@@ -31,7 +31,7 @@ private static final float FIRST_VIEW_IDEAL_X = -WIDTH - 1; private static final float CACHED_TAB_WIDTH = 30; - private ScrollingStripStacker mTarget = new ScrollingStripStacker(); + private final ScrollingStripStacker mTarget = new ScrollingStripStacker(); @Mock private StripLayoutTab mView1; @Mock private StripLayoutGroupTitle mView2; @Mock private StripLayoutTab mView3;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperTest.java index e93cbd1..4606620 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripLayoutHelperTest.java
@@ -220,7 +220,7 @@ // TODO(crbug.com/369736293): Verify usages and remove duplicate implementations of // `TestTabModel` for tab model. - private TestTabModel mModel = spy(new TestTabModel()); + private final TestTabModel mModel = spy(new TestTabModel()); private StripLayoutHelper mStripLayoutHelper; private boolean mIncognito; private static final String[] TEST_TAB_TITLES = {"Tab 1", "Tab 2", "Tab 3", "", null}; @@ -2605,7 +2605,6 @@ "Tab outline should not show.", mStripLayoutHelper.shouldShowTabOutline(tabs[1])); assertFalse( "Tab outline should not show.", mStripLayoutHelper.shouldShowTabOutline(tabs[2])); - XrUtils.resetXrDeviceForTesting(); } @Test @@ -3189,7 +3188,6 @@ expectedEndWidth, groupTitle.getBottomIndicatorWidth(), 0.5f); - XrUtils.resetXrDeviceForTesting(); } private float calculateExpectedBottomIndicatorWidth( @@ -4988,7 +4986,6 @@ // Act and verify the broadcast is sent. onLongPress_OffTab(); verify(mWindowAndroid, times(1)).sendBroadcast(any()); - XrUtils.resetXrDeviceForTesting(); } @Test
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripStackerUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripStackerUnitTest.java index ced38cef..6e20d311 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripStackerUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/StripStackerUnitTest.java
@@ -35,7 +35,7 @@ private static final float STRIP_WIDTH = 200; private static final float BUTTON_WIDTH = 10; - private StripStacker mTarget = new TestStacker(); + private final StripStacker mTarget = new TestStacker(); @Mock private StripLayoutTab mTab1; @Mock private StripLayoutTab mTab2;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/reorder/ExternalViewDragDropReorderStrategyTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/reorder/ExternalViewDragDropReorderStrategyTest.java index 094b671..e6a5957 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/reorder/ExternalViewDragDropReorderStrategyTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/reorder/ExternalViewDragDropReorderStrategyTest.java
@@ -39,7 +39,6 @@ import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; -import java.util.LinkedHashMap; import java.util.List; /** Tests for {@link ExternalViewDragDropReorderStrategy}. */ @@ -505,7 +504,7 @@ /* selectedTabId= */ mTabForInteractingView.getId(), /* sourceWindowId= */ 1, /* tabGroupId= */ new Token(2L, 2L), - /* tabIdsToUrls= */ new LinkedHashMap<Integer, String>(), + /* tabIdsToUrls= */ new ArrayList<>(), /* tabGroupColor= */ 0, /* tabGroupTitle= */ "Collaboration Group", /* mhtmlTabTitle= */ null,
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/reorder/ReorderStrategyTestBase.java b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/reorder/ReorderStrategyTestBase.java index 66c16d3..512a6a6 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/reorder/ReorderStrategyTestBase.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/reorder/ReorderStrategyTestBase.java
@@ -142,8 +142,9 @@ private static class TestAnimationHost implements AnimationHost { - private CompositorAnimationHandler mHandler = new CompositorAnimationHandler(() -> {}); - private AnimatorSet mRunningAnimations = new AnimatorSet(); + private final CompositorAnimationHandler mHandler = + new CompositorAnimationHandler(() -> {}); + private final AnimatorSet mRunningAnimations = new AnimatorSet(); TestAnimationHost() { CompositorAnimationHandler.setTestingMode(true);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/reorder/TabDragSourceTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/reorder/TabDragSourceTest.java index b0027418..84e58ed9 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/reorder/TabDragSourceTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/overlays/strip/reorder/TabDragSourceTest.java
@@ -158,7 +158,7 @@ private Tab mTabBeingDragged; private Tab mGroupedTab1; private Tab mGroupedTab2; - private ArrayList<Tab> mTabGroupBeingDragged = new ArrayList(); + private final ArrayList<Tab> mTabGroupBeingDragged = new ArrayList(); private TabGroupMetadata mTabGroupMetadata; private static final PointF DRAG_START_POINT = new PointF(250, 0); private static final float TAB_POSITION_X = 200f; @@ -269,7 +269,6 @@ ChromePreferenceKeys.TAB_OR_GROUP_TEARING_MAX_INSTANCES_FAILURE_START_TIME_MS); mSharedPreferencesManager.removeKey( ChromePreferenceKeys.TAB_OR_GROUP_TEARING_MAX_INSTANCES_FAILURE_COUNT); - XrUtils.resetXrDeviceForTesting(); } @Test @@ -1563,7 +1562,7 @@ class DragEventInvoker { - private boolean mIsGroupDrag; + private final boolean mIsGroupDrag; DragEventInvoker(boolean isGroupDrag, boolean isGroupShared) { mIsGroupDrag = isGroupDrag;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/scene_layer/TabStripSceneLayerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/scene_layer/TabStripSceneLayerTest.java index 427ffcf..958e4f0 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/compositor/scene_layer/TabStripSceneLayerTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/compositor/scene_layer/TabStripSceneLayerTest.java
@@ -71,7 +71,7 @@ @Mock private TintedCompositorButton mCloseButton; @Mock private StripLayoutGroupTitle mStripGroupTitle; - private final float mDpToPx = 1.f; + private static final float DP_TO_PX = 1.f; private CompositorButton mModelSelectorButton; private TintedCompositorButton mNewTabButton; @@ -100,7 +100,7 @@ } private void initializeTest() { - mTabStripSceneLayer = new TabStripSceneLayer(mDpToPx); + mTabStripSceneLayer = new TabStripSceneLayer(DP_TO_PX); when(mTabStripSceneMock.init(mTabStripSceneLayer)).thenReturn(1L); mModelSelectorButton = new TintedCompositorButton( @@ -206,8 +206,8 @@ eq(mTabStripSceneLayer), /* resourceId= */ anyInt(), /* backgroundResourceId= */ anyInt(), - /* x= */ eq(mNewTabButton.getDrawX() * mDpToPx), - /* y= */ eq(mNewTabButton.getDrawY() * mDpToPx), + /* x= */ eq(mNewTabButton.getDrawX() * DP_TO_PX), + /* y= */ eq(mNewTabButton.getDrawY() * DP_TO_PX), /* touchTargetOffset= */ anyFloat(), /* visible= */ eq(mNewTabButton.isVisible()), /* isHovered= */ eq(mNewTabButton.isHovered()),
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/ClientManagerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/ClientManagerTest.java index 8ab18d0c..fae17b8 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/ClientManagerTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/ClientManagerTest.java
@@ -87,7 +87,7 @@ private ClientManager mClientManager; private final SessionHolder<?> mSession = new SessionHolder<>(CustomTabsSessionToken.createMockSessionTokenForTesting()); - private int mUid = Process.myUid(); + private final int mUid = Process.myUid(); private EngagementSignalsHandler mEngagementSignalsHandler; private PostMessageServiceConnection mPostMessageServiceConnection;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/CustomTabAppMenuPropertiesDelegateUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/CustomTabAppMenuPropertiesDelegateUnitTest.java index bcf75498..c1fa0d6 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/CustomTabAppMenuPropertiesDelegateUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/CustomTabAppMenuPropertiesDelegateUnitTest.java
@@ -93,9 +93,9 @@ @Mock private Verifier mVerifier; - private ObservableSupplierImpl<BookmarkModel> mBookmarkModelSupplier = + private final ObservableSupplierImpl<BookmarkModel> mBookmarkModelSupplier = new ObservableSupplierImpl<>(); - private Supplier<ReadAloudController> mReadAloudControllerSupplier = + private final Supplier<ReadAloudController> mReadAloudControllerSupplier = new ObservableSupplierImpl<>(); @Before
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/CustomTabCookiesFetcherUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/CustomTabCookiesFetcherUnitTest.java index e071745a..f526d3c6 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/CustomTabCookiesFetcherUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/CustomTabCookiesFetcherUnitTest.java
@@ -41,7 +41,7 @@ @Mock private CookiesFetcher.Natives mCookiesFetcherJni; - private PausedExecutorService mExecutor = new PausedExecutorService(); + private final PausedExecutorService mExecutor = new PausedExecutorService(); @Before public void setUp() {
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/content/EngagementSignalsHandlerUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/content/EngagementSignalsHandlerUnitTest.java index 060557c..87f6287e 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/content/EngagementSignalsHandlerUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/content/EngagementSignalsHandlerUnitTest.java
@@ -50,7 +50,7 @@ @Mock private WebContents mWebContents; private EngagementSignalsHandler mEngagementSignalsHandler; - private ObservableSupplierImpl<Boolean> mCrashUploadPermittedSupplier = + private final ObservableSupplierImpl<Boolean> mCrashUploadPermittedSupplier = new ObservableSupplierImpl<>(); @Before
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/ImmersiveModeControllerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/ImmersiveModeControllerTest.java index 574ca58..744d92d 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/ImmersiveModeControllerTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/ImmersiveModeControllerTest.java
@@ -53,7 +53,7 @@ @Mock public ActivityWindowAndroid mWindowAndroid; @Mock public Window mWindow; @Mock public View mDecorView; - private WindowManager.LayoutParams mLayoutParams = new WindowManager.LayoutParams(); + private final WindowManager.LayoutParams mLayoutParams = new WindowManager.LayoutParams(); public UnownedUserDataHost mWindowUserDataHost = new UnownedUserDataHost(); private ImmersiveModeController mController;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/display_cutout/DisplayCutoutControllerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/display_cutout/DisplayCutoutControllerTest.java index b88e34a9c..4238e25 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/display_cutout/DisplayCutoutControllerTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/display_cutout/DisplayCutoutControllerTest.java
@@ -73,7 +73,7 @@ private WeakReference<Activity> mActivityRef; - private UserDataHost mTabDataHost = new UserDataHost(); + private final UserDataHost mTabDataHost = new UserDataHost(); @Before public void setUp() {
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/dragdrop/ChromeDragAndDropBrowserDelegateUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/dragdrop/ChromeDragAndDropBrowserDelegateUnitTest.java index 09e68a4a..f5f4353 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/dragdrop/ChromeDragAndDropBrowserDelegateUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/dragdrop/ChromeDragAndDropBrowserDelegateUnitTest.java
@@ -55,8 +55,10 @@ import org.chromium.ui.dragdrop.DragDropMetricUtils.UrlIntentSource; import org.chromium.url.JUnitTestGURLs; -import java.util.LinkedHashMap; +import java.util.ArrayList; +import java.util.List; import java.util.Map; +import java.util.Map.Entry; /** Unit test for {@link ChromeDragAndDropBrowserDelegate}. */ @RunWith(BaseRobolectricTestRunner.class) @@ -363,26 +365,24 @@ Token tabGroupId = new Token(2L, 2L); String tabGroupTitle = "Regrouped tabs"; int rootId = 1; - LinkedHashMap<Integer, String> tabIdsToUrls = - new LinkedHashMap<>( - Map.ofEntries( + ArrayList<Entry<Integer, String>> tabIdsToUrls = + new ArrayList<>( + List.of( Map.entry(1, "https://www.amazon.com/"), Map.entry(2, "https://www.youtube.com/"), Map.entry(3, "https://www.facebook.com/"))); - TabGroupMetadata tabGroupMetadata = - new TabGroupMetadata( - rootId, - /* selectedTabId= */ rootId, - /* sourceWindowId= */ TabWindowManager.INVALID_WINDOW_ID, - tabGroupId, - tabIdsToUrls, - /* tabGroupColor= */ 0, - tabGroupTitle, - /* mhtmlTabTitle= */ null, - /* tabGroupCollapsed= */ false, - /* isGroupShared= */ false, - /* isIncognito= */ false); - return tabGroupMetadata; + return new TabGroupMetadata( + rootId, + /* selectedTabId= */ rootId, + /* sourceWindowId= */ TabWindowManager.INVALID_WINDOW_ID, + tabGroupId, + tabIdsToUrls, + /* tabGroupColor= */ 0, + tabGroupTitle, + /* mhtmlTabTitle= */ null, + /* tabGroupCollapsed= */ false, + /* isGroupShared= */ false, + /* isIncognito= */ false); } }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/dragdrop/ChromeTabbedOnDragListenerUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/dragdrop/ChromeTabbedOnDragListenerUnitTest.java index 85b3785..7083ed76 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/dragdrop/ChromeTabbedOnDragListenerUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/dragdrop/ChromeTabbedOnDragListenerUnitTest.java
@@ -59,9 +59,9 @@ @Mock private TabGroupMetadata mTabGroupMetadata; @Mock private DesktopWindowStateManager mDesktopWindowStateManager; private OneshotSupplierImpl<LayoutStateProvider> mLayoutStateProviderSupplierImpl; - private ClipDescription mTabClipDescription = + private final ClipDescription mTabClipDescription = new ClipDescription(null, new String[] {"chrome/tab"}); - private ClipDescription mTabGroupClipDescription = + private final ClipDescription mTabGroupClipDescription = new ClipDescription(null, new String[] {"chrome/tab-group"}); private Context mContext; private ChromeTabbedOnDragListener mChromeTabbedOnDragListener;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/dragdrop/DragAndDropLauncherActivityUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/dragdrop/DragAndDropLauncherActivityUnitTest.java index e8a7c111..356765f6 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/dragdrop/DragAndDropLauncherActivityUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/dragdrop/DragAndDropLauncherActivityUnitTest.java
@@ -37,8 +37,10 @@ import org.chromium.ui.dragdrop.DragDropMetricUtils.UrlIntentSource; import org.chromium.url.JUnitTestGURLs; -import java.util.LinkedHashMap; +import java.util.ArrayList; +import java.util.List; import java.util.Map; +import java.util.Map.Entry; /** Unit tests for {@link DragAndDropLauncherActivity}. */ @RunWith(BaseRobolectricTestRunner.class) @@ -238,9 +240,9 @@ Token tabGroupId = new Token(2L, 2L); String tabGroupTitle = "Regrouped tabs"; int rootId = 1; - LinkedHashMap<Integer, String> tabIdsToUrls = - new LinkedHashMap<>( - Map.ofEntries( + ArrayList<Entry<Integer, String>> tabIdsToUrls = + new ArrayList<>( + List.of( Map.entry(1, "https://www.amazon.com/"), Map.entry(2, "https://www.youtube.com/"), Map.entry(3, "https://www.facebook.com/")));
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/feed/FeedItemDecorationTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/feed/FeedItemDecorationTest.java index 0fce26b9..acabd64 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/feed/FeedItemDecorationTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/feed/FeedItemDecorationTest.java
@@ -63,8 +63,8 @@ @Mock private Drawable mBottomRightRoundedDrawable; @Mock private Drawable mNotRoundedDrawable; private Activity mActivity; - private ArrayList<View> mViewList = new ArrayList<>(); - private ArrayList<Rect> mBoundsList = new ArrayList<>(); + private final ArrayList<View> mViewList = new ArrayList<>(); + private final ArrayList<Rect> mBoundsList = new ArrayList<>(); @Before public void setUp() {
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/feed/FeedSurfaceCoordinatorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/feed/FeedSurfaceCoordinatorTest.java index 52a9999..57b3fd9 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/feed/FeedSurfaceCoordinatorTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/feed/FeedSurfaceCoordinatorTest.java
@@ -124,13 +124,13 @@ } } - private class TestSurfaceDelegate implements FeedSurfaceDelegate { + private static class TestSurfaceDelegate implements FeedSurfaceDelegate { @Override public FeedSurfaceLifecycleManager createStreamLifecycleManager( Activity activity, SurfaceCoordinator coordinator, Profile profile) { - mLifecycleManager = + TestLifecycleManager lifecycleManager = new TestLifecycleManager(activity, (FeedSurfaceCoordinator) coordinator); - return mLifecycleManager; + return lifecycleManager; } @Override @@ -143,7 +143,7 @@ } private static class TestTabModel extends EmptyTabModel { - public ArrayList<TabModelObserver> mObservers = new ArrayList<TabModelObserver>(); + public final ArrayList<TabModelObserver> mObservers = new ArrayList<TabModelObserver>(); @Override public void addObserver(TabModelObserver observer) { @@ -151,15 +151,14 @@ } } - private TestTabModel mTabModel = new TestTabModel(); - private TestTabModel mTabModelIncognito = new TestTabModel(); + private final TestTabModel mTabModel = new TestTabModel(); + private final TestTabModel mTabModelIncognito = new TestTabModel(); private FeedSurfaceCoordinator mCoordinator; private Activity mActivity; private RecyclerView mRecyclerView; @Mock private LinearLayoutManager mLayoutManager; - private TestLifecycleManager mLifecycleManager; // Mocked Direct dependencies. @Mock private SnackbarManager mSnackbarManager;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/feedback/ChromeFeedbackCollectorUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/feedback/ChromeFeedbackCollectorUnitTest.java index e1200bd..b0c12605 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/feedback/ChromeFeedbackCollectorUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/feedback/ChromeFeedbackCollectorUnitTest.java
@@ -201,8 +201,8 @@ private static class MockAsyncFeedbackSource implements AsyncFeedbackSource { private Runnable mCallback; private boolean mDone; - private Map<String, String> mFeedback; - private Pair<String, String> mLogs; + private final Map<String, String> mFeedback; + private final Pair<String, String> mLogs; MockAsyncFeedbackSource(Map<String, String> feedback, Pair<String, String> logs) { mFeedback = feedback;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/fullscreen/BrowserControlsManagerUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/fullscreen/BrowserControlsManagerUnitTest.java index e9596b9..2098f66 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/fullscreen/BrowserControlsManagerUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/fullscreen/BrowserControlsManagerUnitTest.java
@@ -98,7 +98,7 @@ private @Captor ArgumentCaptor<TabModelObserver> mTabModelObserverCaptor; private @Captor ArgumentCaptor<TabObserver> mTabObserverCaptor; - private UserDataHost mUserDataHost = new UserDataHost(); + private final UserDataHost mUserDataHost = new UserDataHost(); private BrowserControlsManager mBrowserControlsManager; private BrowserStateBrowserControlsVisibilityDelegate mControlsDelegate;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/init/AsyncInitTaskRunnerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/init/AsyncInitTaskRunnerTest.java index 2fa45f35..0b2b86a 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/init/AsyncInitTaskRunnerTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/init/AsyncInitTaskRunnerTest.java
@@ -41,11 +41,11 @@ shadows = {ShadowAsyncTask.class}) @LooperMode(LooperMode.Mode.LEGACY) public class AsyncInitTaskRunnerTest { - private LibraryLoader mLoader; - private AsyncInitTaskRunner mRunner; - private CountDownLatch mLatch; + private final LibraryLoader mLoader; + private final AsyncInitTaskRunner mRunner; + private final CountDownLatch mLatch; - private VariationsSeedFetcher mVariationsSeedFetcher; + private final VariationsSeedFetcher mVariationsSeedFetcher; public AsyncInitTaskRunnerTest() { LibraryLoader.getInstance().setLibraryProcessType(LibraryProcessType.PROCESS_BROWSER);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/media/FullscreenVideoPictureInPictureControllerUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/media/FullscreenVideoPictureInPictureControllerUnitTest.java index 2b78f1f..236e2f3 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/media/FullscreenVideoPictureInPictureControllerUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/media/FullscreenVideoPictureInPictureControllerUnitTest.java
@@ -66,7 +66,7 @@ @Mock private PowerManager mPowerManager; // Not a mock, since it's just a container and `final` anyway. - private UserDataHost mUserDataHost = new UserDataHost(); + private final UserDataHost mUserDataHost = new UserDataHost(); private FullscreenVideoPictureInPictureController mController;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationTestBase.java b/chrome/android/junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationTestBase.java index ea73b86..e910bd28 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationTestBase.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/media/ui/MediaNotificationTestBase.java
@@ -83,7 +83,7 @@ } class MockListenerService extends SplitCompatService { - private MockListenerServiceImpl mImpl; + private final MockListenerServiceImpl mImpl; MockListenerService() { super(null);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManagerApi31UnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManagerApi31UnitTest.java index 30087e1b..1a26cb2 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManagerApi31UnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/multiwindow/MultiInstanceManagerApi31UnitTest.java
@@ -103,7 +103,6 @@ import java.util.Arrays; import java.util.Collections; import java.util.HashSet; -import java.util.LinkedHashMap; import java.util.List; import java.util.Map; import java.util.Set; @@ -1093,7 +1092,6 @@ verify(mMultiInstanceManager, times(1)) .moveAndReparentTabToNewWindow( any(), eq(INVALID_WINDOW_ID), eq(true), eq(false), eq(true)); - XrUtils.resetXrDeviceForTesting(); } @Test @@ -1123,7 +1121,6 @@ .moveAndReparentTabToNewWindow( any(), eq(INVALID_WINDOW_ID), eq(true), eq(false), eq(true)); verify(mMultiInstanceManager, times(1)).openNewWindow(any()); - XrUtils.resetXrDeviceForTesting(); } @Test @@ -1195,7 +1192,6 @@ verify(mMultiInstanceManager, times(0)) .moveAndReparentTabToNewWindow( eq(mTab1), eq(INVALID_WINDOW_ID), eq(false), eq(true), eq(true)); - XrUtils.resetXrDeviceForTesting(); } @Test @@ -1245,7 +1241,6 @@ eq(mTab1), eq(NON_EXISTENT_INSTANCE_ID), eq(false), eq(true), eq(false)); verify(mMultiInstanceManager, times(0)) .reparentTabToRunningActivity(any(), eq(mTab1), eq(0)); - XrUtils.resetXrDeviceForTesting(); } @Test @@ -1280,7 +1275,6 @@ verify(mMultiInstanceManager, times(1)) .closeInstance(anyInt(), eq(MultiWindowUtils.INVALID_TASK_ID)); - XrUtils.resetXrDeviceForTesting(); } @Test @@ -1554,9 +1548,9 @@ // Setup. mMultiInstanceManager.mTestBuildInstancesList = true; - LinkedHashMap<Integer, String> tabIdsToUrls = - new LinkedHashMap<>( - Map.ofEntries( + ArrayList<Map.Entry<Integer, String>> tabIdsToUrls = + new ArrayList<>( + List.of( Map.entry(1, "https://www.amazon.com"), Map.entry(2, "https://www.youtube.com"), Map.entry(3, "https://www.facebook.com")));
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/new_tab_url/DseNewTabUrlManagerUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/new_tab_url/DseNewTabUrlManagerUnitTest.java index 6bd9048..3806f683 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/new_tab_url/DseNewTabUrlManagerUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/new_tab_url/DseNewTabUrlManagerUnitTest.java
@@ -47,7 +47,7 @@ private static final String NEW_TAB_URL = JUnitTestGURLs.NTP_URL.getSpec(); @Rule public final MockitoRule mMockitoRule = MockitoJUnit.rule(); @Mock private Profile mProfile; - private ObservableSupplierImpl<Profile> mProfileSupplier = new ObservableSupplierImpl<>(); + private final ObservableSupplierImpl<Profile> mProfileSupplier = new ObservableSupplierImpl<>(); @Mock private RegionalCapabilitiesService mRegionalCapabilities; @Mock private TemplateUrlService mTemplateUrlService; @Mock private TemplateUrl mTemplateUrl;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/ntp/IncognitoNewTabPageUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/ntp/IncognitoNewTabPageUnitTest.java index bd16fa4a..d0ff45f 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/ntp/IncognitoNewTabPageUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/ntp/IncognitoNewTabPageUnitTest.java
@@ -60,7 +60,7 @@ private TestActivity mActivity; private IncognitoNewTabPage mIncognitoNtp; - private ObservableSupplierImpl<EdgeToEdgeController> mEdgeToEdgeSupplier = + private final ObservableSupplierImpl<EdgeToEdgeController> mEdgeToEdgeSupplier = new ObservableSupplierImpl<>(); @Before
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/ntp/RecentTabsPageUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/ntp/RecentTabsPageUnitTest.java index 4c0a836..d58394c 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/ntp/RecentTabsPageUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/ntp/RecentTabsPageUnitTest.java
@@ -51,7 +51,7 @@ @Captor ArgumentCaptor<EdgeToEdgePadAdjuster> mPadAdjusterCaptor; private RecentTabsPage mRecentTabsPage; - private ObservableSupplierImpl<EdgeToEdgeController> mEdgeToEdgeSupplier = + private final ObservableSupplierImpl<EdgeToEdgeController> mEdgeToEdgeSupplier = new ObservableSupplierImpl<>(); @Before
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/offlinepages/BackgroundSchedulerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/offlinepages/BackgroundSchedulerTest.java index fa7668e..2a5ec1d 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/offlinepages/BackgroundSchedulerTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/offlinepages/BackgroundSchedulerTest.java
@@ -39,12 +39,12 @@ @RunWith(BaseRobolectricTestRunner.class) @Config(manifest = Config.NONE) public class BackgroundSchedulerTest { - private TriggerConditions mConditions1 = + private final TriggerConditions mConditions1 = new TriggerConditions( /* requirePowerConnected= */ true, 10 /* battery percentage */, true /* requires unmetered */); - private TriggerConditions mConditions2 = + private final TriggerConditions mConditions2 = new TriggerConditions( /* requirePowerConnected= */ false, 0 /* battery percentage */,
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/offlinepages/OfflineBackgroundTaskTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/offlinepages/OfflineBackgroundTaskTest.java index 6b47884..4dfcc3b 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/offlinepages/OfflineBackgroundTaskTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/offlinepages/OfflineBackgroundTaskTest.java
@@ -67,9 +67,9 @@ @Rule public final MockitoRule mMockitoRule = MockitoJUnit.rule(); private PersistableBundle mTaskExtras; private long mTestTime; - private TriggerConditions mTriggerConditions = + private final TriggerConditions mTriggerConditions = new TriggerConditions(!REQUIRE_POWER, MINIMUM_BATTERY_LEVEL, REQUIRE_UNMETERED); - private DeviceConditions mDeviceConditions = + private final DeviceConditions mDeviceConditions = new DeviceConditions( !POWER_CONNECTED, MINIMUM_BATTERY_LEVEL + 5,
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/offlinepages/indicator/OfflineIndicatorControllerV2UnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/offlinepages/indicator/OfflineIndicatorControllerV2UnitTest.java index 037a3a3..de40139 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/offlinepages/indicator/OfflineIndicatorControllerV2UnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/offlinepages/indicator/OfflineIndicatorControllerV2UnitTest.java
@@ -53,7 +53,7 @@ @Mock private OfflineIndicatorMetricsDelegate mMetricsDelegate; private Context mContext; - private ObservableSupplierImpl<Boolean> mIsUrlBarFocusedSupplier = + private final ObservableSupplierImpl<Boolean> mIsUrlBarFocusedSupplier = new ObservableSupplierImpl<>(); private OfflineIndicatorControllerV2 mController; private long mElapsedTimeMs;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/omaha/OmahaBaseTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/omaha/OmahaBaseTest.java index 1ceb0a81..19b146e 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/omaha/OmahaBaseTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/omaha/OmahaBaseTest.java
@@ -51,8 +51,8 @@ @SuppressWarnings("UnusedMethod") public class OmahaBaseTest { private static class TimestampPair { - public long timestampNextRequest; - public long timestampNextPost; + public final long timestampNextRequest; + public final long timestampNextPost; public TimestampPair(long timestampNextRequest, long timestampNextPost) { this.timestampNextRequest = timestampNextRequest; @@ -68,7 +68,6 @@ private final boolean mIsInForeground; private final boolean mIsInSystemImage; private final ExponentialBackoffScheduler mScheduler; - private MockRequestGenerator mMockGenerator; private int mNumUUIDsGenerated; private long mNextScheduledTimestamp = -1; @@ -91,9 +90,9 @@ @Override protected RequestGenerator createRequestGenerator() { - mMockGenerator = + MockRequestGenerator mockGenerator = new MockRequestGenerator(mIsOnTablet ? DeviceType.TABLET : DeviceType.HANDSET); - return mMockGenerator; + return mockGenerator; } @Override
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/page_info/PageInfoPermissionsControllerUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/page_info/PageInfoPermissionsControllerUnitTest.java index d3cd6a4c7..69f6d03 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/page_info/PageInfoPermissionsControllerUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/page_info/PageInfoPermissionsControllerUnitTest.java
@@ -58,10 +58,10 @@ @Rule(order = -2) public BaseRobolectricTestRule mBaseRule = new BaseRobolectricTestRule(); - private Context mContext; - private String mTestName; - private List<PermissionObject> mPermissions; - private String mExpectedString; + private final Context mContext; + private final String mTestName; + private final List<PermissionObject> mPermissions; + private final String mExpectedString; public PageInfoPermissionsControllerUnitTest( String testName, List<PermissionObject> permissions, String expectedString) {
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/page_info/PermissionParamsListBuilderUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/page_info/PermissionParamsListBuilderUnitTest.java index bc11232..8fca190 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/page_info/PermissionParamsListBuilderUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/page_info/PermissionParamsListBuilderUnitTest.java
@@ -92,7 +92,7 @@ } private static class FakePermissionDelegate implements AndroidPermissionDelegate { - private static List<String> sBlockedPermissions = new ArrayList<String>(); + private static final List<String> sBlockedPermissions = new ArrayList<String>(); private static void blockPermission(String permission) { sBlockedPermissions.add(permission);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/password_manager/PasswordCheckupLauncherTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/password_manager/PasswordCheckupLauncherTest.java index 38a2fb5..82583390 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/password_manager/PasswordCheckupLauncherTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/password_manager/PasswordCheckupLauncherTest.java
@@ -92,13 +92,14 @@ @Mock private PendingIntent mMockPendingIntentForAccountCheckup; - private FakePasswordManagerBackendSupportHelper mFakeBackendSupportHelper = + private final FakePasswordManagerBackendSupportHelper mFakeBackendSupportHelper = new FakePasswordManagerBackendSupportHelper(); private ModalDialogManager mModalDialogManager; - private FakePasswordCheckupClientHelperFactoryImpl mFakePasswordCheckupClientHelperFactory = - new FakePasswordCheckupClientHelperFactoryImpl(); + private final FakePasswordCheckupClientHelperFactoryImpl + mFakePasswordCheckupClientHelperFactory = + new FakePasswordCheckupClientHelperFactoryImpl(); private FakePasswordCheckupClientHelper mFakePasswordCheckupClientHelper;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/reengagement/ReengagementNotificationControllerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/reengagement/ReengagementNotificationControllerTest.java index cec609d..238f0b1 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/reengagement/ReengagementNotificationControllerTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/reengagement/ReengagementNotificationControllerTest.java
@@ -60,7 +60,7 @@ private class TestingReengagementNotificationController extends ReengagementNotificationController { - private DefaultBrowserInfo.DefaultInfo mInfo; + private final DefaultBrowserInfo.DefaultInfo mInfo; TestingReengagementNotificationController(DefaultBrowserInfo.DefaultInfo info) { super(mContext, mTracker, Activity.class);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/searchwidget/SearchActivityClientImplUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/searchwidget/SearchActivityClientImplUnitTest.java index ca523f98..ded4a17 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/searchwidget/SearchActivityClientImplUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/searchwidget/SearchActivityClientImplUnitTest.java
@@ -54,8 +54,8 @@ public @Rule MockitoRule mMockitoRule = MockitoJUnit.rule(); private @Mock ResourceRequestBodyJni mResourceRequestBodyJni; - private Activity mActivity = Robolectric.buildActivity(TestActivity.class).setup().get(); - private SearchActivityClientImpl mClient = + private final Activity mActivity = Robolectric.buildActivity(TestActivity.class).setup().get(); + private final SearchActivityClientImpl mClient = new SearchActivityClientImpl(mActivity, IntentOrigin.CUSTOM_TAB); @Before
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/searchwidget/SearchActivityUtilsUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/searchwidget/SearchActivityUtilsUnitTest.java index e709a2f..566e9b4 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/searchwidget/SearchActivityUtilsUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/searchwidget/SearchActivityUtilsUnitTest.java
@@ -69,8 +69,8 @@ private static final ComponentName COMPONENT_UNTRUSTED = new ComponentName("com.some.package", "com.some.package.test.Activity"); - private Activity mActivity = Robolectric.buildActivity(TestActivity.class).setup().get(); - private SearchActivityClientImpl mClient = + private final Activity mActivity = Robolectric.buildActivity(TestActivity.class).setup().get(); + private final SearchActivityClientImpl mClient = new SearchActivityClientImpl(mActivity, IntentOrigin.CUSTOM_TAB); // UrlFormatter call intercepting mock.
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/share/ShareButtonControllerUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/share/ShareButtonControllerUnitTest.java index fdd9a62..078911e 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/share/ShareButtonControllerUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/share/ShareButtonControllerUnitTest.java
@@ -72,7 +72,7 @@ @Mock private ModalDialogManager mModalDialogManager; @Mock private Tracker mTracker; - private Configuration mConfiguration = new Configuration(); + private final Configuration mConfiguration = new Configuration(); private ShareButtonController mShareButtonController; @Before
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/share/ShareDelegateImplUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/share/ShareDelegateImplUnitTest.java index 8dd92ab..17ea5f0 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/share/ShareDelegateImplUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/share/ShareDelegateImplUnitTest.java
@@ -107,7 +107,7 @@ @Mock private DataProtectionBridge.Natives mDataProtectionBridgeMock; - private ArgumentCaptor<ShareParams> mShareParamsCaptor = + private final ArgumentCaptor<ShareParams> mShareParamsCaptor = ArgumentCaptor.forClass(ShareParams.class); private ShareDelegateImpl mShareDelegate;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/signin/SigninAndHistorySyncActivityLauncherImplTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/signin/SigninAndHistorySyncActivityLauncherImplTest.java index ff6971c..b030b32 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/signin/SigninAndHistorySyncActivityLauncherImplTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/signin/SigninAndHistorySyncActivityLauncherImplTest.java
@@ -86,7 +86,7 @@ HistorySyncConfig.OptInMode.REQUIRED) .build(); - private Context mContext = ContextUtils.getApplicationContext(); + private final Context mContext = ContextUtils.getApplicationContext(); @Mock private IdentityServicesProvider mIdentityProviderMock; @Mock private SigninManager mSigninManagerMock; @Mock private IdentityManager mIdentityManagerMock;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/tab/TabStateExtractorTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/tab/TabStateExtractorTest.java index 16288b9d..bee8b50 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/tab/TabStateExtractorTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/tab/TabStateExtractorTest.java
@@ -44,7 +44,7 @@ @Mock private WebContents mWebContentsMock; @Mock private Origin mMockOrigin; - private ByteBuffer mByteBuffer = ByteBuffer.allocateDirect(1); + private final ByteBuffer mByteBuffer = ByteBuffer.allocateDirect(1); @Before public void setUp() {
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/tab/TabViewManagerUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/tab/TabViewManagerUnitTest.java index fda6fdc..e03294d8 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/tab/TabViewManagerUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/tab/TabViewManagerUnitTest.java
@@ -50,11 +50,11 @@ @Mock private TabViewProvider mTabViewProvider1; @Mock private TabViewProvider mTabViewProvider2; @Mock private View mTabView0; - private final int mViewBackground0 = Color.WHITE; + private static final int VIEW_BACKGROUND0 = Color.WHITE; @Mock private View mTabView1; - private final int mViewBackground1 = Color.BLACK; + private static final int VIEW_BACKGROUND1 = Color.BLACK; @Mock private View mTabView2; - private final int mViewBackground2 = Color.RED; + private static final int VIEW_BACKGROUND2 = Color.RED; private TabViewManagerImpl mTabViewManager; @@ -68,11 +68,11 @@ when(mTabViewProvider2.getTabViewProviderType()) .thenReturn(TabViewManagerImpl.PRIORITIZED_TAB_VIEW_PROVIDER_TYPES[2]); when(mTabViewProvider0.getView()).thenReturn(mTabView0); - when(mTabViewProvider0.getBackgroundColor(any())).thenReturn(mViewBackground0); + when(mTabViewProvider0.getBackgroundColor(any())).thenReturn(VIEW_BACKGROUND0); when(mTabViewProvider1.getView()).thenReturn(mTabView1); - when(mTabViewProvider1.getBackgroundColor(any())).thenReturn(mViewBackground1); + when(mTabViewProvider1.getBackgroundColor(any())).thenReturn(VIEW_BACKGROUND1); when(mTabViewProvider2.getView()).thenReturn(mTabView2); - when(mTabViewProvider2.getBackgroundColor(any())).thenReturn(mViewBackground2); + when(mTabViewProvider2.getBackgroundColor(any())).thenReturn(VIEW_BACKGROUND2); } /** @@ -85,7 +85,7 @@ Assert.assertTrue( "TabViewProvider with the highest priority should be shown", mTabViewManager.isShowing(mTabViewProvider1)); - verify(mTab).setCustomView(mTabView1, mViewBackground1); + verify(mTab).setCustomView(mTabView1, VIEW_BACKGROUND1); verifyTabViewProviderOnShownCalled(mTabViewProvider1, 1); verifyTabViewProviderOnHiddenCalled(mTabViewProvider1, 0); @@ -93,7 +93,7 @@ Assert.assertTrue( "TabViewProvider with the highest priority should be shown", mTabViewManager.isShowing(mTabViewProvider1)); - verify(mTab).setCustomView(mTabView1, mViewBackground1); + verify(mTab).setCustomView(mTabView1, VIEW_BACKGROUND1); verifyTabViewProviderOnShownCalled(mTabViewProvider1, 1); verifyTabViewProviderOnShownCalled(mTabViewProvider2, 0); verifyTabViewProviderOnHiddenCalled(mTabViewProvider1, 0); @@ -103,7 +103,7 @@ Assert.assertTrue( "TabViewProvider with the highest priority should be shown", mTabViewManager.isShowing(mTabViewProvider0)); - verify(mTab).setCustomView(mTabView0, mViewBackground0); + verify(mTab).setCustomView(mTabView0, VIEW_BACKGROUND0); verifyTabViewProviderOnShownCalled(mTabViewProvider0, 1); verifyTabViewProviderOnShownCalled(mTabViewProvider1, 1); verifyTabViewProviderOnShownCalled(mTabViewProvider2, 0); @@ -129,7 +129,7 @@ Assert.assertTrue( "TabViewProvider with the highest priority should be shown", mTabViewManager.isShowing(mTabViewProvider1)); - verify(mTab).setCustomView(mTabView1, mViewBackground1); + verify(mTab).setCustomView(mTabView1, VIEW_BACKGROUND1); verifyTabViewProviderOnShownCalled(mTabViewProvider0, 1); verifyTabViewProviderOnShownCalled(mTabViewProvider1, 1); verifyTabViewProviderOnShownCalled(mTabViewProvider2, 0); @@ -141,7 +141,7 @@ Assert.assertTrue( "TabViewProvider with the highest priority should be shown", mTabViewManager.isShowing(mTabViewProvider1)); - verify(mTab).setCustomView(mTabView1, mViewBackground1); + verify(mTab).setCustomView(mTabView1, VIEW_BACKGROUND1); verifyTabViewProviderOnShownCalled(mTabViewProvider1, 1); verifyTabViewProviderOnShownCalled(mTabViewProvider2, 0); verifyTabViewProviderOnHiddenCalled(mTabViewProvider1, 0);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/toolbar/LocationBarModelUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/toolbar/LocationBarModelUnitTest.java index 39da0f4..5675736 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/toolbar/LocationBarModelUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/toolbar/LocationBarModelUnitTest.java
@@ -83,7 +83,7 @@ url -> url.getSpec(), OFFLINE_STATUS); - private GURL mExampleGurl = new GURL("http://www.example.com/"); + private final GURL mExampleGurl = new GURL("http://www.example.com/"); @Before public void setUp() {
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/toolbar/ToolbarTabControllerImplTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/toolbar/ToolbarTabControllerImplTest.java index d1feffb..73c4a92 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/toolbar/ToolbarTabControllerImplTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/toolbar/ToolbarTabControllerImplTest.java
@@ -50,7 +50,7 @@ @Config(manifest = Config.NONE) public class ToolbarTabControllerImplTest { private static class LoadUrlParamsMatcher implements ArgumentMatcher<LoadUrlParams> { - LoadUrlParams mLoadUrlParams; + final LoadUrlParams mLoadUrlParams; public LoadUrlParamsMatcher(LoadUrlParams loadUrlParams) { mLoadUrlParams = loadUrlParams;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/ui/AppLaunchDrawBlockerUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/ui/AppLaunchDrawBlockerUnitTest.java index bb6d0a9..f1595c2 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/ui/AppLaunchDrawBlockerUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/ui/AppLaunchDrawBlockerUnitTest.java
@@ -76,7 +76,7 @@ @Mock private Supplier<Boolean> mIsTabletSupplier; @Mock private Supplier<Boolean> mShouldShowTabSwitcherOnStartSupplier; - private ObservableSupplierImpl<Profile> mProfileSupplier = new ObservableSupplierImpl<>(); + private final ObservableSupplierImpl<Profile> mProfileSupplier = new ObservableSupplierImpl<>(); @Mock private IncognitoRestoreAppLaunchDrawBlockerFactory
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/ui/IncognitoRestoreAppLaunchDrawBlockerUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/ui/IncognitoRestoreAppLaunchDrawBlockerUnitTest.java index 6146af9f..6b63401 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/ui/IncognitoRestoreAppLaunchDrawBlockerUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/ui/IncognitoRestoreAppLaunchDrawBlockerUnitTest.java
@@ -64,9 +64,9 @@ @Captor private ArgumentCaptor<TabModelSelectorObserver> mTabModelSelectorObserverArgumentCaptor; - private ObservableSupplierImpl<TabModelSelector> mTabModelSelectorObservableSupplier = + private final ObservableSupplierImpl<TabModelSelector> mTabModelSelectorObservableSupplier = new ObservableSupplierImpl<>(); - private Supplier<Intent> mIntentSupplier = + private final Supplier<Intent> mIntentSupplier = new Supplier<Intent>() { @Nullable @Override @@ -74,7 +74,7 @@ return mIntentMock; } }; - private Supplier<Boolean> mShouldIgnoreIntentSupplier = + private final Supplier<Boolean> mShouldIgnoreIntentSupplier = new Supplier<Boolean>() { @Nullable @Override
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebApkShareTargetUtilTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebApkShareTargetUtilTest.java index c4c3f8f..2942482b 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebApkShareTargetUtilTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebApkShareTargetUtilTest.java
@@ -30,7 +30,7 @@ public class WebApkShareTargetUtilTest { /** Builder class for {@link WebApkShareTarget} */ public static class ShareTargetBuilder { - private String mAction; + private final String mAction; private @ShareTarget.RequestMethod String mMethod; private @ShareTarget.EncodingType String mEncodingType; private String mParamTitle;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerUnitTest.java index 66bf9d217..a9bb3012 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebApkUpdateManagerUnitTest.java
@@ -225,9 +225,9 @@ * Whether App Identity updates should be enabled. If either of those is true when the tests * run, all App Identity update dialogs will be pre-approved (without showing). */ - private boolean mNameUpdatesEnabled; + private final boolean mNameUpdatesEnabled; - private boolean mIconUpdatesEnabled; + private final boolean mIconUpdatesEnabled; public TestWebApkUpdateManager(Activity activity) { this(activity, /* nameUpdatesEnabled= */ false, /* iconUpdatesEnabled= */ false); @@ -391,7 +391,7 @@ private static class FakeDefaultBackgroundColorResource extends Resources { private static final int ID = 10; - private int mColorValue; + private final int mColorValue; public FakeDefaultBackgroundColorResource(int colorValue) { super(new AssetManager(), null, null);
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebappRegistryTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebappRegistryTest.java index 1169b189..1271470 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebappRegistryTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/webapps/WebappRegistryTest.java
@@ -73,7 +73,7 @@ private static class FetchStorageCallback implements WebappRegistry.FetchWebappDataStorageCallback { - BrowserServicesIntentDataProvider mIntentDataProvider; + final BrowserServicesIntentDataProvider mIntentDataProvider; boolean mCallbackCalled; FetchStorageCallback(BrowserServicesIntentDataProvider intentDataProvider) {
diff --git a/chrome/android/modules/readaloud/public/java/src/org/chromium/chrome/modules/readaloud/contentjs/Highlighter.java b/chrome/android/modules/readaloud/public/java/src/org/chromium/chrome/modules/readaloud/contentjs/Highlighter.java index 5c02a5f..9a7a0f13 100644 --- a/chrome/android/modules/readaloud/public/java/src/org/chromium/chrome/modules/readaloud/contentjs/Highlighter.java +++ b/chrome/android/modules/readaloud/public/java/src/org/chromium/chrome/modules/readaloud/contentjs/Highlighter.java
@@ -44,7 +44,7 @@ public static class Config { private @Mode int mMode = Mode.TEXT_HIGHLIGHTING_MODE_WORD; // Hex values in format: RRGGBBAA - private final String mHighlightForegroundColorHex = "#000000FF"; + private static final String HIGHLIGHT_FOREGROUND_COLOR_HEX = "#000000FF"; private final String mHighlightBackgroundColorHex; public Config(Context context) { @@ -72,7 +72,7 @@ } public String getHighlightForegroundColorHex() { - return mHighlightForegroundColorHex; + return HIGHLIGHT_FOREGROUND_COLOR_HEX; } }
diff --git a/chrome/android/webapk/libs/client/junit/src/org/chromium/webapk/lib/client/WebApkIdentityServiceClientTest.java b/chrome/android/webapk/libs/client/junit/src/org/chromium/webapk/lib/client/WebApkIdentityServiceClientTest.java index 0192eef..a5115e2 100644 --- a/chrome/android/webapk/libs/client/junit/src/org/chromium/webapk/lib/client/WebApkIdentityServiceClientTest.java +++ b/chrome/android/webapk/libs/client/junit/src/org/chromium/webapk/lib/client/WebApkIdentityServiceClientTest.java
@@ -53,7 +53,7 @@ /** Mocks the Identity service of a WebAPK. */ private static class TestIdentityService extends IIdentityService.Stub { - private String mRuntimeHost; + private final String mRuntimeHost; public TestIdentityService(String runtimeHost) { mRuntimeHost = runtimeHost;
diff --git a/chrome/android/webapk/libs/client/junit/src/org/chromium/webapk/lib/client/WebApkServiceConnectionManagerTest.java b/chrome/android/webapk/libs/client/junit/src/org/chromium/webapk/lib/client/WebApkServiceConnectionManagerTest.java index 015c1502..03c3809 100644 --- a/chrome/android/webapk/libs/client/junit/src/org/chromium/webapk/lib/client/WebApkServiceConnectionManagerTest.java +++ b/chrome/android/webapk/libs/client/junit/src/org/chromium/webapk/lib/client/WebApkServiceConnectionManagerTest.java
@@ -39,7 +39,7 @@ @LooperMode(LooperMode.Mode.LEGACY) public class WebApkServiceConnectionManagerTest { private static class TestExecutor implements Executor { - private LinkedList<Runnable> mPendingTasks = new LinkedList<>(); + private final LinkedList<Runnable> mPendingTasks = new LinkedList<>(); @Override public void execute(Runnable command) { @@ -58,7 +58,7 @@ private static final String CATEGORY_WEBAPK_SERVICE_API = "android.intent.category.WEBAPK_API"; private ShadowApplication mShadowApplication; - private TestExecutor mTestExecutor = new TestExecutor(); + private final TestExecutor mTestExecutor = new TestExecutor(); private WebApkServiceConnectionManager mConnectionManager; private static class TestCallback implements WebApkServiceConnectionManager.ConnectionCallback { @@ -181,9 +181,9 @@ * Context#unbindService()} calls. */ private static class BindUnbindRecordingContext extends ContextWrapper { - private String mRecordPackage; - private ArrayList<Boolean> mStartStopServiceSequence = new ArrayList<>(); - private HashSet<ServiceConnection> mTrackedConnections = new HashSet<>(); + private final String mRecordPackage; + private final ArrayList<Boolean> mStartStopServiceSequence = new ArrayList<>(); + private final HashSet<ServiceConnection> mTrackedConnections = new HashSet<>(); public BindUnbindRecordingContext(String recordPackage) { super(null);
diff --git a/chrome/android/webapk/libs/client/src/org/chromium/webapk/lib/client/WebApkIdentityServiceClient.java b/chrome/android/webapk/libs/client/src/org/chromium/webapk/lib/client/WebApkIdentityServiceClient.java index 34500240..d741a64 100644 --- a/chrome/android/webapk/libs/client/src/org/chromium/webapk/lib/client/WebApkIdentityServiceClient.java +++ b/chrome/android/webapk/libs/client/src/org/chromium/webapk/lib/client/WebApkIdentityServiceClient.java
@@ -3,7 +3,6 @@ // found in the LICENSE file. package org.chromium.webapk.lib.client; -import org.chromium.build.annotations.NullMarked; import android.content.Context; import android.content.pm.ApplicationInfo; @@ -15,9 +14,10 @@ import android.util.Log; import org.chromium.base.task.TaskTraits; +import org.chromium.build.annotations.NullMarked; +import org.chromium.build.annotations.Nullable; import org.chromium.components.webapk.lib.common.WebApkMetaDataKeys; import org.chromium.webapk.lib.common.identity_service.IIdentityService; -import org.chromium.build.annotations.Nullable; /** * Provides APIs for browsers to communicate with WebAPK Identity services. Each WebAPK has its own @@ -53,7 +53,7 @@ private static @Nullable WebApkIdentityServiceClient sInstance; /** Manages connections between the browser application and WebAPK Identity services. */ - private WebApkServiceConnectionManager mConnectionManager; + private final WebApkServiceConnectionManager mConnectionManager; public static WebApkIdentityServiceClient getInstance(@TaskTraits int uiThreadTaskTraits) { if (sInstance == null) {
diff --git a/chrome/android/webapk/libs/client/src/org/chromium/webapk/lib/client/WebApkServiceConnectionManager.java b/chrome/android/webapk/libs/client/src/org/chromium/webapk/lib/client/WebApkServiceConnectionManager.java index 8c3c503..3f5f487 100644 --- a/chrome/android/webapk/libs/client/src/org/chromium/webapk/lib/client/WebApkServiceConnectionManager.java +++ b/chrome/android/webapk/libs/client/src/org/chromium/webapk/lib/client/WebApkServiceConnectionManager.java
@@ -3,7 +3,6 @@ // found in the LICENSE file. package org.chromium.webapk.lib.client; -import org.chromium.build.annotations.NullMarked; import android.annotation.SuppressLint; import android.content.ComponentName; @@ -17,11 +16,12 @@ import org.chromium.base.task.PostTask; import org.chromium.base.task.TaskRunner; import org.chromium.base.task.TaskTraits; +import org.chromium.build.annotations.NullMarked; +import org.chromium.build.annotations.Nullable; import java.util.ArrayList; import java.util.HashMap; import java.util.concurrent.Callable; -import org.chromium.build.annotations.Nullable; /** * Each WebAPK has several services. This class manages static global connections between the Chrome @@ -42,10 +42,10 @@ /** Managed connection to WebAPK service. */ private static class Connection implements ServiceConnection { /** The connection manager who owns this connection. */ - private WebApkServiceConnectionManager mConnectionManager; + private final WebApkServiceConnectionManager mConnectionManager; /** Callbacks to call once the connection is established. */ - private ArrayList<ConnectionCallback> mCallbacks = new ArrayList<>(); + private final ArrayList<ConnectionCallback> mCallbacks = new ArrayList<>(); /** WebAPK IBinder interface. */ private @Nullable IBinder mBinder; @@ -86,12 +86,12 @@ private static final String TAG = "WebApkService"; /** The category of the service to connect to. */ - private @Nullable String mCategory; + private final @Nullable String mCategory; /** The action of the service to connect to. */ - private String mAction; + private final String mAction; - private @TaskTraits int mUiThreadTaskTraits; + private final @TaskTraits int mUiThreadTaskTraits; private @Nullable TaskRunner mTaskRunner; @@ -99,7 +99,7 @@ private int mNumPendingPostedTasks; /** Mapping of WebAPK package to WebAPK service connection. */ - private HashMap<String, Connection> mConnections = new HashMap<>(); + private final HashMap<String, Connection> mConnections = new HashMap<>(); public WebApkServiceConnectionManager( @TaskTraits int uiThreadTaskTraits, @Nullable String category, String action) {
diff --git a/chrome/android/webapk/shell_apk/current_version/current_version.gni b/chrome/android/webapk/shell_apk/current_version/current_version.gni index a4ff77b..09f24b9 100644 --- a/chrome/android/webapk/shell_apk/current_version/current_version.gni +++ b/chrome/android/webapk/shell_apk/current_version/current_version.gni
@@ -12,4 +12,4 @@ # //chrome/android/webapk/shell_apk:webapk is changed. This includes # Java files, Android resource files and AndroidManifest.xml. Does not affect # Chrome.apk -current_shell_apk_version = 183 +current_shell_apk_version = 184
diff --git a/chrome/android/webapk/shell_apk/javatests/src/org/chromium/webapk/shell_apk/DexLoaderTest.java b/chrome/android/webapk/shell_apk/javatests/src/org/chromium/webapk/shell_apk/DexLoaderTest.java index 0b2e35d..ca20aff0 100644 --- a/chrome/android/webapk/shell_apk/javatests/src/org/chromium/webapk/shell_apk/DexLoaderTest.java +++ b/chrome/android/webapk/shell_apk/javatests/src/org/chromium/webapk/shell_apk/DexLoaderTest.java
@@ -48,8 +48,8 @@ /** Monitors read files and modified files in the directory passed to the constructor. */ private static class FileMonitor extends FileObserver { - public ArrayList<String> mReadPaths = new ArrayList<String>(); - public ArrayList<String> mModifiedPaths = new ArrayList<String>(); + public final ArrayList<String> mReadPaths = new ArrayList<String>(); + public final ArrayList<String> mModifiedPaths = new ArrayList<String>(); public FileMonitor(File directory) { super(directory.getPath());
diff --git a/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/HostBrowserUtilsTest.java b/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/HostBrowserUtilsTest.java index 6b4ff5e1..bac5786 100644 --- a/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/HostBrowserUtilsTest.java +++ b/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/HostBrowserUtilsTest.java
@@ -60,10 +60,10 @@ BROWSERS_NOT_SUPPORTING_WEBAPKS); private Context mContext; - private TestBrowserInstaller mBrowserInstaller = new TestBrowserInstaller(); + private final TestBrowserInstaller mBrowserInstaller = new TestBrowserInstaller(); // Whether we are testing with bound WebAPKs. - private boolean mIsBoundWebApk; + private final boolean mIsBoundWebApk; @Parameters public static Collection<Object[]> data() {
diff --git a/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/MainActivityTest.java b/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/MainActivityTest.java index f94565f..96e829c 100644 --- a/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/MainActivityTest.java +++ b/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/MainActivityTest.java
@@ -37,7 +37,7 @@ private static final String BROWSER_PACKAGE_NAME = "com.android.chrome"; private PackageManager mPackageManager; - private TestBrowserInstaller mBrowserInstaller = new TestBrowserInstaller(); + private final TestBrowserInstaller mBrowserInstaller = new TestBrowserInstaller(); @Before public void setUp() {
diff --git a/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/h2o/LaunchTest.java b/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/h2o/LaunchTest.java index 95c8775..671e7cea 100644 --- a/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/h2o/LaunchTest.java +++ b/chrome/android/webapk/shell_apk/junit/src/org/chromium/webapk/shell_apk/h2o/LaunchTest.java
@@ -72,7 +72,7 @@ private PackageManager mPackageManager; private ShadowPackageManager mShadowPackageManager; - private TestBrowserInstaller mTestBrowserInstaller = new TestBrowserInstaller(); + private final TestBrowserInstaller mTestBrowserInstaller = new TestBrowserInstaller(); @Before public void setUp() {
diff --git a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/HostBrowserLauncherParams.java b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/HostBrowserLauncherParams.java index 1f65f82..bc46784 100644 --- a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/HostBrowserLauncherParams.java +++ b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/HostBrowserLauncherParams.java
@@ -28,16 +28,16 @@ /** Convenience wrapper for parameters to {@link HostBrowserLauncher} methods. */ @NullMarked public class HostBrowserLauncherParams { - private boolean mIsArcChromeOs; - private PackageNameAndComponentName mHostBrowserPackageNameAndComponentName; - private boolean mDialogShown; - private Intent mOriginalIntent; - private String mStartUrl; - private int mSource; - private boolean mForceNavigation; - private long mLaunchTimeMs; - private long mSplashShownTimeMs; - private @Nullable String mSelectedShareTargetActivityClassName; + private final boolean mIsArcChromeOs; + private final PackageNameAndComponentName mHostBrowserPackageNameAndComponentName; + private final boolean mDialogShown; + private final Intent mOriginalIntent; + private final String mStartUrl; + private final int mSource; + private final boolean mForceNavigation; + private final long mLaunchTimeMs; + private final long mSplashShownTimeMs; + private final @Nullable String mSelectedShareTargetActivityClassName; /** * Constructs a HostBrowserLauncherParams object from the passed in Intent and from <meta-data>
diff --git a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/HostBrowserUtils.java b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/HostBrowserUtils.java index e69c572..570d37c 100644 --- a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/HostBrowserUtils.java +++ b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/HostBrowserUtils.java
@@ -35,7 +35,7 @@ "com.google.android.apps.chrome.webapps.WebappManager.ACTION_START_WEBAPP"; /** The package names of the browsers that support WebAPK notification delegation. */ - private static Set<String> sBrowsersSupportingNotificationDelegation = + private static final Set<String> sBrowsersSupportingNotificationDelegation = new HashSet<String>( Arrays.asList( "com.google.android.apps.chrome", @@ -73,8 +73,8 @@ * unbound or effectively unbound. */ public static class PackageNameAndComponentName { - private String mPackageName; - private @Nullable ComponentName mComponentName; + private final String mPackageName; + private final @Nullable ComponentName mComponentName; public PackageNameAndComponentName(String packageName) { mPackageName = packageName;
diff --git a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/LaunchHostBrowserSelector.java b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/LaunchHostBrowserSelector.java index 1d638d0..ee02ea9 100644 --- a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/LaunchHostBrowserSelector.java +++ b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/LaunchHostBrowserSelector.java
@@ -25,10 +25,10 @@ private static final String LAST_RESORT_HOST_BROWSER_APPLICATION_NAME = "Google Chrome"; private static final String TAG = "cr_LaunchHostBrowserSelector"; - private Context mContext; + private final Context mContext; /** Parent activity for any dialogs. */ - private Activity mParentActivity; + private final Activity mParentActivity; /** * Called once {@link #selectHostBrowser()} has selected the host browser either via a shared
diff --git a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/WebApkServiceImplWrapper.java b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/WebApkServiceImplWrapper.java index 9405c906..8eac3fa 100644 --- a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/WebApkServiceImplWrapper.java +++ b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/WebApkServiceImplWrapper.java
@@ -52,9 +52,9 @@ /** * The {@link org.chromium.webapk.lib.runtime_library.WebApkServiceImpl} that this class wraps. */ - private IBinder mIBinderDelegate; + private final IBinder mIBinderDelegate; - private Context mContext; + private final Context mContext; public WebApkServiceImplWrapper(Context context, IBinder delegate, int hostBrowserUid) { mContext = context;
diff --git a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/SplashContentProvider.java b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/SplashContentProvider.java index bd6af4d..ef3d5863 100644 --- a/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/SplashContentProvider.java +++ b/chrome/android/webapk/shell_apk/src/org/chromium/webapk/shell_apk/h2o/SplashContentProvider.java
@@ -36,8 +36,8 @@ /** Time in milliseconds after constructing the object to clear the cached data. */ private static final int CLEAR_CACHED_DATA_INTERVAL_MS = 10000; - private byte[] mCachedData; - private Handler mHandler; + private final byte[] mCachedData; + private final Handler mHandler; public ExpiringData(byte[] cachedData, Runnable expiryTask) { mCachedData = cachedData; @@ -64,7 +64,7 @@ /** The encoding type of the last image vended by the ContentProvider. */ private static Bitmap.@Nullable CompressFormat sEncodingFormat; - private static AtomicReference<ExpiringData> sCachedSplashBytes = new AtomicReference<>(); + private static final AtomicReference<ExpiringData> sCachedSplashBytes = new AtomicReference<>(); /** The URI handled by this content provider. */ private String mContentProviderUri;
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index 693c0c1f3..97a8add 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd
@@ -8846,6 +8846,12 @@ Reading list </message> </if> + <message name="IDS_READ_LATER_EXPAND_BUTTON_ARIA_LABEL" desc="Aria label for the Read later list expand button."> + Expand <ph name="HEADER">$1<ex>Unread</ex></ph> + </message> + <message name="IDS_READ_LATER_COLLAPSE_BUTTON_ARIA_LABEL" desc="Aria label for the Read later list collapse button."> + Collapse <ph name="HEADER">$1<ex>Unread</ex></ph> + </message> <message name="IDS_READ_LATER_MENU_UNREAD_HEADER" desc="Header for section of unread Read later items."> Unread </message>
diff --git a/chrome/app/generated_resources_grd/IDS_READ_LATER_COLLAPSE_BUTTON_ARIA_LABEL.png.sha1 b/chrome/app/generated_resources_grd/IDS_READ_LATER_COLLAPSE_BUTTON_ARIA_LABEL.png.sha1 new file mode 100644 index 0000000..d75a99d0 --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_READ_LATER_COLLAPSE_BUTTON_ARIA_LABEL.png.sha1
@@ -0,0 +1 @@ +aab4004110b329e6ae85a8d87797a8447b9ce69c \ No newline at end of file
diff --git a/chrome/app/generated_resources_grd/IDS_READ_LATER_EXPAND_BUTTON_ARIA_LABEL.png.sha1 b/chrome/app/generated_resources_grd/IDS_READ_LATER_EXPAND_BUTTON_ARIA_LABEL.png.sha1 new file mode 100644 index 0000000..bd8f3ae7 --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_READ_LATER_EXPAND_BUTTON_ARIA_LABEL.png.sha1
@@ -0,0 +1 @@ +e85400554be7ad9d23863e5b60cb3ff68b9a3d77 \ No newline at end of file
diff --git a/chrome/browser/BUILD.gn b/chrome/browser/BUILD.gn index 6e2efd2..e44a7794 100644 --- a/chrome/browser/BUILD.gn +++ b/chrome/browser/BUILD.gn
@@ -2042,6 +2042,7 @@ "//chrome/browser/ui/prefs:impl", "//chrome/browser/ui/safety_hub", "//chrome/browser/ui/safety_hub:impl", + "//chrome/browser/ui/search_engines", "//chrome/browser/ui/startup:startup_tab", "//chrome/browser/ui/tab_contents", "//chrome/browser/ui/tab_contents:impl", @@ -4307,7 +4308,6 @@ "//chrome/browser/apps/link_capturing", "//chrome/browser/contextual_cueing", "//chrome/browser/contextual_cueing:impl", - "//chrome/browser/enterprise/incognito", "//chrome/browser/error_reporting", "//chrome/browser/feedback:feedback_enum", "//chrome/browser/hid", @@ -7450,6 +7450,7 @@ "//extensions/browser", ] deps += [ + "//chrome/browser/enterprise/incognito", "//chrome/browser/extensions/api/browsing_data", # This dependency should be removed when //chrome/browser/notifications
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 1fe8357..fac4216 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -2480,18 +2480,32 @@ {"mode", features::kPredictionTypeTimeBased}, {"latency", features::kPredictionTypeDefaultTime}}; const FeatureEntry::FeatureParam - kResamplingScrollEventsPredictionFramesBasedEnabled[] = { + kResamplingScrollEventsPredictionFramesBasedEnabledV1[] = { {"mode", features::kPredictionTypeFramesBased}, - {"latency", features::kPredictionTypeDefaultFramesRatio}}; + {"latency", features::kPredictionTypeDefaultFramesVariation1}}; +const FeatureEntry::FeatureParam + kResamplingScrollEventsPredictionFramesBasedEnabledV2[] = { + {"mode", features::kPredictionTypeFramesBased}, + {"latency", features::kPredictionTypeDefaultFramesVariation2}}; +const FeatureEntry::FeatureParam + kResamplingScrollEventsPredictionFramesBasedEnabledV3[] = { + {"mode", features::kPredictionTypeFramesBased}, + {"latency", features::kPredictionTypeDefaultFramesVariation3}}; const FeatureEntry::FeatureVariation kResamplingScrollEventsExperimentalPredictionVariations[] = { {features::kPredictionTypeTimeBased, kResamplingScrollEventsPredictionTimeBasedEnabled, std::size(kResamplingScrollEventsPredictionTimeBasedEnabled), nullptr}, - {features::kPredictionTypeFramesBased, - kResamplingScrollEventsPredictionFramesBasedEnabled, - std::size(kResamplingScrollEventsPredictionFramesBasedEnabled), - nullptr}}; + {"frames 0.25", kResamplingScrollEventsPredictionFramesBasedEnabledV1, + std::size(kResamplingScrollEventsPredictionFramesBasedEnabledV1), + nullptr}, + {"frames 0.375", kResamplingScrollEventsPredictionFramesBasedEnabledV2, + std::size(kResamplingScrollEventsPredictionFramesBasedEnabledV2), + nullptr}, + {"frames 0.5", kResamplingScrollEventsPredictionFramesBasedEnabledV3, + std::size(kResamplingScrollEventsPredictionFramesBasedEnabledV3), + nullptr}, +}; const FeatureEntry::FeatureParam kShowWarningsForSuspiciousNotificationsScoreThreshold70[] = {
diff --git a/chrome/browser/actor/actor_coordinator.cc b/chrome/browser/actor/actor_coordinator.cc index 1affef8..1917679e 100644 --- a/chrome/browser/actor/actor_coordinator.cc +++ b/chrome/browser/actor/actor_coordinator.cc
@@ -7,7 +7,6 @@ #include <cstddef> #include <utility> -#include "actor_coordinator.h" #include "base/check.h" #include "base/check_deref.h" #include "base/feature_list.h" @@ -21,6 +20,8 @@ #include "chrome/browser/actor/tools/tool_invocation.h" #include "chrome/browser/ui/browser_navigator.h" #include "chrome/browser/ui/browser_navigator_params.h" +#include "chrome/common/actor.mojom.h" +#include "chrome/common/actor/action_result.h" #include "chrome/common/chrome_features.h" #include "components/optimization_guide/proto/features/actions_data.pb.h" #include "components/tabs/public/tab_interface.h" @@ -45,9 +46,9 @@ } void PostTaskForActCallback(ActorCoordinator::ActionResultCallback callback, - bool success) { + mojom::ActionResultPtr result) { base::SequencedTaskRunner::GetCurrentDefault()->PostTask( - FROM_HERE, base::BindOnce(std::move(callback), success)); + FROM_HERE, base::BindOnce(std::move(callback), std::move(result))); } } // namespace @@ -159,7 +160,8 @@ } if (task_state_->current_action) { - CompleteAction(false); + CompleteAction( + MakeResult(mojom::ActionResultCode::kTaskWentAway, "Task was stopped")); } task_state_.reset(); @@ -186,21 +188,30 @@ DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); // StartTask must have been called to initialize the tab for action. + // NOTE: Improve this API by moving Act() to Task:: instead of permitting + // actions without a Task. if (!task_state_) { VLOG(1) << "Unable to perform action: task hasn't been started"; - PostTaskForActCallback(std::move(callback), /*success=*/false); + PostTaskForActCallback(std::move(callback), + MakeResult(mojom::ActionResultCode::kError, + "Task hasn't been started")); return; } if (!task_state_->HasTab()) { VLOG(1) << "Unable to perform action: tab has been destroyed"; - PostTaskForActCallback(std::move(callback), /*success=*/false); + PostTaskForActCallback(std::move(callback), + MakeResult(mojom::ActionResultCode::kTabWentAway)); return; } + // NOTE: Improve this API by queuing the action instead. if (task_state_->HasAction()) { VLOG(1) << "Unable to perform action: task already has action in progress"; - PostTaskForActCallback(std::move(callback), /*success=*/false); + PostTaskForActCallback(std::move(callback), + MakeResult(mojom::ActionResultCode::kError, + "Task already has action in progress")); + return; } @@ -316,7 +327,8 @@ if (!task_state_->HasTab()) { VLOG(1) << "Unable to perform action: Tab closed while checking site policy"; - CompleteAction(/*success=*/false); + CompleteAction(MakeResult(mojom::ActionResultCode::kTabWentAway, + "Tab closed while checking site policy")); return; } @@ -327,12 +339,14 @@ // is no longer applicable. For now just fail. // TODO(mcnee): Handle this gracefully. NOTIMPLEMENTED() << "Acting after cross-origin navigation occurred"; - CompleteAction(/*success=*/false); + CompleteAction(MakeResult(mojom::ActionResultCode::kCrossOriginNavigation, + "Acting after cross-origin navigation occurred")); return; } if (!may_act) { - CompleteAction(/*success=*/false); + CompleteAction(MakeResult(mojom::ActionResultCode::kUrlBlocked, + "URL blocked for actions")); return; } @@ -341,7 +355,8 @@ // Currently, only one action at a time is supported. if (proto.action_information_size() != 1) { NOTIMPLEMENTED() << "Multi-action BrowserAction"; - CompleteAction(/*success=*/false); + CompleteAction(MakeResult(mojom::ActionResultCode::kError, + "Multiple actions are not supported")); return; } @@ -352,13 +367,13 @@ base::BindOnce(&ActorCoordinator::CompleteAction, GetWeakPtr())); } -void ActorCoordinator::CompleteAction(bool success) { +void ActorCoordinator::CompleteAction(mojom::ActionResultPtr result) { if (!task_state_ || !task_state_->HasAction()) { return; } PostTaskForActCallback(std::move(task_state_->current_action->callback), - success); + std::move(result)); task_state_->current_action.reset(); }
diff --git a/chrome/browser/actor/actor_coordinator.h b/chrome/browser/actor/actor_coordinator.h index 95d7480c..8475eee 100644 --- a/chrome/browser/actor/actor_coordinator.h +++ b/chrome/browser/actor/actor_coordinator.h
@@ -7,12 +7,13 @@ #include <memory> -#include "base/functional/callback_forward.h" +#include "base/functional/callback.h" #include "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" #include "base/sequence_checker.h" #include "base/types/id_type.h" #include "chrome/browser/actor/tools/tool_controller.h" +#include "chrome/common/actor.mojom-forward.h" #include "content/public/browser/web_contents_observer.h" class Profile; @@ -38,7 +39,7 @@ // Coordinates the execution of a multi-step task. class ActorCoordinator { public: - using ActionResultCallback = base::OnceCallback<void(bool)>; + using ActionResultCallback = base::OnceCallback<void(mojom::ActionResultPtr)>; using StartTaskCallback = base::OnceCallback<void(base::WeakPtr<tabs::TabInterface>)>; @@ -115,7 +116,7 @@ const url::Origin& evaluated_origin, bool may_act); - void CompleteAction(bool success); + void CompleteAction(mojom::ActionResultPtr result); base::WeakPtr<ActorCoordinator> GetWeakPtr(); @@ -126,7 +127,7 @@ struct Action { Action(const optimization_guide::proto::BrowserAction& action, - ActionResultCallback callback); + ActorCoordinator::ActionResultCallback callback); ~Action(); Action(const Action&) = delete; Action& operator=(const Action&) = delete;
diff --git a/chrome/browser/actor/actor_coordinator_browsertest.cc b/chrome/browser/actor/actor_coordinator_browsertest.cc index 8f6d32c..970c140 100644 --- a/chrome/browser/actor/actor_coordinator_browsertest.cc +++ b/chrome/browser/actor/actor_coordinator_browsertest.cc
@@ -13,6 +13,8 @@ #include "chrome/browser/glic/glic_keyed_service.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/browser.h" +#include "chrome/common/actor.mojom-forward.h" +#include "chrome/common/actor/action_result.h" #include "chrome/common/chrome_features.h" #include "chrome/test/base/chrome_test_utils.h" #include "chrome/test/base/in_process_browser_test.h" @@ -75,9 +77,9 @@ content::GetDOMNodeId(*main_frame(), query_selector); ASSERT_TRUE(dom_node_id); BrowserAction action = MakeClick(dom_node_id.value()); - TestFuture<bool> result; + TestFuture<mojom::ActionResultPtr> result; actor_coordinator().Act(action, result.GetCallback()); - EXPECT_TRUE(result.Get()); + ExpectOkResult(result); } private:
diff --git a/chrome/browser/actor/actor_coordinator_unittest.cc b/chrome/browser/actor/actor_coordinator_unittest.cc index cd68604..ed9cb165 100644 --- a/chrome/browser/actor/actor_coordinator_unittest.cc +++ b/chrome/browser/actor/actor_coordinator_unittest.cc
@@ -11,6 +11,7 @@ #include "chrome/browser/actor/actor_test_util.h" #include "chrome/browser/ui/tabs/test/mock_tab_interface.h" #include "chrome/common/actor.mojom.h" +#include "chrome/common/actor/action_result.h" #include "chrome/common/chrome_features.h" #include "chrome/common/chrome_render_frame.mojom.h" #include "chrome/common/webui_url_constants.h" @@ -66,7 +67,7 @@ void InvokeTool(actor::mojom::ToolInvocationPtr request, InvokeToolCallback callback) override { - std::move(callback).Run(true); + std::move(callback).Run(MakeOkResult()); } private: @@ -107,11 +108,11 @@ FakeChromeRenderFrame fake_chrome_render_frame; fake_chrome_render_frame.OverrideBinder(main_rfh()); - base::test::TestFuture<bool> success; + base::test::TestFuture<mojom::ActionResultPtr> success; ActorCoordinator coordinator(profile()); coordinator.StartTaskForTesting(GetTab()); coordinator.Act(action, success.GetCallback()); - return success.Get(); + return IsOk(*success.Get()); } tabs::MockTabInterface* GetTab() { @@ -150,19 +151,19 @@ content::NavigationSimulator::NavigateAndCommitFromBrowser( web_contents(), GURL("http://localhost/")); - base::test::TestFuture<bool> success; + base::test::TestFuture<mojom::ActionResultPtr> result; ActorCoordinator coordinator(profile()); coordinator.StartTaskForTesting(GetTab()); FakeChromeRenderFrame fake_chrome_render_frame; fake_chrome_render_frame.OverrideBinder(main_rfh()); - coordinator.Act(MakeClick(kFakeContentNodeId), success.GetCallback()); + coordinator.Act(MakeClick(kFakeContentNodeId), result.GetCallback()); ClearTabInterface(); DeleteContents(); - EXPECT_FALSE(success.Get()); + ExpectErrorResult(result, mojom::ActionResultCode::kTabWentAway); } TEST_F(ActorCoordinatorTest, CrossOriginNavigationBeforeAction) { @@ -172,19 +173,19 @@ FakeChromeRenderFrame fake_chrome_render_frame; fake_chrome_render_frame.OverrideBinder(main_rfh()); - base::test::TestFuture<bool> success; + base::test::TestFuture<mojom::ActionResultPtr> result; ActorCoordinator coordinator(profile()); coordinator.StartTaskForTesting(GetTab()); - coordinator.Act(MakeClick(kFakeContentNodeId), success.GetCallback()); + coordinator.Act(MakeClick(kFakeContentNodeId), result.GetCallback()); // Before the action happens, commit a cross-origin navigation. - ASSERT_FALSE(success.IsReady()); + ASSERT_FALSE(result.IsReady()); content::NavigationSimulator::NavigateAndCommitFromBrowser( web_contents(), GURL("http://localhost:8000/")); // TODO(mcnee): We currently just fail, but this should do something more // graceful. - EXPECT_FALSE(success.Get()); + ExpectErrorResult(result, mojom::ActionResultCode::kCrossOriginNavigation); } } // namespace
diff --git a/chrome/browser/actor/actor_test_util.cc b/chrome/browser/actor/actor_test_util.cc index 6c78fe9..f172c02fe 100644 --- a/chrome/browser/actor/actor_test_util.cc +++ b/chrome/browser/actor/actor_test_util.cc
@@ -6,9 +6,13 @@ #include <string_view> +#include "base/types/cxx23_to_underlying.h" #include "base/values.h" #include "chrome/browser/actor/actor_coordinator.h" +#include "chrome/common/actor.mojom.h" +#include "chrome/common/actor/action_result.h" #include "components/optimization_guide/proto/features/actions_data.pb.h" +#include "testing/gtest/include/gtest/gtest.h" namespace actor { @@ -134,4 +138,18 @@ ActorCoordinator::SetActionObservationDelayForTesting(delta); } +void ExpectOkResult(base::test::TestFuture<mojom::ActionResultPtr>& future) { + const auto& result = *(future.Get()); + EXPECT_TRUE(IsOk(result)) + << "Expected OK result, got " << ToDebugString(result); +} + +void ExpectErrorResult(base::test::TestFuture<mojom::ActionResultPtr>& future, + mojom::ActionResultCode expected_code) { + const auto& result = *(future.Get()); + EXPECT_EQ(result.code, expected_code) + << "Expected error " << base::to_underlying(expected_code) << ", got " + << ToDebugString(result); +} + } // namespace actor
diff --git a/chrome/browser/actor/actor_test_util.h b/chrome/browser/actor/actor_test_util.h index 5d757e0..83c4cfb 100644 --- a/chrome/browser/actor/actor_test_util.h +++ b/chrome/browser/actor/actor_test_util.h
@@ -5,7 +5,9 @@ #ifndef CHROME_BROWSER_ACTOR_ACTOR_TEST_UTIL_H_ #define CHROME_BROWSER_ACTOR_ACTOR_TEST_UTIL_H_ +#include "base/test/test_future.h" #include "base/time/time.h" +#include "chrome/common/actor.mojom-forward.h" #include "components/optimization_guide/proto/features/actions_data.pb.h" #include "ui/gfx/geometry/point.h" @@ -34,6 +36,10 @@ void OverrideActionObservationDelay(const base::TimeDelta& delta); +void ExpectOkResult(base::test::TestFuture<mojom::ActionResultPtr>& future); +void ExpectErrorResult(base::test::TestFuture<mojom::ActionResultPtr>& future, + mojom::ActionResultCode expected_code); + } // namespace actor #endif // CHROME_BROWSER_ACTOR_ACTOR_TEST_UTIL_H_
diff --git a/chrome/browser/actor/tools/history_tool.cc b/chrome/browser/actor/tools/history_tool.cc index 836c905..995e475 100644 --- a/chrome/browser/actor/tools/history_tool.cc +++ b/chrome/browser/actor/tools/history_tool.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/actor/tools/history_tool.h" #include "chrome/browser/actor/tools/tool_callbacks.h" +#include "chrome/common/actor/action_result.h" #include "components/tabs/public/tab_interface.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/navigation_controller.h" @@ -29,14 +30,14 @@ NavigationController& controller = web_contents()->GetController(); if ((direction_ == kBack && !controller.CanGoBack()) || (direction_ == kForward && !controller.CanGoForward())) { - PostResponseTask(std::move(callback), false); + PostResponseTask(std::move(callback), MakeErrorResult()); return; } // TODO(crbug.com/402731599): Additional validation here (e.g. is URL in // allowlist). - PostResponseTask(std::move(callback), true); + PostResponseTask(std::move(callback), MakeOkResult()); } void HistoryTool::Invoke(InvokeCallback callback) { @@ -87,17 +88,19 @@ void HistoryTool::DidFinishNavigation(NavigationHandle* navigation_handle) { if (navigation_handle_ids_.erase(navigation_handle->GetNavigationId())) { - bool success = - navigation_handle->HasCommitted() && !navigation_handle->IsErrorPage(); - FinishToolInvocationIfNeeded(success); + auto result = + (navigation_handle->HasCommitted() && !navigation_handle->IsErrorPage()) + ? MakeOkResult() + : MakeErrorResult(); + FinishToolInvocationIfNeeded(std::move(result)); } } -void HistoryTool::FinishToolInvocationIfNeeded(bool result) { +void HistoryTool::FinishToolInvocationIfNeeded(mojom::ActionResultPtr result) { CHECK(invoke_callback_); // This responds with failure if any navigations fails. - if (navigation_handle_ids_.empty() || !result) { - PostResponseTask(std::move(invoke_callback_), result); + if (navigation_handle_ids_.empty() || !IsOk(*result)) { + PostResponseTask(std::move(invoke_callback_), std::move(result)); } } @@ -107,7 +110,7 @@ // If no navigations were started, we should complete now. Respond with // failure since nothing changed. if (navigation_handle_ids_.empty()) { - FinishToolInvocationIfNeeded(false); + FinishToolInvocationIfNeeded(MakeErrorResult()); } }
diff --git a/chrome/browser/actor/tools/history_tool.h b/chrome/browser/actor/tools/history_tool.h index 85ed485..f07fe19 100644 --- a/chrome/browser/actor/tools/history_tool.h +++ b/chrome/browser/actor/tools/history_tool.h
@@ -10,6 +10,7 @@ #include "base/containers/flat_set.h" #include "base/memory/weak_ptr.h" #include "chrome/browser/actor/tools/tool.h" +#include "chrome/common/actor.mojom-forward.h" #include "content/public/browser/web_contents_observer.h" namespace content { @@ -45,7 +46,7 @@ content::NavigationHandle* navigation_handle) override; private: - void FinishToolInvocationIfNeeded(bool result); + void FinishToolInvocationIfNeeded(mojom::ActionResultPtr result); void LegacyBrowserBasedBeforeUnloadReplyComplete();
diff --git a/chrome/browser/actor/tools/navigate_tool.cc b/chrome/browser/actor/tools/navigate_tool.cc index 23dc8f9..441b983 100644 --- a/chrome/browser/actor/tools/navigate_tool.cc +++ b/chrome/browser/actor/tools/navigate_tool.cc
@@ -5,6 +5,8 @@ #include "chrome/browser/actor/tools/navigate_tool.h" #include "chrome/browser/actor/tools/tool_callbacks.h" +#include "chrome/common/actor.mojom.h" +#include "chrome/common/actor/action_result.h" #include "components/tabs/public/tab_interface.h" #include "content/public/browser/browser_thread.h" #include "content/public/browser/navigation_handle.h" @@ -27,13 +29,14 @@ void NavigateTool::Validate(ValidateCallback callback) { if (!url_.is_valid()) { // URL is invalid. - PostResponseTask(std::move(callback), false); + PostResponseTask(std::move(callback), + MakeResult(mojom::ActionResultCode::kNavigateInvalidUrl)); return; } // TODO(crbug.com/402731599): Validate URL and state here. - PostResponseTask(std::move(callback), true); + PostResponseTask(std::move(callback), MakeOkResult()); } void NavigateTool::Invoke(InvokeCallback callback) { @@ -63,12 +66,14 @@ // page navigates before it's done loading. Common with client-side redirects. if (pending_navigation_handle_id_ && navigation_handle->GetNavigationId() == *pending_navigation_handle_id_) { + auto result = + navigation_handle->HasCommitted() && !navigation_handle->IsErrorPage() + ? MakeOkResult() + : MakeErrorResult(); - bool success = - navigation_handle->HasCommitted() && !navigation_handle->IsErrorPage(); - - if ((!success || navigation_handle->IsSameDocument()) && invoke_callback_) { - PostResponseTask(std::move(invoke_callback_), success); + if ((!IsOk(*result) || navigation_handle->IsSameDocument()) && + invoke_callback_) { + PostResponseTask(std::move(invoke_callback_), std::move(result)); return; } @@ -98,7 +103,7 @@ post_navigation_state_->waiting_for_load = false; if (post_navigation_state_->Done() && invoke_callback_) { - PostResponseTask(std::move(invoke_callback_), /*response=*/true); + PostResponseTask(std::move(invoke_callback_), MakeOkResult()); } } @@ -109,7 +114,7 @@ post_navigation_state_->waiting_for_fcp = false; if (post_navigation_state_->Done() && invoke_callback_) { - PostResponseTask(std::move(invoke_callback_), /*response=*/true); + PostResponseTask(std::move(invoke_callback_), MakeOkResult()); } } @@ -119,7 +124,7 @@ void NavigateTool::Timeout() { if (invoke_callback_) { - PostResponseTask(std::move(invoke_callback_), /*response=*/true); + PostResponseTask(std::move(invoke_callback_), MakeOkResult()); } }
diff --git a/chrome/browser/actor/tools/page_tool.cc b/chrome/browser/actor/tools/page_tool.cc index c1935be..f0fae21 100644 --- a/chrome/browser/actor/tools/page_tool.cc +++ b/chrome/browser/actor/tools/page_tool.cc
@@ -5,7 +5,7 @@ #include "chrome/browser/actor/tools/page_tool.h" #include "chrome/browser/actor/actor_coordinator.h" -#include "chrome/common/actor.mojom.h" +#include "chrome/common/actor/action_result.h" #include "chrome/common/chrome_render_frame.mojom.h" #include "content/public/browser/render_frame_host.h" #include "mojo/public/cpp/bindings/associated_remote.h" @@ -187,7 +187,7 @@ void PageTool::Validate(ValidateCallback callback) { // No browser-side validation yet. base::SequencedTaskRunner::GetCurrentDefault()->PostTask( - FROM_HERE, base::BindOnce(std::move(callback), true)); + FROM_HERE, base::BindOnce(std::move(callback), MakeOkResult())); } void PageTool::Invoke(InvokeCallback callback) { @@ -198,7 +198,8 @@ case ActionInformation::ActionInfoCase::kClick: { auto click = mojom::ClickAction::New(); if (!SetClickToolArgs(click, action_info)) { - std::move(callback).Run(false); + std::move(callback).Run( + MakeResult(mojom::ActionResultCode::kClickInvalidArguments)); return; } request->action = mojom::ToolAction::NewClick(std::move(click)); @@ -207,7 +208,8 @@ case ActionInformation::ActionInfoCase::kType: { auto type = mojom::TypeAction::New(); if (!SetTypeToolArgs(type, action_info)) { - std::move(callback).Run(false); + std::move(callback).Run( + MakeResult(mojom::ActionResultCode::kTypeInvalidArguments)); return; } request->action = mojom::ToolAction::NewType(std::move(type)); @@ -216,7 +218,8 @@ case ActionInformation::ActionInfoCase::kScroll: { auto scroll = mojom::ScrollAction::New(); if (!SetScrollToolArgs(scroll, action_info)) { - std::move(callback).Run(false); + std::move(callback).Run( + MakeResult(mojom::ActionResultCode::kScrollInvalidArguments)); return; } request->action = mojom::ToolAction::NewScroll(std::move(scroll));
diff --git a/chrome/browser/actor/tools/tool.h b/chrome/browser/actor/tools/tool.h index 64fe673..0fabde6 100644 --- a/chrome/browser/actor/tools/tool.h +++ b/chrome/browser/actor/tools/tool.h
@@ -8,6 +8,7 @@ #include <string> #include "base/functional/callback_forward.h" +#include "chrome/common/actor.mojom-forward.h" namespace actor { @@ -16,8 +17,10 @@ // when the tool will be destroyed. class Tool { public: - using ValidateCallback = base::OnceCallback<void(bool)>; - using InvokeCallback = base::OnceCallback<void(bool)>; + // NOTE: Let's rename this to `ToolCallback`, move to a shared header, and + // eliminate the other redundant definitions. + using ValidateCallback = base::OnceCallback<void(mojom::ActionResultPtr)>; + using InvokeCallback = base::OnceCallback<void(mojom::ActionResultPtr)>; Tool() = default; virtual ~Tool() = default;
diff --git a/chrome/browser/actor/tools/tool_callbacks.cc b/chrome/browser/actor/tools/tool_callbacks.cc index be8ed4b..57c81df 100644 --- a/chrome/browser/actor/tools/tool_callbacks.cc +++ b/chrome/browser/actor/tools/tool_callbacks.cc
@@ -8,14 +8,15 @@ #include "base/functional/callback.h" #include "base/task/sequenced_task_runner.h" +#include "chrome/common/actor.mojom.h" namespace actor { -void PostResponseTask(base::OnceCallback<void(bool)> task, - bool response, +void PostResponseTask(base::OnceCallback<void(mojom::ActionResultPtr)> task, + mojom::ActionResultPtr result, base::TimeDelta delay) { base::SequencedTaskRunner::GetCurrentDefault()->PostDelayedTask( - FROM_HERE, base::BindOnce(std::move(task), response), delay); + FROM_HERE, base::BindOnce(std::move(task), std::move(result)), delay); } } // namespace actor
diff --git a/chrome/browser/actor/tools/tool_callbacks.h b/chrome/browser/actor/tools/tool_callbacks.h index 9aea2af..6775a36 100644 --- a/chrome/browser/actor/tools/tool_callbacks.h +++ b/chrome/browser/actor/tools/tool_callbacks.h
@@ -7,14 +7,13 @@ #include "base/functional/callback_forward.h" #include "base/time/time.h" +#include "chrome/common/actor.mojom-forward.h" namespace actor { // Helper to post a callback on the current sequence with the given response. -// TODO(crbug.com/389739308): This will have to be split up or templated when -// responses become typed rather than the placeholder bool. -void PostResponseTask(base::OnceCallback<void(bool)> task, - bool response, +void PostResponseTask(base::OnceCallback<void(mojom::ActionResultPtr)> task, + mojom::ActionResultPtr result, base::TimeDelta delay = base::Seconds(0)); } // namespace actor
diff --git a/chrome/browser/actor/tools/tool_controller.cc b/chrome/browser/actor/tools/tool_controller.cc index e6c4d3c..6c36e15c 100644 --- a/chrome/browser/actor/tools/tool_controller.cc +++ b/chrome/browser/actor/tools/tool_controller.cc
@@ -19,6 +19,7 @@ #include "chrome/browser/actor/tools/tool_invocation.h" #include "chrome/browser/actor/tools/wait_tool.h" #include "chrome/common/actor.mojom.h" +#include "chrome/common/actor/action_result.h" #include "chrome/common/actor/actor_logging.h" #include "chrome/common/chrome_features.h" #include "components/optimization_guide/proto/features/actions_data.pb.h" @@ -86,7 +87,8 @@ RenderFrameHost* target_frame = invocation.FindTargetFrame(); if (!target_frame) { // The tab for this action was closed. - PostResponseTask(std::move(result_callback), false); + PostResponseTask(std::move(result_callback), + MakeResult(mojom::ActionResultCode::kTabWentAway)); return; } @@ -94,7 +96,8 @@ if (!created_tool) { // Tool not found. - PostResponseTask(std::move(result_callback), false); + PostResponseTask(std::move(result_callback), + MakeResult(mojom::ActionResultCode::kToolUnknown)); return; } @@ -105,14 +108,13 @@ &ToolController::ValidationComplete, weak_ptr_factory_.GetWeakPtr())); } -void ToolController::ValidationComplete(bool success) { +void ToolController::ValidationComplete(mojom::ActionResultPtr result) { if (!active_state_) { return; } - // TODO(crbug.com/389739308): Provide more detail of failure to the caller. - if (!success) { - CompleteToolRequest(/*result=*/false); + if (!IsOk(*result)) { + CompleteToolRequest(std::move(result)); return; } @@ -125,9 +127,9 @@ &ToolController::CompleteToolRequest, weak_ptr_factory_.GetSafeRef())); } -void ToolController::CompleteToolRequest(bool result) { +void ToolController::CompleteToolRequest(mojom::ActionResultPtr result) { CHECK(active_state_); - ACTOR_LOG() << "Completed Tool[" << (result ? "SUCCESS" : "FAILURE") + ACTOR_LOG() << "Completed Tool[" << ToDebugString(*result) << "]: " << active_state_->tool->DebugString(); // TODO(crbug.com/409564704): Delay the callback to give the page a chance to @@ -136,8 +138,8 @@ auto delay = active_state_->tool->ShouldAddCompletionDelay() ? actor::ActorCoordinator::GetActionObservationDelay() : base::Seconds(0); - PostResponseTask(std::move(active_state_->completion_callback), result, - delay); + PostResponseTask(std::move(active_state_->completion_callback), + std::move(result), delay); active_state_.reset(); }
diff --git a/chrome/browser/actor/tools/tool_controller.h b/chrome/browser/actor/tools/tool_controller.h index 669d242..ee5464be 100644 --- a/chrome/browser/actor/tools/tool_controller.h +++ b/chrome/browser/actor/tools/tool_controller.h
@@ -10,6 +10,7 @@ #include "base/functional/callback.h" #include "base/memory/weak_ptr.h" #include "chrome/browser/actor/tools/tool_invocation.h" +#include "chrome/common/actor.mojom-forward.h" namespace content { class RenderFrameHost; @@ -36,13 +37,13 @@ // Call to clear the current tool invocation and return the given result to // the initiator. Must only be called when a tool invocation is in-progress. - void CompleteToolRequest(bool result); + void CompleteToolRequest(mojom::ActionResultPtr result); private: std::unique_ptr<Tool> CreateTool(content::RenderFrameHost& frame, const ToolInvocation& invocation); - void ValidationComplete(bool success); + void ValidationComplete(mojom::ActionResultPtr result); // This state is non-null whenever a tool invocation is in progress. struct ActiveState {
diff --git a/chrome/browser/actor/tools/tool_invocation.h b/chrome/browser/actor/tools/tool_invocation.h index d6e3fef..d97af50 100644 --- a/chrome/browser/actor/tools/tool_invocation.h +++ b/chrome/browser/actor/tools/tool_invocation.h
@@ -7,6 +7,7 @@ #include "base/functional/callback_forward.h" #include "base/memory/raw_ref.h" +#include "chrome/common/actor.mojom-forward.h" #include "components/optimization_guide/proto/features/actions_data.pb.h" namespace content { @@ -24,7 +25,7 @@ // methods. class ToolInvocation { public: - using ResultCallback = base::OnceCallback<void(bool)>; + using ResultCallback = base::OnceCallback<void(mojom::ActionResultPtr)>; explicit ToolInvocation( const optimization_guide::proto::ActionInformation& action_information,
diff --git a/chrome/browser/actor/tools/tools_browsertest.cc b/chrome/browser/actor/tools/tools_browsertest.cc index 987fa80..2b62944 100644 --- a/chrome/browser/actor/tools/tools_browsertest.cc +++ b/chrome/browser/actor/tools/tools_browsertest.cc
@@ -5,6 +5,7 @@ #include <string_view> #include "base/command_line.h" +#include "base/strings/strcat.h" #include "base/test/bind.h" #include "base/test/scoped_feature_list.h" #include "base/test/test_future.h" @@ -16,6 +17,8 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/ui/views/frame/browser_view.h" #include "chrome/browser/ui/zoom/chrome_zoom_level_prefs.h" +#include "chrome/common/actor.mojom.h" +#include "chrome/common/actor/action_result.h" #include "chrome/common/chrome_features.h" #include "chrome/common/chrome_render_frame.mojom.h" #include "chrome/common/chrome_switches.h" @@ -30,6 +33,7 @@ #include "content/public/test/test_navigation_observer.h" #include "mojo/public/cpp/bindings/associated_remote.h" #include "net/dns/mock_host_resolver.h" +#include "testing/gtest/include/gtest/gtest.h" #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" #include "third_party/blink/public/common/page/page_zoom.h" #include "ui/display/display_switches.h" @@ -187,9 +191,9 @@ ASSERT_TRUE(body_id); BrowserAction action = MakeClick(body_id.value()); - TestFuture<bool> result; + TestFuture<mojom::ActionResultPtr> result; actor_coordinator().Act(action, result.GetCallback()); - EXPECT_TRUE(result.Get()); + ExpectOkResult(result); EXPECT_EQ("mousedown[BODY#],mouseup[BODY#],click[BODY#]", EvalJs(web_contents(), "mouse_event_log.join(',')")); } @@ -203,9 +207,9 @@ ASSERT_TRUE(button_id); BrowserAction action = MakeClick(button_id.value()); - TestFuture<bool> result; + TestFuture<mojom::ActionResultPtr> result; actor_coordinator().Act(action, result.GetCallback()); - EXPECT_TRUE(result.Get()); + ExpectOkResult(result); EXPECT_EQ( "mousedown[BUTTON#clickable],mouseup[BUTTON#clickable],click[BUTTON#" "clickable]", @@ -224,10 +228,10 @@ // Use a random node id that doesn't exist. BrowserAction action = MakeClick(kNonExistentContentNodeId); - TestFuture<bool> result_fail; + TestFuture<mojom::ActionResultPtr> result_fail; actor_coordinator().Act(action, result_fail.GetCallback()); // The node id doesn't exist so the tool will return false. - EXPECT_FALSE(result_fail.Get()); + ExpectErrorResult(result_fail, mojom::ActionResultCode::kClickInvalidPoint); // The page should not have received any events. EXPECT_EQ("", EvalJs(web_contents(), "mouse_event_log.join(',')")); @@ -243,9 +247,9 @@ ASSERT_TRUE(button_id); BrowserAction action = MakeClick(button_id.value()); - TestFuture<bool> result_fail; + TestFuture<mojom::ActionResultPtr> result_fail; actor_coordinator().Act(action, result_fail.GetCallback()); - EXPECT_FALSE(result_fail.Get()); + ExpectErrorResult(result_fail, mojom::ActionResultCode::kClickInvalidPoint); // The page should not have received any events. EXPECT_EQ("", EvalJs(web_contents(), "mouse_event_log.join(',')")); @@ -263,14 +267,39 @@ ASSERT_TRUE(button_id); BrowserAction action = MakeClick(button_id.value()); - TestFuture<bool> result_fail; + TestFuture<mojom::ActionResultPtr> result_fail; actor_coordinator().Act(action, result_fail.GetCallback()); - EXPECT_FALSE(result_fail.Get()); + ExpectErrorResult(result_fail, mojom::ActionResultCode::kClickInvalidPoint); // The page should not have received any events. EXPECT_EQ("", EvalJs(web_contents(), "mouse_event_log.join(',')")); } +// Ensure clicks can be sent to elements that are only partially onscreen. +IN_PROC_BROWSER_TEST_F(ActorToolsTest, ClickTool_ClippedElements) { + const GURL url = + embedded_test_server()->GetURL("/actor/click_with_overflow_clip.html"); + ASSERT_TRUE(content::NavigateToURL(web_contents(), url)); + + std::vector<std::string> test_cases = { + "offscreenButton", "overflowHiddenButton", "overflowScrollButton"}; + + for (auto button : test_cases) { + SCOPED_TRACE(testing::Message() << "WHILE TESTING: " << button); + std::optional<int> button_id = + GetDOMNodeId(*main_frame(), base::StrCat({"#", button})); + ASSERT_TRUE(button_id); + + BrowserAction action = MakeClick(button_id.value()); + TestFuture<mojom::ActionResultPtr> result; + actor_coordinator().Act(action, result.GetCallback()); + ExpectOkResult(result); + EXPECT_EQ(button, EvalJs(web_contents(), "clicked_button")); + + ASSERT_TRUE(ExecJs(web_contents(), "clicked_button = ''")); + } +} + // =============================================== // Type Tool // =============================================== @@ -287,9 +316,9 @@ BrowserAction action = MakeType(input_id.value(), typed_string, /*follow_by_enter=*/true); - TestFuture<bool> result; + TestFuture<mojom::ActionResultPtr> result; actor_coordinator().Act(action, result.GetCallback()); - EXPECT_TRUE(result.Get()); + ExpectOkResult(result); EXPECT_EQ(typed_string, EvalJs(web_contents(), "document.getElementById('input').value")); @@ -304,9 +333,9 @@ BrowserAction action = MakeType(kNonExistentContentNodeId, typed_string, /*follow_by_enter=*/true); - TestFuture<bool> result; + TestFuture<mojom::ActionResultPtr> result; actor_coordinator().Act(action, result.GetCallback()); - EXPECT_FALSE(result.Get()); + ExpectErrorResult(result, mojom::ActionResultCode::kError); EXPECT_EQ("", EvalJs(web_contents(), "document.getElementById('input').value")); } @@ -326,9 +355,9 @@ BrowserAction action = MakeType(input_id.value(), typed_string, /*follow_by_enter=*/true); - TestFuture<bool> result; + TestFuture<mojom::ActionResultPtr> result; actor_coordinator().Act(action, result.GetCallback()); - EXPECT_TRUE(result.Get()); + ExpectOkResult(result); EXPECT_EQ( // a @@ -356,9 +385,9 @@ BrowserAction action = MakeType(input_id.value(), typed_string, /*follow_by_enter=*/true); - TestFuture<bool> result; + TestFuture<mojom::ActionResultPtr> result; actor_coordinator().Act(action, result.GetCallback()); - EXPECT_TRUE(result.Get()); + ExpectOkResult(result); EXPECT_EQ( // enter (causes submit to "click") @@ -383,9 +412,9 @@ BrowserAction action = MakeType(input_id.value(), typed_string, /*follow_by_enter=*/true); - TestFuture<bool> result; + TestFuture<mojom::ActionResultPtr> result; actor_coordinator().Act(action, result.GetCallback()); - EXPECT_TRUE(result.Get()); + ExpectOkResult(result); } EXPECT_EQ( @@ -403,9 +432,9 @@ BrowserAction action = MakeType(input_id.value(), typed_string, /*follow_by_enter=*/false); - TestFuture<bool> result; + TestFuture<mojom::ActionResultPtr> result; actor_coordinator().Act(action, result.GetCallback()); - EXPECT_TRUE(result.Get()); + ExpectOkResult(result); } EXPECT_EQ( @@ -428,9 +457,9 @@ BrowserAction action = MakeType(input_id.value(), typed_string, /*follow_by_enter=*/true); - TestFuture<bool> result; + TestFuture<mojom::ActionResultPtr> result; actor_coordinator().Act(action, result.GetCallback()); - EXPECT_TRUE(result.Get()); + ExpectOkResult(result); } // Ensure that the default mode is for the type tool to replace any existing @@ -448,9 +477,9 @@ BrowserAction action = MakeType(input_id.value(), typed_string, /*follow_by_enter=*/false); - TestFuture<bool> result; + TestFuture<mojom::ActionResultPtr> result; actor_coordinator().Act(action, result.GetCallback()); - EXPECT_TRUE(result.Get()); + ExpectOkResult(result); EXPECT_EQ(typed_string, EvalJs(web_contents(), "document.getElementById('input').value")); } @@ -479,9 +508,9 @@ BrowserAction action = MakeType(input_id.value(), typed_string, /*follow_by_enter=*/false); - TestFuture<bool> result; + TestFuture<mojom::ActionResultPtr> result; actor_coordinator().Act(action, result.GetCallback()); - EXPECT_TRUE(result.Get()); + ExpectOkResult(result); // Since focusing the first input causes the second input to become focused, // the tool should operate on the second input. @@ -506,9 +535,9 @@ // Use a random node id that doesn't exist. BrowserAction action = MakeMouseMove(kNonExistentContentNodeId); - TestFuture<bool> result; + TestFuture<mojom::ActionResultPtr> result; actor_coordinator().Act(action, result.GetCallback()); - EXPECT_FALSE(result.Get()); + ExpectErrorResult(result, mojom::ActionResultCode::kError); } // Test basic movements using MouseMove tool generates the expected events. @@ -524,9 +553,9 @@ std::optional<int> first_id = GetDOMNodeId(*main_frame(), "#first"); BrowserAction action = MakeMouseMove(first_id.value()); - TestFuture<bool> result; + TestFuture<mojom::ActionResultPtr> result; actor_coordinator().Act(action, result.GetCallback()); - EXPECT_TRUE(result.Get()); + ExpectOkResult(result); } EXPECT_EQ("mouseenter[DIV#first],mousemove[DIV#first]", @@ -538,9 +567,9 @@ std::optional<int> second_id = GetDOMNodeId(*main_frame(), "#second"); BrowserAction action = MakeMouseMove(second_id.value()); - TestFuture<bool> result; + TestFuture<mojom::ActionResultPtr> result; actor_coordinator().Act(action, result.GetCallback()); - EXPECT_TRUE(result.Get()); + ExpectOkResult(result); } EXPECT_EQ( @@ -562,9 +591,9 @@ std::optional<int> offscreen_id = GetDOMNodeId(*main_frame(), "#offscreen"); BrowserAction action = MakeMouseMove(offscreen_id.value()); - TestFuture<bool> result; + TestFuture<mojom::ActionResultPtr> result; actor_coordinator().Act(action, result.GetCallback()); - EXPECT_FALSE(result.Get()); + ExpectErrorResult(result, mojom::ActionResultCode::kError); } // The action should fail without generating any events. @@ -580,9 +609,9 @@ std::optional<int> offscreen_id = GetDOMNodeId(*main_frame(), "#offscreen"); BrowserAction action = MakeMouseMove(offscreen_id.value()); - TestFuture<bool> result; + TestFuture<mojom::ActionResultPtr> result; actor_coordinator().Act(action, result.GetCallback()); - EXPECT_TRUE(result.Get()); + ExpectOkResult(result); } EXPECT_EQ("mouseenter[DIV#offscreen],mousemove[DIV#offscreen]", @@ -603,9 +632,9 @@ BrowserAction action = MakeScroll(kNonExistentContentNodeId, /*scroll_offset_x=*/0, scroll_offset_y); - TestFuture<bool> result_fail; + TestFuture<mojom::ActionResultPtr> result_fail; actor_coordinator().Act(action, result_fail.GetCallback()); - EXPECT_FALSE(result_fail.Get()); + ExpectErrorResult(result_fail, mojom::ActionResultCode::kError); EXPECT_EQ(0, EvalJs(web_contents(), "window.scrollY")); } @@ -622,18 +651,18 @@ // If no node id is passed, it will scroll the page's viewport. BrowserAction action = MakeScroll(/*content_node_id=*/std::nullopt, /*scroll_offset_x=*/0, scroll_offset_y); - TestFuture<bool> result_success; + TestFuture<mojom::ActionResultPtr> result_success; actor_coordinator().Act(action, result_success.GetCallback()); - EXPECT_TRUE(result_success.Get()); + ExpectOkResult(result_success); EXPECT_EQ(scroll_offset_y, EvalJs(web_contents(), "window.scrollY")); } { BrowserAction action = MakeScroll(/*content_node_id=*/std::nullopt, /*scroll_offset_x=*/0, scroll_offset_y); - TestFuture<bool> result_success; + TestFuture<mojom::ActionResultPtr> result_success; actor_coordinator().Act(action, result_success.GetCallback()); - EXPECT_TRUE(result_success.Get()); + ExpectOkResult(result_success); EXPECT_EQ(2 * scroll_offset_y, EvalJs(web_contents(), "window.scrollY")); } } @@ -651,9 +680,9 @@ BrowserAction action = MakeScroll(/*content_node_id=*/std::nullopt, scroll_offset_x, /*scroll_offset_y=*/0); - TestFuture<bool> result_success; + TestFuture<mojom::ActionResultPtr> result_success; actor_coordinator().Act(action, result_success.GetCallback()); - EXPECT_TRUE(result_success.Get()); + ExpectOkResult(result_success); EXPECT_EQ(scroll_offset_x, EvalJs(web_contents(), "window.scrollX")); } @@ -661,9 +690,9 @@ BrowserAction action = MakeScroll(/*content_node_id=*/std::nullopt, scroll_offset_x, /*scroll_offset_y=*/0); - TestFuture<bool> result_success; + TestFuture<mojom::ActionResultPtr> result_success; actor_coordinator().Act(action, result_success.GetCallback()); - EXPECT_TRUE(result_success.Get()); + ExpectOkResult(result_success); EXPECT_EQ(2 * scroll_offset_x, EvalJs(web_contents(), "window.scrollX")); } } @@ -682,9 +711,9 @@ { BrowserAction action = MakeScroll(scroller, scroll_offset_x, /*scroll_offset_y=*/0); - TestFuture<bool> result_success; + TestFuture<mojom::ActionResultPtr> result_success; actor_coordinator().Act(action, result_success.GetCallback()); - EXPECT_TRUE(result_success.Get()); + ExpectOkResult(result_success); EXPECT_EQ(scroll_offset_x, EvalJs(web_contents(), "document.getElementById('scroller').scrollLeft")); @@ -693,9 +722,9 @@ { BrowserAction action = MakeScroll(scroller, /*scroll_offset_x=*/0, scroll_offset_y); - TestFuture<bool> result_success; + TestFuture<mojom::ActionResultPtr> result_success; actor_coordinator().Act(action, result_success.GetCallback()); - EXPECT_TRUE(result_success.Get()); + ExpectOkResult(result_success); EXPECT_EQ(scroll_offset_y, EvalJs(web_contents(), "document.getElementById('scroller').scrollTop")); @@ -715,9 +744,9 @@ { BrowserAction action = MakeScroll(scroller, /*scroll_offset_x=*/0, scroll_offset_y); - TestFuture<bool> result_success; - actor_coordinator().Act(action, result_success.GetCallback()); - EXPECT_FALSE(result_success.Get()); + TestFuture<mojom::ActionResultPtr> result; + actor_coordinator().Act(action, result.GetCallback()); + ExpectErrorResult(result, mojom::ActionResultCode::kError); EXPECT_EQ(0, EvalJs(web_contents(), "document.getElementById('nonscroll').scrollTop")); EXPECT_EQ(0, EvalJs(web_contents(), "window.scrollY")); @@ -740,9 +769,9 @@ { BrowserAction action = MakeScroll(scroller, /*scroll_offset_x=*/0, scroll_offset); - TestFuture<bool> result_success; - actor_coordinator().Act(action, result_success.GetCallback()); - EXPECT_FALSE(result_success.Get()); + TestFuture<mojom::ActionResultPtr> result; + actor_coordinator().Act(action, result.GetCallback()); + ExpectErrorResult(result, mojom::ActionResultCode::kError); EXPECT_EQ( 0, EvalJs(web_contents(), "document.getElementById('horizontalscroller').scrollTop")); @@ -753,9 +782,9 @@ { BrowserAction action = MakeScroll(scroller, scroll_offset, /*scroll_offset_y=*/0); - TestFuture<bool> result_success; + TestFuture<mojom::ActionResultPtr> result_success; actor_coordinator().Act(action, result_success.GetCallback()); - EXPECT_TRUE(result_success.Get()); + ExpectOkResult(result_success); EXPECT_EQ( scroll_offset, EvalJs(web_contents(), @@ -783,9 +812,9 @@ BrowserAction action = MakeScroll(scroller, /*scroll_offset_x=*/0, scroll_offset_physical); - TestFuture<bool> result_success; + TestFuture<mojom::ActionResultPtr> result_success; actor_coordinator().Act(action, result_success.GetCallback()); - EXPECT_TRUE(result_success.Get()); + ExpectOkResult(result_success); EXPECT_EQ(expected_offset_css, EvalJs(web_contents(), "document.getElementById('scroller').scrollTop")); @@ -809,9 +838,9 @@ BrowserAction action = MakeScroll(scroller, /*scroll_offset_x=*/0, scroll_offset_physical); - TestFuture<bool> result_success; + TestFuture<mojom::ActionResultPtr> result_success; actor_coordinator().Act(action, result_success.GetCallback()); - EXPECT_TRUE(result_success.Get()); + ExpectOkResult(result_success); EXPECT_EQ(expected_offset_css, EvalJs(web_contents(), "document.getElementById('zoomedscroller').scrollTop")); @@ -849,9 +878,9 @@ BrowserAction action = MakeScroll(scroller, /*scroll_offset_x=*/0, scroll_offset_physical); - TestFuture<bool> result_success; + TestFuture<mojom::ActionResultPtr> result_success; actor_coordinator().Act(action, result_success.GetCallback()); - EXPECT_TRUE(result_success.Get()); + ExpectOkResult(result_success); EXPECT_EQ(expected_offset_css, EvalJs(web_contents(), "document.getElementById('scroller').scrollTop")); @@ -869,9 +898,9 @@ BrowserAction action = MakeScroll(kViewportId, /*scroll_offset_x=*/0, scroll_offset_y); - TestFuture<bool> result; + TestFuture<mojom::ActionResultPtr> result; actor_coordinator().Act(action, result.GetCallback()); - EXPECT_TRUE(result.Get()); + ExpectOkResult(result); // Not sure why, since all zooms should be exactly 1.0, but some numerical // instability seems to creep in. Using ExtractDouble and EXPECT_FLOAT_EQ for @@ -902,9 +931,9 @@ BrowserAction action = MakeDragAndRelease(start, end); - TestFuture<bool> result_success; + TestFuture<mojom::ActionResultPtr> result_success; actor_coordinator().Act(action, result_success.GetCallback()); - EXPECT_TRUE(result_success.Get()); + ExpectOkResult(result_success); EXPECT_EQ(50, GetRangeValue(*main_frame(), "#range")); } @@ -933,9 +962,9 @@ BrowserAction action = MakeDragAndRelease(start, end); - TestFuture<bool> result_success; + TestFuture<mojom::ActionResultPtr> result_success; actor_coordinator().Act(action, result_success.GetCallback()); - EXPECT_TRUE(result_success.Get()); + ExpectOkResult(result_success); EXPECT_EQ(base::StrCat({"mousemove[", start.ToString(), "],", "mousedown[", start.ToString(), "],", "mousemove[", end.ToString(), @@ -964,9 +993,9 @@ gfx::Point end = gfx::ToFlooredPoint(range_rect.CenterPoint()); BrowserAction action = MakeDragAndRelease(start, end); - TestFuture<bool> result_success; - actor_coordinator().Act(action, result_success.GetCallback()); - EXPECT_FALSE(result_success.Get()); + TestFuture<mojom::ActionResultPtr> result; + actor_coordinator().Act(action, result.GetCallback()); + ExpectErrorResult(result, mojom::ActionResultCode::kError); } // Scroll the range into the viewport. @@ -986,9 +1015,9 @@ gfx::Point end = gfx::ToFlooredPoint(range_rect.CenterPoint()); BrowserAction action = MakeDragAndRelease(start, end); - TestFuture<bool> result_success; + TestFuture<mojom::ActionResultPtr> result_success; actor_coordinator().Act(action, result_success.GetCallback()); - EXPECT_TRUE(result_success.Get()); + ExpectOkResult(result_success); } EXPECT_EQ(50, GetRangeValue(*main_frame(), "#offscreenRange")); @@ -1011,9 +1040,9 @@ action.add_action_information()->mutable_navigate(); navigate->mutable_url()->assign(url_target.spec()); - TestFuture<bool> result_success; + TestFuture<mojom::ActionResultPtr> result_success; actor_coordinator().Act(action, result_success.GetCallback()); - EXPECT_TRUE(result_success.Get()); + ExpectOkResult(result_success); EXPECT_EQ(web_contents()->GetURL(), url_target); } @@ -1031,9 +1060,9 @@ ASSERT_TRUE(content::NavigateToURL(web_contents(), url_first)); ASSERT_TRUE(content::NavigateToURL(web_contents(), url_second)); - TestFuture<bool> result_success; + TestFuture<mojom::ActionResultPtr> result_success; actor_coordinator().Act(MakeHistoryBack(), result_success.GetCallback()); - EXPECT_TRUE(result_success.Get()); + ExpectOkResult(result_success); EXPECT_EQ(web_contents()->GetURL(), url_first); } @@ -1050,9 +1079,9 @@ GoBack(); ASSERT_EQ(web_contents()->GetURL(), url_first); - TestFuture<bool> result_success; + TestFuture<mojom::ActionResultPtr> result_success; actor_coordinator().Act(MakeHistoryForward(), result_success.GetCallback()); - EXPECT_TRUE(result_success.Get()); + ExpectOkResult(result_success); EXPECT_EQ(web_contents()->GetURL(), url_second); } @@ -1071,9 +1100,9 @@ ASSERT_TRUE(content::NavigateToURL(web_contents(), url_first)); ASSERT_TRUE(content::NavigateToURL(web_contents(), url_second)); - TestFuture<bool> result_success; + TestFuture<mojom::ActionResultPtr> result_success; actor_coordinator().Act(MakeHistoryBack(), result_success.GetCallback()); - EXPECT_TRUE(result_success.Get()); + ExpectOkResult(result_success); EXPECT_EQ(web_contents()->GetURL(), url_first); } @@ -1091,9 +1120,9 @@ // Attempting a forward history navigation should fail since we're at the // latest entry. { - TestFuture<bool> result; + TestFuture<mojom::ActionResultPtr> result; actor_coordinator().Act(MakeHistoryForward(), result.GetCallback()); - EXPECT_FALSE(result.Get()); + ExpectErrorResult(result, mojom::ActionResultCode::kError); EXPECT_EQ(web_contents()->GetURL(), url_second); } @@ -1104,9 +1133,9 @@ // Attempting a back history navigation should fail since we're at the first // entry. { - TestFuture<bool> result; + TestFuture<mojom::ActionResultPtr> result; actor_coordinator().Act(MakeHistoryBack(), result.GetCallback()); - EXPECT_FALSE(result.Get()); + ExpectErrorResult(result, mojom::ActionResultCode::kError); EXPECT_EQ(web_contents()->GetURL(), url_second); } } @@ -1120,16 +1149,16 @@ ASSERT_TRUE(content::NavigateToURL(web_contents(), url_second)); { - TestFuture<bool> result; + TestFuture<mojom::ActionResultPtr> result; actor_coordinator().Act(MakeHistoryBack(), result.GetCallback()); - EXPECT_TRUE(result.Get()); + ExpectOkResult(result); EXPECT_EQ(web_contents()->GetURL(), url_first); } { - TestFuture<bool> result; + TestFuture<mojom::ActionResultPtr> result; actor_coordinator().Act(MakeHistoryForward(), result.GetCallback()); - EXPECT_TRUE(result.Get()); + ExpectOkResult(result); EXPECT_EQ(web_contents()->GetURL(), url_second); } } @@ -1156,9 +1185,9 @@ ASSERT_EQ(child_frame->GetLastCommittedURL(), child_frame_url_2); // Invoke the history back tool. The iframe should be navigated back. - TestFuture<bool> result; + TestFuture<mojom::ActionResultPtr> result; actor_coordinator().Act(MakeHistoryBack(), result.GetCallback()); - EXPECT_TRUE(result.Get()); + ExpectOkResult(result); child_frame = content::ChildFrameAt(web_contents()->GetPrimaryMainFrame(), 0); EXPECT_EQ(child_frame->GetLastCommittedURL(), child_frame_url_1); EXPECT_EQ(web_contents()->GetURL(), main_frame_url); @@ -1178,7 +1207,7 @@ ASSERT_TRUE(content::NavigateToURL(web_contents(), url_second)); TestNavigationManager back_navigation(web_contents(), url_first); - TestFuture<bool> result_success; + TestFuture<mojom::ActionResultPtr> result_success; actor_coordinator().Act(MakeHistoryBack(), result_success.GetCallback()); ASSERT_TRUE(back_navigation.WaitForResponse()); EXPECT_FALSE(result_success.IsReady()); @@ -1189,7 +1218,7 @@ } ASSERT_TRUE(back_navigation.WaitForNavigationFinished()); - EXPECT_TRUE(result_success.Get()); + ExpectOkResult(result_success); } // Test a case where history back causes navigation in two frames. @@ -1238,9 +1267,9 @@ // Invoke the history back tool. Both should be navigated back to their // starting URL. - TestFuture<bool> result; + TestFuture<mojom::ActionResultPtr> result; actor_coordinator().Act(MakeHistoryBack(), result.GetCallback()); - EXPECT_TRUE(result.Get()); + ExpectOkResult(result); child_frame_1 = ChildFrameAt(web_contents()->GetPrimaryMainFrame(), 0); child_frame_2 = ChildFrameAt(web_contents()->GetPrimaryMainFrame(), 1); @@ -1267,19 +1296,19 @@ { BrowserAction select = MakeSelect(plain_select_dom_node_id, "beta"); - TestFuture<bool> result; + TestFuture<mojom::ActionResultPtr> result; actor_coordinator().Act(select, result.GetCallback()); - EXPECT_TRUE(result.Get()); + ExpectOkResult(result); } EXPECT_EQ(GetSelectElementCurrentValue(plain_select_id), "beta"); { BrowserAction select = MakeSelect(plain_select_dom_node_id, "gamma"); - TestFuture<bool> result; + TestFuture<mojom::ActionResultPtr> result; actor_coordinator().Act(select, result.GetCallback()); - EXPECT_TRUE(result.Get()); + ExpectOkResult(result); } EXPECT_EQ(GetSelectElementCurrentValue(plain_select_id), "gamma"); @@ -1287,10 +1316,10 @@ // Test selecting by value. The option with value last has text "omega". { BrowserAction select = MakeSelect(plain_select_dom_node_id, "last"); - TestFuture<bool> result; + TestFuture<mojom::ActionResultPtr> result; actor_coordinator().Act(select, result.GetCallback()); - EXPECT_TRUE(result.Get()); + ExpectOkResult(result); } EXPECT_EQ(GetSelectElementCurrentValue(plain_select_id), "last"); @@ -1311,9 +1340,9 @@ { BrowserAction select = MakeSelect(plain_select_dom_node_id, "beta"); - TestFuture<bool> result; + TestFuture<mojom::ActionResultPtr> result; actor_coordinator().Act(select, result.GetCallback()); - EXPECT_TRUE(result.Get()); + ExpectOkResult(result); EXPECT_EQ("input,change", EvalJs(web_contents(), "select_event_log.join(',')")); } @@ -1335,9 +1364,9 @@ BrowserAction select = MakeSelect(plain_select_dom_node_id, "nonexistentValue"); - TestFuture<bool> result; + TestFuture<mojom::ActionResultPtr> result; actor_coordinator().Act(select, result.GetCallback()); - EXPECT_FALSE(result.Get()); + ExpectErrorResult(result, mojom::ActionResultCode::kError); EXPECT_EQ(GetSelectElementCurrentValue(plain_select_id), initial_value); } @@ -1360,9 +1389,9 @@ // value. Expect the action to fail. { BrowserAction select = MakeSelect(non_options_select_dom_node_id, "beta"); - TestFuture<bool> result; + TestFuture<mojom::ActionResultPtr> result; actor_coordinator().Act(select, result.GetCallback()); - EXPECT_FALSE(result.Get()); + ExpectErrorResult(result, mojom::ActionResultCode::kError); } // Expect the value to remain unchanged @@ -1372,9 +1401,9 @@ // element, not an <option> value. Expect the action to fail. { BrowserAction select = MakeSelect(non_options_select_dom_node_id, "gamma"); - TestFuture<bool> result; + TestFuture<mojom::ActionResultPtr> result; actor_coordinator().Act(select, result.GetCallback()); - EXPECT_FALSE(result.Get()); + ExpectErrorResult(result, mojom::ActionResultCode::kError); } // Expect the value to remain unchanged @@ -1386,9 +1415,9 @@ { BrowserAction select = MakeSelect(non_options_select_dom_node_id, "epsilon"); - TestFuture<bool> result; + TestFuture<mojom::ActionResultPtr> result; actor_coordinator().Act(select, result.GetCallback()); - EXPECT_TRUE(result.Get()); + ExpectOkResult(result); EXPECT_EQ(GetSelectElementCurrentValue(non_options_select_id), "epsilon"); } } @@ -1409,9 +1438,9 @@ // Attempt to select "BETA" which has different casing than the option "beta" // Expect the action to fail due to case mismatch. BrowserAction select = MakeSelect(plain_select_dom_node_id, "BETA"); - TestFuture<bool> result; + TestFuture<mojom::ActionResultPtr> result; actor_coordinator().Act(select, result.GetCallback()); - EXPECT_FALSE(result.Get()); + ExpectErrorResult(result, mojom::ActionResultCode::kError); // The select value should be unchanged. EXPECT_EQ(GetSelectElementCurrentValue(plain_select_id), initial_value); @@ -1433,9 +1462,9 @@ // Attempt to select the value of the disabled option. Expect the action to // fail and the select's value to be unchanged. BrowserAction select = MakeSelect(plain_select_dom_node_id, "disabledOption"); - TestFuture<bool> result; + TestFuture<mojom::ActionResultPtr> result; actor_coordinator().Act(select, result.GetCallback()); - EXPECT_FALSE(result.Get()); + ExpectErrorResult(result, mojom::ActionResultCode::kError); EXPECT_EQ(GetSelectElementCurrentValue(plain_select_id), initial_value); } @@ -1456,9 +1485,9 @@ // enabled but is in a disabled optgroup. Expect the action to fail and the // select's value to be unchanged. BrowserAction select = MakeSelect(plain_select_dom_node_id, "foobar"); - TestFuture<bool> result; + TestFuture<mojom::ActionResultPtr> result; actor_coordinator().Act(select, result.GetCallback()); - EXPECT_FALSE(result.Get()); + ExpectErrorResult(result, mojom::ActionResultCode::kError); EXPECT_EQ(GetSelectElementCurrentValue(group_select_id), initial_value); } @@ -1479,9 +1508,9 @@ // Attempt to select an otherwise valid option value ("beta"). Expect the // action to fail without affecting the <select>. BrowserAction select = MakeSelect(disabled_select_dom_node_id, "beta"); - TestFuture<bool> result; + TestFuture<mojom::ActionResultPtr> result; actor_coordinator().Act(select, result.GetCallback()); - EXPECT_FALSE(result.Get()); + ExpectErrorResult(result, mojom::ActionResultCode::kError); EXPECT_EQ(GetSelectElementCurrentValue(disabled_select_id), initial_value); } @@ -1499,9 +1528,9 @@ // Select an option from the first group { BrowserAction select = MakeSelect(grouped_select_dom_node_id, "gamma"); - TestFuture<bool> result; + TestFuture<mojom::ActionResultPtr> result; actor_coordinator().Act(select, result.GetCallback()); - EXPECT_TRUE(result.Get()); + ExpectOkResult(result); } EXPECT_EQ(GetSelectElementCurrentValue(grouped_select_id), "gamma"); @@ -1509,9 +1538,9 @@ // Select an option from the second group { BrowserAction select = MakeSelect(grouped_select_dom_node_id, "b"); - TestFuture<bool> result; + TestFuture<mojom::ActionResultPtr> result; actor_coordinator().Act(select, result.GetCallback()); - EXPECT_TRUE(result.Get()); + ExpectOkResult(result); } EXPECT_EQ(GetSelectElementCurrentValue(grouped_select_id), "b"); @@ -1532,18 +1561,18 @@ { BrowserAction select = MakeSelect(listbox_select_dom_node_id, "beta"); - TestFuture<bool> result; + TestFuture<mojom::ActionResultPtr> result; actor_coordinator().Act(select, result.GetCallback()); - EXPECT_TRUE(result.Get()); + ExpectOkResult(result); } EXPECT_EQ(GetSelectElementCurrentValue(listbox_select_id), "beta"); { BrowserAction select = MakeSelect(listbox_select_dom_node_id, "delta"); - TestFuture<bool> result; + TestFuture<mojom::ActionResultPtr> result; actor_coordinator().Act(select, result.GetCallback()); - EXPECT_TRUE(result.Get()); + ExpectOkResult(result); } EXPECT_EQ(GetSelectElementCurrentValue(listbox_select_id), "delta"); @@ -1560,9 +1589,9 @@ ASSERT_TRUE(content::NavigateToURL(web_contents(), url)); BrowserAction wait = MakeWait(); - TestFuture<bool> result; + TestFuture<mojom::ActionResultPtr> result; actor_coordinator().Act(wait, result.GetCallback()); - EXPECT_TRUE(result.Get()); + ExpectOkResult(result); } } // namespace
diff --git a/chrome/browser/actor/tools/wait_tool.cc b/chrome/browser/actor/tools/wait_tool.cc index a3d5cd36..85535395 100644 --- a/chrome/browser/actor/tools/wait_tool.cc +++ b/chrome/browser/actor/tools/wait_tool.cc
@@ -10,6 +10,7 @@ #include "base/task/sequenced_task_runner.h" #include "base/time/time.h" #include "chrome/browser/actor/tools/tool_callbacks.h" +#include "chrome/common/actor/action_result.h" namespace actor { @@ -26,7 +27,7 @@ WaitTool::~WaitTool() = default; void WaitTool::Validate(ValidateCallback callback) { - PostResponseTask(std::move(callback), true); + PostResponseTask(std::move(callback), MakeOkResult()); } void WaitTool::Invoke(InvokeCallback callback) { @@ -48,7 +49,7 @@ void WaitTool::OnDelayFinished(InvokeCallback callback) { // TODO(crbug.com/409566732): Add more robust methods for detecting that the // page has settled. - std::move(callback).Run(true); + std::move(callback).Run(MakeOkResult()); } // static
diff --git a/chrome/browser/ai/BUILD.gn b/chrome/browser/ai/BUILD.gn index b250788..9126112 100644 --- a/chrome/browser/ai/BUILD.gn +++ b/chrome/browser/ai/BUILD.gn
@@ -18,11 +18,9 @@ "ai_data_keyed_service_factory.h", "ai_language_model.h", "ai_manager.h", - "ai_on_device_model_component_observer.h", "ai_on_device_session.h", "ai_rewriter.h", "ai_summarizer.h", - "ai_utils.h", "ai_writer.h", "built_in_ai_logger.cc", "built_in_ai_logger.h", @@ -37,6 +35,8 @@ public_deps = [ "//base", "//chrome/browser:browser_process", + "//chrome/browser/ai:ai_model_download_progress_manager", + "//chrome/browser/ai:ai_utils", "//chrome/browser/optimization_guide", "//chrome/browser/profiles:profile", "//components/component_updater:component_updater", @@ -52,6 +52,15 @@ } } +source_set("ai_utils") { + sources = [ "ai_utils.h" ] + + deps = [ + "//components/optimization_guide/core", + "//content/public/browser", + ] +} + source_set("impl") { sources = [ "ai_context_bound_object.cc", @@ -61,7 +70,6 @@ "ai_data_keyed_service_factory.cc", "ai_language_model.cc", "ai_manager.cc", - "ai_on_device_model_component_observer.cc", "ai_on_device_session.cc", "ai_rewriter.cc", "ai_summarizer.cc", @@ -112,9 +120,9 @@ "ai_model_download_progress_manager.h", ] public_deps = [ - ":ai", "//base", "//chrome/browser:browser_process", + "//chrome/browser/ai:ai_utils", "//components/component_updater", "//components/update_client", "//content/public/browser",
diff --git a/chrome/browser/ai/ai_data_keyed_service.cc b/chrome/browser/ai/ai_data_keyed_service.cc index bddda9db..f22d2e4d 100644 --- a/chrome/browser/ai/ai_data_keyed_service.cc +++ b/chrome/browser/ai/ai_data_keyed_service.cc
@@ -66,6 +66,8 @@ #include "chrome/browser/glic/host/context/glic_page_context_fetcher.h" #include "chrome/browser/glic/host/context/glic_tab_data.h" #include "chrome/browser/glic/host/glic.mojom.h" +#include "chrome/common/actor.mojom.h" +#include "chrome/common/actor/action_result.h" #endif #if !BUILDFLAG(IS_ANDROID) @@ -973,7 +975,7 @@ callback, int task_id, int tab_id, - bool success) { + actor::mojom::ActionResultPtr action_result) { if (!tab_ || tab_id_ != tab_id || task_id_ != task_id) { VLOG(1) << "Execute Action failed: Tab id or task id does not match " "current task."; @@ -990,7 +992,8 @@ focused_tab_data, DefaultOptions(), base::BindOnce(&AiDataKeyedService::ConvertToBrowserActionResult, weak_factory_.GetWeakPtr(), std::move(callback), - std::move(fetcher), task_id_, tab_id_, success)); + std::move(fetcher), task_id_, tab_id_, + std::move(action_result))); } void AiDataKeyedService::ConvertToBrowserActionResult( @@ -999,15 +1002,16 @@ std::unique_ptr<glic::GlicPageContextFetcher> fetcher, int task_id, int tab_id, - bool action_success, + actor::mojom::ActionResultPtr action_result, glic::mojom::GetContextResultPtr context_result) { - optimization_guide::proto::BrowserActionResult action_result; + optimization_guide::proto::BrowserActionResult browser_action_result; if (task_id != task_id_ || tab_id != tab_id_ || context_result->is_error_reason()) { VLOG(1) << "Execute Action failed: Tab id or task id does not match " "current task."; - action_result.set_action_result(0); - RunLater(base::BindOnce(std::move(callback), std::move(action_result))); + browser_action_result.set_action_result(0); + RunLater( + base::BindOnce(std::move(callback), std::move(browser_action_result))); return; } if (context_result->get_tab_context() && @@ -1019,20 +1023,21 @@ .As<optimization_guide::proto::AnnotatedPageContent>(); if (apc.has_value()) { auto apc_value = *std::move(apc); - action_result.mutable_annotated_page_content()->Swap(&apc_value); + browser_action_result.mutable_annotated_page_content()->Swap(&apc_value); } } if (context_result->get_tab_context()->viewport_screenshot && context_result->get_tab_context()->viewport_screenshot->data.size() != 0) { auto& data = context_result->get_tab_context()->viewport_screenshot->data; - action_result.set_screenshot(data.data(), data.size()); - action_result.set_screenshot_mime_type( + browser_action_result.set_screenshot(data.data(), data.size()); + browser_action_result.set_screenshot_mime_type( context_result->get_tab_context()->viewport_screenshot->mime_type); } - action_result.set_task_id(task_id); - action_result.set_tab_id(tab_id); - action_result.set_action_result(action_success ? 1 : 0); - RunLater(base::BindOnce(std::move(callback), std::move(action_result))); + browser_action_result.set_task_id(task_id); + browser_action_result.set_tab_id(tab_id); + browser_action_result.set_action_result(actor::IsOk(*action_result) ? 1 : 0); + RunLater( + base::BindOnce(std::move(callback), std::move(browser_action_result))); } #endif // BUILDFLAG(ENABLE_GLIC)
diff --git a/chrome/browser/ai/ai_data_keyed_service.h b/chrome/browser/ai/ai_data_keyed_service.h index 23151a1..9141b7b 100644 --- a/chrome/browser/ai/ai_data_keyed_service.h +++ b/chrome/browser/ai/ai_data_keyed_service.h
@@ -21,6 +21,7 @@ #if BUILDFLAG(ENABLE_GLIC) #include "chrome/browser/actor/actor_coordinator.h" #include "chrome/browser/glic/host/context/glic_page_context_fetcher.h" +#include "chrome/common/actor.mojom-forward.h" #endif namespace content { @@ -109,7 +110,7 @@ std::unique_ptr<glic::GlicPageContextFetcher> fetcher, int task_id, int tab_id, - bool action_success, + actor::mojom::ActionResultPtr action_result, glic::mojom::GetContextResultPtr result); // Called when the actor coordinator has started a tas. void OnTaskCreated( @@ -125,7 +126,7 @@ callback, int task_id, int tab_id, - bool success); + actor::mojom::ActionResultPtr action_result); // The actor coordinator which manages task and action routing. std::unique_ptr<actor::ActorCoordinator> actor_coordinator_;
diff --git a/chrome/browser/ai/ai_language_model_unittest.cc b/chrome/browser/ai/ai_language_model_unittest.cc index de6961d..5308735 100644 --- a/chrome/browser/ai/ai_language_model_unittest.cc +++ b/chrome/browser/ai/ai_language_model_unittest.cc
@@ -24,6 +24,7 @@ #include "chrome/browser/ai/ai_test_utils.h" #include "chrome/browser/ai/ai_utils.h" #include "chrome/browser/ai/features.h" +#include "chrome/browser/component_updater/optimization_guide_on_device_model_installer.h" #include "components/optimization_guide/core/mock_optimization_guide_model_executor.h" #include "components/optimization_guide/core/model_execution/multimodal_message.h" #include "components/optimization_guide/core/optimization_guide_features.h" @@ -34,6 +35,7 @@ #include "components/optimization_guide/proto/features/prompt_api.pb.h" #include "components/optimization_guide/proto/on_device_model_execution_config.pb.h" #include "components/optimization_guide/proto/string_value.pb.h" +#include "components/update_client/update_client.h" #include "content/public/browser/render_widget_host_view.h" #include "services/on_device_model/public/cpp/capabilities.h" #include "services/on_device_model/public/mojom/on_device_model.mojom.h" @@ -326,19 +328,19 @@ : 1); }); ON_CALL(*session, SetInput(_, _)) - .WillByDefault([&, initial = true]( - MultimodalMessage request_metadata, - SetInputCallback callback) mutable { - if (initial && !options.expected_context.empty()) { - initial = false; - EXPECT_THAT(ToString(request_metadata), - options.expected_context); - } else { - EXPECT_THAT( - ToString(request_metadata), - options.expected_context + options.expected_prompt); - } - }); + .WillByDefault( + [&, initial = true](MultimodalMessage request_metadata, + SetInputCallback callback) mutable { + if (initial && !options.expected_context.empty()) { + initial = false; + EXPECT_THAT(ToString(request_metadata), + options.expected_context); + } else { + EXPECT_THAT( + ToString(request_metadata), + options.expected_context + options.expected_prompt); + } + }); EXPECT_CALL(*session, ExecuteModelWithResponseConstraint(_, _, _)) .WillOnce( @@ -417,29 +419,30 @@ if (options.should_use_supported_language) { EXPECT_EQ(GetAIManagerDownloadProgressObserversSize(), 0u); - AITestUtils::MockModelDownloadProgressMonitor mock_monitor; - base::RunLoop download_progress_run_loop; - EXPECT_CALL(mock_monitor, OnDownloadProgressUpdate(_, _)) - .WillOnce(testing::Invoke([&](uint64_t downloaded_bytes, - uint64_t total_bytes) { - EXPECT_EQ( - downloaded_bytes, - static_cast<uint64_t>(AIUtils::kNormalizedDownloadProgressMax)); - EXPECT_EQ( - total_bytes, - static_cast<uint64_t>(AIUtils::kNormalizedDownloadProgressMax)); - download_progress_run_loop.Quit(); - })); + AITestUtils::FakeMonitor mock_monitor; + EXPECT_CALL(component_update_service_, GetComponentIDs()).Times(1); mock_remote->AddModelDownloadProgressObserver( mock_monitor.BindNewPipeAndPassRemote()); + ASSERT_TRUE(base::test::RunUntil([this] { return GetAIManagerDownloadProgressObserversSize() == 1u; })); - MockDownloadProgressUpdate(kTestModelDownloadSize, - kTestModelDownloadSize); - download_progress_run_loop.Run(); + // This is the component id of the on device model. The `AIManager` sends + // updates for it to the `CreateMonitor`s. + std::string model_component_id = + component_updater::OptimizationGuideOnDeviceModelInstallerPolicy:: + GetOnDeviceModelExtensionId(); + AITestUtils::FakeComponent model_component(model_component_id, + kTestModelDownloadSize); + + component_update_service_.SendUpdate(model_component.CreateUpdateItem( + update_client::ComponentState::kDownloading, kTestModelDownloadSize)); + + mock_monitor.ExpectReceivedNormalizedUpdate(0, kTestModelDownloadSize); + mock_monitor.ExpectReceivedNormalizedUpdate(kTestModelDownloadSize, + kTestModelDownloadSize); } std::vector<blink::mojom::AILanguageModelExpectedInputPtr> expected_inputs;
diff --git a/chrome/browser/ai/ai_manager.cc b/chrome/browser/ai/ai_manager.cc index daad545c..35efcaa 100644 --- a/chrome/browser/ai/ai_manager.cc +++ b/chrome/browser/ai/ai_manager.cc
@@ -31,6 +31,7 @@ #include "chrome/browser/ai/ai_utils.h" #include "chrome/browser/ai/ai_writer.h" #include "chrome/browser/ai/features.h" +#include "chrome/browser/component_updater/optimization_guide_on_device_model_installer.h" #include "chrome/browser/optimization_guide/optimization_guide_keyed_service.h" #include "chrome/browser/optimization_guide/optimization_guide_keyed_service_factory.h" #include "chrome/browser/profiles/profile.h" @@ -305,10 +306,11 @@ } // namespace -AIManager::AIManager(content::BrowserContext* browser_context, - content::RenderFrameHost* rfh) - : component_observer_( - std::make_unique<AIOnDeviceModelComponentObserver>(this)), +AIManager::AIManager( + content::BrowserContext* browser_context, + component_updater::ComponentUpdateService* component_update_service, + content::RenderFrameHost* rfh) + : component_update_service_(*component_update_service), context_bound_object_set_(GetPriorityFromVisibility(rfh)), browser_context_(browser_context) { if (rfh && rfh->GetRenderWidgetHost()) { @@ -758,9 +760,8 @@ // If the `OptimizationGuideKeyedService` cannot be retrieved, return false. if (!service) { - std::move(callback).Run( - blink::mojom::ModelAvailabilityCheckResult:: - kUnavailableServiceNotRunning); + std::move(callback).Run(blink::mojom::ModelAvailabilityCheckResult:: + kUnavailableServiceNotRunning); return; } @@ -783,9 +784,11 @@ // the reason. if (eligibility != optimization_guide::OnDeviceModelEligibilityReason::kSuccess) { + bool is_downloading = + model_download_progress_manager_.GetNumberOfReporters() >= 1; std::move(callback).Run( ConvertOnDeviceModelEligibilityReasonToModelAvailabilityCheckResult( - eligibility, component_observer_->is_downloading())); + eligibility, is_downloading)); return; } @@ -866,8 +869,9 @@ features::kAILanguageModelOverrideConfiguration)) { return std::min( kDefaultMaxTemperature, - float(features::kAILanguageModelOverrideConfigurationMaxTemperature - .Get())); + static_cast<float>( + features::kAILanguageModelOverrideConfigurationMaxTemperature + .Get())); } return kDefaultMaxTemperature; @@ -876,28 +880,10 @@ void AIManager::AddModelDownloadProgressObserver( mojo::PendingRemote<blink ::mojom::ModelDownloadProgressObserver> observer_remote) { - download_progress_observers_.Add(std::move(observer_remote)); -} - -void AIManager::SendDownloadProgressUpdate(uint64_t downloaded_bytes, - uint64_t total_bytes) { - for (auto& observer : download_progress_observers_) { - observer->OnDownloadProgressUpdate( - AIUtils::NormalizeModelDownloadProgress(downloaded_bytes, total_bytes), - AIUtils::kNormalizedDownloadProgressMax); - } -} - -void AIManager::SendDownloadProgressUpdateForTesting(uint64_t downloaded_bytes, - uint64_t total_bytes) { - SendDownloadProgressUpdate(downloaded_bytes, total_bytes); -} - -void AIManager::OnTextModelDownloadProgressChange( - base::PassKey<AIOnDeviceModelComponentObserver> observer_key, - uint64_t downloaded_bytes, - uint64_t total_bytes) { - SendDownloadProgressUpdate(downloaded_bytes, total_bytes); + model_download_progress_manager_.AddObserver( + &component_update_service_.get(), std::move(observer_remote), + {component_updater::OptimizationGuideOnDeviceModelInstallerPolicy:: + GetOnDeviceModelExtensionId()}); } void AIManager::RenderWidgetHostVisibilityChanged(
diff --git a/chrome/browser/ai/ai_manager.h b/chrome/browser/ai/ai_manager.h index 4dd5cd5..8c647aa 100644 --- a/chrome/browser/ai/ai_manager.h +++ b/chrome/browser/ai/ai_manager.h
@@ -13,7 +13,7 @@ #include "chrome/browser/ai/ai_context_bound_object_set.h" #include "chrome/browser/ai/ai_create_on_device_session_task.h" #include "chrome/browser/ai/ai_language_model.h" -#include "chrome/browser/ai/ai_on_device_model_component_observer.h" +#include "chrome/browser/ai/ai_model_download_progress_manager.h" #include "chrome/browser/ai/ai_summarizer.h" #include "chrome/browser/ai/ai_utils.h" #include "content/public/browser/browser_context.h" @@ -48,6 +48,7 @@ base::expected<std::unique_ptr<AILanguageModel>, blink::mojom::AIManagerCreateClientError>; AIManager(content::BrowserContext* browser_context, + component_updater::ComponentUpdateService* component_update_service, content::RenderFrameHost* rfh); AIManager(const AIManager&) = delete; AIManager& operator=(const AIManager&) = delete; @@ -69,15 +70,8 @@ } size_t GetDownloadProgressObserversSizeForTesting() { - return download_progress_observers_.size(); + return model_download_progress_manager_.GetNumberOfReporters(); } - void SendDownloadProgressUpdateForTesting(uint64_t downloaded_bytes, - uint64_t total_bytes); - - void OnTextModelDownloadProgressChange( - base::PassKey<AIOnDeviceModelComponentObserver> observer_key, - uint64_t downloaded_bytes, - uint64_t total_bytes); // Return the max top k value for the LanguageModel API. Note that this value // won't exceed the max top k defined by the underlying on-device model. @@ -155,9 +149,6 @@ const std::optional<const AILanguageModel::Context>& context = std::nullopt); - void SendDownloadProgressUpdate(uint64_t downloaded_bytes, - uint64_t total_bytes); - // content::RenderWidgetHostObserver: void RenderWidgetHostVisibilityChanged(content::RenderWidgetHost* widget_host, bool became_visible) override; @@ -171,10 +162,10 @@ optimization_guide::OnDeviceModelEligibilityReason eligibility); mojo::ReceiverSet<blink::mojom::AIManager> receivers_; - mojo::RemoteSet<blink::mojom::ModelDownloadProgressObserver> - download_progress_observers_; - std::unique_ptr<AIOnDeviceModelComponentObserver> component_observer_; + on_device_ai::AIModelDownloadProgressManager model_download_progress_manager_; + + raw_ref<component_updater::ComponentUpdateService> component_update_service_; AIContextBoundObjectSet context_bound_object_set_; raw_ptr<content::BrowserContext> browser_context_;
diff --git a/chrome/browser/ai/ai_manager_unittest.cc b/chrome/browser/ai/ai_manager_unittest.cc index 55f74fdb..0697cc8 100644 --- a/chrome/browser/ai/ai_manager_unittest.cc +++ b/chrome/browser/ai/ai_manager_unittest.cc
@@ -41,8 +41,9 @@ protected: void SetUp() override { AITestUtils::AITestBase::SetUp(); - ai_manager_ = std::make_unique<AIManager>(main_rfh()->GetBrowserContext(), - main_rfh()); + ai_manager_ = + std::make_unique<AIManager>(main_rfh()->GetBrowserContext(), + &component_update_service_, main_rfh()); } void TearDown() override {
diff --git a/chrome/browser/ai/ai_model_download_progress_manager.cc b/chrome/browser/ai/ai_model_download_progress_manager.cc index ba9b037..70c1071 100644 --- a/chrome/browser/ai/ai_model_download_progress_manager.cc +++ b/chrome/browser/ai/ai_model_download_progress_manager.cc
@@ -53,7 +53,7 @@ reporters_.erase(reporter); } -int AIModelDownloadProgressManager::GetNumberOfReportersForTesting() { +int AIModelDownloadProgressManager::GetNumberOfReporters() { return reporters_.size(); }
diff --git a/chrome/browser/ai/ai_model_download_progress_manager.h b/chrome/browser/ai/ai_model_download_progress_manager.h index 09c2216..6c11b74 100644 --- a/chrome/browser/ai/ai_model_download_progress_manager.h +++ b/chrome/browser/ai/ai_model_download_progress_manager.h
@@ -38,7 +38,7 @@ observer_remote, base::flat_set<std::string> component_ids); - int GetNumberOfReportersForTesting(); + int GetNumberOfReporters(); private: // Observes progress updates from the `component_update_service`, filters and
diff --git a/chrome/browser/ai/ai_model_download_progress_manager_unittest.cc b/chrome/browser/ai/ai_model_download_progress_manager_unittest.cc index 984bc079..004f5f21 100644 --- a/chrome/browser/ai/ai_model_download_progress_manager_unittest.cc +++ b/chrome/browser/ai/ai_model_download_progress_manager_unittest.cc
@@ -21,67 +21,26 @@ using testing::_; using update_client::ComponentState; -namespace { - -class FakeMonitor { - public: - mojo::PendingRemote<blink::mojom::ModelDownloadProgressObserver> - BindNewPipeAndPassRemote() { - return mock_monitor_.BindNewPipeAndPassRemote(); - } - - void ExpectReceivedUpdate(uint64_t expected_downloaded_bytes, - uint64_t expected_total_bytes) { - base::RunLoop download_progress_run_loop; - EXPECT_CALL(mock_monitor_, OnDownloadProgressUpdate(_, _)) - .WillOnce(testing::Invoke( - [&](uint64_t downloaded_bytes, uint64_t total_bytes) { - EXPECT_EQ(downloaded_bytes, expected_downloaded_bytes); - EXPECT_EQ(total_bytes, expected_total_bytes); - download_progress_run_loop.Quit(); - })); - download_progress_run_loop.Run(); - } - - // Same as `ExpectReceivedUpdate` except it normalizes - // `expected_downloaded_bytes` and `expected_total_bytes`. - void ExpectReceivedNormalizedUpdate(uint64_t expected_downloaded_bytes, - uint64_t expected_total_bytes) { - ExpectReceivedUpdate(AIUtils::NormalizeModelDownloadProgress( - expected_downloaded_bytes, expected_total_bytes), - AIUtils::kNormalizedDownloadProgressMax); - } - - void ExpectNoUpdate() { - EXPECT_CALL(mock_monitor_, OnDownloadProgressUpdate(_, _)).Times(0); - } - - private: - AITestUtils::MockModelDownloadProgressMonitor mock_monitor_; -}; - -} // namespace - class AIModelDownloadProgressManagerTest : public testing::Test { public: AIModelDownloadProgressManagerTest() = default; ~AIModelDownloadProgressManagerTest() override = default; protected: - AITestUtils::MockComponentUpdateService component_update_service_; - // Send a download update. - void SendUpdate(const AITestUtils::FakeComponent& monitor, + void SendUpdate(const AITestUtils::FakeComponent& component, ComponentState state, uint64_t downloaded_bytes) { component_update_service_.SendUpdate( - monitor.CreateUpdateItem(state, downloaded_bytes)); + component.CreateUpdateItem(state, downloaded_bytes)); } void FastForwardBy(base::TimeDelta delta) { task_environment_.FastForwardBy(delta); } + AITestUtils::MockComponentUpdateService component_update_service_; + private: void SetUp() override { EXPECT_CALL(component_update_service_, GetComponentIDs()).Times(1); @@ -95,16 +54,16 @@ AIModelDownloadProgressManager manager; // Should start with no reporters. - EXPECT_EQ(manager.GetNumberOfReportersForTesting(), 0); + EXPECT_EQ(manager.GetNumberOfReporters(), 0); AITestUtils::FakeComponent component("component_id", 100); { // Adding an Observer, should create a reporter. - FakeMonitor monitor1; + AITestUtils::FakeMonitor monitor1; manager.AddObserver(&component_update_service_, monitor1.BindNewPipeAndPassRemote(), {component.id()}); - EXPECT_EQ(manager.GetNumberOfReportersForTesting(), 1); + EXPECT_EQ(manager.GetNumberOfReporters(), 1); { // Adding a second observer we'll result in component ids being called @@ -112,26 +71,24 @@ EXPECT_CALL(component_update_service_, GetComponentIDs()).Times(1); // Adding an Observer, should create a reporter. - FakeMonitor monitor2; + AITestUtils::FakeMonitor monitor2; manager.AddObserver(&component_update_service_, monitor2.BindNewPipeAndPassRemote(), {component.id()}); - EXPECT_EQ(manager.GetNumberOfReportersForTesting(), 2); + EXPECT_EQ(manager.GetNumberOfReporters(), 2); } // `manager` should have destroyed the `Reporter` associated with // `monitor2`. - base::test::RunUntil( - [&]() { return manager.GetNumberOfReportersForTesting() == 1; }); + base::test::RunUntil([&]() { return manager.GetNumberOfReporters() == 1; }); } // `manager` should have destroyed the `Reporter` associated with // `monitor1`. - base::test::RunUntil( - [&]() { return manager.GetNumberOfReportersForTesting() == 0; }); + base::test::RunUntil([&]() { return manager.GetNumberOfReporters() == 0; }); } TEST_F(AIModelDownloadProgressManagerTest, FirstUpdateIsReportedAsZero) { AIModelDownloadProgressManager manager; - FakeMonitor monitor; + AITestUtils::FakeMonitor monitor; AITestUtils::FakeComponent component("component_id", 100); manager.AddObserver(&component_update_service_, @@ -152,7 +109,7 @@ TEST_F(AIModelDownloadProgressManagerTest, ProgressIsNormalized) { AIModelDownloadProgressManager manager; - FakeMonitor monitor; + AITestUtils::FakeMonitor monitor; AITestUtils::FakeComponent component("component_id", 100); manager.AddObserver(&component_update_service_, @@ -179,7 +136,7 @@ TEST_F(AIModelDownloadProgressManagerTest, AlreadyDownloadedBytesArentIncludedInProgress) { AIModelDownloadProgressManager manager; - FakeMonitor monitor; + AITestUtils::FakeMonitor monitor; AITestUtils::FakeComponent component("component_id", 100); int64_t already_downloaded_bytes = 10; @@ -209,7 +166,7 @@ TEST_F(AIModelDownloadProgressManagerTest, MaxIsSentWhenDownloadedBytesEqualsTotalBytes) { AIModelDownloadProgressManager manager; - FakeMonitor monitor; + AITestUtils::FakeMonitor monitor; AITestUtils::FakeComponent component( "component_id", AIUtils::kNormalizedDownloadProgressMax * 5); @@ -239,7 +196,7 @@ TEST_F(AIModelDownloadProgressManagerTest, MaxIsSentWhenDownloadedBytesEqualsTotalBytesForFirstUpdate) { AIModelDownloadProgressManager manager; - FakeMonitor monitor; + AITestUtils::FakeMonitor monitor; AITestUtils::FakeComponent component( "component_id", AIUtils::kNormalizedDownloadProgressMax * 5); @@ -257,7 +214,7 @@ TEST_F(AIModelDownloadProgressManagerTest, DoesntReceiveUpdatesForNonDownloadEvents) { AIModelDownloadProgressManager manager; - FakeMonitor monitor; + AITestUtils::FakeMonitor monitor; AITestUtils::FakeComponent component("component_id", 100); manager.AddObserver(&component_update_service_, @@ -282,7 +239,7 @@ TEST_F(AIModelDownloadProgressManagerTest, DoesntReceiveUpdatesForEventsWithNegativeDownloadedBytes) { AIModelDownloadProgressManager manager; - FakeMonitor monitor; + AITestUtils::FakeMonitor monitor; AITestUtils::FakeComponent component("component_id", 100); manager.AddObserver(&component_update_service_, @@ -297,7 +254,7 @@ TEST_F(AIModelDownloadProgressManagerTest, DoesntReceiveUpdatesForEventsWithNegativeTotalBytes) { AIModelDownloadProgressManager manager; - FakeMonitor monitor; + AITestUtils::FakeMonitor monitor; AITestUtils::FakeComponent component("component_id", -1); manager.AddObserver(&component_update_service_, @@ -312,7 +269,7 @@ TEST_F(AIModelDownloadProgressManagerTest, DoesntReceiveUpdatesForComponentsNotObserving) { AIModelDownloadProgressManager manager; - FakeMonitor monitor; + AITestUtils::FakeMonitor monitor; AITestUtils::FakeComponent component_observed("component_id1", 100); AITestUtils::FakeComponent component_not_observed("component_id2", 100); @@ -329,7 +286,7 @@ TEST_F(AIModelDownloadProgressManagerTest, ReceiveZeroAndHundredPercentForNoComponents) { AIModelDownloadProgressManager manager; - FakeMonitor monitor; + AITestUtils::FakeMonitor monitor; manager.AddObserver(&component_update_service_, monitor.BindNewPipeAndPassRemote(), {}); @@ -340,7 +297,7 @@ TEST_F(AIModelDownloadProgressManagerTest, OnlyReceivesUpdatesEvery50ms) { AIModelDownloadProgressManager manager; - FakeMonitor monitor; + AITestUtils::FakeMonitor monitor; AITestUtils::FakeComponent component("component_id", 100); manager.AddObserver(&component_update_service_, @@ -368,7 +325,7 @@ TEST_F(AIModelDownloadProgressManagerTest, OnlyReceivesUpdatesForNewProgress) { AIModelDownloadProgressManager manager; - FakeMonitor monitor; + AITestUtils::FakeMonitor monitor; // Set its total to twice kNormalizedProgressMax so that there are two raw // download progresses that map to every normalized download progress. AITestUtils::FakeComponent component( @@ -409,7 +366,7 @@ TEST_F(AIModelDownloadProgressManagerTest, ShouldReceive100percent) { AIModelDownloadProgressManager manager; - FakeMonitor monitor; + AITestUtils::FakeMonitor monitor; AITestUtils::FakeComponent component("component_id", 100); manager.AddObserver(&component_update_service_, @@ -432,7 +389,7 @@ TEST_F(AIModelDownloadProgressManagerTest, AllComponentsMustBeObservedBeforeSendingEvents) { AIModelDownloadProgressManager manager; - FakeMonitor monitor; + AITestUtils::FakeMonitor monitor; AITestUtils::FakeComponent component1("component_id1", 100); AITestUtils::FakeComponent component2("component_id2", 1000); @@ -454,7 +411,7 @@ TEST_F(AIModelDownloadProgressManagerTest, ProgressIsNormalizedAgainstTheSumOfTheComponentsTotalBytes) { AIModelDownloadProgressManager manager; - FakeMonitor monitor; + AITestUtils::FakeMonitor monitor; AITestUtils::FakeComponent component1("component_id1", 100); AITestUtils::FakeComponent component2("component_id2", 1000); @@ -494,7 +451,7 @@ TEST_F(AIModelDownloadProgressManagerTest, AlreadyDownloadedBytesArentIncludedInProgressForMultipleComponents) { AIModelDownloadProgressManager manager; - FakeMonitor monitor; + AITestUtils::FakeMonitor monitor; AITestUtils::FakeComponent component1("component_id1", 100); AITestUtils::FakeComponent component2("component_id2", 1000); int64_t already_downloaded_bytes = 0; @@ -559,7 +516,7 @@ TEST_F(AIModelDownloadProgressManagerHasPreviousDownloadsTest, AlreadyInstalledComponentsAreNotObserved) { AIModelDownloadProgressManager manager; - FakeMonitor monitor; + AITestUtils::FakeMonitor monitor; AITestUtils::FakeComponent component1("component_id1", 100); AITestUtils::FakeComponent component2("component_id2", 1000); @@ -579,7 +536,7 @@ TEST_F(AIModelDownloadProgressManagerHasPreviousDownloadsTest, ProgressIsNormalizedAgainstOnlyUninstalledComponents) { AIModelDownloadProgressManager manager; - FakeMonitor monitor; + AITestUtils::FakeMonitor monitor; AITestUtils::FakeComponent component1("component_id1", 100); AITestUtils::FakeComponent component2("component_id2", 1000); AITestUtils::FakeComponent component3("component_id3", 500); @@ -609,7 +566,7 @@ TEST_F(AIModelDownloadProgressManagerHasPreviousDownloadsTest, ReceiveZeroAndHundredPercentWhenEverythingIsInstalled) { AIModelDownloadProgressManager manager; - FakeMonitor monitor; + AITestUtils::FakeMonitor monitor; AITestUtils::FakeComponent component1("component_id1", 100); AITestUtils::FakeComponent component2("component_id2", 1000);
diff --git a/chrome/browser/ai/ai_on_device_model_component_observer.cc b/chrome/browser/ai/ai_on_device_model_component_observer.cc deleted file mode 100644 index 4d9568d8..0000000 --- a/chrome/browser/ai/ai_on_device_model_component_observer.cc +++ /dev/null
@@ -1,46 +0,0 @@ -// Copyright 2024 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/ai/ai_on_device_model_component_observer.h" - -#include "base/types/pass_key.h" -#include "chrome/browser/ai/ai_manager.h" -#include "chrome/browser/browser_process.h" -#include "chrome/browser/component_updater/optimization_guide_on_device_model_installer.h" -#include "components/update_client/crx_update_item.h" -#include "components/update_client/update_client.h" - -using update_client::ComponentState; - -AIOnDeviceModelComponentObserver::AIOnDeviceModelComponentObserver( - AIManager* ai_manager) - : ai_manager_(ai_manager) { - if (g_browser_process->component_updater()) { - component_updater_observation_.Observe( - g_browser_process->component_updater()); - } -} - -AIOnDeviceModelComponentObserver::~AIOnDeviceModelComponentObserver() { - component_updater_observation_.Reset(); -} - -void AIOnDeviceModelComponentObserver::OnEvent( - const component_updater::CrxUpdateItem& item) { - if (item.id != - component_updater::OptimizationGuideOnDeviceModelInstallerPolicy:: - GetOnDeviceModelExtensionId()) { - return; - } - - is_downloading_ = item.state == ComponentState::kDownloading || - item.state == ComponentState::kDownloadingDiff || - item.state == ComponentState::kUpdating || - item.state == ComponentState::kUpdatingDiff; - if (is_downloading_ && item.downloaded_bytes >= 0 && item.total_bytes >= 0) { - ai_manager_->OnTextModelDownloadProgressChange( - base::PassKey<AIOnDeviceModelComponentObserver>(), - item.downloaded_bytes, item.total_bytes); - } -}
diff --git a/chrome/browser/ai/ai_on_device_model_component_observer.h b/chrome/browser/ai/ai_on_device_model_component_observer.h deleted file mode 100644 index 2d9488f..0000000 --- a/chrome/browser/ai/ai_on_device_model_component_observer.h +++ /dev/null
@@ -1,38 +0,0 @@ -// Copyright 2024 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_AI_AI_ON_DEVICE_MODEL_COMPONENT_OBSERVER_H_ -#define CHROME_BROWSER_AI_AI_ON_DEVICE_MODEL_COMPONENT_OBSERVER_H_ - -#include "base/memory/raw_ptr.h" -#include "base/scoped_observation.h" -#include "components/component_updater/component_updater_service.h" - -class AIManager; - -class AIOnDeviceModelComponentObserver - : public component_updater::ServiceObserver { - public: - explicit AIOnDeviceModelComponentObserver(AIManager* ai_manager); - ~AIOnDeviceModelComponentObserver() override; - AIOnDeviceModelComponentObserver(const AIOnDeviceModelComponentObserver&) = - delete; - AIOnDeviceModelComponentObserver& operator=( - const AIOnDeviceModelComponentObserver&) = delete; - - bool is_downloading() { return is_downloading_; } - - protected: - // component_updater::ServiceObserver: - void OnEvent(const component_updater::CrxUpdateItem& item) override; - - private: - base::ScopedObservation<component_updater::ComponentUpdateService, - component_updater::ComponentUpdateService::Observer> - component_updater_observation_{this}; - bool is_downloading_ = false; - raw_ptr<AIManager> ai_manager_; -}; - -#endif // CHROME_BROWSER_AI_AI_ON_DEVICE_MODEL_COMPONENT_OBSERVER_H_
diff --git a/chrome/browser/ai/ai_test_utils.cc b/chrome/browser/ai/ai_test_utils.cc index 94b4b6c..e0cd525 100644 --- a/chrome/browser/ai/ai_test_utils.cc +++ b/chrome/browser/ai/ai_test_utils.cc
@@ -48,6 +48,38 @@ return receiver_.BindNewPipeAndPassRemote(); } +mojo::PendingRemote<blink::mojom::ModelDownloadProgressObserver> +AITestUtils::FakeMonitor::BindNewPipeAndPassRemote() { + return mock_monitor_.BindNewPipeAndPassRemote(); +} + +void AITestUtils::FakeMonitor::ExpectReceivedUpdate( + uint64_t expected_downloaded_bytes, + uint64_t expected_total_bytes) { + base::RunLoop download_progress_run_loop; + EXPECT_CALL(mock_monitor_, OnDownloadProgressUpdate(testing::_, testing::_)) + .WillOnce( + testing::Invoke([&](uint64_t downloaded_bytes, uint64_t total_bytes) { + EXPECT_EQ(downloaded_bytes, expected_downloaded_bytes); + EXPECT_EQ(total_bytes, expected_total_bytes); + download_progress_run_loop.Quit(); + })); + download_progress_run_loop.Run(); +} + +void AITestUtils::FakeMonitor::ExpectReceivedNormalizedUpdate( + uint64_t expected_downloaded_bytes, + uint64_t expected_total_bytes) { + ExpectReceivedUpdate(AIUtils::NormalizeModelDownloadProgress( + expected_downloaded_bytes, expected_total_bytes), + AIUtils::kNormalizedDownloadProgressMax); +} + +void AITestUtils::FakeMonitor::ExpectNoUpdate() { + EXPECT_CALL(mock_monitor_, OnDownloadProgressUpdate(testing::_, testing::_)) + .Times(0); +} + AITestUtils::FakeComponent::FakeComponent(std::string id, uint64_t total_bytes) : id_(std::move(id)), total_bytes_(total_bytes) {} @@ -87,8 +119,8 @@ void AITestUtils::AITestBase::SetUp() { ChromeRenderViewHostTestHarness::SetUp(); - ai_manager_ = - std::make_unique<AIManager>(main_rfh()->GetBrowserContext(), main_rfh()); + ai_manager_ = std::make_unique<AIManager>( + main_rfh()->GetBrowserContext(), &component_update_service_, main_rfh()); } void AITestUtils::AITestBase::TearDown() { @@ -159,13 +191,6 @@ return ai_manager_->GetContextBoundObjectSetSizeForTesting(); } -void AITestUtils::AITestBase::MockDownloadProgressUpdate( - uint64_t downloaded_bytes, - uint64_t total_bytes) { - ai_manager_->SendDownloadProgressUpdateForTesting(downloaded_bytes, - total_bytes); -} - // static const optimization_guide::TokenLimits& AITestUtils::GetFakeTokenLimits() { static const optimization_guide::TokenLimits limits{
diff --git a/chrome/browser/ai/ai_test_utils.h b/chrome/browser/ai/ai_test_utils.h index 34160ab..4f85cad 100644 --- a/chrome/browser/ai/ai_test_utils.h +++ b/chrome/browser/ai/ai_test_utils.h
@@ -129,6 +129,25 @@ mojo::Receiver<blink::mojom::AILanguageModelAppendClient> receiver_{this}; }; + class FakeMonitor { + public: + mojo::PendingRemote<blink::mojom::ModelDownloadProgressObserver> + BindNewPipeAndPassRemote(); + + void ExpectReceivedUpdate(uint64_t expected_downloaded_bytes, + uint64_t expected_total_bytes); + + // Same as `ExpectReceivedUpdate` except it normalizes + // `expected_downloaded_bytes` and `expected_total_bytes`. + void ExpectReceivedNormalizedUpdate(uint64_t expected_downloaded_bytes, + uint64_t expected_total_bytes); + + void ExpectNoUpdate(); + + private: + AITestUtils::MockModelDownloadProgressMonitor mock_monitor_; + }; + class FakeComponent { public: FakeComponent(std::string id, uint64_t total_bytes); @@ -186,12 +205,11 @@ mojo::Remote<blink::mojom::AIManager> GetAIManagerRemote(); size_t GetAIManagerContextBoundObjectSetSize(); size_t GetAIManagerDownloadProgressObserversSize(); - void MockDownloadProgressUpdate(uint64_t downloaded_bytes, - uint64_t total_bytes); raw_ptr<MockOptimizationGuideKeyedService> mock_optimization_guide_keyed_service_; testing::NiceMock<optimization_guide::MockSession> session_; + AITestUtils::MockComponentUpdateService component_update_service_; private: std::unique_ptr<AIManager> ai_manager_;
diff --git a/chrome/browser/android/browserservices/intents/java/src/org/chromium/chrome/browser/browserservices/intents/MergedWebappInfo.java b/chrome/browser/android/browserservices/intents/java/src/org/chromium/chrome/browser/browserservices/intents/MergedWebappInfo.java index 5b37b131..272baf609 100644 --- a/chrome/browser/android/browserservices/intents/java/src/org/chromium/chrome/browser/browserservices/intents/MergedWebappInfo.java +++ b/chrome/browser/android/browserservices/intents/java/src/org/chromium/chrome/browser/browserservices/intents/MergedWebappInfo.java
@@ -21,7 +21,7 @@ @NullMarked public class MergedWebappInfo extends WebappInfo { // The old WebappInfo values (typically the current values for a webapp being upgraded). - private WebappInfo mOldWebappInfo; + private final WebappInfo mOldWebappInfo; // Whether to override the name and shortName information returned to callers. private boolean mUseOldName;
diff --git a/chrome/browser/android/browserservices/intents/java/src/org/chromium/chrome/browser/browserservices/intents/WebApkInfoTest.java b/chrome/browser/android/browserservices/intents/java/src/org/chromium/chrome/browser/browserservices/intents/WebApkInfoTest.java index ea396f4..c4cf6ec3 100644 --- a/chrome/browser/android/browserservices/intents/java/src/org/chromium/chrome/browser/browserservices/intents/WebApkInfoTest.java +++ b/chrome/browser/android/browserservices/intents/java/src/org/chromium/chrome/browser/browserservices/intents/WebApkInfoTest.java
@@ -77,14 +77,14 @@ /** Fakes the Resources object, allowing lookup of String value. */ private static class FakeResources extends Resources { - private static AssetManager sAssetManager = createAssetManager(); + private static final AssetManager sAssetManager = createAssetManager(); private final Map<String, Integer> mStringIdMap; private final Map<Integer, String> mIdValueMap; private String mShortcutsXmlContents; private String mPrimaryIconXmlContents; private class MockXmlResourceParserImpl extends XmlResourceParserImpl { - String mPackageName; + final String mPackageName; public MockXmlResourceParserImpl( Document document,
diff --git a/chrome/browser/android/browserservices/intents/java/src/org/chromium/chrome/browser/browserservices/intents/WebApkShareTarget.java b/chrome/browser/android/browserservices/intents/java/src/org/chromium/chrome/browser/browserservices/intents/WebApkShareTarget.java index 0e3f97f..26d2319 100644 --- a/chrome/browser/android/browserservices/intents/java/src/org/chromium/chrome/browser/browserservices/intents/WebApkShareTarget.java +++ b/chrome/browser/android/browserservices/intents/java/src/org/chromium/chrome/browser/browserservices/intents/WebApkShareTarget.java
@@ -15,11 +15,11 @@ private static final int ACTION_INDEX = 0; private static final int PARAM_TITLE_INDEX = 1; private static final int PARAM_TEXT_INDEX = 2; - private String[] mData; - private boolean mIsShareMethodPost; - private boolean mIsShareEncTypeMultipart; - private String[] mFileNames; - private String[][] mFileAccepts; + private final String[] mData; + private final boolean mIsShareMethodPost; + private final boolean mIsShareEncTypeMultipart; + private final String[] mFileNames; + private final String[][] mFileAccepts; public WebApkShareTarget( String action,
diff --git a/chrome/browser/android/browserservices/verification/java/src/org/chromium/chrome/browser/browserservices/verification/ChromeOriginVerifierJunitTest.java b/chrome/browser/android/browserservices/verification/java/src/org/chromium/chrome/browser/browserservices/verification/ChromeOriginVerifierJunitTest.java index 5ceb3f0..3d07a45 100644 --- a/chrome/browser/android/browserservices/verification/java/src/org/chromium/chrome/browser/browserservices/verification/ChromeOriginVerifierJunitTest.java +++ b/chrome/browser/android/browserservices/verification/java/src/org/chromium/chrome/browser/browserservices/verification/ChromeOriginVerifierJunitTest.java
@@ -44,8 +44,8 @@ public static final String TEST_BATCH_NAME = "chrome_origin_verifier"; private static final String PACKAGE_NAME = "org.chromium.com"; - private int mUid = Process.myUid(); - private Origin mHttpsOrigin = Origin.create("https://www.example.com"); + private final int mUid = Process.myUid(); + private final Origin mHttpsOrigin = Origin.create("https://www.example.com"); private ChromeOriginVerifier mChromeVerifier; @@ -57,10 +57,10 @@ @Mock private ChromeOriginVerifier.Natives mMockChromeOriginVerifierJni; - private CountDownLatch mVerificationResultLatch = new CountDownLatch(1); + private final CountDownLatch mVerificationResultLatch = new CountDownLatch(1); private static class TestOriginVerificationListener implements OriginVerificationListener { - private CountDownLatch mLatch; + private final CountDownLatch mLatch; private boolean mVerified; TestOriginVerificationListener(CountDownLatch latch) {
diff --git a/chrome/browser/android/browserservices/verification/java/src/org/chromium/chrome/browser/browserservices/verification/ChromeOriginVerifierTest.java b/chrome/browser/android/browserservices/verification/java/src/org/chromium/chrome/browser/browserservices/verification/ChromeOriginVerifierTest.java index 85842702..6e9aea5d 100644 --- a/chrome/browser/android/browserservices/verification/java/src/org/chromium/chrome/browser/browserservices/verification/ChromeOriginVerifierTest.java +++ b/chrome/browser/android/browserservices/verification/java/src/org/chromium/chrome/browser/browserservices/verification/ChromeOriginVerifierTest.java
@@ -54,7 +54,7 @@ private TestExternalAuthUtils mExternalAuthUtils; private static class TestExternalAuthUtils extends ExternalAuthUtils { - private List<Pair<String, Origin>> mAllowlist = new ArrayList<>(); + private final List<Pair<String, Origin>> mAllowlist = new ArrayList<>(); public void addToAllowlist(String packageName, Origin origin) { mAllowlist.add(Pair.create(packageName, origin));
diff --git a/chrome/browser/android/common/java/src/org/chromium/chrome/browser/common/ChromeUrlConstants.java b/chrome/browser/android/common/java/src/org/chromium/chrome/browser/common/ChromeUrlConstants.java index 08327ae0..c36024b 100644 --- a/chrome/browser/android/common/java/src/org/chromium/chrome/browser/common/ChromeUrlConstants.java +++ b/chrome/browser/android/common/java/src/org/chromium/chrome/browser/common/ChromeUrlConstants.java
@@ -17,7 +17,7 @@ private static class Holder { private static final String SERIALIZED_NATIVE_NTP_URL = "82,1,true,0,13,0,-1,0,-1,16,6,0,-1,22,1,0,-1,0,-1,false,false,chrome-native://newtab/"; - private static GURL sNativeNtpGurl = + private static final GURL sNativeNtpGurl = GURL.deserializeLatestVersionOnly(SERIALIZED_NATIVE_NTP_URL.replace(',', '\0')); }
diff --git a/chrome/browser/android/customtabs/branding/java/src/org/chromium/chrome/browser/customtabs/features/branding/BrandingController.java b/chrome/browser/android/customtabs/branding/java/src/org/chromium/chrome/browser/customtabs/features/branding/BrandingController.java index d93fd0f..019050a 100644 --- a/chrome/browser/android/customtabs/branding/java/src/org/chromium/chrome/browser/customtabs/features/branding/BrandingController.java +++ b/chrome/browser/android/customtabs/branding/java/src/org/chromium/chrome/browser/customtabs/features/branding/BrandingController.java
@@ -63,7 +63,7 @@ private long mToolbarInitializedTime; private boolean mIsDestroyed; - private Supplier<MismatchNotificationChecker> mMismatchNotificationChecker; + private final Supplier<MismatchNotificationChecker> mMismatchNotificationChecker; /** * Branding controller responsible for showing branding.
diff --git a/chrome/browser/android/customtabs/branding/java/src/org/chromium/chrome/browser/customtabs/features/branding/MismatchNotificationCheckerUnitTest.java b/chrome/browser/android/customtabs/branding/java/src/org/chromium/chrome/browser/customtabs/features/branding/MismatchNotificationCheckerUnitTest.java index 009c4b4..bb33508 100644 --- a/chrome/browser/android/customtabs/branding/java/src/org/chromium/chrome/browser/customtabs/features/branding/MismatchNotificationCheckerUnitTest.java +++ b/chrome/browser/android/customtabs/branding/java/src/org/chromium/chrome/browser/customtabs/features/branding/MismatchNotificationCheckerUnitTest.java
@@ -117,7 +117,7 @@ private CoreAccountInfo mCoreAccountInfo; private Callback<MismatchNotificationData> mOnClose; - private MismatchNotificationData.AppUiData mAppData = + private final MismatchNotificationData.AppUiData mAppData = new MismatchNotificationData.AppUiData(); public MismatchNotificationCheckerTester newChecker() {
diff --git a/chrome/browser/android/customtabs/branding/java/src/org/chromium/chrome/browser/customtabs/features/branding/ToolbarBrandingOverlayCoordinator.java b/chrome/browser/android/customtabs/branding/java/src/org/chromium/chrome/browser/customtabs/features/branding/ToolbarBrandingOverlayCoordinator.java index 3ba15a00..dcb2d90 100644 --- a/chrome/browser/android/customtabs/branding/java/src/org/chromium/chrome/browser/customtabs/features/branding/ToolbarBrandingOverlayCoordinator.java +++ b/chrome/browser/android/customtabs/branding/java/src/org/chromium/chrome/browser/customtabs/features/branding/ToolbarBrandingOverlayCoordinator.java
@@ -31,7 +31,7 @@ @VisibleForTesting static final int HIDING_DURATION_MS = 300; private @Nullable View mView; - private PropertyModel mModel; + private final PropertyModel mModel; private @Nullable ValueAnimator mHidingAnimator; /**
diff --git a/chrome/browser/android/examples/custom_tabs_client/src/java/org/chromium/customtabsclient/MainActivity.java b/chrome/browser/android/examples/custom_tabs_client/src/java/org/chromium/customtabsclient/MainActivity.java index 8204f5a7..cfc43cd 100644 --- a/chrome/browser/android/examples/custom_tabs_client/src/java/org/chromium/customtabsclient/MainActivity.java +++ b/chrome/browser/android/examples/custom_tabs_client/src/java/org/chromium/customtabsclient/MainActivity.java
@@ -239,11 +239,11 @@ } /** Once per second, asks the framework for the process importance, and logs any change. */ - private Runnable mLogImportance = + private final Runnable mLogImportance = new Runnable() { private int mPreviousImportance = -1; private boolean mPreviousServiceInUse; - private Handler mHandler = new Handler(Looper.getMainLooper()); + private final Handler mHandler = new Handler(Looper.getMainLooper()); @Override public void run() {
diff --git a/chrome/browser/android/examples/custom_tabs_client/src/java/org/chromium/customtabsclient/shared/ServiceConnection.java b/chrome/browser/android/examples/custom_tabs_client/src/java/org/chromium/customtabsclient/shared/ServiceConnection.java index 97803a6..5b6bc81 100644 --- a/chrome/browser/android/examples/custom_tabs_client/src/java/org/chromium/customtabsclient/shared/ServiceConnection.java +++ b/chrome/browser/android/examples/custom_tabs_client/src/java/org/chromium/customtabsclient/shared/ServiceConnection.java
@@ -20,7 +20,7 @@ @NullMarked public class ServiceConnection extends CustomTabsServiceConnection { // A weak reference to the ServiceConnectionCallback to avoid leaking it. - private WeakReference<ServiceConnectionCallback> mConnectionCallback; + private final WeakReference<ServiceConnectionCallback> mConnectionCallback; public ServiceConnection(ServiceConnectionCallback connectionCallback) { mConnectionCallback = new WeakReference<>(connectionCallback);
diff --git a/chrome/browser/android/metrics/java/src/org/chromium/chrome/browser/metrics/AppUpdateInfoUtils.java b/chrome/browser/android/metrics/java/src/org/chromium/chrome/browser/metrics/AppUpdateInfoUtils.java index 329816cf..9e6ab56 100644 --- a/chrome/browser/android/metrics/java/src/org/chromium/chrome/browser/metrics/AppUpdateInfoUtils.java +++ b/chrome/browser/android/metrics/java/src/org/chromium/chrome/browser/metrics/AppUpdateInfoUtils.java
@@ -12,7 +12,7 @@ /** Utility class for native to request AppUpdateInfo */ @NullMarked public class AppUpdateInfoUtils { - private static @Nullable AppUpdateInfoDelegate sDelegate = + private static final @Nullable AppUpdateInfoDelegate sDelegate = ServiceLoaderUtil.maybeCreate(AppUpdateInfoDelegate.class); @CalledByNative
diff --git a/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/AutofillImageFetcher.java b/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/AutofillImageFetcher.java index 87c94052..f9fedec 100644 --- a/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/AutofillImageFetcher.java +++ b/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/AutofillImageFetcher.java
@@ -46,7 +46,7 @@ private final Map<String, Integer> mFetchAttemptCounter = new HashMap<>(); private final Map<String, Bitmap> mImagesCache = new HashMap<>(); - private ImageFetcher mImageFetcher; + private final ImageFetcher mImageFetcher; @CalledByNative private static AutofillImageFetcher create(SimpleFactoryKeyHandle key) {
diff --git a/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManager.java b/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManager.java index 8737cdb..dd1a783 100644 --- a/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManager.java +++ b/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManager.java
@@ -61,8 +61,8 @@ // marshaled and compared as strings. To save conversions, we sometimes use strings. private String mGUID; private String mOrigin; - private boolean mIsLocal; - private boolean mIsVirtual; + private final boolean mIsLocal; + private final boolean mIsVirtual; private String mName; private String mNumber; private String mNetworkAndLastFourDigits; @@ -80,8 +80,8 @@ private String mNickname; private @Nullable GURL mCardArtUrl; private String mCvc; - private String mIssuerId; - private @Nullable GURL mProductTermsUrl; + private final String mIssuerId; + private final @Nullable GURL mProductTermsUrl; private final @VirtualCardEnrollmentState int mVirtualCardEnrollmentState; private final String mProductDescription; private final String mCardNameForAutofillDisplay; @@ -448,14 +448,14 @@ /** Autofill IBAN information. */ public static class Iban { - private @Nullable String mGuid; - private @Nullable Long mInstrumentId; + private final @Nullable String mGuid; + private final @Nullable Long mInstrumentId; // Obfuscated IBAN value. This is used for displaying the IBAN in the Payment methods page. - private String mLabel; + private final String mLabel; private String mNickname; - private @IbanRecordType int mRecordType; + private final @IbanRecordType int mRecordType; // Value is empty for server IBAN. private @Nullable String mValue;
diff --git a/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManagerFactory.java b/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManagerFactory.java index c42fe01..cfed20e 100644 --- a/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManagerFactory.java +++ b/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/PersonalDataManagerFactory.java
@@ -14,7 +14,7 @@ /** Provides access to {@link PersonalDataManager}s for a given {@link Profile}. */ @NullMarked public class PersonalDataManagerFactory { - private static ProfileKeyedMap<PersonalDataManager> sProfileMap = + private static final ProfileKeyedMap<PersonalDataManager> sProfileMap = ProfileKeyedMap.createMapOfDestroyables( ProfileKeyedMap.ProfileSelection.REDIRECTED_TO_ORIGINAL); private static @Nullable PersonalDataManager sManagerForTesting;
diff --git a/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/editors/EditorFieldValidator.java b/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/editors/EditorFieldValidator.java index 9e90347c..6033fac 100644 --- a/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/editors/EditorFieldValidator.java +++ b/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/editors/EditorFieldValidator.java
@@ -36,7 +36,7 @@ /** Builder for the {@link EditorFieldValidator}. */ public static class Builder { - private EditorFieldValidator mValidator; + private final EditorFieldValidator mValidator; public Builder() { mValidator = new EditorFieldValidator();
diff --git a/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/editors/TextFieldView.java b/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/editors/TextFieldView.java index f79a0901..da14d11 100644 --- a/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/editors/TextFieldView.java +++ b/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/editors/TextFieldView.java
@@ -67,10 +67,10 @@ return true; }; - private PropertyModel mEditorFieldModel; - private TextInputLayout mInputLayout; - private AutoCompleteTextView mInput; - private View mIconsLayer; + private final PropertyModel mEditorFieldModel; + private final TextInputLayout mInputLayout; + private final AutoCompleteTextView mInput; + private final View mIconsLayer; private @Nullable EditorFieldValidator mValidator; private @Nullable TextWatcher mTextFormatter; private boolean mInFocusChange;
diff --git a/chrome/browser/autofill/android/javatest/src/org/chromium/chrome/browser/autofill/editors/AddressEditorRenderTest.java b/chrome/browser/autofill/android/javatest/src/org/chromium/chrome/browser/autofill/editors/AddressEditorRenderTest.java index 6f51fe0..f9671c3 100644 --- a/chrome/browser/autofill/android/javatest/src/org/chromium/chrome/browser/autofill/editors/AddressEditorRenderTest.java +++ b/chrome/browser/autofill/android/javatest/src/org/chromium/chrome/browser/autofill/editors/AddressEditorRenderTest.java
@@ -125,7 +125,7 @@ public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule(); @ParameterAnnotations.ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = new NightModeTestUtils.NightModeParams().getParameters(); @Rule
diff --git a/chrome/browser/auxiliary_search/java/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchBridge.java b/chrome/browser/auxiliary_search/java/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchBridge.java index 46d038c..8c97eec2 100644 --- a/chrome/browser/auxiliary_search/java/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchBridge.java +++ b/chrome/browser/auxiliary_search/java/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchBridge.java
@@ -25,7 +25,7 @@ /** Java bridge to provide information for the auxiliary search. */ @NullMarked public class AuxiliarySearchBridge { - private long mNativeBridge; + private final long mNativeBridge; /** * Constructs a bridge for the auxiliary search provider.
diff --git a/chrome/browser/auxiliary_search/java/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchConfigManager.java b/chrome/browser/auxiliary_search/java/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchConfigManager.java index 4068d39fd..20884f36 100644 --- a/chrome/browser/auxiliary_search/java/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchConfigManager.java +++ b/chrome/browser/auxiliary_search/java/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchConfigManager.java
@@ -25,7 +25,7 @@ /** Static class that implements the initialization-on-demand holder idiom. */ private static class LazyHolder { - static AuxiliarySearchConfigManager sInstance = new AuxiliarySearchConfigManager(); + static final AuxiliarySearchConfigManager sInstance = new AuxiliarySearchConfigManager(); } /** Returns the singleton instance of AuxiliarySearchConfigManager. */
diff --git a/chrome/browser/auxiliary_search/java/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchControllerFactory.java b/chrome/browser/auxiliary_search/java/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchControllerFactory.java index 457a73c1..966ca86 100644 --- a/chrome/browser/auxiliary_search/java/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchControllerFactory.java +++ b/chrome/browser/auxiliary_search/java/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchControllerFactory.java
@@ -36,7 +36,8 @@ /** Static class that implements the initialization-on-demand holder idiom. */ private static class LazyHolder { - static AuxiliarySearchControllerFactory sInstance = new AuxiliarySearchControllerFactory(); + static final AuxiliarySearchControllerFactory sInstance = + new AuxiliarySearchControllerFactory(); } /** Returns the singleton instance of AuxiliarySearchControllerFactory. */
diff --git a/chrome/browser/auxiliary_search/java/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchDonor.java b/chrome/browser/auxiliary_search/java/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchDonor.java index 82c6dae8..c56e221 100644 --- a/chrome/browser/auxiliary_search/java/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchDonor.java +++ b/chrome/browser/auxiliary_search/java/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchDonor.java
@@ -113,12 +113,12 @@ private @Nullable Callback<Boolean> mPendingCallback; private boolean mSharedTabsWithOsState; private @Nullable Boolean mIsDeviceCompatible; - private boolean mSupportMultiDataSource; + private final boolean mSupportMultiDataSource; private boolean mIsCreatedSessionAndInitForTesting; /** Static class that implements the initialization-on-demand holder idiom. */ private static class LazyHolder { - static AuxiliarySearchDonor sInstance = new AuxiliarySearchDonor(); + static final AuxiliarySearchDonor sInstance = new AuxiliarySearchDonor(); } /** Returns the singleton instance of AuxiliarySearchDonor. */
diff --git a/chrome/browser/auxiliary_search/java/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchMultiDataControllerImpl.java b/chrome/browser/auxiliary_search/java/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchMultiDataControllerImpl.java index 1dbaf0c..85b93f4 100644 --- a/chrome/browser/auxiliary_search/java/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchMultiDataControllerImpl.java +++ b/chrome/browser/auxiliary_search/java/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchMultiDataControllerImpl.java
@@ -45,7 +45,7 @@ private boolean mExpectDonating; // A set of ActivityLifecycleDispatcher that this controller tracks. - private Set<ActivityLifecycleDispatcher> mActivityLifecycleDispatcherSet; + private final Set<ActivityLifecycleDispatcher> mActivityLifecycleDispatcherSet; // It is null when the controller doesn't observe top sites changes. private @Nullable AuxiliarySearchTopSiteProviderBridge mAuxiliarySearchTopSiteProviderBridge;
diff --git a/chrome/browser/auxiliary_search/java/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchProvider.java b/chrome/browser/auxiliary_search/java/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchProvider.java index a14456f..cb208cf 100644 --- a/chrome/browser/auxiliary_search/java/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchProvider.java +++ b/chrome/browser/auxiliary_search/java/src/org/chromium/chrome/browser/auxiliary_search/AuxiliarySearchProvider.java
@@ -77,10 +77,9 @@ private final Context mContext; private final Profile mProfile; - private final @AuxiliarySearchHostType int mHostType; private final @Nullable TabModelSelector mTabModelSelector; - private Long mTabMaxAgeMillis; + private final Long mTabMaxAgeMillis; @Nullable private AuxiliarySearchBridge mAuxiliarySearchBridge; public AuxiliarySearchProvider( @@ -90,8 +89,7 @@ @AuxiliarySearchHostType int hostType) { mContext = context; mProfile = profile; - mHostType = hostType; - if (mHostType == AuxiliarySearchHostType.CTA) { + if (hostType == AuxiliarySearchHostType.CTA) { mAuxiliarySearchBridge = new AuxiliarySearchBridge(mProfile); } mTabModelSelector = tabModelSelector;
diff --git a/chrome/browser/back_press/android/java/src/org/chromium/chrome/browser/back_press/BackPressManagerTest.java b/chrome/browser/back_press/android/java/src/org/chromium/chrome/browser/back_press/BackPressManagerTest.java index 399828b3..721896e 100644 --- a/chrome/browser/back_press/android/java/src/org/chromium/chrome/browser/back_press/BackPressManagerTest.java +++ b/chrome/browser/back_press/android/java/src/org/chromium/chrome/browser/back_press/BackPressManagerTest.java
@@ -28,8 +28,8 @@ public class BackPressManagerTest { private static class EmptyBackPressHandler implements BackPressHandler { - private ObservableSupplierImpl<Boolean> mSupplier = new ObservableSupplierImpl<>(); - protected CallbackHelper mCallbackHelper = new CallbackHelper(); + private final ObservableSupplierImpl<Boolean> mSupplier = new ObservableSupplierImpl<>(); + protected final CallbackHelper mCallbackHelper = new CallbackHelper(); public CallbackHelper getCallbackHelper() { return mCallbackHelper;
diff --git a/chrome/browser/back_press/android/java/src/org/chromium/chrome/browser/back_press/BackPressManagerUnitTest.java b/chrome/browser/back_press/android/java/src/org/chromium/chrome/browser/back_press/BackPressManagerUnitTest.java index 916f34e..8d4c2f9 100644 --- a/chrome/browser/back_press/android/java/src/org/chromium/chrome/browser/back_press/BackPressManagerUnitTest.java +++ b/chrome/browser/back_press/android/java/src/org/chromium/chrome/browser/back_press/BackPressManagerUnitTest.java
@@ -33,8 +33,8 @@ public class BackPressManagerUnitTest { private static class EmptyBackPressHandler implements BackPressHandler { - private ObservableSupplierImpl<Boolean> mSupplier = new ObservableSupplierImpl<>(); - protected CallbackHelper mCallbackHelper = new CallbackHelper(); + private final ObservableSupplierImpl<Boolean> mSupplier = new ObservableSupplierImpl<>(); + protected final CallbackHelper mCallbackHelper = new CallbackHelper(); @Override public @BackPressResult int handleBackPress() {
diff --git a/chrome/browser/bluetooth/android/java/src/org/chromium/chrome/browser/bluetooth/BluetoothNotificationManager.java b/chrome/browser/bluetooth/android/java/src/org/chromium/chrome/browser/bluetooth/BluetoothNotificationManager.java index 84b8c2a..0ba7554 100644 --- a/chrome/browser/bluetooth/android/java/src/org/chromium/chrome/browser/bluetooth/BluetoothNotificationManager.java +++ b/chrome/browser/bluetooth/android/java/src/org/chromium/chrome/browser/bluetooth/BluetoothNotificationManager.java
@@ -60,9 +60,9 @@ int IS_SCANNING = 2; } - private BluetoothNotificationManagerDelegate mDelegate; - private BaseNotificationManagerProxy mNotificationManager; - private SharedPreferencesManager mSharedPreferences; + private final BluetoothNotificationManagerDelegate mDelegate; + private final BaseNotificationManagerProxy mNotificationManager; + private final SharedPreferencesManager mSharedPreferences; private final SparseIntArray mNotifications = new SparseIntArray(); public BluetoothNotificationManager(BluetoothNotificationManagerDelegate delegate) {
diff --git a/chrome/browser/bluetooth/android/junit/src/org/chromium/chrome/browser/bluetooth/BluetoothNotificationManagerTest.java b/chrome/browser/bluetooth/android/junit/src/org/chromium/chrome/browser/bluetooth/BluetoothNotificationManagerTest.java index f7f6fa1..4f4ff62 100644 --- a/chrome/browser/bluetooth/android/junit/src/org/chromium/chrome/browser/bluetooth/BluetoothNotificationManagerTest.java +++ b/chrome/browser/bluetooth/android/junit/src/org/chromium/chrome/browser/bluetooth/BluetoothNotificationManagerTest.java
@@ -39,7 +39,7 @@ UrlFormatter.formatUrlForSecurityDisplay(TEST_URL, SchemeDisplay.OMIT_HTTP_AND_HTTPS); private MockNotificationManagerProxy mMockNotificationManager; - private BluetoothNotificationManagerDelegate mDelegate = + private final BluetoothNotificationManagerDelegate mDelegate = new BluetoothNotificationManagerDelegate() { @Override public Intent createTrustedBringTabToFrontIntent(int tabId) {
diff --git a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java index 3075de0..488e000 100644 --- a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java +++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkBridge.java
@@ -42,7 +42,7 @@ */ @NullMarked class BookmarkBridge { - private static OneshotSupplierImpl<BookmarkModel.PartnerBookmarkIteratorProvider> + private static final OneshotSupplierImpl<BookmarkModel.PartnerBookmarkIteratorProvider> sPartnerBookmarkIteratorSupplier = new OneshotSupplierImpl<>(); private final ObserverList<BookmarkModelObserver> mObservers = new ObserverList<>();
diff --git a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkModel.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkModel.java index 821e210..40fd133 100644 --- a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkModel.java +++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkModel.java
@@ -66,7 +66,7 @@ void onDeleteBookmarks(String[] titles, boolean isUndoable); } - private ObserverList<BookmarkDeleteObserver> mDeleteObservers = new ObserverList<>(); + private final ObserverList<BookmarkDeleteObserver> mDeleteObservers = new ObserverList<>(); /** * Provides an instance of the bookmark model for the provided profile.
diff --git a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkPromoHeader.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkPromoHeader.java index 45c3574..b524aa0 100644 --- a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkPromoHeader.java +++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkPromoHeader.java
@@ -45,7 +45,7 @@ private final AccountManagerFacade mAccountManagerFacade; private final Runnable mPromoHeaderChangeAction; - private @Nullable ProfileDataCache mProfileDataCache; + private final @Nullable ProfileDataCache mProfileDataCache; private final @Nullable SyncPromoController mSyncPromoController; private boolean mShouldShowPromo; private final @Nullable SyncService mSyncService;
diff --git a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSaveFlowCoordinator.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSaveFlowCoordinator.java index 27780ddd..26bff22 100644 --- a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSaveFlowCoordinator.java +++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkSaveFlowCoordinator.java
@@ -52,12 +52,12 @@ private final DestroyChecker mDestroyChecker; private final Profile mProfile; - private BottomSheetController mBottomSheetController; + private final BottomSheetController mBottomSheetController; private @Nullable BookmarkSaveFlowBottomSheetContent mBottomSheetContent; private BookmarkSaveFlowMediator mMediator; private View mBookmarkSaveFlowView; - private BookmarkModel mBookmarkModel; - private UserEducationHelper mUserEducationHelper; + private final BookmarkModel mBookmarkModel; + private final UserEducationHelper mUserEducationHelper; private boolean mClosedViaRunnable; /**
diff --git a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUiPrefs.java b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUiPrefs.java index d0d069b6..310b6a7 100644 --- a/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUiPrefs.java +++ b/chrome/browser/bookmarks/android/java/src/org/chromium/chrome/browser/bookmarks/BookmarkUiPrefs.java
@@ -75,7 +75,7 @@ default void onBookmarkRowSortOrderChanged(@BookmarkRowSortOrder int sortOrder) {} } - private SharedPreferences.OnSharedPreferenceChangeListener mPrefsListener = + private final SharedPreferences.OnSharedPreferenceChangeListener mPrefsListener = new SharedPreferences.OnSharedPreferenceChangeListener() { @Override public void onSharedPreferenceChanged(
diff --git a/chrome/browser/bookmarks/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkFolderPickerRenderTest.java b/chrome/browser/bookmarks/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkFolderPickerRenderTest.java index 7cc1490..dd7ba88 100644 --- a/chrome/browser/bookmarks/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkFolderPickerRenderTest.java +++ b/chrome/browser/bookmarks/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkFolderPickerRenderTest.java
@@ -64,7 +64,7 @@ @Batch(Batch.PER_CLASS) public class BookmarkFolderPickerRenderTest { @ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = Arrays.asList( new ParameterSet().value(true, true).name("VisualRow_NightModeEnabled"), new ParameterSet().value(true, false).name("VisualRow_NightModeDisabled"),
diff --git a/chrome/browser/bookmarks/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkSaveFlowTest.java b/chrome/browser/bookmarks/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkSaveFlowTest.java index feb6bc7..3d126f86 100644 --- a/chrome/browser/bookmarks/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkSaveFlowTest.java +++ b/chrome/browser/bookmarks/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkSaveFlowTest.java
@@ -94,7 +94,7 @@ private BottomSheetController mBottomSheetController; private BottomSheetTestSupport mBottomSheetTestSupport; private BookmarkModel mBookmarkModel; - private CoreAccountInfo mAccountInfo = + private final CoreAccountInfo mAccountInfo = CoreAccountInfo.createFromEmailAndGaiaId("test@gmail.com", new GaiaId("testGaiaId")); @Before
diff --git a/chrome/browser/bookmarks/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkSearchBoxRowRenderTest.java b/chrome/browser/bookmarks/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkSearchBoxRowRenderTest.java index 93cdb11..3389fb1 100644 --- a/chrome/browser/bookmarks/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkSearchBoxRowRenderTest.java +++ b/chrome/browser/bookmarks/android/javatests/src/org/chromium/chrome/browser/bookmarks/BookmarkSearchBoxRowRenderTest.java
@@ -43,7 +43,7 @@ @Batch(Batch.PER_CLASS) public class BookmarkSearchBoxRowRenderTest { @ClassParameter - private static List<ParameterSet> sClassParams = new NightModeParams().getParameters(); + private static final List<ParameterSet> sClassParams = new NightModeParams().getParameters(); @Rule public BaseActivityTestRule<BlankUiTestActivity> mActivityTestRule =
diff --git a/chrome/browser/bookmarks/android/javatests/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkFolderViewRenderTest.java b/chrome/browser/bookmarks/android/javatests/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkFolderViewRenderTest.java index 68f5156..eff82da 100644 --- a/chrome/browser/bookmarks/android/javatests/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkFolderViewRenderTest.java +++ b/chrome/browser/bookmarks/android/javatests/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkFolderViewRenderTest.java
@@ -63,7 +63,7 @@ @Batch(Batch.PER_CLASS) public class ImprovedBookmarkFolderViewRenderTest { @ParameterAnnotations.ClassParameter - private static List<ParameterSet> sClassParams = new NightModeParams().getParameters(); + private static final List<ParameterSet> sClassParams = new NightModeParams().getParameters(); @Rule public MockitoRule mMockitoRule = MockitoJUnit.rule();
diff --git a/chrome/browser/bookmarks/android/javatests/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkRowRenderTest.java b/chrome/browser/bookmarks/android/javatests/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkRowRenderTest.java index 517332bf..d3270aba2 100644 --- a/chrome/browser/bookmarks/android/javatests/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkRowRenderTest.java +++ b/chrome/browser/bookmarks/android/javatests/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkRowRenderTest.java
@@ -66,7 +66,7 @@ private static final long MICRO_CURRENCY_QUOTIENT = 1000000; @ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = Arrays.asList( new ParameterSet().value(true, true).name("VisualRow_NightModeEnabled"), new ParameterSet().value(true, false).name("VisualRow_NightModeDisabled"),
diff --git a/chrome/browser/bookmarks/android/javatests/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkSaveFlowRenderTest.java b/chrome/browser/bookmarks/android/javatests/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkSaveFlowRenderTest.java index b19ba44..c8e9cdd 100644 --- a/chrome/browser/bookmarks/android/javatests/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkSaveFlowRenderTest.java +++ b/chrome/browser/bookmarks/android/javatests/src/org/chromium/chrome/browser/bookmarks/ImprovedBookmarkSaveFlowRenderTest.java
@@ -49,7 +49,7 @@ @Batch(Batch.PER_CLASS) public class ImprovedBookmarkSaveFlowRenderTest { @ClassParameter - private static List<ParameterSet> sClassParams = new NightModeParams().getParameters(); + private static final List<ParameterSet> sClassParams = new NightModeParams().getParameters(); @Rule public MockitoRule mMockitoRule = MockitoJUnit.rule();
diff --git a/chrome/browser/bookmarks/android/javatests/src/org/chromium/chrome/browser/bookmarks/ShoppingAccessoryViewRenderTest.java b/chrome/browser/bookmarks/android/javatests/src/org/chromium/chrome/browser/bookmarks/ShoppingAccessoryViewRenderTest.java index b57c8b7..fe491bf 100644 --- a/chrome/browser/bookmarks/android/javatests/src/org/chromium/chrome/browser/bookmarks/ShoppingAccessoryViewRenderTest.java +++ b/chrome/browser/bookmarks/android/javatests/src/org/chromium/chrome/browser/bookmarks/ShoppingAccessoryViewRenderTest.java
@@ -52,7 +52,7 @@ private static final long MICRO_CURRENCY_QUOTIENT_WITH_CENTS = 10000; @ClassParameter - private static List<ParameterSet> sClassParams = new NightModeParams().getParameters(); + private static final List<ParameterSet> sClassParams = new NightModeParams().getParameters(); @Rule public MockitoRule mMockitoRule = MockitoJUnit.rule();
diff --git a/chrome/browser/bookmarks/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkFolderPickerMediatorUnitTest.java b/chrome/browser/bookmarks/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkFolderPickerMediatorUnitTest.java index 7329835..03a2c5c 100644 --- a/chrome/browser/bookmarks/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkFolderPickerMediatorUnitTest.java +++ b/chrome/browser/bookmarks/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkFolderPickerMediatorUnitTest.java
@@ -241,8 +241,8 @@ private Activity mActivity; private BookmarkFolderPickerMediator mMediator; - private PropertyModel mModel = new PropertyModel(BookmarkFolderPickerProperties.ALL_KEYS); - private ModelList mModelList = new ModelList(); + private final PropertyModel mModel = new PropertyModel(BookmarkFolderPickerProperties.ALL_KEYS); + private final ModelList mModelList = new ModelList(); @Before public void setUp() throws Exception {
diff --git a/chrome/browser/bookmarks/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediatorTest.java b/chrome/browser/bookmarks/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediatorTest.java index f41c171..d4389c81 100644 --- a/chrome/browser/bookmarks/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediatorTest.java +++ b/chrome/browser/bookmarks/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerMediatorTest.java
@@ -347,7 +347,7 @@ private final ModelList mModelList = new ModelList(); private final Bitmap mBitmap = Bitmap.createBitmap(1, 1, Bitmap.Config.ARGB_8888); - private BookmarkUiPrefs mBookmarkUiPrefs = + private final BookmarkUiPrefs mBookmarkUiPrefs = new BookmarkUiPrefs(ChromeSharedPreferences.getInstance()); private Activity mActivity; private BookmarkManagerMediator mMediator;
diff --git a/chrome/browser/bookmarks/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerOpenerTest.java b/chrome/browser/bookmarks/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerOpenerTest.java index 03d66ee..78727d5 100644 --- a/chrome/browser/bookmarks/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerOpenerTest.java +++ b/chrome/browser/bookmarks/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkManagerOpenerTest.java
@@ -47,7 +47,7 @@ @Mock private Runnable mRunnable; private Activity mActivity; - private BookmarkManagerOpener mBookmarkManagerOpener = new BookmarkManagerOpenerImpl(); + private final BookmarkManagerOpener mBookmarkManagerOpener = new BookmarkManagerOpenerImpl(); @Before public void setUp() {
diff --git a/chrome/browser/bookmarks/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkSaveFlowMediatorUnitTest.java b/chrome/browser/bookmarks/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkSaveFlowMediatorUnitTest.java index 96ec83c..7b7b6b9 100644 --- a/chrome/browser/bookmarks/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkSaveFlowMediatorUnitTest.java +++ b/chrome/browser/bookmarks/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkSaveFlowMediatorUnitTest.java
@@ -54,7 +54,7 @@ @Rule public final MockitoRule mMockitoRule = MockitoJUnit.rule(); private BookmarkSaveFlowMediator mMediator; - private PropertyModel mPropertyModel = + private final PropertyModel mPropertyModel = new PropertyModel(ImprovedBookmarkSaveFlowProperties.ALL_KEYS); private Context mContext;
diff --git a/chrome/browser/bookmarks/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarMediatorTest.java b/chrome/browser/bookmarks/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarMediatorTest.java index 52fb1874..7e4adc7 100644 --- a/chrome/browser/bookmarks/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarMediatorTest.java +++ b/chrome/browser/bookmarks/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkToolbarMediatorTest.java
@@ -94,7 +94,7 @@ @Spy private Context mContext; - private BookmarkManagerOpener mBookmarkManagerOpener = new BookmarkManagerOpenerImpl(); + private final BookmarkManagerOpener mBookmarkManagerOpener = new BookmarkManagerOpenerImpl(); private FakeBookmarkModel mBookmarkModel; private BookmarkToolbarMediator mMediator; private PropertyModel mModel;
diff --git a/chrome/browser/bookmarks/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkUtilsTest.java b/chrome/browser/bookmarks/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkUtilsTest.java index 75358df..6d3a486 100644 --- a/chrome/browser/bookmarks/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkUtilsTest.java +++ b/chrome/browser/bookmarks/android/junit/src/org/chromium/chrome/browser/bookmarks/BookmarkUtilsTest.java
@@ -85,7 +85,7 @@ private Activity mActivity; private FakeBookmarkModel mBookmarkModel; - private CoreAccountInfo mAccountInfo = + private final CoreAccountInfo mAccountInfo = CoreAccountInfo.createFromEmailAndGaiaId("test@gmail.com", new GaiaId("testGaiaId")); @Before
diff --git a/chrome/browser/browser_controls/android/java/src/org/chromium/chrome/browser/browser_controls/BottomControlsStackerUnitTest.java b/chrome/browser/browser_controls/android/java/src/org/chromium/chrome/browser/browser_controls/BottomControlsStackerUnitTest.java index 757d281d..b2ceb183 100644 --- a/chrome/browser/browser_controls/android/java/src/org/chromium/chrome/browser/browser_controls/BottomControlsStackerUnitTest.java +++ b/chrome/browser/browser_controls/android/java/src/org/chromium/chrome/browser/browser_controls/BottomControlsStackerUnitTest.java
@@ -57,7 +57,7 @@ @Mock private DisplayAndroid mDisplayAndroid; private BottomControlsStacker mBottomControlsStacker; - private Configuration mConfig = new Configuration(); + private final Configuration mConfig = new Configuration(); @Before public void setup() {
diff --git a/chrome/browser/browser_resources.grd b/chrome/browser/browser_resources.grd index 533d97a0..54b4eab 100644 --- a/chrome/browser/browser_resources.grd +++ b/chrome/browser/browser_resources.grd
@@ -224,13 +224,12 @@ <if expr="not is_android or enable_extensions_core"> <!-- Page not available for guest. --> <include name="IDR_PAGE_NOT_AVAILABLE_FOR_GUEST_APP_HTML" file="resources\page_not_available_for_guest\app.html" type="BINDATA" /> + <include name="IDR_INCOGNITO_NAVIGATION_BLOCKED_PAGE_HTML" file="resources\enterprise\incognito_navigation_blocked_page\incognito_blocked.html" flattenhtml="true" type="BINDATA" /> </if> <if expr="not is_android"> <include name="IDR_IME_WINDOW_CLOSE" file="resources\input_ime\ime_window_close.png" type="BINDATA" /> <include name="IDR_IME_WINDOW_CLOSE_C" file="resources\input_ime\ime_window_close_click.png" type="BINDATA" /> <include name="IDR_IME_WINDOW_CLOSE_H" file="resources\input_ime\ime_window_close_hover.png" type="BINDATA" /> - <!-- Extensions required in Incognito --> - <include name="IDR_INCOGNITO_NAVIGATION_BLOCKED_PAGE_HTML" file="resources\enterprise\incognito_navigation_blocked_page\incognito_blocked.html" flattenhtml="true" type="BINDATA" /> <!-- FedCM --> <part file="ui/views/webid/resources/webid_resources.grdp" /> </if>
diff --git a/chrome/browser/browsing_data/android/java/src/org/chromium/chrome/browser/browsing_data/TimePeriodUtils.java b/chrome/browser/browsing_data/android/java/src/org/chromium/chrome/browser/browsing_data/TimePeriodUtils.java index e03a2fc..85a8e5c 100644 --- a/chrome/browser/browsing_data/android/java/src/org/chromium/chrome/browser/browsing_data/TimePeriodUtils.java +++ b/chrome/browser/browsing_data/android/java/src/org/chromium/chrome/browser/browsing_data/TimePeriodUtils.java
@@ -16,8 +16,8 @@ public class TimePeriodUtils { /** An option to be shown in the time period spiner. */ public static class TimePeriodSpinnerOption { - private @TimePeriod int mTimePeriod; - private String mTitle; + private final @TimePeriod int mTimePeriod; + private final String mTitle; /** * Constructs this time period spinner option.
diff --git a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc index 6067f65e..5378f1c 100644 --- a/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc +++ b/chrome/browser/browsing_data/chrome_browsing_data_remover_delegate.cc
@@ -909,6 +909,10 @@ #if !BUILDFLAG(IS_ANDROID) host_content_settings_map_->ClearSettingsForOneTypeWithPredicate( + ContentSettingsType::INITIALIZED_TRANSLATIONS, delete_begin_, + delete_end_, website_settings_filter); + + host_content_settings_map_->ClearSettingsForOneTypeWithPredicate( ContentSettingsType::INTENT_PICKER_DISPLAY, delete_begin_, delete_end_, website_settings_filter);
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc index 60dcfa89..6f72b63 100644 --- a/chrome/browser/chrome_content_browser_client.cc +++ b/chrome/browser/chrome_content_browser_client.cc
@@ -631,12 +631,12 @@ #include "chrome/browser/ui/webui/app_settings/web_app_settings_navigation_throttle.h" #endif -#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || \ - BUILDFLAG(IS_CHROMEOS) +#if BUILDFLAG(ENABLE_EXTENSIONS_CORE) +#if !BUILDFLAG(IS_ANDROID) #include "chrome/browser/enterprise/connectors/device_trust/navigation_throttle.h" +#endif // !BUILDFLAG(IS_ANDROID) #include "chrome/browser/enterprise/incognito/incognito_navigation_throttle.h" -#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || - // BUILDFLAG(IS_CHROMEOS) +#endif // BUILDFLAG(ENABLE_EXTENSIONS_CORE) #if defined(TOOLKIT_VIEWS) #include "chrome/browser/ui/views/chrome_browser_main_extra_parts_views.h" @@ -1630,8 +1630,7 @@ registry->RegisterBooleanPref( policy::policy_prefs::kForcePermissionPolicyUnloadDefaultEnabled, false); -#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || \ - BUILDFLAG(IS_LINUX) +#if BUILDFLAG(ENABLE_EXTENSIONS_CORE) registry->RegisterListPref(prefs::kMandatoryExtensionsForIncognitoNavigation); #endif @@ -5621,13 +5620,13 @@ apps::AppInstallNavigationThrottle::MaybeCreate(&handle)); #endif // BUILDFLAG(IS_CHROMEOS) -#if BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) +#if BUILDFLAG(ENABLE_EXTENSIONS_CORE) if (profile && profile->IsIncognitoProfile() && profile->IsOffTheRecord()) { registry.MaybeAddThrottle( enterprise_incognito::IncognitoNavigationThrottle:: MaybeCreateThrottleFor(&handle)); } -#endif // BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) +#endif // BUILDFLAG(ENABLE_EXTENSIONS_CORE) #if !BUILDFLAG(IS_ANDROID) registry.MaybeAddThrottle( @@ -8732,7 +8731,8 @@ if (!context_user_data->GetUserData(kAIManagerUserDataKey)) { context_user_data->SetUserData( kAIManagerUserDataKey, - std::make_unique<AIManager>(browser_context, rfh)); + std::make_unique<AIManager>( + browser_context, g_browser_process->component_updater(), rfh)); } AIManager* ai_manager = static_cast<AIManager*>(
diff --git a/chrome/browser/collaboration/android/java/src/org/chromium/chrome/browser/collaboration/CollaborationControllerDelegateImpl.java b/chrome/browser/collaboration/android/java/src/org/chromium/chrome/browser/collaboration/CollaborationControllerDelegateImpl.java index 9878e56..97d6b5a 100644 --- a/chrome/browser/collaboration/android/java/src/org/chromium/chrome/browser/collaboration/CollaborationControllerDelegateImpl.java +++ b/chrome/browser/collaboration/android/java/src/org/chromium/chrome/browser/collaboration/CollaborationControllerDelegateImpl.java
@@ -72,7 +72,7 @@ // Will become null once used in the prepareFlowUI(). private @Nullable Callback<Runnable> mSwitchToTabSwitcherCallback; - private Callback<Callback<Boolean>> mStartAccountRefreshCallback; + private final Callback<Callback<Boolean>> mStartAccountRefreshCallback; // Stores the runnable to close the current showing UI. Is null when there's no UI showing. private @Nullable Runnable mCloseScreenRunnable;
diff --git a/chrome/browser/collaboration/android/java/src/org/chromium/chrome/browser/collaboration/CollaborationIntegrationTest.java b/chrome/browser/collaboration/android/java/src/org/chromium/chrome/browser/collaboration/CollaborationIntegrationTest.java index b73645d..b71c3290 100644 --- a/chrome/browser/collaboration/android/java/src/org/chromium/chrome/browser/collaboration/CollaborationIntegrationTest.java +++ b/chrome/browser/collaboration/android/java/src/org/chromium/chrome/browser/collaboration/CollaborationIntegrationTest.java
@@ -44,6 +44,7 @@ import org.chromium.base.supplier.ObservableSupplier; import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.CriteriaHelper; +import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.DoNotBatch; import org.chromium.base.test.util.Features.EnableFeatures; import org.chromium.base.test.util.Restriction; @@ -297,6 +298,7 @@ @Test @MediumTest + @DisabledTest(message = "crbug.com/415943165") public void testDataSharingShowShare() { setUpSyncAndSignIn();
diff --git a/chrome/browser/commerce/android/java/src/org/chromium/chrome/browser/commerce/CommerceBottomSheetContentCoordinator.java b/chrome/browser/commerce/android/java/src/org/chromium/chrome/browser/commerce/CommerceBottomSheetContentCoordinator.java index c9b127b..4b01836 100644 --- a/chrome/browser/commerce/android/java/src/org/chromium/chrome/browser/commerce/CommerceBottomSheetContentCoordinator.java +++ b/chrome/browser/commerce/android/java/src/org/chromium/chrome/browser/commerce/CommerceBottomSheetContentCoordinator.java
@@ -40,11 +40,11 @@ public class CommerceBottomSheetContentCoordinator implements CommerceBottomSheetContentController { private static final long CONTENT_PROVIDER_TIMEOUT_MS = 200; - private List<CommerceBottomSheetContentProvider> mContentProviders = new ArrayList<>(); + private final List<CommerceBottomSheetContentProvider> mContentProviders = new ArrayList<>(); private final CommerceBottomSheetContentMediator mMediator; - private RecyclerView mContentRecyclerView; - private View mCommerceBottomSheetContentContainer; - private ModelList mModelList; + private final RecyclerView mContentRecyclerView; + private final View mCommerceBottomSheetContentContainer; + private final ModelList mModelList; private @Nullable Long mSheetOpenTimeMs; @MonotonicNonNull private CallbackController mCallbackController;
diff --git a/chrome/browser/commerce/coupons/android/java/src/org/chromium/chrome/browser/commerce/coupons/DiscountsBottomSheetContentCoordinator.java b/chrome/browser/commerce/coupons/android/java/src/org/chromium/chrome/browser/commerce/coupons/DiscountsBottomSheetContentCoordinator.java index 2114f5c..0345d95 100644 --- a/chrome/browser/commerce/coupons/android/java/src/org/chromium/chrome/browser/commerce/coupons/DiscountsBottomSheetContentCoordinator.java +++ b/chrome/browser/commerce/coupons/android/java/src/org/chromium/chrome/browser/commerce/coupons/DiscountsBottomSheetContentCoordinator.java
@@ -35,11 +35,11 @@ @NullMarked public class DiscountsBottomSheetContentCoordinator implements CommerceBottomSheetContentProvider { - private Context mContext; - private ModelList mModelList; - private View mDiscountsContentContainer; - private RecyclerView mContentRecyclerView; - private DiscountsBottomSheetContentMediator mMediator; + private final Context mContext; + private final ModelList mModelList; + private final View mDiscountsContentContainer; + private final RecyclerView mContentRecyclerView; + private final DiscountsBottomSheetContentMediator mMediator; public DiscountsBottomSheetContentCoordinator(Context context, Supplier<Tab> tabSupplier) { mContext = context;
diff --git a/chrome/browser/commerce/coupons/android/java/src/org/chromium/chrome/browser/commerce/coupons/DiscountsButtonController.java b/chrome/browser/commerce/coupons/android/java/src/org/chromium/chrome/browser/commerce/coupons/DiscountsButtonController.java index b95ce02..9004119 100644 --- a/chrome/browser/commerce/coupons/android/java/src/org/chromium/chrome/browser/commerce/coupons/DiscountsButtonController.java +++ b/chrome/browser/commerce/coupons/android/java/src/org/chromium/chrome/browser/commerce/coupons/DiscountsButtonController.java
@@ -29,7 +29,8 @@ private final BottomSheetController mBottomSheetController; private final BottomSheetObserver mBottomSheetObserver; - private Supplier<CommerceBottomSheetContentController> mCommerceBottomSheetContentController; + private final Supplier<CommerceBottomSheetContentController> + mCommerceBottomSheetContentController; public DiscountsButtonController( Context context,
diff --git a/chrome/browser/commerce/merchant_viewer/android/javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustMessageViewTest.java b/chrome/browser/commerce/merchant_viewer/android/javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustMessageViewTest.java index 290aeef..095a8ab 100644 --- a/chrome/browser/commerce/merchant_viewer/android/javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustMessageViewTest.java +++ b/chrome/browser/commerce/merchant_viewer/android/javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustMessageViewTest.java
@@ -56,7 +56,7 @@ @Batch(Batch.PER_CLASS) public class MerchantTrustMessageViewTest { @ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = new NightModeTestUtils.NightModeParams().getParameters(); @ClassRule @@ -84,7 +84,7 @@ private MessageBannerView mMessageBannerView; private View mMessageBannerContent; private LayoutParams mParams; - private MerchantInfo mMerchantInfo = + private final MerchantInfo mMerchantInfo = new MerchantInfo(3.51234f, 1640, new GURL("http://dummy/url"), false, 0f, false, false); @BeforeClass
diff --git a/chrome/browser/commerce/merchant_viewer/android/javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsCoordinatorTest.java b/chrome/browser/commerce/merchant_viewer/android/javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsCoordinatorTest.java index f578701..9221a24 100644 --- a/chrome/browser/commerce/merchant_viewer/android/javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsCoordinatorTest.java +++ b/chrome/browser/commerce/merchant_viewer/android/javatests/src/org/chromium/chrome/browser/merchant_viewer/MerchantTrustSignalsCoordinatorTest.java
@@ -134,7 +134,7 @@ private static final String DIFFERENT_HOST = "different_host"; private static final String FAKE_URL = "fake_url"; - private MerchantInfo mDummyMerchantTrustSignals = + private final MerchantInfo mDummyMerchantTrustSignals = new MerchantInfo(4.5f, 100, null, false, 0f, false, false); private MerchantTrustSignalsCoordinator mCoordinator; private String mSerializedTimestamps;
diff --git a/chrome/browser/commerce/price_history/android/java/src/org/chromium/chrome/browser/price_history/PriceHistoryBottomSheetContentCoordinator.java b/chrome/browser/commerce/price_history/android/java/src/org/chromium/chrome/browser/price_history/PriceHistoryBottomSheetContentCoordinator.java index 841b4ea..585d3e82 100644 --- a/chrome/browser/commerce/price_history/android/java/src/org/chromium/chrome/browser/price_history/PriceHistoryBottomSheetContentCoordinator.java +++ b/chrome/browser/commerce/price_history/android/java/src/org/chromium/chrome/browser/price_history/PriceHistoryBottomSheetContentCoordinator.java
@@ -24,9 +24,9 @@ @NullMarked public class PriceHistoryBottomSheetContentCoordinator implements CommerceBottomSheetContentProvider { - private Context mContext; - private View mPriceHistoryContentContainer; - private PriceHistoryBottomSheetContentMediator mMediator; + private final Context mContext; + private final View mPriceHistoryContentContainer; + private final PriceHistoryBottomSheetContentMediator mMediator; public PriceHistoryBottomSheetContentCoordinator( Context context,
diff --git a/chrome/browser/commerce/price_history/android/javatests/src/org/chromium/chrome/browser/price_history/PriceHistoryBottomSheetContentMediatorTest.java b/chrome/browser/commerce/price_history/android/javatests/src/org/chromium/chrome/browser/price_history/PriceHistoryBottomSheetContentMediatorTest.java index ab50689a..2af87e3 100644 --- a/chrome/browser/commerce/price_history/android/javatests/src/org/chromium/chrome/browser/price_history/PriceHistoryBottomSheetContentMediatorTest.java +++ b/chrome/browser/commerce/price_history/android/javatests/src/org/chromium/chrome/browser/price_history/PriceHistoryBottomSheetContentMediatorTest.java
@@ -106,7 +106,7 @@ true); private PriceHistoryBottomSheetContentMediator mMediator; - private PropertyModel mPropertyModel = new PropertyModel(ALL_KEYS); + private final PropertyModel mPropertyModel = new PropertyModel(ALL_KEYS); private Activity mActivity; @Before
diff --git a/chrome/browser/commerce/price_insights/android/java/src/org/chromium/chrome/browser/price_insights/PriceInsightsBottomSheetCoordinator.java b/chrome/browser/commerce/price_insights/android/java/src/org/chromium/chrome/browser/price_insights/PriceInsightsBottomSheetCoordinator.java index 81eaabdc..91afa44f 100644 --- a/chrome/browser/commerce/price_insights/android/java/src/org/chromium/chrome/browser/price_insights/PriceInsightsBottomSheetCoordinator.java +++ b/chrome/browser/commerce/price_insights/android/java/src/org/chromium/chrome/browser/price_insights/PriceInsightsBottomSheetCoordinator.java
@@ -67,9 +67,9 @@ private final BottomSheetController mBottomSheetController; private @Nullable PriceInsightsBottomSheetContent mBottomSheetContent; - private PriceInsightsBottomSheetMediator mBottomSheetMediator; - private BottomSheetObserver mBottomSheetObserver; - private View mPriceInsightsView; + private final PriceInsightsBottomSheetMediator mBottomSheetMediator; + private final BottomSheetObserver mBottomSheetObserver; + private final View mPriceInsightsView; private @Nullable Long mSheetOpenTimeMs; /**
diff --git a/chrome/browser/commerce/price_insights/android/javatests/src/org/chromium/chrome/browser/price_insights/PriceInsightsBottomSheetMediatorTest.java b/chrome/browser/commerce/price_insights/android/javatests/src/org/chromium/chrome/browser/price_insights/PriceInsightsBottomSheetMediatorTest.java index 3e1b6b4..5b5d9af 100644 --- a/chrome/browser/commerce/price_insights/android/javatests/src/org/chromium/chrome/browser/price_insights/PriceInsightsBottomSheetMediatorTest.java +++ b/chrome/browser/commerce/price_insights/android/javatests/src/org/chromium/chrome/browser/price_insights/PriceInsightsBottomSheetMediatorTest.java
@@ -132,7 +132,7 @@ true); private PriceInsightsBottomSheetMediator mPriceInsightsMediator; - private PropertyModel mPropertyModel = new PropertyModel(ALL_KEYS); + private final PropertyModel mPropertyModel = new PropertyModel(ALL_KEYS); private Activity mActivity; @Before
diff --git a/chrome/browser/commerce/price_tracking/android/java/src/org/chromium/chrome/browser/price_tracking/PriceTrackingBottomSheetContentCoordinator.java b/chrome/browser/commerce/price_tracking/android/java/src/org/chromium/chrome/browser/price_tracking/PriceTrackingBottomSheetContentCoordinator.java index d2927932..9db9511 100644 --- a/chrome/browser/commerce/price_tracking/android/java/src/org/chromium/chrome/browser/price_tracking/PriceTrackingBottomSheetContentCoordinator.java +++ b/chrome/browser/commerce/price_tracking/android/java/src/org/chromium/chrome/browser/price_tracking/PriceTrackingBottomSheetContentCoordinator.java
@@ -26,9 +26,9 @@ @NullMarked public class PriceTrackingBottomSheetContentCoordinator implements CommerceBottomSheetContentProvider { - private Context mContext; - private View mPriceTrackingContentContainer; - private PriceTrackingBottomSheetContentMediator mMediator; + private final Context mContext; + private final View mPriceTrackingContentContainer; + private final PriceTrackingBottomSheetContentMediator mMediator; public PriceTrackingBottomSheetContentCoordinator( Context context,
diff --git a/chrome/browser/commerce/price_tracking/android/javatests/src/org/chromium/chrome/browser/price_tracking/PriceTrackingBottomSheetContentMediatorTest.java b/chrome/browser/commerce/price_tracking/android/javatests/src/org/chromium/chrome/browser/price_tracking/PriceTrackingBottomSheetContentMediatorTest.java index 8296038d..080f753 100644 --- a/chrome/browser/commerce/price_tracking/android/javatests/src/org/chromium/chrome/browser/price_tracking/PriceTrackingBottomSheetContentMediatorTest.java +++ b/chrome/browser/commerce/price_tracking/android/javatests/src/org/chromium/chrome/browser/price_tracking/PriceTrackingBottomSheetContentMediatorTest.java
@@ -112,7 +112,7 @@ Optional.empty()); private PriceTrackingBottomSheetContentMediator mMediator; - private PropertyModel mPropertyModel = new PropertyModel(ALL_KEYS); + private final PropertyModel mPropertyModel = new PropertyModel(ALL_KEYS); private Activity mActivity; private HistogramWatcher mHistogramWatcher;
diff --git a/chrome/browser/commerce/subscriptions/android/java/src/org/chromium/chrome/browser/subscriptions/CommerceSubscriptionsService.java b/chrome/browser/commerce/subscriptions/android/java/src/org/chromium/chrome/browser/subscriptions/CommerceSubscriptionsService.java index a496765d..b045dcd 100644 --- a/chrome/browser/commerce/subscriptions/android/java/src/org/chromium/chrome/browser/subscriptions/CommerceSubscriptionsService.java +++ b/chrome/browser/commerce/subscriptions/android/java/src/org/chromium/chrome/browser/subscriptions/CommerceSubscriptionsService.java
@@ -40,7 +40,7 @@ private final PriceDropNotificationManager mPriceDropNotificationManager; private @Nullable ActivityLifecycleDispatcher mActivityLifecycleDispatcher; private @Nullable PauseResumeWithNativeObserver mPauseResumeWithNativeObserver; - private ShoppingService mShoppingService; + private final ShoppingService mShoppingService; /** Creates a new instance. */ CommerceSubscriptionsService(
diff --git a/chrome/browser/controlled_frame/api/controlled_frame_internal_api.cc b/chrome/browser/controlled_frame/api/controlled_frame_internal_api.cc index 830cde239..4d3f831 100644 --- a/chrome/browser/controlled_frame/api/controlled_frame_internal_api.cc +++ b/chrome/browser/controlled_frame/api/controlled_frame_internal_api.cc
@@ -50,6 +50,33 @@ } ExtensionFunction::ResponseAction +ControlledFrameInternalContextMenusUpdateFunction::Run() { + std::optional<webview::ContextMenusUpdate::Params> params = + webview::ContextMenusUpdate::Params::Create(args()); + + extensions::MenuItem::Id id( + browser_context()->IsOffTheRecord(), + extensions::MenuItem::ExtensionKey( + /*extension_id=*/std::string(), + render_frame_host()->GetProcess()->GetDeprecatedID(), + render_frame_host()->GetRoutingID(), params->instance_id)); + + if (params->id.as_string) { + id.string_uid = *params->id.as_string; + } else if (params->id.as_integer) { + id.uid = *params->id.as_integer; + } else { + NOTREACHED(); + } + + std::string error; + bool success = extensions::context_menu_helpers::UpdateMenuItem( + params->update_properties, Profile::FromBrowserContext(browser_context()), + /*extension=*/nullptr, id, &error); + return RespondNow(success ? NoArguments() : Error(error)); +} + +ExtensionFunction::ResponseAction ControlledFrameInternalSetClientHintsEnabledFunction::Run() { std::optional<controlled_frame_internal::SetClientHintsEnabled::Params> params = controlled_frame_internal::SetClientHintsEnabled::Params::Create(
diff --git a/chrome/browser/controlled_frame/api/controlled_frame_internal_api.h b/chrome/browser/controlled_frame/api/controlled_frame_internal_api.h index 358f42d..66a449f7 100644 --- a/chrome/browser/controlled_frame/api/controlled_frame_internal_api.h +++ b/chrome/browser/controlled_frame/api/controlled_frame_internal_api.h
@@ -33,6 +33,26 @@ ResponseAction Run() override; }; +// Handles the <controlledframe> contextMenus.update() API. +class ControlledFrameInternalContextMenusUpdateFunction + : public ExtensionFunction { + public: + DECLARE_EXTENSION_FUNCTION("controlledFrameInternal.contextMenusUpdate", + CONTROLLEDFRAMEINTERNAL_CONTEXTMENUSUPDATE) + ControlledFrameInternalContextMenusUpdateFunction() = default; + + ControlledFrameInternalContextMenusUpdateFunction( + const ControlledFrameInternalContextMenusUpdateFunction&) = delete; + ControlledFrameInternalContextMenusUpdateFunction& operator=( + const ControlledFrameInternalContextMenusUpdateFunction&) = delete; + + protected: + ~ControlledFrameInternalContextMenusUpdateFunction() override = default; + + // ExtensionFunction implementation. + ResponseAction Run() override; +}; + // Handles the <controlledframe> setClientHintsUABrandEnabled() API. class ControlledFrameInternalSetClientHintsEnabledFunction : public extensions::WebViewInternalExtensionFunction {
diff --git a/chrome/browser/controlled_frame/controlled_frame_contextmenus_browsertest.cc b/chrome/browser/controlled_frame/controlled_frame_contextmenus_browsertest.cc index 3597a55..a869d60 100644 --- a/chrome/browser/controlled_frame/controlled_frame_contextmenus_browsertest.cc +++ b/chrome/browser/controlled_frame/controlled_frame_contextmenus_browsertest.cc
@@ -392,7 +392,7 @@ } IN_PROC_BROWSER_TEST_F(ControlledFrameContextMenusTest, OnClicked) { - constexpr char test_menu_item_id[] = "107"; + constexpr std::string kItemID = "107"; web_app::IsolatedWebAppUrlInfo url_info = CreateAndInstallEmptyApp(web_app::ManifestBuilder()); @@ -422,7 +422,7 @@ resolve('SUCCESS'); }); )", - test_menu_item_id); + kItemID); // Create a ContextMenu item with a inline listener. ASSERT_EQ(content::EvalJs(app_frame, create_context_menu_script), @@ -478,7 +478,7 @@ EXPECT_EQ(content::EvalJs(app_frame, "document.globalOnClickedCount"), 1); EXPECT_THAT( content::EvalJs(app_frame, "document.clickedMenuItemId").ExtractList(), - Each(Eq(test_menu_item_id))); + Each(Eq(kItemID))); auto remove_handler_script = content::JsReplace( R"( @@ -519,6 +519,81 @@ EXPECT_EQ(content::EvalJs(app_frame, "document.globalOnClickedCount"), 1); EXPECT_THAT( content::EvalJs(app_frame, "document.clickedMenuItemId").ExtractList(), - Each(Eq(test_menu_item_id))); + Each(Eq(kItemID))); } + +IN_PROC_BROWSER_TEST_F(ControlledFrameContextMenusTest, UpdatedOnClickHandler) { + constexpr char kItemID[] = "221B"; + constexpr char kFirstOnClickValue[] = "first handler"; + constexpr char kSecondOnClickValue[] = "second handler"; + + web_app::IsolatedWebAppUrlInfo url_info = + CreateAndInstallEmptyApp(web_app::ManifestBuilder()); + content::RenderFrameHost* app_frame = OpenApp(url_info.app_id()); + + ASSERT_TRUE(CreateControlledFrame( + app_frame, embedded_https_test_server().GetURL("/index.html"))); + + auto create_context_menu_script = + content::JsReplace(R"( +new Promise(async (resolve, reject) => { + const frame = document.getElementsByTagName('controlledframe')[0]; + if (!frame || !frame.contextMenus || !frame.contextMenus.create) { + reject('FAIL: frame, frame.contextMenus, or ' + + 'frame.contextMenus.create is undefined'); + return; + } + await frame.contextMenus.create( + { + title: 'test_title', + id: $1, + onclick: function(info){ + document.executed_onclick_handler = $2; + } + }); + resolve('SUCCESS'); +}); + )", + kItemID, kFirstOnClickValue); + + // Create a ContextMenu item with a inline listener. + ASSERT_EQ(content::EvalJs(app_frame, create_context_menu_script), + kEvalSuccessStr); + + auto update_context_menu_script = + content::JsReplace(R"( +new Promise(async (resolve, reject) => { + const frame = document.getElementsByTagName('controlledframe')[0]; + if (!frame || !frame.contextMenus || !frame.contextMenus.create) { + reject('FAIL: frame, frame.contextMenus, or ' + + 'frame.contextMenus.create is undefined'); + return; + } + await frame.contextMenus.update( + $1, + { + onclick: function(info){ + document.executed_onclick_handler = $2; + } + }); + resolve('SUCCESS'); +}); + )", + kItemID, kSecondOnClickValue); + + // Update a ContextMenu item with a new onclick handler. + ASSERT_EQ(content::EvalJs(app_frame, update_context_menu_script), + kEvalSuccessStr); + + extensions::WebViewGuest* web_view_guest = GetWebViewGuest(app_frame); + ASSERT_TRUE(web_view_guest); + content::RenderFrameHost* controlled_frame = + web_view_guest->GetGuestMainFrame(); + ASSERT_TRUE(controlled_frame); + SimulateClickContextMenuItem(controlled_frame); + + EXPECT_EQ(content::EvalJs(app_frame, "document.executed_onclick_handler"), + kSecondOnClickValue); +} + } // namespace controlled_frame
diff --git a/chrome/browser/controlled_frame/controlled_frame_permissions_unittest.cc b/chrome/browser/controlled_frame/controlled_frame_permissions_unittest.cc index ad980d4..98512bb 100644 --- a/chrome/browser/controlled_frame/controlled_frame_permissions_unittest.cc +++ b/chrome/browser/controlled_frame/controlled_frame_permissions_unittest.cc
@@ -199,6 +199,7 @@ case ContentSettingsType::LOCAL_NETWORK_ACCESS: case ContentSettingsType:: ON_DEVICE_SPEECH_RECOGNITION_LANGUAGES_DOWNLOADED: + case ContentSettingsType::INITIALIZED_TRANSLATIONS: break; default:
diff --git a/chrome/browser/creator/android/java/src/org/chromium/chrome/browser/creator/CreatorCoordinator.java b/chrome/browser/creator/android/java/src/org/chromium/chrome/browser/creator/CreatorCoordinator.java index 75b22e3..acdf0a4 100644 --- a/chrome/browser/creator/android/java/src/org/chromium/chrome/browser/creator/CreatorCoordinator.java +++ b/chrome/browser/creator/android/java/src/org/chromium/chrome/browser/creator/CreatorCoordinator.java
@@ -87,18 +87,18 @@ public class CreatorCoordinator implements FeedContentFirstLoadWatcher, View.OnLayoutChangeListener { private final ViewGroup mCreatorViewGroup; - private CreatorMediator mMediator; + private final CreatorMediator mMediator; private @MonotonicNonNull CreatorTabMediator mTabMediator; - private Activity mActivity; - private FeedListContentManager mContentManager; - private UiConfig mUiConfig; - private RecyclerView mRecyclerView; - private View mProfileView; - private ViewGroup mLayoutView; + private final Activity mActivity; + private final FeedListContentManager mContentManager; + private final UiConfig mUiConfig; + private final RecyclerView mRecyclerView; + private final View mProfileView; + private final ViewGroup mLayoutView; private @Nullable HybridListRenderer mHybridListRenderer; private @Nullable FeedSurfaceScope mSurfaceScope; private @Nullable FeedSurfaceScopeDependencyProviderImpl mDependencyProvider; - private PropertyModel mCreatorModel; + private final PropertyModel mCreatorModel; private final SnackbarManager mSnackbarManager; private final CreatorSnackbarController mCreatorSnackbarController; @@ -106,7 +106,7 @@ private BottomSheetController mBottomSheetController; private ScrimManager mScrimManager; private ViewGroup mBottomSheetContainer; - private Profile mProfile; + private final Profile mProfile; private @MonotonicNonNull Stream mStream; private int mHeaderCount; @@ -117,11 +117,11 @@ private @Nullable CreatorTabSheetContent mSheetContent; private boolean mPeeked; private boolean mFullyOpened; - private WebContentsCreator mCreatorWebContents; - private NewTabCreator mCreatorOpenTab; + private final WebContentsCreator mCreatorWebContents; + private final NewTabCreator mCreatorOpenTab; private final UnownedUserDataSupplier<ShareDelegate> mBottomsheetShareDelegateSupplier; private @MonotonicNonNull GURL mBottomSheetUrl; - private int mEntryPoint; + private final int mEntryPoint; private static final String CREATOR_PROFILE_ID = "CreatorProfileView"; private static final String CREATOR_PRIVACY_ID = "CreatorPrivacyId";
diff --git a/chrome/browser/creator/android/java/src/org/chromium/chrome/browser/creator/CreatorMediator.java b/chrome/browser/creator/android/java/src/org/chromium/chrome/browser/creator/CreatorMediator.java index b0179d0..7e399e3f 100644 --- a/chrome/browser/creator/android/java/src/org/chromium/chrome/browser/creator/CreatorMediator.java +++ b/chrome/browser/creator/android/java/src/org/chromium/chrome/browser/creator/CreatorMediator.java
@@ -19,9 +19,9 @@ */ @NullMarked public class CreatorMediator { - private PropertyModel mCreatorModel; + private final PropertyModel mCreatorModel; private final CreatorSnackbarController mCreatorSnackbarController; - private SignInInterstitialInitiator mSignInInterstitialInitiator; + private final SignInInterstitialInitiator mSignInInterstitialInitiator; CreatorMediator( Context context,
diff --git a/chrome/browser/creator/android/java/src/org/chromium/chrome/browser/creator/CreatorSnackbarController.java b/chrome/browser/creator/android/java/src/org/chromium/chrome/browser/creator/CreatorSnackbarController.java index 8340e3f9..a145c3a2 100644 --- a/chrome/browser/creator/android/java/src/org/chromium/chrome/browser/creator/CreatorSnackbarController.java +++ b/chrome/browser/creator/android/java/src/org/chromium/chrome/browser/creator/CreatorSnackbarController.java
@@ -19,9 +19,9 @@ public class CreatorSnackbarController { static final int SNACKBAR_DURATION_MS = 8000; - private Context mContext; - private SnackbarManager mSnackbarManager; - private SnackbarManager.SnackbarController mSnackbarController; + private final Context mContext; + private final SnackbarManager mSnackbarManager; + private final SnackbarManager.SnackbarController mSnackbarController; /** * Constructs an instance of {@link CreatorSnackbarController}.
diff --git a/chrome/browser/data_sharing/android/java/src/org/chromium/chrome/browser/data_sharing/BulkFaviconUtilUnitTest.java b/chrome/browser/data_sharing/android/java/src/org/chromium/chrome/browser/data_sharing/BulkFaviconUtilUnitTest.java index 976b9cd..00d21ac 100644 --- a/chrome/browser/data_sharing/android/java/src/org/chromium/chrome/browser/data_sharing/BulkFaviconUtilUnitTest.java +++ b/chrome/browser/data_sharing/android/java/src/org/chromium/chrome/browser/data_sharing/BulkFaviconUtilUnitTest.java
@@ -59,9 +59,9 @@ private Context mContext; private BulkFaviconUtil mBulkFaviconUtil; - private GURL mGurl1 = new GURL("https://www.google.com"); - private GURL mGurl2 = new GURL("https://www.chromium.org"); - private List<GURL> mGurlList = Arrays.asList(mGurl1, mGurl2); + private final GURL mGurl1 = new GURL("https://www.google.com"); + private final GURL mGurl2 = new GURL("https://www.chromium.org"); + private final List<GURL> mGurlList = Arrays.asList(mGurl1, mGurl2); @Before public void setUp() {
diff --git a/chrome/browser/data_sharing/android/java/src/org/chromium/chrome/browser/data_sharing/RecentActivityActionHandlerImpl.java b/chrome/browser/data_sharing/android/java/src/org/chromium/chrome/browser/data_sharing/RecentActivityActionHandlerImpl.java index d3b7c0d..36c9e05 100644 --- a/chrome/browser/data_sharing/android/java/src/org/chromium/chrome/browser/data_sharing/RecentActivityActionHandlerImpl.java +++ b/chrome/browser/data_sharing/android/java/src/org/chromium/chrome/browser/data_sharing/RecentActivityActionHandlerImpl.java
@@ -24,7 +24,6 @@ private final @Nullable TabGroupSyncService mTabGroupSyncService; private final TabModelSelector mTabModelSelector; private final DataSharingTabGroupsDelegate mDataSharingTabGroupsDelegate; - private final String mCollaborationId; private final @Nullable String mSyncTabGroupId; private final Runnable mManageSharingCallback; @@ -49,10 +48,8 @@ mTabGroupSyncService = tabGroupSyncService; mTabModelSelector = tabModelSelector; mDataSharingTabGroupsDelegate = dataSharingTabGroupsDelegate; - mCollaborationId = collaborationId; mSyncTabGroupId = syncTabGroupId; mManageSharingCallback = manageSharingCallback; - assert mCollaborationId != null; } @Override
diff --git a/chrome/browser/data_sharing/android/java/src/org/chromium/chrome/browser/data_sharing/TabGridDialogShareBottomSheetContent.java b/chrome/browser/data_sharing/android/java/src/org/chromium/chrome/browser/data_sharing/TabGridDialogShareBottomSheetContent.java index bc8e61f3..bb8e95b 100644 --- a/chrome/browser/data_sharing/android/java/src/org/chromium/chrome/browser/data_sharing/TabGridDialogShareBottomSheetContent.java +++ b/chrome/browser/data_sharing/android/java/src/org/chromium/chrome/browser/data_sharing/TabGridDialogShareBottomSheetContent.java
@@ -16,7 +16,7 @@ /** Bottom sheet content to provide data sharing service to TabGridDialog. */ @NullMarked public class TabGridDialogShareBottomSheetContent implements BottomSheetContent { - private View mContentView; + private final View mContentView; public TabGridDialogShareBottomSheetContent(View view) { mContentView = view;
diff --git a/chrome/browser/data_sharing/android/java/src/org/chromium/chrome/browser/data_sharing/ui/recent_activity/RecentActivityListMediatorUnitTest.java b/chrome/browser/data_sharing/android/java/src/org/chromium/chrome/browser/data_sharing/ui/recent_activity/RecentActivityListMediatorUnitTest.java index 1c556fe0..a2adc61 100644 --- a/chrome/browser/data_sharing/android/java/src/org/chromium/chrome/browser/data_sharing/ui/recent_activity/RecentActivityListMediatorUnitTest.java +++ b/chrome/browser/data_sharing/android/java/src/org/chromium/chrome/browser/data_sharing/ui/recent_activity/RecentActivityListMediatorUnitTest.java
@@ -80,7 +80,7 @@ private PropertyModel mPropertyModel; private ModelList mModelList; private RecentActivityListMediator mMediator; - private List<ActivityLogItem> mTestItems = new ArrayList<>(); + private final List<ActivityLogItem> mTestItems = new ArrayList<>(); @Before public void setup() {
diff --git a/chrome/browser/device/android/java/src/org/chromium/chrome/browser/device/DeviceClassManager.java b/chrome/browser/device/android/java/src/org/chromium/chrome/browser/device/DeviceClassManager.java index 3162bb494..aca3e756 100644 --- a/chrome/browser/device/android/java/src/org/chromium/chrome/browser/device/DeviceClassManager.java +++ b/chrome/browser/device/android/java/src/org/chromium/chrome/browser/device/DeviceClassManager.java
@@ -19,10 +19,10 @@ private static @Nullable DeviceClassManager sInstance; // Set of features that can be enabled/disabled - private boolean mEnableLayerDecorationCache; - private boolean mEnableAnimations; - private boolean mEnablePrerendering; - private boolean mEnableToolbarSwipe; + private final boolean mEnableLayerDecorationCache; + private final boolean mEnableAnimations; + private final boolean mEnablePrerendering; + private final boolean mEnableToolbarSwipe; private final boolean mEnableFullscreen;
diff --git a/chrome/browser/device/android/java/src/org/chromium/chrome/browser/device/DeviceConditions.java b/chrome/browser/device/android/java/src/org/chromium/chrome/browser/device/DeviceConditions.java index 59025d7e..950949b 100644 --- a/chrome/browser/device/android/java/src/org/chromium/chrome/browser/device/DeviceConditions.java +++ b/chrome/browser/device/android/java/src/org/chromium/chrome/browser/device/DeviceConditions.java
@@ -30,12 +30,12 @@ // Battery and power related variables. private boolean mPowerConnected; private int mBatteryPercentage; - private boolean mPowerSaveOn; - private boolean mScreenOnAndUnlocked; + private final boolean mPowerSaveOn; + private final boolean mScreenOnAndUnlocked; // Network related variables. private @ConnectionType int mNetConnectionType = ConnectionType.CONNECTION_UNKNOWN; - private boolean mActiveNetworkMetered; + private final boolean mActiveNetworkMetered; // If true, getCurrentNetConnectionType() will always return CONNECTION_NONE. @VisibleForTesting public static boolean sForceConnectionTypeForTesting;
diff --git a/chrome/browser/device_reauth/android/java/src/org/chromium/chrome/browser/device_reauth/BiometricErrorDialogUnitTest.java b/chrome/browser/device_reauth/android/java/src/org/chromium/chrome/browser/device_reauth/BiometricErrorDialogUnitTest.java index e2080da3..c311422 100644 --- a/chrome/browser/device_reauth/android/java/src/org/chromium/chrome/browser/device_reauth/BiometricErrorDialogUnitTest.java +++ b/chrome/browser/device_reauth/android/java/src/org/chromium/chrome/browser/device_reauth/BiometricErrorDialogUnitTest.java
@@ -31,7 +31,7 @@ @RunWith(BaseRobolectricTestRunner.class) @Config(manifest = Config.NONE) public class BiometricErrorDialogUnitTest { - private FakeModalDialogManager mModalDialogManager = + private final FakeModalDialogManager mModalDialogManager = new FakeModalDialogManager(ModalDialogManager.ModalDialogType.APP); private Activity mActivity;
diff --git a/chrome/browser/device_reauth/android/java/src/org/chromium/chrome/browser/device_reauth/MandatoryAuthenticatorControllerImpl.java b/chrome/browser/device_reauth/android/java/src/org/chromium/chrome/browser/device_reauth/MandatoryAuthenticatorControllerImpl.java index 43e0eb0..6927306 100644 --- a/chrome/browser/device_reauth/android/java/src/org/chromium/chrome/browser/device_reauth/MandatoryAuthenticatorControllerImpl.java +++ b/chrome/browser/device_reauth/android/java/src/org/chromium/chrome/browser/device_reauth/MandatoryAuthenticatorControllerImpl.java
@@ -49,7 +49,7 @@ */ public static final int BIOMETRIC_ERROR_LOCKOUT_PERMANENT = 9; - private Context mContext; + private final Context mContext; private @Nullable BiometricPrompt mBiometricPrompt; public MandatoryAuthenticatorControllerImpl(Context context, Delegate delegate) {
diff --git a/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/DownloadDirectoryProvider.java b/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/DownloadDirectoryProvider.java index 349dc34..85cf53bf 100644 --- a/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/DownloadDirectoryProvider.java +++ b/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/DownloadDirectoryProvider.java
@@ -86,7 +86,7 @@ * can exist at the same time. */ private class AllDirectoriesTask extends AsyncTask<ArrayList<DirectoryOption>> { - private DownloadDirectoryProvider.Delegate mDelegate; + private final DownloadDirectoryProvider.Delegate mDelegate; AllDirectoriesTask(DownloadDirectoryProvider.Delegate delegate) { mDelegate = delegate; @@ -208,7 +208,7 @@ private @Nullable AllDirectoriesTask mAllDirectoriesTask; private @Nullable ArrayList<DirectoryOption> mDirectoryOptions; private @Nullable String mExternalStorageDirectory; - private ArrayList<Callback<ArrayList<DirectoryOption>>> mCallbacks = new ArrayList<>(); + private final ArrayList<Callback<ArrayList<DirectoryOption>>> mCallbacks = new ArrayList<>(); protected DownloadDirectoryProvider() { registerSDCardReceiver();
diff --git a/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/dialogs/DownloadLocationCustomView.java b/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/dialogs/DownloadLocationCustomView.java index f1e243b..73ca37e 100644 --- a/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/dialogs/DownloadLocationCustomView.java +++ b/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/dialogs/DownloadLocationCustomView.java
@@ -41,7 +41,7 @@ @NullMarked public class DownloadLocationCustomView extends ScrollView implements OnCheckedChangeListener, DownloadDirectoryAdapter.Delegate { - private DownloadDirectoryAdapter mDirectoryAdapter; + private final DownloadDirectoryAdapter mDirectoryAdapter; private TextView mTitle; private TextView mSubtitleView;
diff --git a/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/home/DownloadManagerUiConfig.java b/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/home/DownloadManagerUiConfig.java index 1c99e70b..a22cdba 100644 --- a/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/home/DownloadManagerUiConfig.java +++ b/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/home/DownloadManagerUiConfig.java
@@ -81,7 +81,7 @@ private boolean mSupportFullWidthImages; private int mInMemoryThumbnailCacheSizeBytes = IN_MEMORY_THUMBNAIL_CACHE_SIZE_BYTES; private float mMaxThumbnailScaleFactor = MAX_THUMBNAIL_SCALE_FACTOR; - private long mJustNowThresholdSeconds = JUST_NOW_THRESHOLD_SECONDS; + private final long mJustNowThresholdSeconds = JUST_NOW_THRESHOLD_SECONDS; private boolean mSupportsGrouping; private boolean mShowPaginationHeaders; private boolean mStartWithPrefetchedContent;
diff --git a/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/settings/DownloadDirectoryAdapter.java b/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/settings/DownloadDirectoryAdapter.java index 16b8fd4..fb3883e 100644 --- a/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/settings/DownloadDirectoryAdapter.java +++ b/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/settings/DownloadDirectoryAdapter.java
@@ -58,13 +58,13 @@ protected int mSelectedPosition = SELECTED_ITEM_NOT_INITIALIZED; - private Context mContext; - private LayoutInflater mLayoutInflater; + private final Context mContext; + private final LayoutInflater mLayoutInflater; protected Delegate mDelegate; - private List<DirectoryOption> mCanonicalOptions = new ArrayList<>(); - private List<DirectoryOption> mAdditionalOptions = new ArrayList<>(); - private List<DirectoryOption> mErrorOptions = new ArrayList<>(); + private final List<DirectoryOption> mCanonicalOptions = new ArrayList<>(); + private final List<DirectoryOption> mAdditionalOptions = new ArrayList<>(); + private final List<DirectoryOption> mErrorOptions = new ArrayList<>(); public DownloadDirectoryAdapter(Context context, Delegate delegate) { super(context, android.R.layout.simple_spinner_item);
diff --git a/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/settings/DownloadLocationPreference.java b/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/settings/DownloadLocationPreference.java index 69f6df9..e3da2c72a 100644 --- a/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/settings/DownloadLocationPreference.java +++ b/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/settings/DownloadLocationPreference.java
@@ -28,7 +28,7 @@ * Provides data for the list of available download directories options. Uses an asynchronous * operation to query the directory options. */ - private DownloadLocationPreferenceAdapter mAdapter; + private final DownloadLocationPreferenceAdapter mAdapter; private DownloadLocationHelper mLocationHelper;
diff --git a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/list/DateOrderedListCoordinator.java b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/list/DateOrderedListCoordinator.java index 729a2373..1d44eed 100644 --- a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/list/DateOrderedListCoordinator.java +++ b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/list/DateOrderedListCoordinator.java
@@ -96,8 +96,8 @@ private ViewGroup mMainView; private View mEmptyView; private int mWindowHeight; - private int mDownloadStorageSummaryHeightPx; - private int mSelectableListToolbarHeightPx; + private final int mDownloadStorageSummaryHeightPx; + private final int mSelectableListToolbarHeightPx; /** * Creates an instance of a DateOrderedListCoordinator, which will visually represent
diff --git a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/list/DateOrderedListView.java b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/list/DateOrderedListView.java index 46a3496..bdd8d2a 100644 --- a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/list/DateOrderedListView.java +++ b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/list/DateOrderedListView.java
@@ -53,7 +53,7 @@ private final RecyclerView mView; private final GridLayoutManager mGridLayoutManager; private final UiConfig mUiConfig; - private Runnable mOnConfigurationChangedCallback; + private final Runnable mOnConfigurationChangedCallback; /** Creates an instance of a {@link DateOrderedListView} representing {@code model}. */ public DateOrderedListView(
diff --git a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/list/holder/OfflineItemViewHolder.java b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/list/holder/OfflineItemViewHolder.java index c0a53eec..08efa018 100644 --- a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/list/holder/OfflineItemViewHolder.java +++ b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/list/holder/OfflineItemViewHolder.java
@@ -215,9 +215,9 @@ private static class BitmapResizer implements AsyncImageView.ImageResizer { private static final float IMAGE_VIEW_MAX_SCALE_FACTOR = 4.f; - private ImageView mImageView; + private final ImageView mImageView; - private @Filters.FilterType int mFilter; + private final @Filters.FilterType int mFilter; /** Constructor. */ public BitmapResizer(ImageView imageView, @Filters.FilterType int filter) {
diff --git a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/list/mutator/CardPaginator.java b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/list/mutator/CardPaginator.java index 21a8592..d17ab9b3 100644 --- a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/list/mutator/CardPaginator.java +++ b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/list/mutator/CardPaginator.java
@@ -18,7 +18,7 @@ private static final int ITEM_COUNT_PER_PAGE = 3; // Maintains the current page count for each card. The cards are keyed by date and domain. - private Map<Pair<Date, String>, Integer> mPageCountForCard = new HashMap<>(); + private final Map<Pair<Date, String>, Integer> mPageCountForCard = new HashMap<>(); /** * Called to load one more page for the given card.
diff --git a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/list/mutator/DateOrderedListMutator.java b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/list/mutator/DateOrderedListMutator.java index 2e1598e..1d92f68 100644 --- a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/list/mutator/DateOrderedListMutator.java +++ b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/list/mutator/DateOrderedListMutator.java
@@ -49,7 +49,7 @@ private final JustNowProvider mJustNowProvider; private final ListItemModel mModel; private @Nullable ListConsumer mListConsumer; - private ArrayList<ListItem> mSortedItems = new ArrayList<>(); + private final ArrayList<ListItem> mSortedItems = new ArrayList<>(); /** * Creates an DateOrderedList instance that will reflect {@code source}.
diff --git a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/list/mutator/DateSorterForCards.java b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/list/mutator/DateSorterForCards.java index 3f0a131f..5c439d9 100644 --- a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/list/mutator/DateSorterForCards.java +++ b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/list/mutator/DateSorterForCards.java
@@ -24,7 +24,7 @@ @NullMarked public class DateSorterForCards implements ListConsumer { private @Nullable ListConsumer mListConsumer; - private Map<String, Long> mTimestampForCard = new HashMap<>(); + private final Map<String, Long> mTimestampForCard = new HashMap<>(); @Override public ListConsumer setListConsumer(ListConsumer consumer) {
diff --git a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/list/mutator/GroupCardLabelAdder.java b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/list/mutator/GroupCardLabelAdder.java index 38493647..5c1da3f 100644 --- a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/list/mutator/GroupCardLabelAdder.java +++ b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/list/mutator/GroupCardLabelAdder.java
@@ -30,7 +30,7 @@ private static final long CARD_DIVIDER_MIDDLE_HASH_CODE_OFFSET = 200000; private @Nullable ListConsumer mListConsumer; - private CardPaginator mCardPaginator; + private final CardPaginator mCardPaginator; private long mDividerIndexId; /** Constructor. */
diff --git a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/toolbar/ToolbarCoordinator.java b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/toolbar/ToolbarCoordinator.java index b20f436..c4b9bb0 100644 --- a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/toolbar/ToolbarCoordinator.java +++ b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/home/toolbar/ToolbarCoordinator.java
@@ -75,7 +75,7 @@ private boolean mShowToolbarShadow; - private SelectableListToolbar.SearchDelegate mSearchDelegate = + private final SelectableListToolbar.SearchDelegate mSearchDelegate = new SelectableListToolbar.SearchDelegate() { @Override public void onSearchTextChanged(String query) {
diff --git a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/interstitial/DownloadInterstitialMediatorTest.java b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/interstitial/DownloadInterstitialMediatorTest.java index 05f3329de..58f275e 100644 --- a/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/interstitial/DownloadInterstitialMediatorTest.java +++ b/chrome/browser/download/internal/android/java/src/org/chromium/chrome/browser/download/interstitial/DownloadInterstitialMediatorTest.java
@@ -70,7 +70,7 @@ private final TestOfflineContentProvider mProvider = new TestOfflineContentProvider(); private FakeModalDialogManager mModalDialogManager; private DownloadInterstitialMediator mMediator; - private UmaTestingHelper mUmaTestingHelper = new UmaTestingHelper(); + private final UmaTestingHelper mUmaTestingHelper = new UmaTestingHelper(); private PropertyModel mModel; private OfflineItem mItem0; @@ -334,7 +334,7 @@ * logs to test how many metrics of each type were logged during the test. */ private static class UmaTestingHelper { - private Map<Integer, Integer> mValues; + private final Map<Integer, Integer> mValues; UmaTestingHelper() { mValues = new HashMap<Integer, Integer>();
diff --git a/chrome/browser/educational_tip/java/src/org/chromium/chrome/browser/educational_tip/EducationalTipModuleMediator.java b/chrome/browser/educational_tip/java/src/org/chromium/chrome/browser/educational_tip/EducationalTipModuleMediator.java index 164b6605..903a16d 100644 --- a/chrome/browser/educational_tip/java/src/org/chromium/chrome/browser/educational_tip/EducationalTipModuleMediator.java +++ b/chrome/browser/educational_tip/java/src/org/chromium/chrome/browser/educational_tip/EducationalTipModuleMediator.java
@@ -30,8 +30,8 @@ private final CallbackController mCallbackController; private @Nullable EducationalTipCardProvider mEducationalTipCardProvider; - private DefaultBrowserPromoTriggerStateListener mDefaultBrowserPromoTriggerStateListener; - private Tracker mTracker; + private final DefaultBrowserPromoTriggerStateListener mDefaultBrowserPromoTriggerStateListener; + private final Tracker mTracker; EducationalTipModuleMediator( @ModuleType int moduleType,
diff --git a/chrome/browser/educational_tip/java/src/org/chromium/chrome/browser/educational_tip/cards/DefaultBrowserPromoBottomSheetContent.java b/chrome/browser/educational_tip/java/src/org/chromium/chrome/browser/educational_tip/cards/DefaultBrowserPromoBottomSheetContent.java index a8ab6982..f8e06c1 100644 --- a/chrome/browser/educational_tip/java/src/org/chromium/chrome/browser/educational_tip/cards/DefaultBrowserPromoBottomSheetContent.java +++ b/chrome/browser/educational_tip/java/src/org/chromium/chrome/browser/educational_tip/cards/DefaultBrowserPromoBottomSheetContent.java
@@ -18,7 +18,7 @@ /** Bottom sheet content of the default browser promo card. */ @NullMarked public class DefaultBrowserPromoBottomSheetContent implements BottomSheetContent { - private View mContentView; + private final View mContentView; public DefaultBrowserPromoBottomSheetContent(View view) { mContentView = view;
diff --git a/chrome/browser/enterprise/util/android/java/src/org/chromium/chrome/browser/enterprise/util/EnterpriseInfoImpl.java b/chrome/browser/enterprise/util/android/java/src/org/chromium/chrome/browser/enterprise/util/EnterpriseInfoImpl.java index 66fdc95..b8533b92 100644 --- a/chrome/browser/enterprise/util/android/java/src/org/chromium/chrome/browser/enterprise/util/EnterpriseInfoImpl.java +++ b/chrome/browser/enterprise/util/android/java/src/org/chromium/chrome/browser/enterprise/util/EnterpriseInfoImpl.java
@@ -40,7 +40,7 @@ // Only ever read/written on the UI thread. private @Nullable OwnedState mOwnedState; - private Queue<Callback<@Nullable OwnedState>> mCallbackList; + private final Queue<Callback<@Nullable OwnedState>> mCallbackList; private boolean mSkipAsyncCheckForTesting;
diff --git a/chrome/browser/extensions/api/web_request/web_request_permissions_unittest.cc b/chrome/browser/extensions/api/web_request/web_request_permissions_unittest.cc index 11417ff..4f01ade 100644 --- a/chrome/browser/extensions/api/web_request/web_request_permissions_unittest.cc +++ b/chrome/browser/extensions/api/web_request/web_request_permissions_unittest.cc
@@ -2,6 +2,8 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +#include "extensions/browser/api/web_request/web_request_permissions.h" + #include <stddef.h> #include <memory> @@ -14,14 +16,16 @@ #include "content/public/test/browser_task_environment.h" #include "extensions/browser/api/web_request/permission_helper.h" #include "extensions/browser/api/web_request/web_request_info.h" -#include "extensions/browser/api/web_request/web_request_permissions.h" #include "extensions/browser/extension_registry.h" +#include "extensions/buildflags/buildflags.h" #include "extensions/common/constants.h" #include "extensions/common/permissions/permissions_data.h" #include "ipc/ipc_message.h" #include "services/network/public/mojom/fetch_api.mojom-shared.h" #include "testing/gtest/include/gtest/gtest.h" +static_assert(BUILDFLAG(ENABLE_EXTENSIONS_CORE)); + using extension_test_util::LoadManifestUnchecked; using extensions::Extension; using extensions::ExtensionRegistry;
diff --git a/chrome/browser/extensions/desktop_android/desktop_android_extensions_browser_client.cc b/chrome/browser/extensions/desktop_android/desktop_android_extensions_browser_client.cc index 28127d7..7475719 100644 --- a/chrome/browser/extensions/desktop_android/desktop_android_extensions_browser_client.cc +++ b/chrome/browser/extensions/desktop_android/desktop_android_extensions_browser_client.cc
@@ -21,6 +21,8 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/profiles/profile_selections.h" +#include "chrome/browser/ui/webui/devtools/devtools_ui.h" +#include "chrome/common/webui_url_constants.h" #include "components/signin/core/browser/signin_header_helper.h" #include "components/update_client/update_client.h" #include "components/value_store/value_store_factory.h" @@ -32,6 +34,8 @@ #include "extensions/browser/api/core_extensions_browser_api_provider.h" #include "extensions/browser/api/extensions_api_client.h" #include "extensions/browser/api/messaging/messaging_delegate.h" +#include "extensions/browser/api/web_request/web_request_info.h" +#include "extensions/browser/api/web_request/web_request_resource_type.h" #include "extensions/browser/event_router.h" #include "extensions/browser/extension_error.h" #include "extensions/browser/extension_util.h" @@ -119,6 +123,41 @@ signin::kDiceResponseHeader) == 0; } + // The following code (duplicated from ChromeExtensionAPIClient) is used to + // support chrome.webRequest api where webRequestPermissions calls + // PermissionHelper::ShouldHideBrowserNetworkRequest(), until + // ChromeExtensionAPIClient is ported for desktop android. + bool ShouldHideBrowserNetworkRequest( + content::BrowserContext* context, + const WebRequestInfo& request) const override { + DCHECK_CURRENTLY_ON(content::BrowserThread::UI); + + // Note: browser initiated non-navigation requests are hidden from + // extensions. But we do still need to protect some sensitive sub-frame + // navigation requests. Exclude main frame navigation requests. + bool is_browser_request = + request.render_process_id == -1 && + request.web_request_type != WebRequestResourceType::MAIN_FRAME; + + // Hide requests made by the Devtools frontend. + bool is_sensitive_request = + is_browser_request && DevToolsUI::IsFrontendResourceURL(request.url); + + // Hide requests made by the browser on behalf of the NTP. + is_sensitive_request |= + is_browser_request && + request.initiator == + url::Origin::Create(GURL(chrome::kChromeUINewTabURL)); + + // Hide requests made by the browser on behalf of the 1P WebUI NTP. + is_sensitive_request |= + is_browser_request && + request.initiator == + url::Origin::Create(GURL(chrome::kChromeUINewTabPageURL)); + + return is_sensitive_request; + } + private: std::unique_ptr<MessagingDelegate> messaging_delegate_; };
diff --git a/chrome/browser/favicon/BUILD.gn b/chrome/browser/favicon/BUILD.gn index 734eabc..e107fc7 100644 --- a/chrome/browser/favicon/BUILD.gn +++ b/chrome/browser/favicon/BUILD.gn
@@ -15,6 +15,8 @@ "large_icon_service_factory.cc", "large_icon_service_factory.h", ] + + # TODO(1335199): split favicon in public and impl targets (due to the circular dependency). public_deps = [ "//chrome/browser:browser_public_dependencies" ] deps = [ "//chrome/app/resources:platform_locale_settings",
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/CardMenuBottomSheetContent.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/CardMenuBottomSheetContent.java index 541b9bd..755be77 100644 --- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/CardMenuBottomSheetContent.java +++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/CardMenuBottomSheetContent.java
@@ -16,7 +16,7 @@ /** Provide data that the bottom sheet manager needs to show a bottom sheet. */ @NullMarked public class CardMenuBottomSheetContent implements BottomSheetContent { - private View mContentView; + private final View mContentView; public CardMenuBottomSheetContent(View view) { mContentView = view;
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedImageFetchClient.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedImageFetchClient.java index 0d74a4a..68ea82b 100644 --- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedImageFetchClient.java +++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedImageFetchClient.java
@@ -18,8 +18,8 @@ @NullMarked public class FeedImageFetchClient implements ImageFetchClient { private static class HttpResponseImpl implements ImageFetchClient.HttpResponse { - private int mStatus; - private byte[] mBody; + private final int mStatus; + private final byte[] mBody; public HttpResponseImpl(int status, byte[] body) { mStatus = status;
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedListContentManager.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedListContentManager.java index e5bc198a..e6720d2 100644 --- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedListContentManager.java +++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedListContentManager.java
@@ -102,7 +102,7 @@ // An unique ID for this NativeViewContent. This is initially 0, and assigned by // FeedListContentManager when needed. private int mViewType; - @Px private int mLateralPaddingsPx; + @Px private final int mLateralPaddingsPx; /** Holds an inflated native view. */ public NativeViewContent(@Px int lateralPaddingsPx, String key, View nativeView) {
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedPlaceholderLayout.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedPlaceholderLayout.java index 993146e1..db9234c 100644 --- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedPlaceholderLayout.java +++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedPlaceholderLayout.java
@@ -68,7 +68,7 @@ private final Context mContext; private final Resources mResources; private long mLayoutInflationCompleteMs; - private int mScreenWidthDp; + private final int mScreenWidthDp; private boolean mIsFirstCardDense; private UiConfig mUiConfig;
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedProcessScopeDependencyProvider.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedProcessScopeDependencyProvider.java index c2135ca1..ce469e17 100644 --- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedProcessScopeDependencyProvider.java +++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedProcessScopeDependencyProvider.java
@@ -25,7 +25,7 @@ public class FeedProcessScopeDependencyProvider implements ProcessScopeDependencyProvider { private static final String FEED_SPLIT_NAME = "google3"; - private ImageFetchClient mImageFetchClient; + private final ImageFetchClient mImageFetchClient; public FeedProcessScopeDependencyProvider() { mImageFetchClient = new FeedImageFetchClient();
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedSliceViewTracker.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedSliceViewTracker.java index 60958c8..3d88ad1 100644 --- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedSliceViewTracker.java +++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedSliceViewTracker.java
@@ -55,15 +55,15 @@ private @Nullable ListLayoutHelper mLayoutHelper; // The set of content keys already reported as mostly visible (66% threshold), which is used to // determine if a slice has been viewed by the user. - private HashSet<String> mContentKeysMostlyVisible = new HashSet<String>(); + private final HashSet<String> mContentKeysMostlyVisible = new HashSet<String>(); // The set of content keys already reported as barely visible (5% threshold), which is used to // determine if a slice has entered the view port. - private HashSet<String> mContentKeysBarelyVisible = new HashSet<>(); + private final HashSet<String> mContentKeysBarelyVisible = new HashSet<>(); // The set of content keys for load-more indicators already reported as visible (5% threshold). - private HashSet<String> mLoadMoreIndicatorContentKeys = new HashSet<>(); + private final HashSet<String> mLoadMoreIndicatorContentKeys = new HashSet<>(); // The set of content keys for load-more indicators already reported as that the user scrolled // away from the indicator. - private HashSet<String> mLoadMoreAwayFromIndicatorContentKeys = new HashSet<>(); + private final HashSet<String> mLoadMoreAwayFromIndicatorContentKeys = new HashSet<>(); private boolean mFeedContentVisible; private Observer mObserver; // Map from content key to a list of watchers that will get notified for the first-time visible
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedStream.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedStream.java index 4d227b2..95a7c63 100644 --- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedStream.java +++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedStream.java
@@ -644,7 +644,7 @@ } } - private FeedSurfaceRendererBridge mBridge; + private final FeedSurfaceRendererBridge mBridge; // How far the user has to scroll down in DP before attempting to load more content. private final int mLoadMoreTriggerScrollDistanceDp; @@ -657,11 +657,11 @@ private @ClosedReason int mClosedReason = ClosedReason.LEAVE_FEED; // Various helpers/controllers. private ShareHelperWrapper mShareHelper; - private SnackbarManager mSnackManager; - private WindowAndroid mWindowAndroid; + private final SnackbarManager mSnackManager; + private final WindowAndroid mWindowAndroid; private @Nullable UnreadContentObserver mUnreadContentObserver; @Nullable FeedContentFirstLoadWatcher mFeedContentFirstLoadWatcher; - private Stream.StreamsMediator mStreamsMediator; + private final Stream.StreamsMediator mStreamsMediator; // Snackbar (and post-Follow dialog) controller used exclusively for handling in-feed // post-Follow and post-Unfollow UX. WebFeedSnackbarController mWebFeedSnackbarController; @@ -669,17 +669,17 @@ // For loading more content. private int mAccumulatedDySinceLastLoadMore; - private int mLoadMoreTriggerLookahead; + private final int mLoadMoreTriggerLookahead; private boolean mIsLoadingMoreContent; // Things attached on bind. - private RestoreScrollObserver mRestoreScrollObserver = new RestoreScrollObserver(); - private RecyclerView.OnScrollListener mMainScrollListener; + private final RestoreScrollObserver mRestoreScrollObserver = new RestoreScrollObserver(); + private final RecyclerView.OnScrollListener mMainScrollListener; private @Nullable FeedSliceViewTracker mSliceViewTracker; - private ScrollReporter mScrollReporter; + private final ScrollReporter mScrollReporter; private final Map<String, Object> mHandlersMap; - private RotationObserver mRotationObserver; - private FeedReliabilityLoggingBridge mReliabilityLoggingBridge; + private final RotationObserver mRotationObserver; + private final FeedReliabilityLoggingBridge mReliabilityLoggingBridge; private @Nullable FeedReliabilityLogger mReliabilityLogger; // Things valid only when bound. @@ -690,7 +690,8 @@ private @Nullable FeedScrollState mScrollStateToRestore; private int mHeaderCount; private long mLastFetchTimeMs; - private ArrayList<SnackbarManager.SnackbarController> mSnackbarControllers = new ArrayList<>(); + private final ArrayList<SnackbarManager.SnackbarController> mSnackbarControllers = + new ArrayList<>(); // Placeholder view that simply takes up space. private FeedListContentManager.@Nullable NativeViewContent mSpacerViewContent; @@ -1478,8 +1479,8 @@ */ @VisibleForTesting static class ShareHelperWrapper { - private WindowAndroid mWindowAndroid; - private Supplier<ShareDelegate> mShareDelegateSupplier; + private final WindowAndroid mWindowAndroid; + private final Supplier<ShareDelegate> mShareDelegateSupplier; public ShareHelperWrapper( WindowAndroid windowAndroid, Supplier<ShareDelegate> shareDelegateSupplier) {
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedStreamTest.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedStreamTest.java index a7ddfb1..e540f33 100644 --- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedStreamTest.java +++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedStreamTest.java
@@ -121,7 +121,7 @@ @Mock private WindowAndroid mWindowAndroid; @Mock private ModalDialogManager mModalDialogManager; @Mock private Supplier<ShareDelegate> mShareDelegateSupplier; - private StubSnackbarController mSnackbarController = new StubSnackbarController(); + private final StubSnackbarController mSnackbarController = new StubSnackbarController(); @Mock private Runnable mMockRunnable; @Mock private Callback<Boolean> mMockRefreshCallback; @Mock private FeedStream.ShareHelperWrapper mShareHelper;
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedSurfaceRendererBridge.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedSurfaceRendererBridge.java index 24da40ab..69386267 100644 --- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedSurfaceRendererBridge.java +++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedSurfaceRendererBridge.java
@@ -23,7 +23,7 @@ @NullMarked public class FeedSurfaceRendererBridge { private final Profile mProfile; - private int mSurfaceId; + private final int mSurfaceId; private long mNativeSurfaceRenderer; private @Nullable Renderer mRenderer;
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedSurfaceTracker.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedSurfaceTracker.java index 3df281c..e4cd454 100644 --- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedSurfaceTracker.java +++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/FeedSurfaceTracker.java
@@ -31,7 +31,7 @@ // the correct sign-in state is used if attaching the surface triggers a fetch. private boolean mStartupCalled; - private ObserverList<Observer> mObservers = new ObserverList<>(); + private final ObserverList<Observer> mObservers = new ObserverList<>(); // Tracks all the instances of FeedSurfaceCoordinator. @VisibleForTesting @Nullable HashSet<SurfaceCoordinator> mCoordinators;
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/HeaderIphScrollListener.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/HeaderIphScrollListener.java index a106df6..5223591 100644 --- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/HeaderIphScrollListener.java +++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/HeaderIphScrollListener.java
@@ -35,8 +35,8 @@ private final ScrollableContainerDelegate mScrollableContainerDelegate; private final Runnable mShowIPHRunnable; - private float mMinScrollFraction; - private float mHeaderMaxPosFraction; + private final float mMinScrollFraction; + private final float mHeaderMaxPosFraction; HeaderIphScrollListener( FeedBubbleDelegate delegate,
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/NativeViewListRenderer.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/NativeViewListRenderer.java index 1cd550c..ea2a202 100644 --- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/NativeViewListRenderer.java +++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/NativeViewListRenderer.java
@@ -158,7 +158,7 @@ } static class NativeViewListLayoutHelper implements ListLayoutHelper { - private LinearLayoutManager mLayoutManager; + private final LinearLayoutManager mLayoutManager; public NativeViewListLayoutHelper(LinearLayoutManager layoutManager) { mLayoutManager = layoutManager;
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/SingleWebFeedParameters.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/SingleWebFeedParameters.java index 9a59fe0f..14391cab 100644 --- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/SingleWebFeedParameters.java +++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/SingleWebFeedParameters.java
@@ -9,8 +9,8 @@ /** This class bundles the parameters for the creation of a single web feed. */ @NullMarked public class SingleWebFeedParameters { - private byte[] mWebFeedId; - private int mEntryPoint; + private final byte[] mWebFeedId; + private final int mEntryPoint; public SingleWebFeedParameters(byte[] webFeedId, int entryPoint) { mWebFeedId = webFeedId;
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/SingleWebFeedStreamTest.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/SingleWebFeedStreamTest.java index 50382870..3cadace8 100644 --- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/SingleWebFeedStreamTest.java +++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/SingleWebFeedStreamTest.java
@@ -101,7 +101,7 @@ @Mock private FeedSurfaceScope mSurfaceScope; @Mock private FeedReliabilityLogger mReliabilityLogger; @Mock private Supplier<ShareDelegate> mShareDelegateSupplier; - private StubSnackbarController mSnackbarController = new StubSnackbarController(); + private final StubSnackbarController mSnackbarController = new StubSnackbarController(); @Mock private Runnable mMockRunnable; @Mock private Callback<Boolean> mMockRefreshCallback; @Mock private FeedStream.ShareHelperWrapper mShareHelper;
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/feedmanagement/FeedManagementCoordinator.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/feedmanagement/FeedManagementCoordinator.java index 6b0554cc..a81cb39 100644 --- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/feedmanagement/FeedManagementCoordinator.java +++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/feedmanagement/FeedManagementCoordinator.java
@@ -24,7 +24,7 @@ */ @NullMarked public class FeedManagementCoordinator { - private AppCompatActivity mActivity; + private final AppCompatActivity mActivity; private final View mView; public FeedManagementCoordinator(Activity activity, @StreamKind int feedType) {
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/feedmanagement/FeedManagementMediator.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/feedmanagement/FeedManagementMediator.java index 99d1469..e2734e1 100644 --- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/feedmanagement/FeedManagementMediator.java +++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/feedmanagement/FeedManagementMediator.java
@@ -36,7 +36,7 @@ @NullMarked public class FeedManagementMediator { private static final String TAG = "FeedManagementMdtr"; - private ModelList mModelList; + private final ModelList mModelList; private final Context mContext; private final @StreamKind int mInitiatingStreamKind;
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/followmanagement/FollowManagementCoordinator.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/followmanagement/FollowManagementCoordinator.java index acdd6317..56abff6 100644 --- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/followmanagement/FollowManagementCoordinator.java +++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/followmanagement/FollowManagementCoordinator.java
@@ -27,7 +27,7 @@ */ @NullMarked public class FollowManagementCoordinator { - private AppCompatActivity mActivity; + private final AppCompatActivity mActivity; private final View mView; public FollowManagementCoordinator(Activity activity) {
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/followmanagement/FollowManagementMediator.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/followmanagement/FollowManagementMediator.java index 33687aa..42b9f2ca 100644 --- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/followmanagement/FollowManagementMediator.java +++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/followmanagement/FollowManagementMediator.java
@@ -35,10 +35,10 @@ @NullMarked class FollowManagementMediator { private static final String TAG = "FollowManagementMdtr"; - private ModelList mModelList; - private Observer mObserver; - private Context mContext; - private WebFeedFaviconFetcher mFaviconFetcher; + private final ModelList mModelList; + private final Observer mObserver; + private final Context mContext; + private final WebFeedFaviconFetcher mFaviconFetcher; public interface Observer { /** An operation failed because there is no network connection. */
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/sections/SectionHeaderView.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/sections/SectionHeaderView.java index 99cb927..7c5e72e 100644 --- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/sections/SectionHeaderView.java +++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/sections/SectionHeaderView.java
@@ -83,8 +83,8 @@ } private class UnreadIndicator implements ViewTreeObserver.OnGlobalLayoutListener { - private View mAnchor; - private SectionHeaderBadgeDrawable mNewBadge; + private final View mAnchor; + private final SectionHeaderBadgeDrawable mNewBadge; UnreadIndicator(View anchor) { mAnchor = anchor; @@ -132,8 +132,8 @@ private boolean mTextsEnabled; private @Px int mToolbarHeight; - private @Px int mTouchSize; - private boolean mIsTablet; + private final @Px int mTouchSize; + private final boolean mIsTablet; private final boolean mIsNewTabPageCustomizationEnabled; public SectionHeaderView(Context context, @Nullable AttributeSet attrs) {
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/sort_ui/FeedOptionsCoordinator.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/sort_ui/FeedOptionsCoordinator.java index 264bafbc..df4e5fb 100644 --- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/sort_ui/FeedOptionsCoordinator.java +++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/sort_ui/FeedOptionsCoordinator.java
@@ -46,8 +46,8 @@ private final FeedOptionsView mView; private final Context mContext; - private List<PropertyModel> mChipModels; - private PropertyModel mModel; + private final List<PropertyModel> mChipModels; + private final PropertyModel mModel; private @Nullable OptionChangedListener mOptionsListener; public FeedOptionsCoordinator(Context context) {
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedFaviconFetcher.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedFaviconFetcher.java index eb9b4a4..6756cfb 100644 --- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedFaviconFetcher.java +++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedFaviconFetcher.java
@@ -31,8 +31,8 @@ */ @NullMarked public class WebFeedFaviconFetcher { - private LargeIconBridge mLargeIconBridge; - private ImageFetcher mImageFetcher; + private final LargeIconBridge mLargeIconBridge; + private final ImageFetcher mImageFetcher; public static WebFeedFaviconFetcher createDefault() { Profile profile = ProfileManager.getLastUsedRegularProfile();
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedFaviconFetcherTest.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedFaviconFetcherTest.java index 3ccf972..62e171a91 100644 --- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedFaviconFetcherTest.java +++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedFaviconFetcherTest.java
@@ -50,9 +50,9 @@ private Bitmap mBitmapFromImageFetcher; private Bitmap mBitmapFromIconBridge; private Activity mActivity; - private TestImageFetcher mImageFetcher = Mockito.spy(new TestImageFetcher()); - private TestLargeIconBridge mLargeIconBridge = Mockito.spy(new TestLargeIconBridge()); - private WebFeedFaviconFetcher mFaviconFetcher = + private final TestImageFetcher mImageFetcher = Mockito.spy(new TestImageFetcher()); + private final TestLargeIconBridge mLargeIconBridge = Mockito.spy(new TestLargeIconBridge()); + private final WebFeedFaviconFetcher mFaviconFetcher = new WebFeedFaviconFetcher(mLargeIconBridge, mImageFetcher); @Before
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedMainMenuItemTest.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedMainMenuItemTest.java index 42b6091..7cf6473 100644 --- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedMainMenuItemTest.java +++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedMainMenuItemTest.java
@@ -92,8 +92,8 @@ private Activity mActivity; private Class<?> mCreatorActivityClass; private WebFeedMainMenuItem mWebFeedMainMenuItem; - private TestWebFeedFaviconFetcher mFaviconFetcher = new TestWebFeedFaviconFetcher(); - private ArrayList<Callback<WebFeedBridge.WebFeedMetadata>> mWaitingMetadataCallbacks = + private final TestWebFeedFaviconFetcher mFaviconFetcher = new TestWebFeedFaviconFetcher(); + private final ArrayList<Callback<WebFeedBridge.WebFeedMetadata>> mWaitingMetadataCallbacks = new ArrayList(); @Before
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedRecommendationFollowAcceleratorController.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedRecommendationFollowAcceleratorController.java index aa7c67d..e11218e 100644 --- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedRecommendationFollowAcceleratorController.java +++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedRecommendationFollowAcceleratorController.java
@@ -42,7 +42,7 @@ /** We use UserData to put the web feed name into the tab and the NavigationHandle. */ @VisibleForTesting private static class AssociatedWebFeedData implements UserData { - byte[] mWebFeedName; + final byte[] mWebFeedName; public AssociatedWebFeedData(byte[] webFeedName) { mWebFeedName = webFeedName;
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedSnackbarControllerTest.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedSnackbarControllerTest.java index e33fbaa..9d0e1f60 100644 --- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedSnackbarControllerTest.java +++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedSnackbarControllerTest.java
@@ -87,7 +87,7 @@ @Mock public FeedServiceBridge.Natives mFeedServideBridgeJniMock; private Context mContext; @Mock private Profile mProfile; - private ModalDialogManager mDialogManager = + private final ModalDialogManager mDialogManager = new ModalDialogManager(Mockito.mock(ModalDialogManager.Presenter.class), 0); @Mock private SnackbarManager mSnackbarManager; private WebFeedSnackbarController mWebFeedSnackbarController;
diff --git a/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/FamilyInfoFeedbackSource.java b/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/FamilyInfoFeedbackSource.java index 5691f5a..32e5850 100644 --- a/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/FamilyInfoFeedbackSource.java +++ b/chrome/browser/feedback/android/java/src/org/chromium/chrome/browser/feedback/FamilyInfoFeedbackSource.java
@@ -26,7 +26,7 @@ private static final String PARENTAL_CONTROL_SITES_CHILD = "Parental_Control_Sites_Child"; private final Profile mProfile; - private Map<String, String> mFeedbackMap = new HashMap<>(); + private final Map<String, String> mFeedbackMap = new HashMap<>(); private boolean mIsReady; private @Nullable Runnable mCallback;
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index 144b167..dd2c1ab 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -4042,7 +4042,7 @@ { "name": "enable-resampling-scroll-events-experimental-prediction", "owners": [ "input-dev@chromium.org" ], - "expiry_milestone": 95 + "expiry_milestone": 140 }, { "name": "enable-retail-coupons",
diff --git a/chrome/browser/flags/android/chrome_feature_list.cc b/chrome/browser/flags/android/chrome_feature_list.cc index 56afa23..a429620 100644 --- a/chrome/browser/flags/android/chrome_feature_list.cc +++ b/chrome/browser/flags/android/chrome_feature_list.cc
@@ -572,7 +572,7 @@ BASE_FEATURE(kAndroidTabDeclutterAutoDelete, "AndroidTabDeclutterAutoDelete", - base::FEATURE_ENABLED_BY_DEFAULT); + base::FEATURE_DISABLED_BY_DEFAULT); BASE_FEATURE(kAndroidTabDeclutterDedupeTabIdsKillSwitch, "AndroidTabDeclutterDedupeTabIdsKillSwitch",
diff --git a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java index e02e3e1..5e9d6a7d 100644 --- a/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java +++ b/chrome/browser/flags/android/java/src/org/chromium/chrome/browser/flags/ChromeFeatureList.java
@@ -185,7 +185,8 @@ "AndroidOmniboxFocusedNewTabPage"; public static final String ANDROID_OPEN_PDF_INLINE_BACKPORT = "AndroidOpenPdfInlineBackport"; public static final String ANDROID_PDF_ASSIST_CONTENT = "AndroidPdfAssistContent"; - public static final String ANDROID_PROGRESS_BAR_VISUAL_UPDATE = "AndroidProgressBarVisualUpdate"; + public static final String ANDROID_PROGRESS_BAR_VISUAL_UPDATE = + "AndroidProgressBarVisualUpdate"; public static final String ANDROID_SURFACE_COLOR_UPDATE = "AndroidSurfaceColorUpdate"; public static final String ANDROID_TAB_DECLUTTER_ARCHIVE_ALL_BUT_ACTIVE = "AndroidTabDeclutterArchiveAllButActiveTab"; @@ -491,7 +492,8 @@ public static final String QUIET_NOTIFICATION_PROMPTS = "QuietNotificationPrompts"; public static final String READALOUD = "ReadAloud"; public static final String READALOUD_AUDIO_OVERVIEWS = "ReadAloudAudioOverviews"; - public static final String READALOUD_AUDIO_OVERVIEWS_FEEDBACK = "ReadAloudAudioOverviewsFeedback"; + public static final String READALOUD_AUDIO_OVERVIEWS_FEEDBACK = + "ReadAloudAudioOverviewsFeedback"; public static final String READALOUD_BACKGROUND_PLAYBACK = "ReadAloudBackgroundPlayback"; public static final String READALOUD_IN_MULTI_WINDOW = "ReadAloudInMultiWindow"; public static final String READALOUD_IN_OVERFLOW_MENU_IN_CCT = "ReadAloudInOverflowMenuInCCT"; @@ -1494,9 +1496,6 @@ sAndroidNativePagesInNewTabRecentTabsEnabled = sAndroidNativePagesInNewTab.newBooleanParam( "android_native_pages_in_new_tab_recent_tabs_enabled", true); - public static final MutableBooleanParamWithSafeDefault sAndroidTabDeclutterAutoDeleteEnabled = - sAndroidTabDeclutterAutoDelete.newBooleanParam( - "android_tab_declutter_auto_delete_enabled", false); public static final MutableIntParamWithSafeDefault sAndroidTabDeclutterAutoDeleteTimeDeltaHours = sAndroidTabDeclutterAutoDelete.newIntParam(
diff --git a/chrome/browser/gesturenav/android/java/src/org/chromium/chrome/browser/gesturenav/HardwareDraw.java b/chrome/browser/gesturenav/android/java/src/org/chromium/chrome/browser/gesturenav/HardwareDraw.java index 6da2ea9a..141ba578 100644 --- a/chrome/browser/gesturenav/android/java/src/org/chromium/chrome/browser/gesturenav/HardwareDraw.java +++ b/chrome/browser/gesturenav/android/java/src/org/chromium/chrome/browser/gesturenav/HardwareDraw.java
@@ -75,7 +75,7 @@ private static @Nullable Executor sHardwareRequestThreadExecutor; // Only ever recreated in the UI thread. - private ImageReader mImageReader; + private final ImageReader mImageReader; // Set in the UI thread before enqueuing a request. // Cleared in the hardware thread after posting the task back to the UI thread.
diff --git a/chrome/browser/glic/BUILD.gn b/chrome/browser/glic/BUILD.gn index 3a3db741..7b2d691 100644 --- a/chrome/browser/glic/BUILD.gn +++ b/chrome/browser/glic/BUILD.gn
@@ -141,6 +141,8 @@ "media/glic_media_context.h", "media/glic_media_integration.cc", "media/glic_media_integration.h", + "media/glic_media_page_cache.cc", + "media/glic_media_page_cache.h", "widget/application_hotkey_delegate.cc", "widget/browser_conditions.cc", "widget/browser_conditions.h", @@ -260,6 +262,7 @@ "host/glic_cookie_synchronizer_unittest.cc", "media/glic_media_context_unittest.cc", "media/glic_media_integration_unittest.cc", + "media/glic_media_page_cache_unittest.cc", ] deps = [ ":glic",
diff --git a/chrome/browser/glic/host/glic_actor_controller.cc b/chrome/browser/glic/host/glic_actor_controller.cc index ccdb251..f8a8423 100644 --- a/chrome/browser/glic/host/glic_actor_controller.cc +++ b/chrome/browser/glic/host/glic_actor_controller.cc
@@ -13,6 +13,8 @@ #include "chrome/browser/actor/actor_coordinator.h" #include "chrome/browser/glic/host/context/glic_page_context_fetcher.h" #include "chrome/browser/glic/host/glic.mojom.h" +#include "chrome/common/actor.mojom.h" +#include "chrome/common/actor/action_result.h" #include "chrome/common/chrome_features.h" #include "components/optimization_guide/proto/features/actions_data.pb.h" #include "components/tabs/public/tab_interface.h" @@ -145,8 +147,8 @@ FocusedTabData focused_tab_data, const mojom::GetTabContextOptions& options, mojom::WebClientHandler::ActInFocusedTabCallback callback, - bool action_succeeded) const { - if (!action_succeeded) { + actor::mojom::ActionResultPtr result) const { + if (!actor::IsOk(*result)) { PostTaskForActCallback(std::move(callback), mojom::ActInFocusedTabErrorReason::kTargetNotFound); return;
diff --git a/chrome/browser/glic/host/glic_actor_controller.h b/chrome/browser/glic/host/glic_actor_controller.h index 9776a1b..702d418 100644 --- a/chrome/browser/glic/host/glic_actor_controller.h +++ b/chrome/browser/glic/host/glic_actor_controller.h
@@ -12,6 +12,7 @@ #include "base/functional/callback_forward.h" #include "chrome/browser/glic/host/context/glic_tab_data.h" #include "chrome/browser/glic/host/glic.mojom.h" +#include "chrome/common/actor.mojom-forward.h" #include "components/optimization_guide/proto/features/actions_data.pb.h" class Profile; @@ -71,7 +72,7 @@ FocusedTabData focused_tab_data, const mojom::GetTabContextOptions& options, glic::mojom::WebClientHandler::ActInFocusedTabCallback callback, - bool action_succeeded) const; + actor::mojom::ActionResultPtr result) const; void GetContextFromFocusedTab( FocusedTabData focused_tab_data,
diff --git a/chrome/browser/glic/host/glic_api_uitest.cc b/chrome/browser/glic/host/glic_api_uitest.cc index 8b599cd5..737212d 100644 --- a/chrome/browser/glic/host/glic_api_uitest.cc +++ b/chrome/browser/glic/host/glic_api_uitest.cc
@@ -681,6 +681,22 @@ testing::EndsWith("#foreground")); } +IN_PROC_BROWSER_TEST_F(GlicApiTest, testCreateTabByClickingOnLink) { + RunTestSequence(OpenGlicWindow(GlicWindowMode::kDetached, + GlicInstrumentMode::kHostAndContents), + CheckTabCount(1)); + content::RenderFrameHost* guest_frame = FindGlicGuestMainFrame(); + ExecuteJsTest(); + ASSERT_TRUE(base::test::RunUntil([&]() { + return InProcessBrowserTest::browser()->tab_strip_model()->GetTabCount() == + 2; + })) << "Timed out waiting for tab count to increase. Tab count = " + << InProcessBrowserTest::browser()->tab_strip_model()->GetTabCount(); + // This assertion is a regression test for b/416464184. The guest frame + // shouldn't change. + CHECK_EQ(guest_frame, FindGlicGuestMainFrame()); +} + IN_PROC_BROWSER_TEST_F(GlicApiTestWithOneTab, testOpenGlicSettingsPage) { ExecuteJsTest();
diff --git a/chrome/browser/glic/host/glic_page_handler.cc b/chrome/browser/glic/host/glic_page_handler.cc index 401f369d..5621007 100644 --- a/chrome/browser/glic/host/glic_page_handler.cc +++ b/chrome/browser/glic/host/glic_page_handler.cc
@@ -439,12 +439,13 @@ void SetAudioDucking(bool enabled, SetAudioDuckingCallback callback) override { - if (!page_handler_->GetGuestMainFrame()) { + content::RenderFrameHost* guest_frame = page_handler_->GetGuestMainFrame(); + if (!guest_frame) { std::move(callback).Run(false); return; } - AudioDucker* audio_ducker = AudioDucker::GetOrCreateForPage( - page_handler_->GetGuestMainFrame()->GetPage()); + AudioDucker* audio_ducker = + AudioDucker::GetOrCreateForPage(guest_frame->GetPage()); std::move(callback).Run(enabled ? audio_ducker->StartDuckingOtherAudio() : audio_ducker->StopDuckingOtherAudio()); } @@ -828,16 +829,27 @@ } } -void GlicPageHandler::GuestAdded(extensions::WebViewGuest* guest) { - guest_ = guest->GetWeakPtr(); -} - void GlicPageHandler::NotifyWindowIntentToShow() { page_->IntentToShow(); } content::RenderFrameHost* GlicPageHandler::GetGuestMainFrame() { - return guest_ ? guest_->GetGuestMainFrame() : nullptr; + extensions::WebViewGuest* web_view_guest = nullptr; + content::RenderFrameHost* webui_frame = + webui_contents_->GetPrimaryMainFrame(); + if (!webui_frame) { + return nullptr; + } + webui_frame->ForEachRenderFrameHostWithAction( + [&web_view_guest](content::RenderFrameHost* rfh) { + if (auto* web_view = + extensions::WebViewGuest::FromRenderFrameHost(rfh)) { + web_view_guest = web_view; + return content::RenderFrameHost::FrameIterationAction::kStop; + } + return content::RenderFrameHost::FrameIterationAction::kContinue; + }); + return web_view_guest ? web_view_guest->GetGuestMainFrame() : nullptr; } void GlicPageHandler::ClosePanel() {
diff --git a/chrome/browser/glic/host/glic_page_handler.h b/chrome/browser/glic/host/glic_page_handler.h index 3d66dd86f..af307de 100644 --- a/chrome/browser/glic/host/glic_page_handler.h +++ b/chrome/browser/glic/host/glic_page_handler.h
@@ -43,11 +43,6 @@ content::WebContents* webui_contents() { return webui_contents_; } - // Called whenever a guest view is added to the WebContents owned by this - // WebUI. Because we embed only one webview, there should only ever be one - // guest view alive at one time within GlicPageHandler. - void GuestAdded(extensions::WebViewGuest* guest); - void NotifyWindowIntentToShow(); // Returns the main frame of the guest view that lives within this WebUI. May
diff --git a/chrome/browser/glic/host/host.cc b/chrome/browser/glic/host/host.cc index 75fe209f..9ac552d 100644 --- a/chrome/browser/glic/host/host.cc +++ b/chrome/browser/glic/host/host.cc
@@ -167,11 +167,6 @@ .default_font_size; top->SetWebPreferences(prefs); } - PageHandlerInfo* info = FindInfoForWebUiContents(top); - CHECK(info); - auto* webview = extensions::WebViewGuest::FromWebContents(guest_contents); - CHECK(webview); - info->page_handler->GuestAdded(webview); } void Host::NotifyWindowIntentToShow() {
diff --git a/chrome/browser/glic/media/glic_media_context.cc b/chrome/browser/glic/media/glic_media_context.cc index be9d417c..6d012176 100644 --- a/chrome/browser/glic/media/glic_media_context.cc +++ b/chrome/browser/glic/media/glic_media_context.cc
@@ -41,9 +41,11 @@ void GlicMediaContext::OnResult(const media::SpeechRecognitionResult& result) { if (!result.is_final) { + most_recent_nonfinal_ = result.transcription; return; } text_context_ += result.transcription; + most_recent_nonfinal_.clear(); // Trim to `max_size`. Note that we should utf8-trim, but this is easier. constexpr size_t max_size = 20000; @@ -55,8 +57,8 @@ } } -const std::string& GlicMediaContext::GetContext() const { - return text_context_; +std::string GlicMediaContext::GetContext() const { + return text_context_ + most_recent_nonfinal_; } } // namespace glic
diff --git a/chrome/browser/glic/media/glic_media_context.h b/chrome/browser/glic/media/glic_media_context.h index 5a91baf..c9a5887 100644 --- a/chrome/browser/glic/media/glic_media_context.h +++ b/chrome/browser/glic/media/glic_media_context.h
@@ -8,6 +8,7 @@ #include <string> #include "base/supports_user_data.h" +#include "chrome/browser/glic/media/glic_media_page_cache.h" namespace content { class Page; @@ -20,7 +21,8 @@ namespace glic { -class GlicMediaContext : public base::SupportsUserData::Data { +class GlicMediaContext : public base::SupportsUserData::Data, + public GlicMediaPageCache::Entry { public: // Get or create for the current page for `web_contents`, or null if either // `web_contents` is null or it has no page. @@ -30,11 +32,12 @@ ~GlicMediaContext() override; void OnResult(const media::SpeechRecognitionResult&); - const std::string& GetContext() const; + std::string GetContext() const; private: raw_ptr<content::Page> page_ = nullptr; std::string text_context_; + std::string most_recent_nonfinal_; }; } // namespace glic
diff --git a/chrome/browser/glic/media/glic_media_context_unittest.cc b/chrome/browser/glic/media/glic_media_context_unittest.cc index 5827dbb..88b68a8 100644 --- a/chrome/browser/glic/media/glic_media_context_unittest.cc +++ b/chrome/browser/glic/media/glic_media_context_unittest.cc
@@ -28,20 +28,16 @@ TEST_F(GlicMediaContextTest, ContextContainsTranscript) { auto* context = GlicMediaContext::GetOrCreateFor(web_contents()); - // Send the string in pieces, mixing final and non-final ones. + // Send the string in pieces. const std::string test_cap_1("ABC"); const std::string test_cap_2("DEF"); - const std::string test_cap_3("XYZ"); // Should be ignored. - const std::string test_cap_4("GHIJ"); + const std::string test_cap_3("GHIJ"); context->OnResult( media::SpeechRecognitionResult(test_cap_1, /*is_final=*/true)); context->OnResult( media::SpeechRecognitionResult(test_cap_2, /*is_final=*/true)); - // Non-final captions should be ignored. context->OnResult( - media::SpeechRecognitionResult(test_cap_3, /*is_final=*/false)); - context->OnResult( - media::SpeechRecognitionResult(test_cap_4, /*is_final=*/true)); + media::SpeechRecognitionResult(test_cap_3, /*is_final=*/true)); EXPECT_EQ(context->GetContext(), "ABCDEFGHIJ"); } @@ -62,4 +58,25 @@ EXPECT_EQ(actual_cap.back(), long_cap.back()); } +TEST_F(GlicMediaContextTest, ContextContainsButReplacesNonFinal) { + auto* context = GlicMediaContext::GetOrCreateFor(web_contents()); + + // Send the string in pieces, mixing final and non-final ones. + const std::string test_cap_1("ABC"); + context->OnResult( + media::SpeechRecognitionResult(test_cap_1, /*is_final=*/true)); + EXPECT_EQ(context->GetContext(), test_cap_1); + + const std::string test_cap_2("DEF"); + context->OnResult( + media::SpeechRecognitionResult(test_cap_2, /*is_final=*/false)); + EXPECT_EQ(context->GetContext(), test_cap_1 + test_cap_2); + + // Should replace cap_2. + const std::string test_cap_3("GHI"); + context->OnResult( + media::SpeechRecognitionResult(test_cap_3, /*is_final=*/true)); + EXPECT_EQ(context->GetContext(), test_cap_1 + test_cap_3); +} + } // namespace glic
diff --git a/chrome/browser/glic/media/glic_media_integration.cc b/chrome/browser/glic/media/glic_media_integration.cc index 7477d311..f27c4f6 100644 --- a/chrome/browser/glic/media/glic_media_integration.cc +++ b/chrome/browser/glic/media/glic_media_integration.cc
@@ -9,6 +9,7 @@ #include "base/supports_user_data.h" #include "chrome/browser/accessibility/live_caption/live_caption_controller_factory.h" #include "chrome/browser/glic/media/glic_media_context.h" +#include "chrome/browser/glic/media/glic_media_page_cache.h" #include "chrome/browser/profiles/profile.h" #include "components/live_caption/caption_controller_base.h" #include "components/live_caption/caption_util.h" @@ -34,10 +35,13 @@ content::WebContents* web_contents, optimization_guide::proto::ContentNode* context_root) override; + void OnContextUpdated(glic::GlicMediaContext* context); + protected: raw_ptr<Profile> profile_; // Don't let the transcript grow unbounded. static constexpr size_t max_size_bytes_ = 20000; + glic::GlicMediaPageCache page_cache_; }; class CaptionListenerImpl : public captions::CaptionControllerBase::Listener { @@ -50,6 +54,9 @@ const media::SpeechRecognitionResult& result) override { if (auto* context = glic::GlicMediaContext::GetOrCreateFor(web_contents)) { context->OnResult(result); + static_cast<GlicMediaIntegrationImpl*>( + glic::GlicMediaIntegration::GetFor(web_contents)) + ->OnContextUpdated(context); } return true; @@ -82,8 +89,9 @@ context_root->mutable_content_attributes()->set_attribute_type( optimization_guide::proto::CONTENT_ATTRIBUTE_TEXT); - // Get the context for `web_contents`, which is not the right thing to do. - auto* context = glic::GlicMediaContext::GetOrCreateFor(web_contents); + // Get the most recently updated context. Alternatively we could get the + // context for `web_contents`. + auto* context = static_cast<glic::GlicMediaContext*>(page_cache_.front()); std::string result; if (context != nullptr) { result = context->GetContext(); @@ -109,6 +117,11 @@ ->set_text_content(std::move(result)); } +void GlicMediaIntegrationImpl::OnContextUpdated( + glic::GlicMediaContext* context) { + page_cache_.PlaceAtFront(context); +} + } // namespace namespace glic {
diff --git a/chrome/browser/glic/media/glic_media_page_cache.cc b/chrome/browser/glic/media/glic_media_page_cache.cc new file mode 100644 index 0000000..a1497926 --- /dev/null +++ b/chrome/browser/glic/media/glic_media_page_cache.cc
@@ -0,0 +1,58 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/glic/media/glic_media_page_cache.h" + +#include "base/check_op.h" +#include "content/public/browser/web_contents.h" + +namespace glic { + +GlicMediaPageCache::Entry::Entry() = default; + +GlicMediaPageCache::Entry::~Entry() { + if (cache_) { + cache_->RemoveFromCache(this); + } +} + +void GlicMediaPageCache::Entry::OnCached(GlicMediaPageCache* cache) { + CHECK_EQ(cache_, nullptr); + cache_ = cache; +} + +void GlicMediaPageCache::Entry::OnUncached() { + CHECK(cache_); + cache_ = nullptr; +} + +GlicMediaPageCache::GlicMediaPageCache() = default; + +GlicMediaPageCache::~GlicMediaPageCache() { + while (!cache_.empty()) { + RemoveFromCache(static_cast<Entry*>(cache_.head())); + } +} + +void GlicMediaPageCache::PlaceAtFront(Entry* entry) { + // It's okay if `entry` is in our cache already, or not on any cache. It is + // not okay if it is on some other cache. + CHECK(entry->cache() == nullptr || entry->cache() == this); + if (entry->next()) { + RemoveFromCache(entry); + } + entry->InsertBefore(cache_.head()); + if (entry->cache() == nullptr) { + entry->OnCached(this); + } +} + +void GlicMediaPageCache::RemoveFromCache(Entry* entry) { + CHECK(entry->next()); + CHECK_EQ(entry->cache(), this); + entry->RemoveFromList(); + entry->OnUncached(); +} + +} // namespace glic
diff --git a/chrome/browser/glic/media/glic_media_page_cache.h b/chrome/browser/glic/media/glic_media_page_cache.h new file mode 100644 index 0000000..f40a15a --- /dev/null +++ b/chrome/browser/glic/media/glic_media_page_cache.h
@@ -0,0 +1,64 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_GLIC_MEDIA_GLIC_MEDIA_PAGE_CACHE_H_ +#define CHROME_BROWSER_GLIC_MEDIA_GLIC_MEDIA_PAGE_CACHE_H_ + +#include "base/containers/linked_list.h" +#include "base/memory/raw_ptr.h" + +namespace glic { + +// Cache for pages with media context. Currently, this is a thin wrapper +// around `LinkedList` that avoids shutdown order issues. This can be +// expanded to cache entries based on other properties, like document +// pip-ness, in the future. +class GlicMediaPageCache { + public: + // Handy base class for cache entries. It would be nice if this could be + // private inheritance to `LinkNode`, but that's more boiler plate than it's + // worth. Simply don't call any `LinkNode` methods outside of the cache. + class Entry : public base::LinkNode<Entry> { + public: + Entry(); + virtual ~Entry(); + + GlicMediaPageCache* cache() { return cache_; } + + // Notify us that we've been added to the cache. + void OnCached(GlicMediaPageCache*); + + // Notify that we've been removed from the cache. One might override + // `RemoveFromList`, but it's not virtual and would be very easy to call the + // base class implementation unintentionally. + void OnUncached(); + + private: + // Cache to which this entry belongs, or null if we're not cached. + raw_ptr<GlicMediaPageCache> cache_ = nullptr; + }; + + GlicMediaPageCache(); + virtual ~GlicMediaPageCache(); + + // Will either move or add, as appropriate. + void PlaceAtFront(Entry* entry); + + // Use this in favor of Entry::RemoveFromList, because there is more cleanup + // than just that. + void RemoveFromCache(Entry* entry); + + Entry* front() { + return !cache_.empty() ? static_cast<Entry*>(cache_.head()) : nullptr; + } + + const base::LinkedList<Entry>& cache_for_testing() const { return cache_; } + + private: + base::LinkedList<Entry> cache_; +}; + +} // namespace glic + +#endif // CHROME_BROWSER_GLIC_MEDIA_GLIC_MEDIA_PAGE_CACHE_H_
diff --git a/chrome/browser/glic/media/glic_media_page_cache_unittest.cc b/chrome/browser/glic/media/glic_media_page_cache_unittest.cc new file mode 100644 index 0000000..cc9ac4a --- /dev/null +++ b/chrome/browser/glic/media/glic_media_page_cache_unittest.cc
@@ -0,0 +1,74 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/glic/media/glic_media_page_cache.h" + +#include "base/test/mock_callback.h" +#include "base/test/scoped_feature_list.h" +#include "chrome/browser/accessibility/live_caption/live_caption_controller_factory.h" +#include "chrome/browser/prefs/browser_prefs.h" +#include "chrome/test/base/chrome_render_view_host_test_harness.h" +#include "components/live_caption/live_caption_controller.h" +#include "components/live_caption/pref_names.h" +#include "components/optimization_guide/content/browser/page_content_proto_provider.h" +#include "components/pref_registry/pref_registry_syncable.h" +#include "components/prefs/testing_pref_service.h" +#include "components/sync_preferences/testing_pref_service_syncable.h" +#include "content/public/browser/web_contents.h" +#include "media/base/media_switches.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace glic { + +class GlicMediaPageCacheTest : public testing::Test {}; + +TEST_F(GlicMediaPageCacheTest, AddsInOrder) { + GlicMediaPageCache cache; + GlicMediaPageCache::Entry entry1; + GlicMediaPageCache::Entry entry2; + + // First item goes at the front(!). + cache.PlaceAtFront(&entry1); + EXPECT_EQ(cache.front(), &entry1); + + // Second item should push it back. + cache.PlaceAtFront(&entry2); + EXPECT_EQ(cache.front(), &entry2); + EXPECT_EQ(cache.front()->next(), &entry1); + + // Re-adding the first item should work, and move it to the front again. + cache.PlaceAtFront(&entry1); + EXPECT_EQ(cache.front(), &entry1); + EXPECT_EQ(cache.front()->next(), &entry2); +} + +TEST_F(GlicMediaPageCacheTest, CacheClearsOnDestruction) { + std::unique_ptr<GlicMediaPageCache> cache = + std::make_unique<GlicMediaPageCache>(); + GlicMediaPageCache::Entry entry; + EXPECT_EQ(entry.cache(), nullptr); + + cache->PlaceAtFront(&entry); + EXPECT_NE(entry.next(), nullptr); + EXPECT_EQ(entry.cache(), cache.get()); + + // Reset the cache and make sure that `entry` was removed. + cache.reset(); + EXPECT_EQ(entry.next(), nullptr); + EXPECT_EQ(entry.cache(), nullptr); +} + +TEST_F(GlicMediaPageCacheTest, EntriesAutoRemoveOnDestruction) { + GlicMediaPageCache cache; + + std::unique_ptr<GlicMediaPageCache::Entry> entry = + std::make_unique<GlicMediaPageCache::Entry>(); + cache.PlaceAtFront(entry.get()); + EXPECT_FALSE(cache.cache_for_testing().empty()); + + entry.reset(); + EXPECT_TRUE(cache.cache_for_testing().empty()); +} + +} // namespace glic
diff --git a/chrome/browser/hub/internal/android/java/src/org/chromium/chrome/browser/hub/HubColorMixerImpl.java b/chrome/browser/hub/internal/android/java/src/org/chromium/chrome/browser/hub/HubColorMixerImpl.java index 010862f..688c772 100644 --- a/chrome/browser/hub/internal/android/java/src/org/chromium/chrome/browser/hub/HubColorMixerImpl.java +++ b/chrome/browser/hub/internal/android/java/src/org/chromium/chrome/browser/hub/HubColorMixerImpl.java
@@ -107,7 +107,9 @@ public void processStateChange(@StateChange int colorChangeReason) { switch (colorChangeReason) { case HUB_SHOWN -> { - if (!mIsTablet) { + if (mIsTablet) { + onFocusedPaneChange(mFocusedPaneSupplier.get()); + } else { enableOverviewMode(); } }
diff --git a/chrome/browser/hub/internal/android/java/src/org/chromium/chrome/browser/hub/HubColorMixerImplUnitTest.java b/chrome/browser/hub/internal/android/java/src/org/chromium/chrome/browser/hub/HubColorMixerImplUnitTest.java index b963cc1..c1fc47f7 100644 --- a/chrome/browser/hub/internal/android/java/src/org/chromium/chrome/browser/hub/HubColorMixerImplUnitTest.java +++ b/chrome/browser/hub/internal/android/java/src/org/chromium/chrome/browser/hub/HubColorMixerImplUnitTest.java
@@ -148,6 +148,25 @@ } @Test + public void testProcessStateChange_tablet_setColorForBlendBeforeAnimation() { + initialize(/* isTablet= */ true); + + mHubColorMixer.registerBlend(mColorBlend); + verify(mColorBlend, never()).createAnimationForTransition(anyInt(), anyInt()); + + doNothing().when(mAnimationHandler).startAnimation(any()); + mFocusedPaneSupplier.set(mPane1); + reset(mColorBlend); + ShadowLooper.runUiThreadTasks(); + + assertFalse(mHubColorMixer.getOverviewMode()); + mHubColorMixer.processStateChange(HUB_SHOWN); + assertFalse(mHubColorMixer.getOverviewMode()); + + verify(mColorBlend).createAnimationForTransition(anyInt(), anyInt()); + } + + @Test public void testProcessStateChange_tablet_close() { initialize(/* isTablet= */ true);
diff --git a/chrome/browser/hub/internal/android/java/src/org/chromium/chrome/browser/hub/HubColors.java b/chrome/browser/hub/internal/android/java/src/org/chromium/chrome/browser/hub/HubColors.java index ea1966c..3c2c2c0 100644 --- a/chrome/browser/hub/internal/android/java/src/org/chromium/chrome/browser/hub/HubColors.java +++ b/chrome/browser/hub/internal/android/java/src/org/chromium/chrome/browser/hub/HubColors.java
@@ -10,7 +10,6 @@ import android.graphics.Color; import androidx.annotation.ColorInt; -import androidx.annotation.ColorRes; import androidx.annotation.DimenRes; import androidx.core.content.ContextCompat; @@ -162,19 +161,17 @@ /** Returns the color of the background for the search box. */ public static @ColorInt int getSearchBoxBgColor( Context context, @HubColorScheme int colorScheme) { - @ColorRes int backgroundColorRes; switch (colorScheme) { case HubColorScheme.DEFAULT: - backgroundColorRes = R.color.color_primary_with_alpha_10; - break; + return SurfaceColorUpdateUtils.getGtsSearchBoxBackgroundColor( + context, /* isIncognito= */ false); case HubColorScheme.INCOGNITO: - backgroundColorRes = R.color.baseline_neutral_20; - break; + return SurfaceColorUpdateUtils.getGtsSearchBoxBackgroundColor( + context, /* isIncognito= */ true); default: assert false; - backgroundColorRes = Resources.ID_NULL; + return ContextCompat.getColor(context, Resources.ID_NULL); } - return ContextCompat.getColor(context, backgroundColorRes); } /** Returns the hub tool bar action button background color as per the given color scheme. */
diff --git a/chrome/browser/hub/internal/android/java/src/org/chromium/chrome/browser/hub/HubCoordinatorUnitTest.java b/chrome/browser/hub/internal/android/java/src/org/chromium/chrome/browser/hub/HubCoordinatorUnitTest.java index 02fd929..a98948f3 100644 --- a/chrome/browser/hub/internal/android/java/src/org/chromium/chrome/browser/hub/HubCoordinatorUnitTest.java +++ b/chrome/browser/hub/internal/android/java/src/org/chromium/chrome/browser/hub/HubCoordinatorUnitTest.java
@@ -90,23 +90,24 @@ @Mock private Tracker mTracker; @Mock private SearchActivityClient mSearchActivityClient; @Mock private HubColorMixer mHubColorMixer; - private ObservableSupplierImpl<Boolean> mHubVisibilitySupplier = new ObservableSupplierImpl<>(); - private ObservableSupplierImpl<Boolean> mTabSwitcherBackPressSupplier = + private final ObservableSupplierImpl<Boolean> mHubVisibilitySupplier = new ObservableSupplierImpl<>(); - private ObservableSupplierImpl<Boolean> mIncognitoTabSwitcherBackPressSupplier = + private final ObservableSupplierImpl<Boolean> mTabSwitcherBackPressSupplier = new ObservableSupplierImpl<>(); - private ObservableSupplierImpl<Tab> mTabSupplier = new ObservableSupplierImpl<>(); - private ObservableSupplierImpl<Integer> mPreviousLayoutTypeSupplier = + private final ObservableSupplierImpl<Boolean> mIncognitoTabSwitcherBackPressSupplier = new ObservableSupplierImpl<>(); - private ObservableSupplierImpl<DisplayButtonData> mReferenceButtonDataSupplier = + private final ObservableSupplierImpl<Tab> mTabSupplier = new ObservableSupplierImpl<>(); + private final ObservableSupplierImpl<Integer> mPreviousLayoutTypeSupplier = new ObservableSupplierImpl<>(); - private ObservableSupplierImpl<Boolean> mRegularHubSearchEnabledStateSupplier = + private final ObservableSupplierImpl<DisplayButtonData> mReferenceButtonDataSupplier = new ObservableSupplierImpl<>(); - private ObservableSupplierImpl<Boolean> mIncognitoHubSearchEnabledStateSupplier = + private final ObservableSupplierImpl<Boolean> mRegularHubSearchEnabledStateSupplier = new ObservableSupplierImpl<>(); - private OneshotSupplierImpl<ProfileProvider> mProfileProviderSupplier = + private final ObservableSupplierImpl<Boolean> mIncognitoHubSearchEnabledStateSupplier = + new ObservableSupplierImpl<>(); + private final OneshotSupplierImpl<ProfileProvider> mProfileProviderSupplier = new OneshotSupplierImpl<>(); - private ObservableSupplierImpl<EdgeToEdgeController> mEdgeToEdgeSupplier = + private final ObservableSupplierImpl<EdgeToEdgeController> mEdgeToEdgeSupplier = new ObservableSupplierImpl<>(); private PaneManager mPaneManager; private FrameLayout mRootView; @@ -193,7 +194,6 @@ assertFalse(mPreviousLayoutTypeSupplier.hasObservers()); assertFalse(mIncognitoTabSwitcherBackPressSupplier.hasObservers()); assertFalse(mTabSupplier.hasObservers()); - XrUtils.resetXrDeviceForTesting(); } @Test
diff --git a/chrome/browser/hub/internal/android/java/src/org/chromium/chrome/browser/hub/HubManagerImplUnitTest.java b/chrome/browser/hub/internal/android/java/src/org/chromium/chrome/browser/hub/HubManagerImplUnitTest.java index 3e9e420..9dddff14 100644 --- a/chrome/browser/hub/internal/android/java/src/org/chromium/chrome/browser/hub/HubManagerImplUnitTest.java +++ b/chrome/browser/hub/internal/android/java/src/org/chromium/chrome/browser/hub/HubManagerImplUnitTest.java
@@ -97,7 +97,7 @@ new ObservableSupplierImpl<>(); private final ObservableSupplierImpl<Boolean> mIncognitoHubSearchEnabledStateSupplier = new ObservableSupplierImpl<>(); - private final int mSnackbarOverrideToken = 1; + private static final int SNACKBAR_OVERRIDE_TOKEN = 1; private Activity mActivity; private FrameLayout mRootView; @@ -139,7 +139,7 @@ when(mProfileProvider.getOriginalProfile()).thenReturn(mProfile); when(mSnackbarManager.pushParentViewToOverrideStack(any())) - .thenReturn(mSnackbarOverrideToken); + .thenReturn(SNACKBAR_OVERRIDE_TOKEN); mActivityScenarioRule .getScenario() @@ -231,7 +231,7 @@ hubManager.getPaneManager().focusPane(PaneId.INCOGNITO_TAB_SWITCHER); verify(mTabSwitcherPane).setPaneHubController(null); - verify(mSnackbarManager).popParentViewFromOverrideStack(mSnackbarOverrideToken); + verify(mSnackbarManager).popParentViewFromOverrideStack(SNACKBAR_OVERRIDE_TOKEN); verify(mMenuOrKeyboardActionController) .unregisterMenuOrKeyboardActionHandler(mTabSwitcherMenuOrKeyboardActionHandler); verify(mIncognitoTabSwitcherPane).setPaneHubController(coordinator); @@ -244,7 +244,7 @@ assertNull(hubManager.getHubCoordinatorForTesting()); verify(mBackPressManager).removeHandler(eq(coordinator)); verify(mIncognitoTabSwitcherPane).setPaneHubController(null); - verify(mSnackbarManager, times(2)).popParentViewFromOverrideStack(mSnackbarOverrideToken); + verify(mSnackbarManager, times(2)).popParentViewFromOverrideStack(SNACKBAR_OVERRIDE_TOKEN); verify(mMenuOrKeyboardActionController) .unregisterMenuOrKeyboardActionHandler( mIncognitoTabSwitcherMenuOrKeyboardActionHandler);
diff --git a/chrome/browser/hub/internal/android/java/src/org/chromium/chrome/browser/hub/HubToolbarCoordinatorUnitTest.java b/chrome/browser/hub/internal/android/java/src/org/chromium/chrome/browser/hub/HubToolbarCoordinatorUnitTest.java index bf9b1e0..82a233d1 100644 --- a/chrome/browser/hub/internal/android/java/src/org/chromium/chrome/browser/hub/HubToolbarCoordinatorUnitTest.java +++ b/chrome/browser/hub/internal/android/java/src/org/chromium/chrome/browser/hub/HubToolbarCoordinatorUnitTest.java
@@ -16,7 +16,6 @@ import com.google.common.collect.ImmutableSet; -import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -117,12 +116,6 @@ mIsAnimatingSupplier); } - @After - public void tearDown() { - // Reset static state after each test run to ensure isolation - XrUtils.resetXrDeviceForTesting(); - } - @Test @EnableFeatures(ChromeFeatureList.TAB_GROUP_ENTRY_POINTS_ANDROID) public void isIphTriggered() {
diff --git a/chrome/browser/hub/internal/android/java/src/org/chromium/chrome/browser/hub/HubToolbarViewUnitTest.java b/chrome/browser/hub/internal/android/java/src/org/chromium/chrome/browser/hub/HubToolbarViewUnitTest.java index 5390443..aa17bdb 100644 --- a/chrome/browser/hub/internal/android/java/src/org/chromium/chrome/browser/hub/HubToolbarViewUnitTest.java +++ b/chrome/browser/hub/internal/android/java/src/org/chromium/chrome/browser/hub/HubToolbarViewUnitTest.java
@@ -44,7 +44,6 @@ import com.google.android.material.color.MaterialColors; import com.google.android.material.tabs.TabLayout; -import org.junit.After; import org.junit.Before; import org.junit.Rule; import org.junit.Test; @@ -65,6 +64,7 @@ import org.chromium.base.test.util.Features.DisableFeatures; import org.chromium.base.test.util.Features.EnableFeatures; import org.chromium.chrome.browser.hub.HubToolbarProperties.PaneButtonLookup; +import org.chromium.components.browser_ui.styles.SemanticColorUtils; import org.chromium.components.omnibox.OmniboxFeatureList; import org.chromium.ui.base.TestActivity; import org.chromium.ui.modelutil.PropertyModel; @@ -123,11 +123,6 @@ mActivityScenarioRule.getScenario().onActivity(this::onActivity); } - @After - public void tearDown() { - XrUtils.resetXrDeviceForTesting(); - } - private void onActivity(TestActivity activity) { mActivity = activity; mActivity.setTheme(R.style.Theme_BrowserUI_DayNight); @@ -326,7 +321,8 @@ GradientDrawable backgroundDrawable = (GradientDrawable) mSearchBox.getBackground(); assertEquals( ColorStateList.valueOf( - ContextCompat.getColor(mActivity, R.color.baseline_neutral_20)), + ContextCompat.getColor( + mActivity, R.color.gm3_baseline_surface_container_highest_dark)), backgroundDrawable.getColor()); forceSetColorScheme(HubColorScheme.DEFAULT); @@ -334,8 +330,7 @@ MaterialColors.getColor(mActivity, R.attr.colorOnSurfaceVariant, "Test"), mSearchBoxText.getCurrentHintTextColor()); assertEquals( - ColorStateList.valueOf( - ContextCompat.getColor(mActivity, R.color.color_primary_with_alpha_10)), + ColorStateList.valueOf(SemanticColorUtils.getColorSurfaceContainerHigh(mActivity)), backgroundDrawable.getColor()); }
diff --git a/chrome/browser/hub/internal/android/java/src/org/chromium/chrome/browser/hub/PaneBackStackHandlerUnitTest.java b/chrome/browser/hub/internal/android/java/src/org/chromium/chrome/browser/hub/PaneBackStackHandlerUnitTest.java index 8852f250..aa56201 100644 --- a/chrome/browser/hub/internal/android/java/src/org/chromium/chrome/browser/hub/PaneBackStackHandlerUnitTest.java +++ b/chrome/browser/hub/internal/android/java/src/org/chromium/chrome/browser/hub/PaneBackStackHandlerUnitTest.java
@@ -37,11 +37,12 @@ @Mock private Pane mBookmarksPane; @Mock private DisplayButtonData mReferenceButtonData; - private ObservableSupplierImpl<DisplayButtonData> mEmptyReferenceButtonDataSupplier = + private final ObservableSupplierImpl<DisplayButtonData> mEmptyReferenceButtonDataSupplier = new ObservableSupplierImpl<>(); - private ObservableSupplierImpl<DisplayButtonData> mReferenceButtonDataSupplier = + private final ObservableSupplierImpl<DisplayButtonData> mReferenceButtonDataSupplier = new ObservableSupplierImpl<>(); - private ObservableSupplierImpl<Boolean> mHubVisibilitySupplier = new ObservableSupplierImpl<>(); + private final ObservableSupplierImpl<Boolean> mHubVisibilitySupplier = + new ObservableSupplierImpl<>(); private PaneManager mPaneManager; private PaneBackStackHandler mBackStackHandler;
diff --git a/chrome/browser/image_descriptions/android/java/src/org/chromium/chrome/browser/image_descriptions/ImageDescriptionsDialog.java b/chrome/browser/image_descriptions/android/java/src/org/chromium/chrome/browser/image_descriptions/ImageDescriptionsDialog.java index 139eeb8..c366075 100644 --- a/chrome/browser/image_descriptions/android/java/src/org/chromium/chrome/browser/image_descriptions/ImageDescriptionsDialog.java +++ b/chrome/browser/image_descriptions/android/java/src/org/chromium/chrome/browser/image_descriptions/ImageDescriptionsDialog.java
@@ -63,24 +63,24 @@ // LINT.ThenChange(/tools/metrics/histograms/metadata/accessibility/enums.xml:AccessibilityImageLabelModeAndroid) - private ImageDescriptionsControllerDelegate mControllerDelegate; + private final ImageDescriptionsControllerDelegate mControllerDelegate; - private ModalDialogManager mModalDialogManager; - private PropertyModel mPropertyModel; - private WebContentsObserver mWebContentsObserver; + private final ModalDialogManager mModalDialogManager; + private final PropertyModel mPropertyModel; + private final WebContentsObserver mWebContentsObserver; - private RadioButtonWithDescriptionLayout mRadioGroup; - private RadioButtonWithDescription mOptionJustOnceRadioButton; - private RadioButtonWithDescription mOptionAlwaysRadioButton; - private CheckBox mOptionalCheckbox; + private final RadioButtonWithDescriptionLayout mRadioGroup; + private final RadioButtonWithDescription mOptionJustOnceRadioButton; + private final RadioButtonWithDescription mOptionAlwaysRadioButton; + private final CheckBox mOptionalCheckbox; - private boolean mShouldShowDontAskAgainOption; + private final boolean mShouldShowDontAskAgainOption; private boolean mOnlyOnWifiState; private boolean mDontAskAgainState; private @DialogDismissalCause int mDismissalCause; - private WebContents mWebContents; - private Profile mProfile; - private Context mContext; + private final WebContents mWebContents; + private final Profile mProfile; + private final Context mContext; protected ImageDescriptionsDialog( Context context,
diff --git a/chrome/browser/incognito/android/java/src/org/chromium/chrome/browser/incognito/reauth/FullScreenIncognitoReauthCoordinatorTest.java b/chrome/browser/incognito/android/java/src/org/chromium/chrome/browser/incognito/reauth/FullScreenIncognitoReauthCoordinatorTest.java index 870ee75..b75e66f 100644 --- a/chrome/browser/incognito/android/java/src/org/chromium/chrome/browser/incognito/reauth/FullScreenIncognitoReauthCoordinatorTest.java +++ b/chrome/browser/incognito/android/java/src/org/chromium/chrome/browser/incognito/reauth/FullScreenIncognitoReauthCoordinatorTest.java
@@ -54,7 +54,7 @@ @Mock private IncognitoReauthDialog mIncognitoReauthDialogMock; - private OnBackPressedCallback mOnBackPressedCallbackMock = + private final OnBackPressedCallback mOnBackPressedCallbackMock = new OnBackPressedCallback(false) { @Override public void handleOnBackPressed() {}
diff --git a/chrome/browser/incognito/android/java/src/org/chromium/chrome/browser/incognito/reauth/IncognitoReauthCoordinatorFactory.java b/chrome/browser/incognito/android/java/src/org/chromium/chrome/browser/incognito/reauth/IncognitoReauthCoordinatorFactory.java index 12cbe33..2ff45d9 100644 --- a/chrome/browser/incognito/android/java/src/org/chromium/chrome/browser/incognito/reauth/IncognitoReauthCoordinatorFactory.java +++ b/chrome/browser/incognito/android/java/src/org/chromium/chrome/browser/incognito/reauth/IncognitoReauthCoordinatorFactory.java
@@ -63,13 +63,13 @@ * This allows to show the regular overview mode. * Non-null for {@link FullScreenIncognitoReauthCoordinator}. */ - private @Nullable LayoutManager mLayoutManager; + private final @Nullable LayoutManager mLayoutManager; /** Supplier for the HubManager. Non-null for tabbed mode. */ private final @Nullable OneshotSupplier<HubManager> mHubManagerSupplier; /** An {@link Intent} which allows to opens regular overview mode from a non-tabbed Activity. */ - private @Nullable Intent mShowRegularOverviewIntent; + private final @Nullable Intent mShowRegularOverviewIntent; /** A test-only variable used to mock the menu delegate instead of creating one. */ @VisibleForTesting @Nullable IncognitoReauthMenuDelegate mIncognitoReauthMenuDelegateForTesting;
diff --git a/chrome/browser/incognito/android/java/src/org/chromium/chrome/browser/incognito/reauth/IncognitoReauthDialogTest.java b/chrome/browser/incognito/android/java/src/org/chromium/chrome/browser/incognito/reauth/IncognitoReauthDialogTest.java index 35ab8717..6d83b9e 100644 --- a/chrome/browser/incognito/android/java/src/org/chromium/chrome/browser/incognito/reauth/IncognitoReauthDialogTest.java +++ b/chrome/browser/incognito/android/java/src/org/chromium/chrome/browser/incognito/reauth/IncognitoReauthDialogTest.java
@@ -43,7 +43,7 @@ @Mock private ModalDialogManager mModalDialogManagerMock; @Mock private View mIncognitoReauthViewMock; - private OnBackPressedCallback mOnBackPressedCallbackMock = + private final OnBackPressedCallback mOnBackPressedCallbackMock = new OnBackPressedCallback(false) { @Override public void handleOnBackPressed() {}
diff --git a/chrome/browser/incognito/android/java/src/org/chromium/chrome/browser/incognito/reauth/IncognitoReauthManager.java b/chrome/browser/incognito/android/java/src/org/chromium/chrome/browser/incognito/reauth/IncognitoReauthManager.java index 6b02118..3b265b0 100644 --- a/chrome/browser/incognito/android/java/src/org/chromium/chrome/browser/incognito/reauth/IncognitoReauthManager.java +++ b/chrome/browser/incognito/android/java/src/org/chromium/chrome/browser/incognito/reauth/IncognitoReauthManager.java
@@ -23,7 +23,7 @@ @NullMarked public class IncognitoReauthManager { private static @Nullable Boolean sIsIncognitoReauthFeatureAvailableForTesting; - private ReauthenticatorBridge mReauthenticatorBridge; + private final ReauthenticatorBridge mReauthenticatorBridge; /** * A callback interface which is used for re-authentication in {@link
diff --git a/chrome/browser/incognito/android/java/src/org/chromium/chrome/browser/incognito/reauth/IncognitoReauthMediator.java b/chrome/browser/incognito/android/java/src/org/chromium/chrome/browser/incognito/reauth/IncognitoReauthMediator.java index 635e12d7..445fa5db 100644 --- a/chrome/browser/incognito/android/java/src/org/chromium/chrome/browser/incognito/reauth/IncognitoReauthMediator.java +++ b/chrome/browser/incognito/android/java/src/org/chromium/chrome/browser/incognito/reauth/IncognitoReauthMediator.java
@@ -13,7 +13,7 @@ // The entity responsible for actually calling the underlying system re-authentication. private final IncognitoReauthManager mIncognitoReauthManager; // The callback that would be fired after an authentication attempt. - private IncognitoReauthCallback mIncognitoReauthCallback; + private final IncognitoReauthCallback mIncognitoReauthCallback; /** * @param incognitoReauthCallback incognitoReauthCallback The {@link IncognitoReauthCallback}
diff --git a/chrome/browser/interstitials/chrome_settings_page_helper.cc b/chrome/browser/interstitials/chrome_settings_page_helper.cc index df7e4d7..2e65903 100644 --- a/chrome/browser/interstitials/chrome_settings_page_helper.cc +++ b/chrome/browser/interstitials/chrome_settings_page_helper.cc
@@ -3,6 +3,11 @@ // found in the LICENSE file. #include "chrome/browser/interstitials/chrome_settings_page_helper.h" + +#if BUILDFLAG(IS_ANDROID) +#include "base/android/jni_android.h" +#endif + #include "build/build_config.h" #include "components/safe_browsing/buildflags.h" #include "content/public/browser/web_contents.h" @@ -59,4 +64,12 @@ #endif } +#if BUILDFLAG(IS_ANDROID) +void ChromeSettingsPageHelper::OpenAdvancedProtectionSettings( + content::WebContents& web_contents) { + safe_browsing::ShowAdvancedProtectionSettings( + web_contents.GetTopLevelNativeWindow()); +} +#endif // BUILDFLAG(IS_ANDROID) + } // namespace security_interstitials
diff --git a/chrome/browser/interstitials/chrome_settings_page_helper.h b/chrome/browser/interstitials/chrome_settings_page_helper.h index 2004a77d..6d79f16b 100644 --- a/chrome/browser/interstitials/chrome_settings_page_helper.h +++ b/chrome/browser/interstitials/chrome_settings_page_helper.h
@@ -38,6 +38,9 @@ content::WebContents* web_contents, safe_browsing::SafeBrowsingSettingReferralMethod referral_method) const override; +#if BUILDFLAG(IS_ANDROID) + void OpenAdvancedProtectionSettings(content::WebContents&) override; +#endif // BUILDFLAG(IS_ANDROID) }; } // namespace security_interstitials
diff --git a/chrome/browser/keyboard_accessory/android/java/src/org/chromium/chrome/browser/keyboard_accessory/data/KeyboardAccessoryData.java b/chrome/browser/keyboard_accessory/android/java/src/org/chromium/chrome/browser/keyboard_accessory/data/KeyboardAccessoryData.java index 9474542..9a8a40f5b 100644 --- a/chrome/browser/keyboard_accessory/android/java/src/org/chromium/chrome/browser/keyboard_accessory/data/KeyboardAccessoryData.java +++ b/chrome/browser/keyboard_accessory/android/java/src/org/chromium/chrome/browser/keyboard_accessory/data/KeyboardAccessoryData.java
@@ -140,7 +140,7 @@ public static final class Action { private final Callback<Action> mActionCallback; private final @Nullable Callback<Action> mLongPressCallback; - private @AccessoryAction int mType; + private final @AccessoryAction int mType; public Action(@AccessoryAction int type, Callback<Action> actionCallback) { this(type, actionCallback, null); @@ -415,9 +415,9 @@ /** Represents a Google Wallet loyalty card to be shown on the manual fallback UI. */ public static final class LoyaltyCardInfo { - private String mMerchantName; - private GURL mProgramLogoUrl; - private UserInfoField mLoyaltyCardNumber; + private final String mMerchantName; + private final GURL mProgramLogoUrl; + private final UserInfoField mLoyaltyCardNumber; public LoyaltyCardInfo( String merchantName, GURL programLogoUrl, UserInfoField loyaltyCardNumber) {
diff --git a/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLanguagePromoDialog.java b/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLanguagePromoDialog.java index ce081775..5464bb76 100644 --- a/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLanguagePromoDialog.java +++ b/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/AppLanguagePromoDialog.java
@@ -164,8 +164,8 @@ */ protected static class LanguageItemAdapter extends RecyclerView.Adapter<RecyclerView.ViewHolder> { - private ArrayList<LanguageItem> mTopLanguages; - private ArrayList<LanguageItem> mOtherLanguages; + private final ArrayList<LanguageItem> mTopLanguages; + private final ArrayList<LanguageItem> mOtherLanguages; private LanguageItem mCurrentLanguage; private boolean mShowOtherLanguages; @@ -309,9 +309,9 @@ /** Internal class representing an individual language row. */ private static class AppLanguagePromptRowViewHolder extends RecyclerView.ViewHolder implements View.OnClickListener { - private TextView mPrimaryNameTextView; - private TextView mSecondaryNameTextView; - private RadioButton mRadioButton; + private final TextView mPrimaryNameTextView; + private final TextView mSecondaryNameTextView; + private final RadioButton mRadioButton; AppLanguagePromptRowViewHolder(View view) { super(view);
diff --git a/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/LanguageSplitInstaller.java b/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/LanguageSplitInstaller.java index bb89a89..add366cf 100644 --- a/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/LanguageSplitInstaller.java +++ b/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/LanguageSplitInstaller.java
@@ -71,7 +71,7 @@ private final SplitInstallStateUpdatedListener mStateUpdateListener = getStatusUpdateListener(); private @Nullable InstallListener mInstallListener; - private SplitInstallManager mSplitInstallManager; + private final SplitInstallManager mSplitInstallManager; private int mInstallSessionId; private boolean mIsLanguageSplitInstalled;
diff --git a/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/settings/AppLanguagePreferenceDelegate.java b/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/settings/AppLanguagePreferenceDelegate.java index a636a37..2f7701c 100644 --- a/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/settings/AppLanguagePreferenceDelegate.java +++ b/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/settings/AppLanguagePreferenceDelegate.java
@@ -167,7 +167,7 @@ // Inner class for successfully downloaded language split SnackbarController. private static class SuccessSnackbarControllerImpl implements SnackbarController { - private RestartAction mRestartAction; + private final RestartAction mRestartAction; SuccessSnackbarControllerImpl(RestartAction action) { mRestartAction = action;
diff --git a/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/settings/LanguageItem.java b/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/settings/LanguageItem.java index 4d83443..3c2e7bd 100644 --- a/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/settings/LanguageItem.java +++ b/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/settings/LanguageItem.java
@@ -34,7 +34,7 @@ private final boolean mSupportTranslate; - private boolean mSupportAppUi; + private final boolean mSupportAppUi; /** * Creates a new LanguageItem getting UI availability from ResourceBundle.
diff --git a/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/settings/LanguageListBaseAdapter.java b/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/settings/LanguageListBaseAdapter.java index 003ac57..0d39f6b0 100644 --- a/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/settings/LanguageListBaseAdapter.java +++ b/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/settings/LanguageListBaseAdapter.java
@@ -44,11 +44,11 @@ } static class LanguageRowViewHolder extends ViewHolder { - private TextView mTitle; - private TextView mDescription; + private final TextView mTitle; + private final TextView mDescription; - private ImageView mStartIcon; - private ListMenuButton mMoreButton; + private final ImageView mStartIcon; + private final ListMenuButton mMoreButton; LanguageRowViewHolder(View view) { super(view);
diff --git a/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/settings/LanguageSettings.java b/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/settings/LanguageSettings.java index 374bd14..0732be43 100644 --- a/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/settings/LanguageSettings.java +++ b/chrome/browser/language/android/java/src/org/chromium/chrome/browser/language/settings/LanguageSettings.java
@@ -64,7 +64,7 @@ private static final String TAG = "LanguageSettings"; - private AppLanguagePreferenceDelegate mAppLanguageDelegate = + private final AppLanguagePreferenceDelegate mAppLanguageDelegate = new AppLanguagePreferenceDelegate(); private PrefChangeRegistrar mPrefChangeRegistrar; private final ObservableSupplierImpl<String> mPageTitle = new ObservableSupplierImpl<>();
diff --git a/chrome/browser/language/android/java/src/org/chromium/chrome/browser/translate/FakeTranslateBridgeJni.java b/chrome/browser/language/android/java/src/org/chromium/chrome/browser/translate/FakeTranslateBridgeJni.java index b62bbb0..7501209 100644 --- a/chrome/browser/language/android/java/src/org/chromium/chrome/browser/translate/FakeTranslateBridgeJni.java +++ b/chrome/browser/language/android/java/src/org/chromium/chrome/browser/translate/FakeTranslateBridgeJni.java
@@ -29,10 +29,10 @@ public class FakeTranslateBridgeJni implements TranslateBridge.Natives { private String mTargetLanguage; private ArrayList<String> mUserAcceptLanguages; - private LinkedHashSet<String> mDefaultUserAcceptLanguages; - private HashSet<String> mNeverLanguages; - private HashSet<String> mAlwaysLanguages; - private TreeMap<String, LanguageItem> mChromeLanguages; + private final LinkedHashSet<String> mDefaultUserAcceptLanguages; + private final HashSet<String> mNeverLanguages; + private final HashSet<String> mAlwaysLanguages; + private final TreeMap<String, LanguageItem> mChromeLanguages; private boolean mAppLanguagePromptShown; private String mCurrentLanguage; private boolean mIsPageTranslated;
diff --git a/chrome/browser/lens/java/src/org/chromium/chrome/browser/lens/LensController.java b/chrome/browser/lens/java/src/org/chromium/chrome/browser/lens/LensController.java index 6b6d55a..735b2c9 100644 --- a/chrome/browser/lens/java/src/org/chromium/chrome/browser/lens/LensController.java +++ b/chrome/browser/lens/java/src/org/chromium/chrome/browser/lens/LensController.java
@@ -12,7 +12,7 @@ /** A class which manages communication with the Lens SDK. */ @NullMarked public class LensController { - private static LensController sInstance = new LensController(); + private static final LensController sInstance = new LensController(); private final LensControllerDelegate mDelegate;
diff --git a/chrome/browser/lens/java/src/org/chromium/chrome/browser/lens/LensQueryParams.java b/chrome/browser/lens/java/src/org/chromium/chrome/browser/lens/LensQueryParams.java index 67f6617..c7bdced 100644 --- a/chrome/browser/lens/java/src/org/chromium/chrome/browser/lens/LensQueryParams.java +++ b/chrome/browser/lens/java/src/org/chromium/chrome/browser/lens/LensQueryParams.java
@@ -34,9 +34,9 @@ private @Nullable String mPageTitle; private @Nullable WebContents mWebContents; private @Nullable String mSrcUrl; - private boolean mIsIncognito; - private @LensEntryPoint int mLensEntryPoint; - private boolean mIsTablet; + private final boolean mIsIncognito; + private final @LensEntryPoint int mLensEntryPoint; + private final boolean mIsTablet; public Builder(@LensEntryPoint int lensEntryPoint, boolean isIncognito, boolean isTablet) { this.mLensEntryPoint = lensEntryPoint;
diff --git a/chrome/browser/lifetime/android/java/src/org/chromium/chrome/browser/lifetime/ApplicationLifetime.java b/chrome/browser/lifetime/android/java/src/org/chromium/chrome/browser/lifetime/ApplicationLifetime.java index 4c817c6..1fc92c1 100644 --- a/chrome/browser/lifetime/android/java/src/org/chromium/chrome/browser/lifetime/ApplicationLifetime.java +++ b/chrome/browser/lifetime/android/java/src/org/chromium/chrome/browser/lifetime/ApplicationLifetime.java
@@ -21,7 +21,7 @@ void onTerminate(boolean restart); } - private static ObserverList<Observer> sObservers = new ObserverList<Observer>(); + private static final ObserverList<Observer> sObservers = new ObserverList<Observer>(); /** * Adds an observer to watch for application termination.
diff --git a/chrome/browser/loading_modal/android/java/src/org/chromium/chrome/browser/loading_modal/LoadingModalDialogMediator.java b/chrome/browser/loading_modal/android/java/src/org/chromium/chrome/browser/loading_modal/LoadingModalDialogMediator.java index 492d9712..81e490ab 100644 --- a/chrome/browser/loading_modal/android/java/src/org/chromium/chrome/browser/loading_modal/LoadingModalDialogMediator.java +++ b/chrome/browser/loading_modal/android/java/src/org/chromium/chrome/browser/loading_modal/LoadingModalDialogMediator.java
@@ -48,7 +48,7 @@ private boolean mSkipDelay; private boolean mDisableTimeout; - private Runnable mShowingTask = this::onShowDelayPassed; + private final Runnable mShowingTask = this::onShowDelayPassed; /** ModalDialogProperties.Controller implementation */ @Override
diff --git a/chrome/browser/locale/java/src/org/chromium/chrome/browser/locale/LocaleManagerDelegate.java b/chrome/browser/locale/java/src/org/chromium/chrome/browser/locale/LocaleManagerDelegate.java index a859a86..be4e458 100644 --- a/chrome/browser/locale/java/src/org/chromium/chrome/browser/locale/LocaleManagerDelegate.java +++ b/chrome/browser/locale/java/src/org/chromium/chrome/browser/locale/LocaleManagerDelegate.java
@@ -74,7 +74,7 @@ private @Nullable LocaleTemplateUrlLoader mLocaleTemplateUrlLoader; private DefaultSearchEngineDialogHelper.Delegate mSearchEngineHelperDelegate; - private SnackbarController mSnackbarController = + private final SnackbarController mSnackbarController = new SnackbarController() { @Override public void onDismissNoAction(@Nullable Object actionData) {}
diff --git a/chrome/browser/magic_stack/android/java/src/org/chromium/chrome/browser/magic_stack/HomeModulesCoordinator.java b/chrome/browser/magic_stack/android/java/src/org/chromium/chrome/browser/magic_stack/HomeModulesCoordinator.java index e48a6d73..4b4030d 100644 --- a/chrome/browser/magic_stack/android/java/src/org/chromium/chrome/browser/magic_stack/HomeModulesCoordinator.java +++ b/chrome/browser/magic_stack/android/java/src/org/chromium/chrome/browser/magic_stack/HomeModulesCoordinator.java
@@ -54,7 +54,7 @@ private boolean mIsSnapHelperAttached; private int mItemPerScreen; private HomeModulesConfigManager mHomeModulesConfigManager; - private HomeModulesConfigManager.HomeModulesStateListener mHomeModulesStateListener; + private final HomeModulesConfigManager.HomeModulesStateListener mHomeModulesStateListener; /** It is non-null for tablets. */ private @Nullable UiConfig mUiConfig; @@ -64,7 +64,7 @@ private @Nullable Callback<Profile> mOnProfileAvailableObserver; private boolean mHasHomeModulesBeenScrolled; - private RecyclerView.OnScrollListener mOnScrollListener; + private final RecyclerView.OnScrollListener mOnScrollListener; private CallbackController mCallbackController; /**
diff --git a/chrome/browser/magic_stack/android/junit/src/org/chromium/chrome/browser/magic_stack/HomeModulesConfigManagerUnitTest.java b/chrome/browser/magic_stack/android/junit/src/org/chromium/chrome/browser/magic_stack/HomeModulesConfigManagerUnitTest.java index b1cbdee0..cb588e9 100644 --- a/chrome/browser/magic_stack/android/junit/src/org/chromium/chrome/browser/magic_stack/HomeModulesConfigManagerUnitTest.java +++ b/chrome/browser/magic_stack/android/junit/src/org/chromium/chrome/browser/magic_stack/HomeModulesConfigManagerUnitTest.java
@@ -47,7 +47,7 @@ public class HomeModulesConfigManagerUnitTest { @Rule public MockitoRule mMockitoRule = MockitoJUnit.rule(); - private List<ModuleConfigChecker> mModuleConfigCheckerList = new ArrayList<>(); + private final List<ModuleConfigChecker> mModuleConfigCheckerList = new ArrayList<>(); private HomeModulesConfigManager mHomeModulesConfigManager; private ModuleRegistry mModuleRegistry;
diff --git a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/ThrottlingNotificationSchedulerTest.java b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/ThrottlingNotificationSchedulerTest.java index 0ab0f6e0..b95b373 100644 --- a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/ThrottlingNotificationSchedulerTest.java +++ b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/ThrottlingNotificationSchedulerTest.java
@@ -35,7 +35,7 @@ @Rule public MockitoRule mMockitoRule = MockitoJUnit.rule(); - private Map<String, Integer> mTaskInvocationMap = new HashMap<>(); + private final Map<String, Integer> mTaskInvocationMap = new HashMap<>(); @Before public void setUp() throws Exception {
diff --git a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/channels/ChromeChannelDefinitions.java b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/channels/ChromeChannelDefinitions.java index e4fa4608..ccf1269 100644 --- a/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/channels/ChromeChannelDefinitions.java +++ b/chrome/browser/notifications/android/java/src/org/chromium/chrome/browser/notifications/channels/ChromeChannelDefinitions.java
@@ -46,7 +46,7 @@ static final int CHANNELS_VERSION = 4; private static class LazyHolder { - private static ChromeChannelDefinitions sInstance = new ChromeChannelDefinitions(); + private static final ChromeChannelDefinitions sInstance = new ChromeChannelDefinitions(); } public static ChromeChannelDefinitions getInstance() {
diff --git a/chrome/browser/omaha/android/java/src/org/chromium/chrome/browser/omaha/ExponentialBackoffScheduler.java b/chrome/browser/omaha/android/java/src/org/chromium/chrome/browser/omaha/ExponentialBackoffScheduler.java index 76bb015f..7b901eb 100644 --- a/chrome/browser/omaha/android/java/src/org/chromium/chrome/browser/omaha/ExponentialBackoffScheduler.java +++ b/chrome/browser/omaha/android/java/src/org/chromium/chrome/browser/omaha/ExponentialBackoffScheduler.java
@@ -42,7 +42,7 @@ private static final String PREFERENCE_DELAY = "delay"; private static final String PREFERENCE_FAILED_ATTEMPTS = "backoffFailedAttempts"; - private static Random sRandom = new Random(); + private static final Random sRandom = new Random(); private static final int MAX_EXPONENT = 10;
diff --git a/chrome/browser/on_device_translation/BUILD.gn b/chrome/browser/on_device_translation/BUILD.gn index f8d51f6..9ec7fe7 100644 --- a/chrome/browser/on_device_translation/BUILD.gn +++ b/chrome/browser/on_device_translation/BUILD.gn
@@ -38,8 +38,11 @@ deps = [ "//chrome/browser:browser_process", "//chrome/browser/ai:ai_model_download_progress_manager", + "//chrome/browser/content_settings", + "//chrome/browser/content_settings:content_settings_factory", "//chrome/browser/profiles:profile", "//components/component_updater:component_updater", + "//components/content_settings/core/browser", "//components/crx_file:crx_file", "//components/keyed_service/content", "//components/language/core/browser",
diff --git a/chrome/browser/on_device_translation/on_device_translation_browsertest.cc b/chrome/browser/on_device_translation/on_device_translation_browsertest.cc index 363f221..a5f4108 100644 --- a/chrome/browser/on_device_translation/on_device_translation_browsertest.cc +++ b/chrome/browser/on_device_translation/on_device_translation_browsertest.cc
@@ -22,6 +22,7 @@ #include "build/build_config.h" #include "chrome/browser/ai/ai_test_utils.h" #include "chrome/browser/browser_process.h" +#include "chrome/browser/browsing_data/chrome_browsing_data_remover_constants.h" #include "chrome/browser/component_updater/translate_kit_component_installer.h" #include "chrome/browser/on_device_translation/component_manager.h" #include "chrome/browser/on_device_translation/constants.h" @@ -47,6 +48,7 @@ #include "content/public/browser/render_frame_host.h" #include "content/public/test/browser_test.h" #include "content/public/test/browser_test_utils.h" +#include "content/public/test/browsing_data_remover_test_util.h" #include "content/public/test/url_loader_interceptor.h" #include "net/dns/mock_host_resolver.h" #include "testing/gmock/include/gmock/gmock.h" @@ -1084,6 +1086,18 @@ } ~OnDeviceTranslationV1BrowserTest() override = default; + protected: + void ClearSiteContentSettings() { + content::BrowsingDataRemover* remover = + browser()->profile()->GetBrowsingDataRemover(); + content::BrowsingDataRemoverCompletionObserver observer(remover); + remover->RemoveAndReply( + base::Time(), base::Time::Max(), + chrome_browsing_data_remover::DATA_TYPE_CONTENT_SETTINGS, + chrome_browsing_data_remover::ALL_ORIGIN_TYPES, &observer); + observer.BlockUntilCompletion(); + } + private: base::test::ScopedFeatureList scoped_feature_list_; }; @@ -1124,10 +1138,29 @@ "available"); } +// Confirms that `Translator.availability()` is not masked for a translation +// containing only English or the user's preferred languages. +IN_PROC_BROWSER_TEST_F( + OnDeviceTranslationV1BrowserTest, + TranslatorAvailabilityNotMasked_EnglishAndPreferredLanguages) { + SetSelectedLanguages("fr"); + MockComponentManager mock_component_manager(GetTempDir()); + mock_component_manager.InstallMockTranslateKitComponent(); + NavigateToEmptyPage(); + + // The language pack for the preferred language is installed already. + mock_component_manager.InstallMockLanguagePack(LanguagePackKey::kEn_Fr); + + // When the required language packs are installed for translation + // between English and a preferred language, `availability()` is not masked + // prior to initial translator creation. + TestTranslationAvailable(browser(), "en", "fr", "available"); +} + // Tests that `Translator.availability()` for a translation // containing a language outside of English + the user's preferred languages. IN_PROC_BROWSER_TEST_F(OnDeviceTranslationV1BrowserTest, - TranslatorAvailabilityMaskedForNonPreferredLanguages) { + TranslatorAvailabilityMasked_ForNonPreferredLanguages) { SetSelectedLanguages("fr"); MockComponentManager mock_component_manager(GetTempDir()); mock_component_manager.InstallMockTranslateKitComponent(); @@ -1138,15 +1171,25 @@ TestTranslationAvailable(browser(), "fr", "abcxyz", "unavailable"); // The Japanese language pack needs to be downloaded in order for - // translation between Japanese and French to be available. - TestTranslationAvailable(browser(), "ja", "fr", "downloadable"); + // translation between English and Japanese to become "available". + TestTranslationAvailable(browser(), "en", "ja", "downloadable"); - // Even if all required language packs are installed, the - // Japanese <-> French translation availability status remains - // "downloadable" because Japanese is not included in English + - // preferred languages. + // After installing the en-ja language pack, `availability()` is still masked + // as "downloadable", because Japanese is not one of the preferred languages, + // and the site has not yet initialized a translator for that specific pair. mock_component_manager.InstallMockLanguagePack(LanguagePackKey::kEn_Ja); - TestTranslationAvailable(browser(), "ja", "fr", "downloadable"); + TestTranslationAvailable(browser(), "en", "ja", "downloadable"); + + // `availability()` is no longer masked as "downloadable" after creating an + // initial translator for the given translation. + TestSimpleTranslationWorks(browser(), "en", "ja"); + TestTranslationAvailable(browser(), "en", "ja", "available"); + + // When site data is cleared (the stored values for + // `ContentSettingsType::INTIALIZED_TRANSLATIONS` are cleared), the + // translation `availability()` becomes masked once again. + ClearSiteContentSettings(); + TestTranslationAvailable(browser(), "en", "ja", "downloadable"); } // A delay is triggered for a "downloadable" translation containing a language @@ -1171,6 +1214,51 @@ // given that it is not a preferred language. EXPECT_CALL(manager, GetTranslatorDownloadDelay()).Times(1); TestSimpleTranslationWorks(browser(), "en", "ja"); + + // The delay does not occur on subsequent uses of the same language pair. + EXPECT_CALL(manager, GetTranslatorDownloadDelay()).Times(0); + TestSimpleTranslationWorks(browser(), "en", "ja"); +} + +// A delay is triggered when a second translator for a given translation is +// created during the delay time window of an initial translator's creation +// (which is also expected to trigger a delay). +IN_PROC_BROWSER_TEST_F( + OnDeviceTranslationV1BrowserTest, + CreateTranslator_Delay_ForTranslatorCreatedDuringInitialTranslatorCreationWithDelay) { + SetSelectedLanguages("es"); + MockComponentManager mock_component_manager(GetTempDir()); + mock_component_manager.InstallMockTranslateKitComponent(); + NavigateToEmptyPage(); + + auto manager = + MockTranslationManagerImpl(GetBrowserContext(), GetLastCommittedOrigin()); + + // Simulate the download of an additional language pack (Japanese) by another + // site. + mock_component_manager.InstallMockLanguagePack(LanguagePackKey::kEn_Ja); + + // The added delay should be triggered twice, once for each translator + // creation. + EXPECT_CALL(manager, GetTranslatorDownloadDelay()).Times(2); + ASSERT_EQ(EvalJs(base::StringPrintf(R"( + (async () => { + const sourceLanguage = '%s'; + const targetLanguage = '%s'; + try { + await Promise.all([ + Translator.create({sourceLanguage, targetLanguage}), + Translator.create({sourceLanguage, targetLanguage}), + ]); + return 'OK'; + } catch (e) { + return e.toString(); + } + })(); + )", + "en", "ja")) + .ExtractString(), + "OK"); } // No delay is triggered for a "downloadable" translation between English +
diff --git a/chrome/browser/on_device_translation/translation_manager_impl.cc b/chrome/browser/on_device_translation/translation_manager_impl.cc index 88cdf77..4efd852 100644 --- a/chrome/browser/on_device_translation/translation_manager_impl.cc +++ b/chrome/browser/on_device_translation/translation_manager_impl.cc
@@ -11,6 +11,7 @@ #include "base/task/sequenced_task_runner.h" #include "chrome/browser/browser_process.h" #include "chrome/browser/component_updater/translate_kit_component_installer.h" +#include "chrome/browser/content_settings/host_content_settings_map_factory.h" #include "chrome/browser/on_device_translation/component_manager.h" #include "chrome/browser/on_device_translation/pref_names.h" #include "chrome/browser/on_device_translation/service_controller.h" @@ -18,6 +19,9 @@ #include "chrome/browser/on_device_translation/translation_manager_util.h" #include "chrome/browser/on_device_translation/translation_metrics.h" #include "chrome/browser/on_device_translation/translator.h" +#include "components/content_settings/core/browser/host_content_settings_map.h" +#include "components/content_settings/core/common/content_settings.h" +#include "components/content_settings/core/common/content_settings_types.h" #include "components/crx_file/id_util.h" #include "components/services/on_device_translation/public/cpp/features.h" #include "content/public/browser/render_frame_host.h" @@ -26,7 +30,6 @@ #include "third_party/blink/public/common/features.h" #include "third_party/blink/public/common/features_generated.h" #include "third_party/blink/public/mojom/ai/model_download_progress_observer.mojom.h" -#include "third_party/blink/public/mojom/on_device_translation/translation_manager.mojom.h" #include "ui/base/l10n/l10n_util.h" namespace on_device_translation { @@ -103,6 +106,56 @@ return manager_ptr; } +base::Value TranslationManagerImpl::GetInitializedTranslationsValue() { + return HostContentSettingsMapFactory::GetForProfile(browser_context()) + ->GetWebsiteSetting(origin_.GetURL(), origin_.GetURL(), + ContentSettingsType::INITIALIZED_TRANSLATIONS, + /*info=*/nullptr); +} + +bool TranslationManagerImpl::HasInitializedTranslator( + const std::string& source_language, + const std::string& target_language) { + base::Value initialized_translations_value = + GetInitializedTranslationsValue(); + if (initialized_translations_value.is_dict()) { + return initialized_translations_value.GetDict() + .EnsureList(source_language) + ->contains(target_language); + } + return false; +} + +void TranslationManagerImpl::SetTranslatorInitializedContentSetting( + base::Value initialized_translations) { + HostContentSettingsMapFactory::GetForProfile(browser_context()) + ->SetWebsiteSettingDefaultScope( + origin_.GetURL(), origin_.GetURL(), + ContentSettingsType::INITIALIZED_TRANSLATIONS, + std::move(initialized_translations)); +} + +void TranslationManagerImpl::SetInitializedTranslation( + const std::string& source_language, + const std::string& target_language) { + base::Value initialized_translations_value = + GetInitializedTranslationsValue(); + + // Initialize a dictionary to store data, if none exists. + if (!initialized_translations_value.is_dict()) { + initialized_translations_value = base::Value(base::Value::Dict()); + } + + // Update or initialize the list of targets for the source language. + base::Value::List* target_languages_list = + initialized_translations_value.GetDict().EnsureList(source_language); + if (!target_languages_list->contains(target_language)) { + target_languages_list->Append(target_language); + } + SetTranslatorInitializedContentSetting( + std::move(initialized_translations_value)); +} + void TranslationManagerImpl::CanCreateTranslator( TranslatorLanguageCodePtr source_lang, TranslatorLanguageCodePtr target_lang, @@ -129,12 +182,6 @@ std::move(callback)); } -// Returns a delay upon initial translator creation to safeguard against -// fingerprinting resulting from timing translator creation duration. -// -// The delay is triggered when the `availability()` of the translation -// evaluates to "downloadable", even though all required resources for -// translation have already been downloaded and available. base::TimeDelta TranslationManagerImpl::GetTranslatorDownloadDelay() { return base::RandTimeDelta(base::Seconds(2), base::Seconds(3)); } @@ -181,6 +228,16 @@ std::move(client)) ->OnResult(CreateTranslatorResult::NewTranslator( std::move(blink_remote))); + + // TODO(crbug.com/414393698): Ensure stored WebsiteSetting is not + // updated when create is aborted prior to download completion. + // + // Update the corresponding website setting if a translator has + // been initialized as a result of translator creation. + if (!self->HasInitializedTranslator(source_language, + target_language)) { + self->SetInitializedTranslation(source_language, target_language); + } }, weak_ptr_factory_.GetWeakPtr(), std::move(client), source_language, target_language)); @@ -295,12 +352,16 @@ return; } + bool are_source_and_target_accept_or_english = + (IsInAcceptLanguage(accept_languages, source_language) || + l10n_util::GetLanguage(source_language) == "en") && + (IsInAcceptLanguage(accept_languages, target_language) || + l10n_util::GetLanguage(target_language) == "en"); + bool mask_readily_result = base::FeatureList::IsEnabled(blink::features::kTranslationAPIV1) && - ((!IsInAcceptLanguage(accept_languages, source_language) && - l10n_util::GetLanguage(source_language) != "en") || - (!IsInAcceptLanguage(accept_languages, target_language) && - l10n_util::GetLanguage(target_language) != "en")); + !HasInitializedTranslator(source_language, target_language) && + !are_source_and_target_accept_or_english; GetServiceController().CanTranslate( std::move(source_language), std::move(target_language), @@ -309,12 +370,6 @@ CanCreateTranslatorResult result) { if (result == CanCreateTranslatorResult::kReadily && mask_readily_result) { - // TODO(crbug.com/392073246): For translations containing a - // language outside of English + the user's preferred (accept) - // languages, check if a translator exists for the given origin - // before returning the "readily" availability value for the - // translation, instead of always returning an "after-download" - // result. std::move(callback).Run( CanCreateTranslatorResult:: kAfterDownloadTranslatorCreationRequired);
diff --git a/chrome/browser/on_device_translation/translation_manager_impl.h b/chrome/browser/on_device_translation/translation_manager_impl.h index 0b208d0..089af0b 100644 --- a/chrome/browser/on_device_translation/translation_manager_impl.h +++ b/chrome/browser/on_device_translation/translation_manager_impl.h
@@ -64,6 +64,13 @@ base::SupportsUserData* context_user_data, const url::Origin& origin); + // Returns a delay upon initial translator creation to safeguard against + // fingerprinting resulting from timing translator creation duration. + // + // The delay is triggered when the `availability()` of the translation + // evaluates to "downloadable", even though all required resources for + // translation have already been downloaded and available. + // // Overridden for testing. virtual base::TimeDelta GetTranslatorDownloadDelay(); virtual component_updater::ComponentUpdateService* @@ -75,6 +82,31 @@ const std::string& source_language, const std::string& target_language); + // Dictionary keys for the `INITIALIZED_TRANSLATIONS` website setting. + // Schema (per origin): + // { + // ... + // "<source language code>" : { "<target language code>", ... } + // "en" : { "es", "fr", ... } + // "ja" : { "fr", "de", ... } + // ... + // } + base::Value GetInitializedTranslationsValue(); + + // Determine if a translator has been initialized for the given languages. + bool HasInitializedTranslator(const std::string& source_language, + const std::string& target_language); + + // Set the stored website setting value to the given dictionary of translation + // language pairs. + void SetTranslatorInitializedContentSetting( + base::Value initialized_translations); + + // Updates the corresponding website setting to store information + // for the given translation language pair, as needed. + void SetInitializedTranslation(const std::string& source_language, + const std::string& target_language); + // `blink::mojom::TranslationManager` implementation. void CanCreateTranslator(blink::mojom::TranslatorLanguageCodePtr source_lang, blink::mojom::TranslatorLanguageCodePtr target_lang,
diff --git a/chrome/browser/optimization_guide/android/java/src/org/chromium/chrome/browser/optimization_guide/OptimizationGuideBridge.java b/chrome/browser/optimization_guide/android/java/src/org/chromium/chrome/browser/optimization_guide/OptimizationGuideBridge.java index 7733a02..f3211d8 100644 --- a/chrome/browser/optimization_guide/android/java/src/org/chromium/chrome/browser/optimization_guide/OptimizationGuideBridge.java +++ b/chrome/browser/optimization_guide/android/java/src/org/chromium/chrome/browser/optimization_guide/OptimizationGuideBridge.java
@@ -33,7 +33,7 @@ @JNINamespace("optimization_guide::android") @NullMarked public class OptimizationGuideBridge { - private long mNativeOptimizationGuideBridge; + private final long mNativeOptimizationGuideBridge; /** Interface to implement to receive decisions from the optimization guide. */ public interface OptimizationGuideCallback {
diff --git a/chrome/browser/optimization_guide/android/java/src/org/chromium/chrome/browser/optimization_guide/OptimizationGuideBridgeNativeUnitTest.java b/chrome/browser/optimization_guide/android/java/src/org/chromium/chrome/browser/optimization_guide/OptimizationGuideBridgeNativeUnitTest.java index 4798b3c..be00351 100644 --- a/chrome/browser/optimization_guide/android/java/src/org/chromium/chrome/browser/optimization_guide/OptimizationGuideBridgeNativeUnitTest.java +++ b/chrome/browser/optimization_guide/android/java/src/org/chromium/chrome/browser/optimization_guide/OptimizationGuideBridgeNativeUnitTest.java
@@ -30,8 +30,8 @@ private static final String TEST_URL2 = "https://example2.com/"; private static class OptimizationGuideDecisionWithMetadata { - private @OptimizationGuideDecision int mDecision; - private Any mMetadata; + private final @OptimizationGuideDecision int mDecision; + private final Any mMetadata; public OptimizationGuideDecisionWithMetadata( @OptimizationGuideDecision int decision, Any metadata) { @@ -71,8 +71,8 @@ private static class OnDemandOptimizationGuideCallback implements OptimizationGuideBridge.OnDemandOptimizationGuideCallback { - private Map<GURL, Map<OptimizationType, OptimizationGuideDecisionWithMetadata>> mDecisions = - new HashMap<>(); + private final Map<GURL, Map<OptimizationType, OptimizationGuideDecisionWithMetadata>> + mDecisions = new HashMap<>(); @Override public void onOnDemandOptimizationGuideDecision(
diff --git a/chrome/browser/page_image_service/android/java/src/org/chromium/chrome/browser/page_image_service/ImageServiceBridge.java b/chrome/browser/page_image_service/android/java/src/org/chromium/chrome/browser/page_image_service/ImageServiceBridge.java index 1490f23..945dfbe 100644 --- a/chrome/browser/page_image_service/android/java/src/org/chromium/chrome/browser/page_image_service/ImageServiceBridge.java +++ b/chrome/browser/page_image_service/android/java/src/org/chromium/chrome/browser/page_image_service/ImageServiceBridge.java
@@ -34,7 +34,7 @@ private final CallbackController mCallbackController = new CallbackController(); private final ImageFetcher mImageFetcher; - private long mNativeImageServiceBridge; + private final long mNativeImageServiceBridge; /** * @param clientId The ImageService client the salient image url is being fetched for.
diff --git a/chrome/browser/page_load_metrics/java/src/org/chromium/chrome/browser/page_load_metrics/PageLoadMetrics.java b/chrome/browser/page_load_metrics/java/src/org/chromium/chrome/browser/page_load_metrics/PageLoadMetrics.java index 8ce687b..c37cf4c8 100644 --- a/chrome/browser/page_load_metrics/java/src/org/chromium/chrome/browser/page_load_metrics/PageLoadMetrics.java +++ b/chrome/browser/page_load_metrics/java/src/org/chromium/chrome/browser/page_load_metrics/PageLoadMetrics.java
@@ -207,8 +207,8 @@ float layoutShiftScoreOverall) {} } - private static ObserverList<Observer> sObservers = new ObserverList<>(); - private static ObserverList<Observer> sPrerenderObservers = new ObserverList<>(); + private static final ObserverList<Observer> sObservers = new ObserverList<>(); + private static final ObserverList<Observer> sPrerenderObservers = new ObserverList<>(); private static boolean sIsPrerendering; /** Checks if the current observer handles an event for prerendered pages. */
diff --git a/chrome/browser/partnerbookmarks/android/java/src/org/chromium/chrome/browser/partnerbookmarks/PartnerBookmarksReader.java b/chrome/browser/partnerbookmarks/android/java/src/org/chromium/chrome/browser/partnerbookmarks/PartnerBookmarksReader.java index bab57e7b..6bef233b 100644 --- a/chrome/browser/partnerbookmarks/android/java/src/org/chromium/chrome/browser/partnerbookmarks/PartnerBookmarksReader.java +++ b/chrome/browser/partnerbookmarks/android/java/src/org/chromium/chrome/browser/partnerbookmarks/PartnerBookmarksReader.java
@@ -30,7 +30,7 @@ @NullMarked public class PartnerBookmarksReader { private static final String TAG = "PartnerBMReader"; - private static Set<FaviconUpdateObserver> sFaviconUpdateObservers = new HashSet<>(); + private static final Set<FaviconUpdateObserver> sFaviconUpdateObservers = new HashSet<>(); private static final float DESIRED_FAVICON_SIZE_DP = 16.0f; /** Root bookmark id reserved for the implied root of the bookmarks */
diff --git a/chrome/browser/password_check/android/internal/java/src/org/chromium/chrome/browser/password_check/PasswordCheckViewDialogFragment.java b/chrome/browser/password_check/android/internal/java/src/org/chromium/chrome/browser/password_check/PasswordCheckViewDialogFragment.java index b07be7c..d3cac7f 100644 --- a/chrome/browser/password_check/android/internal/java/src/org/chromium/chrome/browser/password_check/PasswordCheckViewDialogFragment.java +++ b/chrome/browser/password_check/android/internal/java/src/org/chromium/chrome/browser/password_check/PasswordCheckViewDialogFragment.java
@@ -26,7 +26,7 @@ /** Shows the dialog that allows the user to see the compromised credential. */ @NullMarked public class PasswordCheckViewDialogFragment extends PasswordCheckDialogFragment { - private CompromisedCredential mCredential; + private final CompromisedCredential mCredential; PasswordCheckViewDialogFragment(Handler handler, CompromisedCredential credential) { super(handler);
diff --git a/chrome/browser/password_edit_dialog/android/java/src/org/chromium/chrome/browser/password_edit_dialog/NoFilterArrayAdapter.java b/chrome/browser/password_edit_dialog/android/java/src/org/chromium/chrome/browser/password_edit_dialog/NoFilterArrayAdapter.java index 61daf44..d03295c 100644 --- a/chrome/browser/password_edit_dialog/android/java/src/org/chromium/chrome/browser/password_edit_dialog/NoFilterArrayAdapter.java +++ b/chrome/browser/password_edit_dialog/android/java/src/org/chromium/chrome/browser/password_edit_dialog/NoFilterArrayAdapter.java
@@ -21,8 +21,8 @@ */ @NullMarked class NoFilterArrayAdapter<T> extends ArrayAdapter<T> { - private List<T> mItems; - private NoFilter mFilter; + private final List<T> mItems; + private final NoFilter mFilter; public NoFilterArrayAdapter(Context context, int resource, List<T> objects) { super(context, resource, objects);
diff --git a/chrome/browser/password_edit_dialog/android/java/src/org/chromium/chrome/browser/password_edit_dialog/PasswordEditDialogControllerTest.java b/chrome/browser/password_edit_dialog/android/java/src/org/chromium/chrome/browser/password_edit_dialog/PasswordEditDialogControllerTest.java index c0fbfad..92fe555 100644 --- a/chrome/browser/password_edit_dialog/android/java/src/org/chromium/chrome/browser/password_edit_dialog/PasswordEditDialogControllerTest.java +++ b/chrome/browser/password_edit_dialog/android/java/src/org/chromium/chrome/browser/password_edit_dialog/PasswordEditDialogControllerTest.java
@@ -58,7 +58,7 @@ @Mock private PasswordEditDialogCoordinator.Delegate mDelegateMock; - private FakeModalDialogManager mModalDialogManager = new FakeModalDialogManager(0); + private final FakeModalDialogManager mModalDialogManager = new FakeModalDialogManager(0); @Mock private PasswordEditDialogView mDialogViewMock; @@ -66,7 +66,7 @@ private PropertyModel mModalDialogModel; private PasswordEditDialogCoordinator mDialogCoordinator; - private boolean mIsSignedIn; + private final boolean mIsSignedIn; @Parameters public static Collection<Object> data() {
diff --git a/chrome/browser/password_edit_dialog/android/java/src/org/chromium/chrome/browser/password_edit_dialog/PasswordEditDialogCoordinator.java b/chrome/browser/password_edit_dialog/android/java/src/org/chromium/chrome/browser/password_edit_dialog/PasswordEditDialogCoordinator.java index 0fad0ed..ae54cee6 100644 --- a/chrome/browser/password_edit_dialog/android/java/src/org/chromium/chrome/browser/password_edit_dialog/PasswordEditDialogCoordinator.java +++ b/chrome/browser/password_edit_dialog/android/java/src/org/chromium/chrome/browser/password_edit_dialog/PasswordEditDialogCoordinator.java
@@ -70,7 +70,7 @@ private PropertyModel mDialogModel; private PropertyModel mDialogViewModel; - private PasswordEditDialogMediator mMediator; + private final PasswordEditDialogMediator mMediator; /** * Creates the {@link PasswordEditDialogCoordinator}.
diff --git a/chrome/browser/password_edit_dialog/android/java/src/org/chromium/chrome/browser/password_edit_dialog/PasswordEditDialogRenderTest.java b/chrome/browser/password_edit_dialog/android/java/src/org/chromium/chrome/browser/password_edit_dialog/PasswordEditDialogRenderTest.java index 0e6d43a..8c2e1f7 100644 --- a/chrome/browser/password_edit_dialog/android/java/src/org/chromium/chrome/browser/password_edit_dialog/PasswordEditDialogRenderTest.java +++ b/chrome/browser/password_edit_dialog/android/java/src/org/chromium/chrome/browser/password_edit_dialog/PasswordEditDialogRenderTest.java
@@ -46,7 +46,7 @@ @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) public class PasswordEditDialogRenderTest { @ParameterAnnotations.ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = Arrays.asList( new ParameterSet().value(false).name("Default"), new ParameterSet().value(true).name("NightMode"));
diff --git a/chrome/browser/password_manager/android/access_loss/java/src/org/chromium/chrome/browser/access_loss/PasswordAccessLossDialogSettingsCoordinatorTest.java b/chrome/browser/password_manager/android/access_loss/java/src/org/chromium/chrome/browser/access_loss/PasswordAccessLossDialogSettingsCoordinatorTest.java index cc9eed0..5d847fe 100644 --- a/chrome/browser/password_manager/android/access_loss/java/src/org/chromium/chrome/browser/access_loss/PasswordAccessLossDialogSettingsCoordinatorTest.java +++ b/chrome/browser/password_manager/android/access_loss/java/src/org/chromium/chrome/browser/access_loss/PasswordAccessLossDialogSettingsCoordinatorTest.java
@@ -48,9 +48,9 @@ @Batch(Batch.PER_CLASS) public class PasswordAccessLossDialogSettingsCoordinatorTest { - private PasswordAccessLossDialogSettingsCoordinator mCoordinator = + private final PasswordAccessLossDialogSettingsCoordinator mCoordinator = new PasswordAccessLossDialogSettingsCoordinator(); - private FakeModalDialogManager mModalDialogManager = + private final FakeModalDialogManager mModalDialogManager = new FakeModalDialogManager(ModalDialogManager.ModalDialogType.APP); private Activity mActivity;
diff --git a/chrome/browser/password_manager/android/access_loss/java/src/org/chromium/chrome/browser/access_loss/PasswordAccessLossWarningRenderTest.java b/chrome/browser/password_manager/android/access_loss/java/src/org/chromium/chrome/browser/access_loss/PasswordAccessLossWarningRenderTest.java index c2a3635..fe8fafa 100644 --- a/chrome/browser/password_manager/android/access_loss/java/src/org/chromium/chrome/browser/access_loss/PasswordAccessLossWarningRenderTest.java +++ b/chrome/browser/password_manager/android/access_loss/java/src/org/chromium/chrome/browser/access_loss/PasswordAccessLossWarningRenderTest.java
@@ -55,7 +55,7 @@ public class PasswordAccessLossWarningRenderTest { @ParameterAnnotations.ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = Arrays.asList( new ParameterSet().value(false, false).name("Default"), new ParameterSet().value(false, true).name("RTL"),
diff --git a/chrome/browser/password_manager/android/add_username_dialog/java/src/org/chromium/chrome/browser/add_username_dialog/AddUsernameDialogBridgeTest.java b/chrome/browser/password_manager/android/add_username_dialog/java/src/org/chromium/chrome/browser/add_username_dialog/AddUsernameDialogBridgeTest.java index a96f891..16dc038 100644 --- a/chrome/browser/password_manager/android/add_username_dialog/java/src/org/chromium/chrome/browser/add_username_dialog/AddUsernameDialogBridgeTest.java +++ b/chrome/browser/password_manager/android/add_username_dialog/java/src/org/chromium/chrome/browser/add_username_dialog/AddUsernameDialogBridgeTest.java
@@ -43,7 +43,7 @@ private static final long sTestNativePointer = 1; - private FakeModalDialogManager mModalDialogManager = new FakeModalDialogManager(0); + private final FakeModalDialogManager mModalDialogManager = new FakeModalDialogManager(0); private AddUsernameDialogBridge mBridge; @Before
diff --git a/chrome/browser/password_manager/android/add_username_dialog/java/src/org/chromium/chrome/browser/add_username_dialog/AddUsernameDialogModuleTest.java b/chrome/browser/password_manager/android/add_username_dialog/java/src/org/chromium/chrome/browser/add_username_dialog/AddUsernameDialogModuleTest.java index a0483666..ed5154d 100644 --- a/chrome/browser/password_manager/android/add_username_dialog/java/src/org/chromium/chrome/browser/add_username_dialog/AddUsernameDialogModuleTest.java +++ b/chrome/browser/password_manager/android/add_username_dialog/java/src/org/chromium/chrome/browser/add_username_dialog/AddUsernameDialogModuleTest.java
@@ -39,7 +39,7 @@ @Batch(Batch.PER_CLASS) public class AddUsernameDialogModuleTest { private AddUsernameDialogController mController; - private FakeModalDialogManager mModalDialogManager = new FakeModalDialogManager(0); + private final FakeModalDialogManager mModalDialogManager = new FakeModalDialogManager(0); private AppCompatActivity mActivity; private static final String TEST_PASSWORD = "password"; private static final String TEST_USERNAME = "username";
diff --git a/chrome/browser/password_manager/android/bottom_sheet/java/src/org/chromium/chrome/browser/bottom_sheet/SimpleNoticeSheetCoordinator.java b/chrome/browser/password_manager/android/bottom_sheet/java/src/org/chromium/chrome/browser/bottom_sheet/SimpleNoticeSheetCoordinator.java index c697e1f..1bbd3be0 100644 --- a/chrome/browser/password_manager/android/bottom_sheet/java/src/org/chromium/chrome/browser/bottom_sheet/SimpleNoticeSheetCoordinator.java +++ b/chrome/browser/password_manager/android/bottom_sheet/java/src/org/chromium/chrome/browser/bottom_sheet/SimpleNoticeSheetCoordinator.java
@@ -24,8 +24,8 @@ /** The coordinator of the simple notice sheet. */ @NullMarked public class SimpleNoticeSheetCoordinator { - private Context mContext; - private BottomSheetController mSheetController; + private final Context mContext; + private final BottomSheetController mSheetController; private @Nullable SimpleNoticeSheetView mView; private final BottomSheetObserver mBottomSheetObserver =
diff --git a/chrome/browser/password_manager/android/bottom_sheet/java/src/org/chromium/chrome/browser/bottom_sheet/SimpleNoticeSheetRenderTest.java b/chrome/browser/password_manager/android/bottom_sheet/java/src/org/chromium/chrome/browser/bottom_sheet/SimpleNoticeSheetRenderTest.java index eb24729..be5ab979 100644 --- a/chrome/browser/password_manager/android/bottom_sheet/java/src/org/chromium/chrome/browser/bottom_sheet/SimpleNoticeSheetRenderTest.java +++ b/chrome/browser/password_manager/android/bottom_sheet/java/src/org/chromium/chrome/browser/bottom_sheet/SimpleNoticeSheetRenderTest.java
@@ -53,7 +53,7 @@ public class SimpleNoticeSheetRenderTest { @ParameterAnnotations.ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = Arrays.asList( new ParameterSet().value(false, false).name("Default"), new ParameterSet().value(false, true).name("RTL"),
diff --git a/chrome/browser/password_manager/android/grouped_affiliations/java/src/org/chromium/chrome/browser/grouped_affiliations/AcknowledgeGroupedCredentialSheetRenderTest.java b/chrome/browser/password_manager/android/grouped_affiliations/java/src/org/chromium/chrome/browser/grouped_affiliations/AcknowledgeGroupedCredentialSheetRenderTest.java index d93df326..9e45c652 100644 --- a/chrome/browser/password_manager/android/grouped_affiliations/java/src/org/chromium/chrome/browser/grouped_affiliations/AcknowledgeGroupedCredentialSheetRenderTest.java +++ b/chrome/browser/password_manager/android/grouped_affiliations/java/src/org/chromium/chrome/browser/grouped_affiliations/AcknowledgeGroupedCredentialSheetRenderTest.java
@@ -50,7 +50,7 @@ @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) public class AcknowledgeGroupedCredentialSheetRenderTest { @ParameterAnnotations.ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = Arrays.asList( new ParameterSet().value(false, false).name("Default"), new ParameterSet().value(false, true).name("RTL"),
diff --git a/chrome/browser/password_manager/android/grouped_affiliations/java/src/org/chromium/chrome/browser/grouped_affiliations/AcknowledgeGroupedCredentialSheetView.java b/chrome/browser/password_manager/android/grouped_affiliations/java/src/org/chromium/chrome/browser/grouped_affiliations/AcknowledgeGroupedCredentialSheetView.java index 3f438a3..2f22073 100644 --- a/chrome/browser/password_manager/android/grouped_affiliations/java/src/org/chromium/chrome/browser/grouped_affiliations/AcknowledgeGroupedCredentialSheetView.java +++ b/chrome/browser/password_manager/android/grouped_affiliations/java/src/org/chromium/chrome/browser/grouped_affiliations/AcknowledgeGroupedCredentialSheetView.java
@@ -29,7 +29,7 @@ private static final float URL_IN_TITLE_MAX_LINES = 1.5f; private final View mContent; private final String mCurrentHostname; - private String mCredentialHostname; + private final String mCredentialHostname; private final Callback<Integer> mInterationCallback; public AcknowledgeGroupedCredentialSheetView(
diff --git a/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/PasswordManagerLifecycleHelper.java b/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/PasswordManagerLifecycleHelper.java index f389932..5879d20 100644 --- a/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/PasswordManagerLifecycleHelper.java +++ b/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/PasswordManagerLifecycleHelper.java
@@ -17,7 +17,7 @@ @NullMarked public class PasswordManagerLifecycleHelper { private static @Nullable PasswordManagerLifecycleHelper sInstance; - private ObserverList<Long> mNativeObservers = new ObserverList<>(); + private final ObserverList<Long> mNativeObservers = new ObserverList<>(); /** * Returns the singleton instance of this class and lazily creates it if that hasn't happened.
diff --git a/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/PasswordSyncControllerDelegateBridgeImpl.java b/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/PasswordSyncControllerDelegateBridgeImpl.java index 38863ef..bc2f780 100644 --- a/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/PasswordSyncControllerDelegateBridgeImpl.java +++ b/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/PasswordSyncControllerDelegateBridgeImpl.java
@@ -19,7 +19,7 @@ @NullMarked class PasswordSyncControllerDelegateBridgeImpl { private final PasswordSyncControllerDelegate mPasswordSyncControllerDelegate; - private long mNativeDelegateBridgeImpl; + private final long mNativeDelegateBridgeImpl; PasswordSyncControllerDelegateBridgeImpl( long nativePasswordSyncControllerDelegateBridgeImpl,
diff --git a/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/settings/ExportFlow.java b/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/settings/ExportFlow.java index cb7030b6..80034d0 100644 --- a/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/settings/ExportFlow.java +++ b/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/settings/ExportFlow.java
@@ -86,7 +86,7 @@ /** Describes at which state the password export flow is. */ @ExportState private int mExportState; - private @PasswordAccessLossWarningType int mWarningType; + private final @PasswordAccessLossWarningType int mWarningType; /** Name of the subdirectory in cache which stores the exported passwords file. */ private static final String PASSWORDS_CACHE_DIR = "/passwords";
diff --git a/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/settings/NonCancelableProgressBar.java b/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/settings/NonCancelableProgressBar.java index e538436..1d02d1ae 100644 --- a/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/settings/NonCancelableProgressBar.java +++ b/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/settings/NonCancelableProgressBar.java
@@ -23,7 +23,7 @@ */ @NullMarked public class NonCancelableProgressBar extends DialogFragment { - private int mTitleStringId; + private final int mTitleStringId; public NonCancelableProgressBar() { mTitleStringId = R.string.please_wait_progress_message;
diff --git a/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/settings/PasswordAccessLossExportDialogMediator.java b/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/settings/PasswordAccessLossExportDialogMediator.java index f49689a..b44e28f8 100644 --- a/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/settings/PasswordAccessLossExportDialogMediator.java +++ b/chrome/browser/password_manager/android/java/src/org/chromium/chrome/browser/password_manager/settings/PasswordAccessLossExportDialogMediator.java
@@ -47,7 +47,7 @@ private final int mDialogViewId; private final PasswordAccessLossExportDialogFragment mExportDialogFragment; private @Nullable ExportFlow mExportFlow; - private PasswordStoreBridge mPasswordStoreBridge; + private final PasswordStoreBridge mPasswordStoreBridge; private @Nullable DialogManager mProgressBarManager; private final PasswordAccessLossExportDialogCoordinator.Observer mExportDialogObserver;
diff --git a/chrome/browser/password_manager/android/junit/src/org/chromium/chrome/browser/password_manager/PasswordSettingsUpdaterMetricsRecorderTest.java b/chrome/browser/password_manager/android/junit/src/org/chromium/chrome/browser/password_manager/PasswordSettingsUpdaterMetricsRecorderTest.java index b40d4a7..872b44a 100644 --- a/chrome/browser/password_manager/android/junit/src/org/chromium/chrome/browser/password_manager/PasswordSettingsUpdaterMetricsRecorderTest.java +++ b/chrome/browser/password_manager/android/junit/src/org/chromium/chrome/browser/password_manager/PasswordSettingsUpdaterMetricsRecorderTest.java
@@ -40,7 +40,7 @@ private static final String HISTOGRAM_NAME_BASE = "PasswordManager.PasswordSettings"; - private String mStoreType; + private final String mStoreType; public PasswordSettingsUpdaterMetricsRecorderTest(String account) { mStoreType = getStoreType(account);
diff --git a/chrome/browser/password_manager/android/pwd_check_wrapper/java/src/org/chromium/chrome/browser/pwd_check_wrapper/FakePasswordCheckController.java b/chrome/browser/password_manager/android/pwd_check_wrapper/java/src/org/chromium/chrome/browser/pwd_check_wrapper/FakePasswordCheckController.java index 9e62f2b..137c1651 100644 --- a/chrome/browser/password_manager/android/pwd_check_wrapper/java/src/org/chromium/chrome/browser/pwd_check_wrapper/FakePasswordCheckController.java +++ b/chrome/browser/password_manager/android/pwd_check_wrapper/java/src/org/chromium/chrome/browser/pwd_check_wrapper/FakePasswordCheckController.java
@@ -8,7 +8,7 @@ import java.util.concurrent.CompletableFuture; public class FakePasswordCheckController implements PasswordCheckController { - private HashMap<Integer, CompletableFuture<PasswordCheckResult>> mPasswordCheckResults = + private final HashMap<Integer, CompletableFuture<PasswordCheckResult>> mPasswordCheckResults = new HashMap<>(); public void setPasswordCheckResult(
diff --git a/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PostPasswordMigrationSheetRenderTest.java b/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PostPasswordMigrationSheetRenderTest.java index dcda556a..81bbf38 100644 --- a/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PostPasswordMigrationSheetRenderTest.java +++ b/chrome/browser/password_manager/android/pwd_migration/java/src/org/chromium/chrome/browser/pwd_migration/PostPasswordMigrationSheetRenderTest.java
@@ -52,7 +52,7 @@ @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) public class PostPasswordMigrationSheetRenderTest { @ParameterAnnotations.ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = Arrays.asList( new ParameterSet().value(false, false).name("Default"), new ParameterSet().value(false, true).name("RTL"),
diff --git a/chrome/browser/password_manager/android/pwm_disabled/java/src/org/chromium/chrome/browser/pwm_disabled/PasswordManagerUnavailableDialogTest.java b/chrome/browser/password_manager/android/pwm_disabled/java/src/org/chromium/chrome/browser/pwm_disabled/PasswordManagerUnavailableDialogTest.java index c367c3cc..e89424e 100644 --- a/chrome/browser/password_manager/android/pwm_disabled/java/src/org/chromium/chrome/browser/pwm_disabled/PasswordManagerUnavailableDialogTest.java +++ b/chrome/browser/password_manager/android/pwm_disabled/java/src/org/chromium/chrome/browser/pwm_disabled/PasswordManagerUnavailableDialogTest.java
@@ -39,9 +39,9 @@ @Batch(Batch.PER_CLASS) public class PasswordManagerUnavailableDialogTest { - private PasswordManagerUnavailableDialogCoordinator mCoordinator = + private final PasswordManagerUnavailableDialogCoordinator mCoordinator = new PasswordManagerUnavailableDialogCoordinator(); - private FakeModalDialogManager mModalDialogManager = + private final FakeModalDialogManager mModalDialogManager = new FakeModalDialogManager(ModalDialogManager.ModalDialogType.APP); private Activity mActivity;
diff --git a/chrome/browser/password_manager/android/test_support/java/src/org/chromium/chrome/browser/password_manager/FakePasswordStoreAndroidBackend.java b/chrome/browser/password_manager/android/test_support/java/src/org/chromium/chrome/browser/password_manager/FakePasswordStoreAndroidBackend.java index 86b28074..b6a02306 100644 --- a/chrome/browser/password_manager/android/test_support/java/src/org/chromium/chrome/browser/password_manager/FakePasswordStoreAndroidBackend.java +++ b/chrome/browser/password_manager/android/test_support/java/src/org/chromium/chrome/browser/password_manager/FakePasswordStoreAndroidBackend.java
@@ -33,7 +33,7 @@ /** Fake {@link PasswordStoreAndroidBackend} to be used in integration tests. */ public class FakePasswordStoreAndroidBackend implements PasswordStoreAndroidBackend { private final Map<Account, List<PasswordWithLocalData>> mSavedPasswords = new HashMap<>(); - private SequencedTaskRunner mTaskRunner = + private final SequencedTaskRunner mTaskRunner = PostTask.createSequencedTaskRunner(TaskTraits.UI_USER_BLOCKING); public static final Account sLocalDefaultAccount = new Account("Test user", "Local");
diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc b/chrome/browser/policy/configuration_policy_handler_list_factory.cc index 91c3a30..4d3600f 100644 --- a/chrome/browser/policy/configuration_policy_handler_list_factory.cc +++ b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
@@ -958,11 +958,13 @@ { key::kDefaultGeolocationSetting, prefs::kManagedDefaultGeolocationSetting, base::Value::Type::INTEGER }, -#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) \ - || BUILDFLAG(IS_MAC) +#if BUILDFLAG(ENABLE_EXTENSIONS_CORE) { key::kMandatoryExtensionsForIncognitoNavigation, prefs::kMandatoryExtensionsForIncognitoNavigation, base::Value::Type::LIST }, +#endif // BUILDFLAG(ENABLE_EXTENSIONS_CORE) +#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_WIN) \ + || BUILDFLAG(IS_MAC) { key::kRequireOnlineRevocationChecksForLocalAnchors, prefs::kCertRevocationCheckingRequiredLocalAnchors, base::Value::Type::BOOLEAN },
diff --git a/chrome/browser/prefs/BUILD.gn b/chrome/browser/prefs/BUILD.gn index fa5fc43..e77a1e19 100644 --- a/chrome/browser/prefs/BUILD.gn +++ b/chrome/browser/prefs/BUILD.gn
@@ -68,6 +68,7 @@ "//chrome/browser/ui/hats", "//chrome/browser/ui/prefs", "//chrome/browser/ui/safety_hub", + "//chrome/browser/ui/search_engines", "//chrome/browser/ui/startup:startup_tab", "//chrome/browser/updates/announcement_notification", "//components/blocked_content",
diff --git a/chrome/browser/privacy_guide/android/java/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideBottomSheetView.java b/chrome/browser/privacy_guide/android/java/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideBottomSheetView.java index 99aaa6d0..06cb6a6 100644 --- a/chrome/browser/privacy_guide/android/java/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideBottomSheetView.java +++ b/chrome/browser/privacy_guide/android/java/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideBottomSheetView.java
@@ -19,7 +19,7 @@ public class PrivacyGuideBottomSheetView implements BottomSheetContent { private final View mContentView; private final Runnable mCloseBottomSheetCallback; - private ObservableSupplierImpl<Boolean> mBackPressStateChangedSupplier = + private final ObservableSupplierImpl<Boolean> mBackPressStateChangedSupplier = new ObservableSupplierImpl<>(); private final float mHalfHeight; private final float mFullHeight;
diff --git a/chrome/browser/privacy_guide/android/java/src/org/chromium/chrome/browser/privacy_guide/StepDisplayHandlerImpl.java b/chrome/browser/privacy_guide/android/java/src/org/chromium/chrome/browser/privacy_guide/StepDisplayHandlerImpl.java index 0e03c14..f012020 100644 --- a/chrome/browser/privacy_guide/android/java/src/org/chromium/chrome/browser/privacy_guide/StepDisplayHandlerImpl.java +++ b/chrome/browser/privacy_guide/android/java/src/org/chromium/chrome/browser/privacy_guide/StepDisplayHandlerImpl.java
@@ -19,7 +19,7 @@ @NullMarked class StepDisplayHandlerImpl implements StepDisplayHandler { private final Profile mProfile; - private PrivacySandboxBridge mPrivacySandboxBridge; + private final PrivacySandboxBridge mPrivacySandboxBridge; StepDisplayHandlerImpl(Profile profile) { mProfile = profile;
diff --git a/chrome/browser/privacy_guide/android/javatests/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideFragmentTest.java b/chrome/browser/privacy_guide/android/javatests/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideFragmentTest.java index 9f90fd3..2bb4bec 100644 --- a/chrome/browser/privacy_guide/android/javatests/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideFragmentTest.java +++ b/chrome/browser/privacy_guide/android/javatests/src/org/chromium/chrome/browser/privacy_guide/PrivacyGuideFragmentTest.java
@@ -150,7 +150,7 @@ onViewWaiting(withText(R.string.privacy_guide_fragment_title)); } - private Map<Integer, Integer> mTitleNames = + private final Map<Integer, Integer> mTitleNames = Map.of( FragmentType.MSBB, R.string.url_keyed_anonymized_data_title,
diff --git a/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxDebouncedOnClick.java b/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxDebouncedOnClick.java index c70c887..4bc60d7 100644 --- a/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxDebouncedOnClick.java +++ b/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxDebouncedOnClick.java
@@ -27,7 +27,7 @@ "debouncing-delay-ms", DEFAULT_MIN_ACTION_DISTANCE_MS); - private String mNoticeName; + private final String mNoticeName; public PrivacySandboxDebouncedOnClick(String noticeName) { mNoticeName = noticeName;
diff --git a/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxDialogConsentEEA.java b/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxDialogConsentEEA.java index e9a10901..175b0ee 100644 --- a/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxDialogConsentEEA.java +++ b/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxDialogConsentEEA.java
@@ -51,23 +51,23 @@ private final PrivacySandboxBridge mPrivacySandboxBridge; - private Activity mActivity; - private View mContentView; + private final Activity mActivity; + private final View mContentView; private final CheckableImageView mExpandArrowView; - private LinearLayout mDropdownContainer; - private LinearLayout mDropdownElement; - private LinearLayout mProgressBarContainer; - private LinearLayout mConsentViewContainer; - private ButtonCompat mMoreButton; - private LinearLayout mActionButtons; - private ScrollView mScrollView; + private final LinearLayout mDropdownContainer; + private final LinearLayout mDropdownElement; + private final LinearLayout mProgressBarContainer; + private final LinearLayout mConsentViewContainer; + private final ButtonCompat mMoreButton; + private final LinearLayout mActionButtons; + private final ScrollView mScrollView; private @Nullable TextViewWithLeading mLearnMoreText; - private int mSurfaceType; - private LinearLayout mPrivacyPolicyView; - private FrameLayout mPrivacyPolicyContent; - private ChromeImageButton mPrivacyPolicyBackButton; - private View.OnClickListener mOnClickListener; + private final int mSurfaceType; + private final LinearLayout mPrivacyPolicyView; + private final FrameLayout mPrivacyPolicyContent; + private final ChromeImageButton mPrivacyPolicyBackButton; + private final View.OnClickListener mOnClickListener; private @Nullable ThinWebView mThinWebView; private @Nullable WebContents mWebContents; @@ -77,7 +77,7 @@ private final ActivityWindowAndroid mActivityWindowAndroid; private boolean mIsPrivacyPageLoaded; - private boolean mAreAnimationsDisabled; + private final boolean mAreAnimationsDisabled; private @StringRes int mLearnMoreBullet1StringRes = R.string.privacy_sandbox_m1_consent_learn_more_bullet_1;
diff --git a/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxDialogNoticeEEA.java b/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxDialogNoticeEEA.java index 5c97352..d909c45 100644 --- a/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxDialogNoticeEEA.java +++ b/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxDialogNoticeEEA.java
@@ -23,17 +23,17 @@ public class PrivacySandboxDialogNoticeEEA extends ChromeDialog implements DialogInterface.OnShowListener { private final PrivacySandboxBridge mPrivacySandboxBridge; - private View mContentView; + private final View mContentView; - private ButtonCompat mMoreButton; - private LinearLayout mActionButtons; - private ScrollView mScrollView; - private LinearLayout mDropdownElement; + private final ButtonCompat mMoreButton; + private final LinearLayout mActionButtons; + private final ScrollView mScrollView; + private final LinearLayout mDropdownElement; private final CheckableImageView mExpandArrowView; - private LinearLayout mDropdownContainer; - private @SurfaceType int mSurfaceType; - private View.OnClickListener mOnClickListener; + private final LinearLayout mDropdownContainer; + private final @SurfaceType int mSurfaceType; + private final View.OnClickListener mOnClickListener; public PrivacySandboxDialogNoticeEEA( Activity activity,
diff --git a/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxDialogNoticeEeaV2.java b/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxDialogNoticeEeaV2.java index 6fc15c4..eac7339 100644 --- a/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxDialogNoticeEeaV2.java +++ b/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxDialogNoticeEeaV2.java
@@ -44,24 +44,24 @@ public class PrivacySandboxDialogNoticeEeaV2 extends ChromeDialog implements DialogInterface.OnShowListener { private final PrivacySandboxBridge mPrivacySandboxBridge; - private View mContentView; + private final View mContentView; - private LinearLayout mNoticeViewContainer; - private ButtonCompat mMoreButton; - private LinearLayout mActionButtons; - private ScrollView mScrollView; - private LinearLayout mSiteSuggestedAdsDropdownElement; - private LinearLayout mAdMeasurementDropdownElement; + private final LinearLayout mNoticeViewContainer; + private final ButtonCompat mMoreButton; + private final LinearLayout mActionButtons; + private final ScrollView mScrollView; + private final LinearLayout mSiteSuggestedAdsDropdownElement; + private final LinearLayout mAdMeasurementDropdownElement; private final CheckableImageView mSiteSuggestedAdsExpandArrowView; private final CheckableImageView mAdMeasurementExpandArrowView; - private LinearLayout mSiteSuggestedAdsDropdownContainer; - private LinearLayout mAdMeasurementDropdownContainer; - private @SurfaceType int mSurfaceType; + private final LinearLayout mSiteSuggestedAdsDropdownContainer; + private final LinearLayout mAdMeasurementDropdownContainer; + private final @SurfaceType int mSurfaceType; - private LinearLayout mPrivacyPolicyView; - private FrameLayout mPrivacyPolicyContent; - private ChromeImageButton mPrivacyPolicyBackButton; + private final LinearLayout mPrivacyPolicyView; + private final FrameLayout mPrivacyPolicyContent; + private final ChromeImageButton mPrivacyPolicyBackButton; private @Nullable TextViewWithLeading mLearnMoreBullet1Description; private @Nullable ThinWebView mThinWebView; private @Nullable WebContents mWebContents; @@ -70,7 +70,7 @@ private long mPrivacyPolicyClickedTimestamp; private final ActivityWindowAndroid mActivityWindowAndroid; private boolean mIsPrivacyPageLoaded; - private View.OnClickListener mOnClickListener; + private final View.OnClickListener mOnClickListener; public PrivacySandboxDialogNoticeEeaV2( Activity activity,
diff --git a/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxDialogNoticeROW.java b/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxDialogNoticeROW.java index d263cc97..96a060c 100644 --- a/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxDialogNoticeROW.java +++ b/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxDialogNoticeROW.java
@@ -44,22 +44,22 @@ public class PrivacySandboxDialogNoticeROW extends ChromeDialog implements DialogInterface.OnShowListener { private final PrivacySandboxBridge mPrivacySandboxBridge; - private View mContentView; + private final View mContentView; - private LinearLayout mNoticeViewContainer; + private final LinearLayout mNoticeViewContainer; private final CheckableImageView mExpandArrowView; - private LinearLayout mDropdownContainer; - private LinearLayout mDropdownElement; - private ButtonCompat mMoreButton; - private LinearLayout mActionButtons; - private ScrollView mScrollView; - private @SurfaceType int mSurfaceType; + private final LinearLayout mDropdownContainer; + private final LinearLayout mDropdownElement; + private final ButtonCompat mMoreButton; + private final LinearLayout mActionButtons; + private final ScrollView mScrollView; + private final @SurfaceType int mSurfaceType; private @StringRes int mLearnMoreBullet2StringRes = R.string.privacy_sandbox_m1_notice_row_learn_more_bullet_2; - private LinearLayout mPrivacyPolicyView; - private FrameLayout mPrivacyPolicyContent; - private ChromeImageButton mPrivacyPolicyBackButton; + private final LinearLayout mPrivacyPolicyView; + private final FrameLayout mPrivacyPolicyContent; + private final ChromeImageButton mPrivacyPolicyBackButton; private @Nullable TextViewWithLeading mLearnMoreDescription5V2; private @Nullable ThinWebView mThinWebView; private @Nullable WebContents mWebContents; @@ -68,7 +68,7 @@ private long mPrivacyPolicyClickedTimestamp; private final ActivityWindowAndroid mActivityWindowAndroid; private boolean mIsPrivacyPageLoaded; - private View.OnClickListener mOnClickListener; + private final View.OnClickListener mOnClickListener; public PrivacySandboxDialogNoticeROW( Activity activity,
diff --git a/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxDialogNoticeRestricted.java b/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxDialogNoticeRestricted.java index b5af0bc3..f150a181 100644 --- a/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxDialogNoticeRestricted.java +++ b/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxDialogNoticeRestricted.java
@@ -23,13 +23,13 @@ public class PrivacySandboxDialogNoticeRestricted extends ChromeDialog implements DialogInterface.OnShowListener { private final PrivacySandboxBridge mPrivacySandboxBridge; - private View mContentView; + private final View mContentView; - private ButtonCompat mMoreButton; - private LinearLayout mActionButtons; - private ScrollView mScrollView; - private @SurfaceType int mSurfaceType; - private View.OnClickListener mOnClickListener; + private final ButtonCompat mMoreButton; + private final LinearLayout mActionButtons; + private final ScrollView mScrollView; + private final @SurfaceType int mSurfaceType; + private final View.OnClickListener mOnClickListener; private boolean mShowMoreButtonForTesting; public PrivacySandboxDialogNoticeRestricted(
diff --git a/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxDialogV3.java b/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxDialogV3.java index 9abdcfe7..fd5faf9 100644 --- a/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxDialogV3.java +++ b/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxDialogV3.java
@@ -90,18 +90,18 @@ int MAX_VALUE = 5; } - private @PrivacySandboxDialogType int mDialogType; + private final @PrivacySandboxDialogType int mDialogType; - private int mSurfaceType; + private final int mSurfaceType; private View mContentView; - private View.OnClickListener mOnClickListener; + private final View.OnClickListener mOnClickListener; private LinearLayout mViewContainer; private ButtonCompat mMoreButton; // Determines if we've shown the action button before, and if so we should always show it. private boolean mShouldShowActionButtons; private LinearLayout mActionButtons; - private ScrollView mScrollView; + private final ScrollView mScrollView; private View mBottomFade; // Dropdown elements @@ -116,10 +116,10 @@ private @Nullable ThinWebView mThinWebView; private @Nullable WebContents mWebContents; private @Nullable WebContentsObserver mWebContentsObserver; - private @IdRes int mPrivacyPolicyTextIdRes = R.id.privacy_policy_text; + private final @IdRes int mPrivacyPolicyTextIdRes = R.id.privacy_policy_text; - private ActivityWindowAndroid mActivityWindowAndroid; - private Profile mProfile; + private final ActivityWindowAndroid mActivityWindowAndroid; + private final Profile mProfile; // TODO(crbug.com/392943234): Update the constructor to accept a layoutRes required for the // dialog.
diff --git a/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxSnackbarController.java b/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxSnackbarController.java index 69846287..3d01581 100644 --- a/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxSnackbarController.java +++ b/chrome/browser/privacy_sandbox/android/java/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxSnackbarController.java
@@ -16,8 +16,8 @@ /** Shows the snackbar for Privacy Sandbox settings, allowing the user to quickly navigate there. */ @NullMarked public class PrivacySandboxSnackbarController implements SnackbarManager.SnackbarController { - private Context mContext; - private SnackbarManager mSnackbarManager; + private final Context mContext; + private final SnackbarManager mSnackbarManager; /** Creates an instance of the controller given a SnackbarManager. */ public PrivacySandboxSnackbarController(Context context, SnackbarManager manager) {
diff --git a/chrome/browser/privacy_sandbox/android/javatests/src/org/chromium/chrome/browser/privacy_sandbox/FakePrivacySandboxBridge.java b/chrome/browser/privacy_sandbox/android/javatests/src/org/chromium/chrome/browser/privacy_sandbox/FakePrivacySandboxBridge.java index d3f4ed4..270af95 100644 --- a/chrome/browser/privacy_sandbox/android/javatests/src/org/chromium/chrome/browser/privacy_sandbox/FakePrivacySandboxBridge.java +++ b/chrome/browser/privacy_sandbox/android/javatests/src/org/chromium/chrome/browser/privacy_sandbox/FakePrivacySandboxBridge.java
@@ -31,7 +31,7 @@ private Integer mLastPromptAction; private Integer mLastSurfaceType; private boolean mLastTopicsToggleValue; - private final String mGoogleEmbeddedPrivacyPolicyURL = + private static final String GOOGLE_EMBEDDED_PRIVACY_POLICY_U_R_L = "https://policies.google.com/privacy/embedded"; public void setCurrentTopTopics(String... topics) { @@ -254,6 +254,6 @@ @PrivacyPolicyDomainType int domainType, @PrivacyPolicyColorScheme int colorScheme, String locale) { - return mGoogleEmbeddedPrivacyPolicyURL; + return GOOGLE_EMBEDDED_PRIVACY_POLICY_U_R_L; } }
diff --git a/chrome/browser/privacy_sandbox/android/javatests/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxDebouncedOnClickTest.java b/chrome/browser/privacy_sandbox/android/javatests/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxDebouncedOnClickTest.java index 229b751..638b6a2b 100644 --- a/chrome/browser/privacy_sandbox/android/javatests/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxDebouncedOnClickTest.java +++ b/chrome/browser/privacy_sandbox/android/javatests/src/org/chromium/chrome/browser/privacy_sandbox/PrivacySandboxDebouncedOnClickTest.java
@@ -41,7 +41,7 @@ @Batch(Batch.PER_CLASS) public final class PrivacySandboxDebouncedOnClickTest { @ParameterAnnotations.ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = Arrays.asList( new ParameterSet() .value(R.id.ack_button, PrivacySandboxDebouncedOnClick.ClickEvent.ACK) @@ -68,11 +68,11 @@ PrivacySandboxDebouncedOnClick.ClickEvent.PRIVACY_POLICY_BACK) .name("PrivacyPolicyBack")); - private View mMockView; + private final View mMockView; private int mNumClicks; - private int mButtonRid; - private int mExpectedClickEvent; - private PrivacySandboxDebouncedOnClickImpl mFakeDialog; + private final int mButtonRid; + private final int mExpectedClickEvent; + private final PrivacySandboxDebouncedOnClickImpl mFakeDialog; public PrivacySandboxDebouncedOnClickTest(int rid, int clickEvent) { mMockView = mock(View.class);
diff --git a/chrome/browser/privacy_sandbox/notice/notice_storage.h b/chrome/browser/privacy_sandbox/notice/notice_storage.h index 669d061d..4c417ff 100644 --- a/chrome/browser/privacy_sandbox/notice/notice_storage.h +++ b/chrome/browser/privacy_sandbox/notice/notice_storage.h
@@ -105,15 +105,6 @@ base::JSONValueConverter<V1MigrationData>* converter); }; -// TODO(crbug.com/414648495): These are only used in tests now, refactor the -// tests & remove. -std::optional<base::Time> GetNoticeFirstShownFromEvents( - const NoticeStorageData& notice_data); - -std::optional<NoticeEventTimestampPair> -GetNoticeActionTakenForFirstShownFromEvents( - const NoticeStorageData& notice_data); - std::string GetNoticeActionStringFromEvent( notice::mojom::PrivacySandboxNoticeEvent event);
diff --git a/chrome/browser/privacy_sandbox/notice/notice_storage_unittest.cc b/chrome/browser/privacy_sandbox/notice/notice_storage_unittest.cc index d327cb2..ee9fff09 100644 --- a/chrome/browser/privacy_sandbox/notice/notice_storage_unittest.cc +++ b/chrome/browser/privacy_sandbox/notice/notice_storage_unittest.cc
@@ -83,17 +83,6 @@ return events; } -std::vector<std::unique_ptr<EventTimePair>> BuildEvents( - std::initializer_list<std::pair<Event, int64_t>> raw_events) { - std::vector<std::unique_ptr<EventTimePair>> events; - events.reserve(raw_events.size()); - for (const auto& raw_event : raw_events) { - events.emplace_back(std::make_unique<EventTimePair>( - EventTimePair{raw_event.first, TimeFromMs(raw_event.second)})); - } - return events; -} - class PrivacySandboxNoticeStorageTest : public testing::Test { public: PrivacySandboxNoticeStorageTest() @@ -202,19 +191,18 @@ PrivacySandboxNoticeStorageStartupTest, ValuesIn(kStartupTestValues)); -TEST_F(PrivacySandboxNoticeStorageTest, SetsValuesAndReadsData) { - base::Time t0 = base::Time::Now(); +TEST_F(PrivacySandboxNoticeStorageTest, EventShownHistogramsEmitSuccessfully) { notice_storage()->RecordEvent(kNotice1InCatalog, kShown); - base::Time t1 = AdvanceMs(100); + histogram_tester_.ExpectBucketCount( + "PrivacySandbox.Notice.NoticeShown.Notice1StorageName", true, 1); + histogram_tester_.ExpectBucketCount( + "PrivacySandbox.Notice.NoticeEvent.Notice1StorageName", kShown, 1); +} + +TEST_F(PrivacySandboxNoticeStorageTest, ActionEventHistogramsEmitSuccessfully) { + notice_storage()->RecordEvent(kNotice1InCatalog, kShown); + AdvanceMs(10); notice_storage()->RecordEvent(kNotice1InCatalog, kAck); - - const auto actual = notice_storage()->ReadNoticeData("Notice1StorageName"); - ASSERT_TRUE(actual.has_value()); - - EXPECT_THAT(actual->notice_events, - ElementsAre(Pointee(Eq(EventTimePair{kShown, t0})), - Pointee(Eq(EventTimePair{kAck, t1})))); - histogram_tester_.ExpectBucketCount( "PrivacySandbox.Notice.NoticeEvent.Notice1StorageName", kAck, 1); histogram_tester_.ExpectBucketCount( @@ -223,17 +211,62 @@ histogram_tester_.ExpectTimeBucketCount( "PrivacySandbox.Notice.FirstShownToInteractedDuration." "Notice1StorageName_Ack", - base::Milliseconds(100), 1); + base::Milliseconds(10), 1); histogram_tester_.ExpectTimeBucketCount( "PrivacySandbox.Notice.LastShownToInteractedDuration." "Notice1StorageName_Ack", - base::Milliseconds(100), 1); - histogram_tester_.ExpectBucketCount( - "PrivacySandbox.Notice.NoticeShown.Notice1StorageName", true, 1); - histogram_tester_.ExpectBucketCount( - "PrivacySandbox.Notice.NoticeEvent.Notice1StorageName", kShown, 1); + base::Milliseconds(10), 1); } +MATCHER(EventTimestampEq, "") { + const auto& actual = std::get<0>(arg); + const auto& expected = std::get<1>(arg); + + if (!actual && !expected) { + return true; + } + if (!actual || !expected) { + return false; + } + + return *actual == *expected; +} + +class PrivacySandboxNoticeStorageEventPopulationTest + : public PrivacySandboxNoticeStorageTest, + public testing::WithParamInterface<std::vector<Event>> {}; + +TEST_P(PrivacySandboxNoticeStorageEventPopulationTest, SetsEventsAndReadsData) { + auto events = GetParam(); + std::vector<testing::Matcher<const std::unique_ptr<EventTimePair>&>> expected; + for (auto event : events) { + base::Time timestamp = base::Time::Now(); + notice_storage()->RecordEvent(kNotice1InCatalog, event); + expected.emplace_back(Pointee(Eq(EventTimePair{event, timestamp}))); + AdvanceMs(10); + } + + const auto actual = notice_storage()->ReadNoticeData("Notice1StorageName"); + if (events.empty()) { + EXPECT_FALSE(actual.has_value()); + } else { + ASSERT_TRUE(actual.has_value()); + EXPECT_EQ(actual->notice_events.size(), expected.size()); + EXPECT_THAT(actual->notice_events, ElementsAreArray(expected)); + } +} + +INSTANTIATE_TEST_SUITE_P(PrivacySandboxNoticeStorageEventPopulationTest, + PrivacySandboxNoticeStorageEventPopulationTest, + ValuesIn(std::vector<std::vector<Event>>{ + {}, + {kShown, kAck, kShown}, + {kShown, kShown}, + {kShown, kAck, kShown, kOptIn}, + {kShown, kAck, kSettings, kShown, kOptIn}, + {kShown, kShown, kAck, kSettings, kShown, kShown, + kOptIn}})); + TEST_F(PrivacySandboxNoticeStorageTest, ReActionRegistersAndEmitsHistogram) { base::Time t0, t1, t2; t0 = base::Time::Now(); @@ -288,7 +321,6 @@ auto actual = notice_storage()->ReadNoticeData("Notice1StorageName"); ASSERT_TRUE(actual.has_value()); - EXPECT_EQ(t0, GetNoticeFirstShownFromEvents(*actual)); histogram_tester_.ExpectBucketCount( "PrivacySandbox.Notice.NoticeShownForFirstTime.Notice1StorageName", true, @@ -639,84 +671,5 @@ EXPECT_EQ(*actual_stored_prefs, expected_stored_prefs); } -class PrivacySandboxNoticeDataTest : public testing::Test {}; - -TEST_F(PrivacySandboxNoticeDataTest, NoPrivacySandboxNoticeDataReturnsNothing) { - NoticeStorageData data; - EXPECT_EQ(GetNoticeFirstShownFromEvents(data), std::nullopt); - EXPECT_EQ(GetNoticeActionTakenForFirstShownFromEvents(data), std::nullopt); -} - -TEST_F(PrivacySandboxNoticeDataTest, - NoticeShownEvent_AccessorReturnsFirstShownSuccessfully) { - NoticeStorageData data; - data.notice_events = BuildEvents({ - {kShown, 100}, - {kAck, 150}, - {kShown, 200}, - }); - - EXPECT_EQ(GetNoticeFirstShownFromEvents(data), TimeFromMs(100)); -} - -TEST_F(PrivacySandboxNoticeDataTest, - NoNoticeActionTakenEvent_AccessorReturnsNoValue) { - NoticeStorageData data; - data.notice_events = BuildEvents({ - {kShown, 100}, - {kShown, 200}, - }); - - EXPECT_EQ(GetNoticeActionTakenForFirstShownFromEvents(data), std::nullopt); -} - -TEST_F(PrivacySandboxNoticeDataTest, - NoticeActionTakenEvent_AccessorReturnsActionSuccessfully) { - NoticeStorageData data; - data.notice_events = BuildEvents({ - {kShown, 100}, - {kAck, 120}, - {kShown, 200}, - {kOptIn, 250}, - }); - - EXPECT_EQ(GetNoticeActionTakenForFirstShownFromEvents(data), - (EventTimePair{kAck, TimeFromMs(120)})); -} - -TEST_F( - PrivacySandboxNoticeDataTest, - NoticeActionTakenEvent_AccessorReturnsActionSuccessfullyMultipleActions) { - NoticeStorageData data; - data.notice_events = BuildEvents({ - {kShown, 100}, - {kAck, 120}, - {kSettings, 150}, - {kShown, 200}, - {kOptIn, 250}, - }); - - EXPECT_EQ(GetNoticeActionTakenForFirstShownFromEvents(data), - (EventTimePair{kSettings, TimeFromMs(150)})); -} - -TEST_F( - PrivacySandboxNoticeDataTest, - NoticeActionTakenEvent_AccessorReturnsActionSuccessfullyWithMultipleShownValues) { - NoticeStorageData data; - data.notice_events = BuildEvents({ - {kShown, 100}, - {kShown, 110}, - {kAck, 120}, - {kSettings, 150}, - {kShown, 200}, - {kShown, 220}, - {kOptIn, 250}, - }); - - EXPECT_EQ(GetNoticeActionTakenForFirstShownFromEvents(data), - (EventTimePair{kSettings, TimeFromMs(150)})); -} - } // namespace } // namespace privacy_sandbox
diff --git a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/ReadAloudController.java b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/ReadAloudController.java index 969e483..fd805f2 100644 --- a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/ReadAloudController.java +++ b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/ReadAloudController.java
@@ -159,7 +159,7 @@ // Information tied to a playback. When playback is reset it should be set to null together // with mActivePlaybackTabSupplier's value and mGlobalRenderFrameId @Nullable private Playback mPlayback; - private ObservableSupplierImpl<@Nullable Tab> mActivePlaybackTabSupplier; + private final ObservableSupplierImpl<@Nullable Tab> mActivePlaybackTabSupplier; @Nullable private GURL mCurrentlyPlayingGurl; @Nullable private GlobalRenderFrameHostId mGlobalRenderFrameId; // Current tab playback data, or null if there is no playback. @@ -1521,7 +1521,8 @@ @Override public void setPlaybackModeAndApplyToPlayback(PlaybackMode mode) { - TrackerFactory.getTrackerForProfile(getProfile()).notifyEvent("read_aloud_playback_mode_clicked"); + TrackerFactory.getTrackerForProfile(getProfile()) + .notifyEvent("read_aloud_playback_mode_clicked"); ReadAloudPrefs.setPlaybackMode(getPrefService(), mode); if (mActivePlaybackTabSupplier.get() != null && mPlayback != null) {
diff --git a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/ReadAloudControllerUnitTest.java b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/ReadAloudControllerUnitTest.java index 99ec12f..7b99876 100644 --- a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/ReadAloudControllerUnitTest.java +++ b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/ReadAloudControllerUnitTest.java
@@ -65,7 +65,6 @@ import org.chromium.chrome.browser.browser_controls.BottomControlsStacker; import org.chromium.chrome.browser.device.DeviceConditions; import org.chromium.chrome.browser.device.ShadowDeviceConditions; -import org.chromium.components.feature_engagement.Tracker; import org.chromium.chrome.browser.feature_engagement.TrackerFactory; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.fullscreen.FullscreenManager; @@ -106,6 +105,7 @@ import org.chromium.chrome.modules.readaloud.contentjs.Highlighter; import org.chromium.chrome.test.util.browser.tabmodel.MockTabModelSelector; import org.chromium.components.browser_ui.bottomsheet.BottomSheetController; +import org.chromium.components.feature_engagement.Tracker; import org.chromium.components.prefs.PrefService; import org.chromium.components.search_engines.TemplateUrl; import org.chromium.components.search_engines.TemplateUrlService; @@ -193,7 +193,8 @@ @Mock private LayoutStateProvider mLayoutStateProvider; @Mock private FullscreenManager mFullscreenManager; @Mock private Tracker mTracker; - private GlobalRenderFrameHostId mGlobalRenderFrameHostId = new GlobalRenderFrameHostId(1, 1); + private final GlobalRenderFrameHostId mGlobalRenderFrameHostId = + new GlobalRenderFrameHostId(1, 1); public UserActionTester mUserActionTester; private HistogramWatcher mHighlightingEnabledOnStartupHistogram; private Promise<Long> mExtractorPromise;
diff --git a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/ReadAloudMetrics.java b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/ReadAloudMetrics.java index 66b034a..3592788 100644 --- a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/ReadAloudMetrics.java +++ b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/ReadAloudMetrics.java
@@ -99,7 +99,7 @@ int COUNT = 7; } - private static float[] sPlaybackSpeeds = {0.5f, 0.8f, 1.0f, 1.2f, 1.5f, 2.0f, 3.0f, 4.0f}; + private static final float[] sPlaybackSpeeds = {0.5f, 0.8f, 1.0f, 1.2f, 1.5f, 2.0f, 3.0f, 4.0f}; /** * Reasons for stopping a playback defined in readaloud/enums.xml.
diff --git a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/TapToSeekHandler.java b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/TapToSeekHandler.java index aa522d0..e9c7789 100644 --- a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/TapToSeekHandler.java +++ b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/TapToSeekHandler.java
@@ -101,7 +101,7 @@ } } - private static Comparator<PlaybackTextPart> sComparator = + private static final Comparator<PlaybackTextPart> sComparator = new Comparator<>() { @Override public int compare(PlaybackTextPart a, PlaybackTextPart b) {
diff --git a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/exceptions/ReadAloudNetworkException.java b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/exceptions/ReadAloudNetworkException.java index 2197fe5..85d94db1 100644 --- a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/exceptions/ReadAloudNetworkException.java +++ b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/exceptions/ReadAloudNetworkException.java
@@ -11,7 +11,7 @@ @NullMarked public class ReadAloudNetworkException extends ReadAloudException { - private int mChromeErrorCode; + private final int mChromeErrorCode; public ReadAloudNetworkException(int chromeErrorCode, @ReadAloudErrorCode int canonicalCode) { super("Chrome network error code: " + chromeErrorCode, null, canonicalCode);
diff --git a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/expanded/ExpandedPlayerCoordinator.java b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/expanded/ExpandedPlayerCoordinator.java index c9a4617..3df22a8 100644 --- a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/expanded/ExpandedPlayerCoordinator.java +++ b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/expanded/ExpandedPlayerCoordinator.java
@@ -96,9 +96,9 @@ || content instanceof NegativeFeedbackMenuSheetContent)); } }; - private PropertyModel mModel; + private final PropertyModel mModel; private ExpandedPlayerSheetContent mSheetContent; - private ExpandedPlayerMediator mMediator; + private final ExpandedPlayerMediator mMediator; public ExpandedPlayerCoordinator(Context context, Delegate delegate, PropertyModel model) { this(
diff --git a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/expanded/ExpandedPlayerSheetContent.java b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/expanded/ExpandedPlayerSheetContent.java index edb38d2..4ac33b4 100644 --- a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/expanded/ExpandedPlayerSheetContent.java +++ b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/expanded/ExpandedPlayerSheetContent.java
@@ -51,14 +51,14 @@ private final SeekBar mSeekBar; private final ScrollView mScrollView; private final LinearLayout mPlayerControls; - private ImageView mModeSelectorButton; + private final ImageView mModeSelectorButton; private boolean mIsModeActive; - private View mContentView; + private final View mContentView; // Effectively final and non null, can be null only in tests private OptionsMenuSheetContent mOptionsMenu; - private NegativeFeedbackMenuSheetContent mNegativeFeedbackMenu; + private final NegativeFeedbackMenuSheetContent mNegativeFeedbackMenu; private SpeedMenuSheetContent mSpeedMenu; - private TextView mSpeedButton; + private final TextView mSpeedButton; private final TextView mLoadingTextView;
diff --git a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/expanded/MenuUnitTest.java b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/expanded/MenuUnitTest.java index 1ce7ce4..eaf33073 100644 --- a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/expanded/MenuUnitTest.java +++ b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/expanded/MenuUnitTest.java
@@ -47,7 +47,7 @@ public class MenuUnitTest { @Rule public final MockitoRule mMockitoRule = MockitoJUnit.rule(); private final Activity mActivity; - private Menu mMenu; + private final Menu mMenu; @Mock Callback<Integer> mHandler; @Mock Callback<Boolean> mToggleHandler;
diff --git a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/expanded/SpeedMenuSheetContent.java b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/expanded/SpeedMenuSheetContent.java index 13c9bba..07398e9f 100644 --- a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/expanded/SpeedMenuSheetContent.java +++ b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/player/expanded/SpeedMenuSheetContent.java
@@ -20,7 +20,7 @@ private static final String TAG = "ReadAloudSpeed"; private final Context mContext; private final PropertyModel mModel; - private float[] mSpeeds = {0.5f, 0.8f, 1.0f, 1.2f, 1.5f, 2.0f, 3.0f, 4.0f}; + private final float[] mSpeeds = {0.5f, 0.8f, 1.0f, 1.2f, 1.5f, 2.0f, 3.0f, 4.0f}; SpeedMenuSheetContent( Context context,
diff --git a/chrome/browser/recent_tabs/internal/android/java/src/org/chromium/chrome/browser/recent_tabs/RestoreTabsCoordinator.java b/chrome/browser/recent_tabs/internal/android/java/src/org/chromium/chrome/browser/recent_tabs/RestoreTabsCoordinator.java index 39ab444..d86ffc77 100644 --- a/chrome/browser/recent_tabs/internal/android/java/src/org/chromium/chrome/browser/recent_tabs/RestoreTabsCoordinator.java +++ b/chrome/browser/recent_tabs/internal/android/java/src/org/chromium/chrome/browser/recent_tabs/RestoreTabsCoordinator.java
@@ -25,9 +25,9 @@ @NullMarked public class RestoreTabsCoordinator { private RestoreTabsMediator mMediator; - private PropertyModel mModel = RestoreTabsProperties.createDefaultModel(); - private RestoreTabsPromoSheetContent mContent; - private ViewFlipper mViewFlipperView; + private final PropertyModel mModel = RestoreTabsProperties.createDefaultModel(); + private final RestoreTabsPromoSheetContent mContent; + private final ViewFlipper mViewFlipperView; private RestoreTabsDetailScreenCoordinator mRestoreTabsDetailScreenCoordinator; public RestoreTabsCoordinator(
diff --git a/chrome/browser/recent_tabs/internal/android/java/src/org/chromium/chrome/browser/recent_tabs/RestoreTabsMediatorUnitTest.java b/chrome/browser/recent_tabs/internal/android/java/src/org/chromium/chrome/browser/recent_tabs/RestoreTabsMediatorUnitTest.java index 630d8fe2..01afbd2 100644 --- a/chrome/browser/recent_tabs/internal/android/java/src/org/chromium/chrome/browser/recent_tabs/RestoreTabsMediatorUnitTest.java +++ b/chrome/browser/recent_tabs/internal/android/java/src/org/chromium/chrome/browser/recent_tabs/RestoreTabsMediatorUnitTest.java
@@ -77,7 +77,7 @@ @Mock private BottomSheetContent mBottomSheetContent; private PropertyModel mModel = RestoreTabsProperties.createDefaultModel(); - private RestoreTabsMediator mMediator = new RestoreTabsMediator(); + private final RestoreTabsMediator mMediator = new RestoreTabsMediator(); @Before public void setUp() {
diff --git a/chrome/browser/recent_tabs/internal/android/java/src/org/chromium/chrome/browser/recent_tabs/RestoreTabsPromoSheetContentUnitTest.java b/chrome/browser/recent_tabs/internal/android/java/src/org/chromium/chrome/browser/recent_tabs/RestoreTabsPromoSheetContentUnitTest.java index e24df25..a6881e44 100644 --- a/chrome/browser/recent_tabs/internal/android/java/src/org/chromium/chrome/browser/recent_tabs/RestoreTabsPromoSheetContentUnitTest.java +++ b/chrome/browser/recent_tabs/internal/android/java/src/org/chromium/chrome/browser/recent_tabs/RestoreTabsPromoSheetContentUnitTest.java
@@ -44,7 +44,7 @@ @Mock private ScrollView mScrollView; private RestoreTabsPromoSheetContent mSheetContent; - private PropertyModel mModel = RestoreTabsProperties.createDefaultModel(); + private final PropertyModel mModel = RestoreTabsProperties.createDefaultModel(); @Before public void setUp() {
diff --git a/chrome/browser/resources/history/BUILD.gn b/chrome/browser/resources/history/BUILD.gn index 3b3b5c6..2c8a241 100644 --- a/chrome/browser/resources/history/BUILD.gn +++ b/chrome/browser/resources/history/BUILD.gn
@@ -48,6 +48,7 @@ css_files = [ "history_embeddings_promo.css", "history_item.css", + "history_toolbar.css", "shared_style.css", "shared_style_lit.css", "shared_vars.css",
diff --git a/chrome/browser/resources/history/history_toolbar.css b/chrome/browser/resources/history/history_toolbar.css new file mode 100644 index 0000000..bf51f44 --- /dev/null +++ b/chrome/browser/resources/history/history_toolbar.css
@@ -0,0 +1,39 @@ +/* Copyright 2025 The Chromium Authors + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. */ + +/* #css_wrapper_metadata_start + * #type=style-lit + * #import=./shared_style_lit.css.js + * #import=./shared_vars.css.js + * #include=shared-style-lit + * #css_wrapper_metadata_end */ + +:host { + display: flex; + position: relative; +} + +/* General toolbar layout. */ + +cr-toolbar { + --cr-toolbar-center-basis: var(--cluster-max-width); + --cr-toolbar-left-spacer-width: var(--side-bar-width); + --cr-toolbar-field-margin: var(--side-bar-width); + flex: 1; +} + +:host([has-drawer]) cr-toolbar, +:host([has-drawer]) cr-toolbar-selection-overlay { + --cr-toolbar-field-margin: 0; +} + +cr-toolbar-selection-overlay { + opacity: 0; + --cr-toolbar-selection-overlay-max-width: var(--card-max-width); + --cr-toolbar-field-margin: var(--side-bar-width); +} + +cr-toolbar-selection-overlay[show] { + opacity: 1; +}
diff --git a/chrome/browser/resources/history/history_toolbar.html b/chrome/browser/resources/history/history_toolbar.html index 97de923..7d1b84f 100644 --- a/chrome/browser/resources/history/history_toolbar.html +++ b/chrome/browser/resources/history/history_toolbar.html
@@ -1,54 +1,24 @@ - <style include="shared-style"> - :host { - display: flex; - position: relative; - } - - /* General toolbar layout. */ - - cr-toolbar { - --cr-toolbar-center-basis: var(--cluster-max-width); - --cr-toolbar-left-spacer-width: var(--side-bar-width); - --cr-toolbar-field-margin: var(--side-bar-width); - flex: 1; - } - - :host([has-drawer]) cr-toolbar, - :host([has-drawer]) cr-toolbar-selection-overlay { - --cr-toolbar-field-margin: 0; - } - - cr-toolbar-selection-overlay { - opacity: 0; - --cr-toolbar-selection-overlay-max-width: var(--card-max-width); - --cr-toolbar-field-margin: var(--side-bar-width); - } - - cr-toolbar-selection-overlay[show] { - opacity: 1; - } - </style> - <cr-toolbar id="mainToolbar" - disable-right-content-grow - has-overlay$="[[itemsSelected_]]" - page-name="$i18n{title}" - clear-label="$i18n{clearSearch}" - search-icon-override="[[searchIconOverride_]]" - search-input-aria-description="[[searchInputAriaDescription_]]" - search-prompt="[[searchPrompt_]]" - spinner-active="[[spinnerActive]]" - autofocus - show-menu="[[hasDrawer]]" - menu-label="$i18n{historyMenuButton}" - narrow-threshold="1023" - on-search-changed="onSearchChanged_"> - </cr-toolbar> - <cr-toolbar-selection-overlay show="[[itemsSelected_]]" - cancel-label="$i18n{cancel}" - selection-label="[[numberOfItemsSelected_(count)]]" - on-clear-selected-items="clearSelectedItems"> - <cr-button - on-click="deleteSelectedItems" disabled$="[[pendingDelete]]"> - $i18n{delete} - </cr-button> - </cr-toolbar-selection-overlay> +<cr-toolbar id="mainToolbar" + disable-right-content-grow + ?has-overlay="${this.itemsSelected_}" + page-name="$i18n{title}" + clear-label="$i18n{clearSearch}" + search-icon-override="${this.computeSearchIconOverride_()}" + search-input-aria-description="${this.computeSearchInputAriaDescriptionOverride_()}" + search-prompt="${this.computeSearchPrompt_()}" + ?spinner-active="${this.spinnerActive}" + autofocus + ?show-menu="${this.hasDrawer}" + menu-label="$i18n{historyMenuButton}" + narrow-threshold="1023" + @search-changed="${this.onSearchChanged_}"> +</cr-toolbar> +<cr-toolbar-selection-overlay ?show="${this.itemsSelected_}" + cancel-label="$i18n{cancel}" + selection-label="${this.numberOfItemsSelected_(this.count)}" + @clear-selected-items="${this.clearSelectedItems}"> + <cr-button + @click="${this.deleteSelectedItems}" ?disabled="${this.pendingDelete}"> + $i18n{delete} + </cr-button> +</cr-toolbar-selection-overlay>
diff --git a/chrome/browser/resources/history/history_toolbar.ts b/chrome/browser/resources/history/history_toolbar.ts index b9f11be..8e74e53 100644 --- a/chrome/browser/resources/history/history_toolbar.ts +++ b/chrome/browser/resources/history/history_toolbar.ts
@@ -2,7 +2,7 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -import './shared_style.css.js'; +import './shared_style_lit.css.js'; import '/strings.m.js'; import 'chrome://resources/cr_components/history_embeddings/icons.html.js'; import 'chrome://resources/cr_elements/cr_toolbar/cr_toolbar.js'; @@ -13,9 +13,11 @@ import type {CrToolbarElement} from 'chrome://resources/cr_elements/cr_toolbar/cr_toolbar.js'; import type {CrToolbarSearchFieldElement} from 'chrome://resources/cr_elements/cr_toolbar/cr_toolbar_search_field.js'; import {loadTimeData} from 'chrome://resources/js/load_time_data.js'; -import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {CrLitElement} from 'chrome://resources/lit/v3_0/lit.rollup.js'; +import type {PropertyValues} from 'chrome://resources/lit/v3_0/lit.rollup.js'; -import {getTemplate} from './history_toolbar.html.js'; +import {getCss} from './history_toolbar.css.js'; +import {getHtml} from './history_toolbar.html.js'; import {TABBED_PAGES} from './router.js'; export interface HistoryToolbarElement { @@ -24,102 +26,86 @@ }; } -export class HistoryToolbarElement extends PolymerElement { +export class HistoryToolbarElement extends CrLitElement { static get is() { return 'history-toolbar'; } - static get template() { - return getTemplate(); + static override get styles() { + return getCss(); } - static get properties() { + override render() { + return getHtml.bind(this)(); + } + + static override get properties() { return { // Number of history items currently selected. // TODO(calamity): bind this to // listContainer.selectedItem.selectedPaths.length. - count: { - type: Number, - observer: 'changeToolbarView_', - value: 0, - }, + count: {type: Number}, // True if 1 or more history items are selected. When this value changes // the background colour changes. - itemsSelected_: { - type: Boolean, - value: false, - }, + itemsSelected_: {type: Boolean}, - pendingDelete: Boolean, - - searchIconOverride_: { - type: String, - computed: 'computeSearchIconOverride_(selectedPage)', - }, - - searchInputAriaDescription_: { - type: String, - computed: 'computeSearchInputAriaDescriptionOverride_(selectedPage)', - }, - - searchPrompt_: { - type: String, - computed: 'computeSearchPrompt_(selectedPage)', - }, + pendingDelete: {type: Boolean}, // The most recent term entered in the search field. Updated incrementally // as the user types. - searchTerm: { - type: String, - observer: 'searchTermChanged_', - }, + searchTerm: {type: String}, - selectedPage: String, + selectedPage: {type: String}, // True if the backend is processing and a spinner should be shown in the // toolbar. - spinnerActive: { - type: Boolean, - value: false, - }, + spinnerActive: {type: Boolean}, hasDrawer: { type: Boolean, - reflectToAttribute: true, + reflect: true, }, - hasMoreResults: Boolean, + hasMoreResults: {type: Boolean}, - querying: Boolean, + querying: {type: Boolean}, - queryInfo: Object, + queryInfo: {type: Object}, // Whether to show the menu promo (a tooltip that points at the menu // button // in narrow mode). - showMenuPromo: Boolean, + showMenuPromo: {type: Boolean}, }; } - declare count: number; - declare pendingDelete: boolean; - declare private searchIconOverride_?: string; - declare private searchInputAriaDescription_?: string; - declare private searchPrompt_: string; - declare searchTerm: string; - declare selectedPage: string; - declare hasDrawer: boolean; - declare hasMoreResults: boolean; - declare querying: boolean; - declare queryInfo?: HistoryQuery; - declare spinnerActive: boolean; - declare showMenuPromo: boolean; - declare private itemsSelected_: boolean; + accessor count: number = 0; + accessor pendingDelete: boolean = false; + accessor searchTerm: string = ''; + accessor selectedPage: string = ''; + accessor hasDrawer: boolean = false; + accessor hasMoreResults: boolean = false; + accessor querying: boolean = false; + accessor queryInfo: HistoryQuery|undefined; + accessor spinnerActive: boolean = false; + accessor showMenuPromo: boolean = false; + protected accessor itemsSelected_: boolean = false; - private fire_(eventName: string, detail?: any) { - this.dispatchEvent( - new CustomEvent(eventName, {bubbles: true, composed: true, detail})); + override willUpdate(changedProperties: PropertyValues<this>) { + super.willUpdate(changedProperties); + if (changedProperties.has('count')) { + this.changeToolbarView_(); + } + } + + override updated(changedProperties: PropertyValues<this>) { + super.updated(changedProperties); + + // Querying and modifying the DOM should happen in updated(). + if (changedProperties.has('searchTerm')) { + this.searchTermChanged_(); + } } get searchField(): CrToolbarSearchFieldElement { @@ -127,11 +113,11 @@ } deleteSelectedItems() { - this.fire_('delete-selected'); + this.fire('delete-selected'); } clearSelectedItems() { - this.fire_('unselect-all'); + this.fire('unselect-all'); getAnnouncerInstance().announce(loadTimeData.getString('itemsUnselected')); } @@ -158,17 +144,17 @@ return this.showMenuPromo && !loadTimeData.getBoolean('isGuestSession'); } - private onSearchChanged_(event: CustomEvent<string>) { - this.fire_( + protected onSearchChanged_(event: CustomEvent<string>) { + this.fire( 'change-query', {search: event.detail, /* Prevent updating after date. */ after: null}); } - private numberOfItemsSelected_(count: number): string { + protected numberOfItemsSelected_(count: number): string { return count > 0 ? loadTimeData.getStringF('itemsSelected', count) : ''; } - private computeSearchIconOverride_(): string|undefined { + protected computeSearchIconOverride_(): string|undefined { if (loadTimeData.getBoolean('enableHistoryEmbeddings') && TABBED_PAGES.includes(this.selectedPage)) { return 'history-embeddings:search'; @@ -177,7 +163,7 @@ return undefined; } - private computeSearchInputAriaDescriptionOverride_(): string|undefined { + protected computeSearchInputAriaDescriptionOverride_(): string|undefined { if (loadTimeData.getBoolean('enableHistoryEmbeddings') && TABBED_PAGES.includes(this.selectedPage)) { return loadTimeData.getString('historyEmbeddingsDisclaimer'); @@ -186,7 +172,7 @@ return undefined; } - private computeSearchPrompt_(): string { + protected computeSearchPrompt_(): string { if (loadTimeData.getBoolean('enableHistoryEmbeddings') && TABBED_PAGES.includes(this.selectedPage)) { if (loadTimeData.getBoolean('enableHistoryEmbeddingsAnswers')) {
diff --git a/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.ts b/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.ts index 3e522c48..f16f4ca8 100644 --- a/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.ts +++ b/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog.ts
@@ -283,7 +283,8 @@ this.addWebUiListener( 'update-sync-state', this.updateSyncState_.bind(this)); this.addWebUiListener( - 'update-counter-text', this.updateCounterText_.bind(this)); + 'browsing-data-counter-text-update', + this.updateCounterText_.bind(this)); this.addEventListener( 'settings-boolean-control-change', this.updateClearButtonState_);
diff --git a/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog_v2.html b/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog_v2.html index 8811e6fe..88a4260e 100644 --- a/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog_v2.html +++ b/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog_v2.html
@@ -60,20 +60,21 @@ show-on-attach ignore-popstate ignore-enter-key> <div slot="title">$i18n{clearBrowsingData}</div> <div slot="body"> - <!-- TODO(crbug.com/397187800): Update counters on selected time period.--> <settings-clear-browsing-data-time-picker id="timePicker" prefs="{{prefs}}" on-selected-time-period-change="onTimePeriodChanged_"> </settings-clear-browsing-data-time-picker> <div id="checkboxContainer"> <template is="dom-repeat" items="[[expandedBrowsingDataTypeOptionsList_]]"> - <settings-checkbox pref="[[item.pref]]" no-set-pref> + <settings-checkbox pref="[[item.pref]]" no-set-pref + sub-label="[[item.subLabel]]"> <div class="checkbox-title">[[item.label]]</div> </settings-checkbox> </template> <template is="dom-if" if="[[dataTypesExpanded_]]"> <template is="dom-repeat" items="[[moreBrowsingDataTypeOptionsList_]]"> - <settings-checkbox pref="[[item.pref]]" no-set-pref> + <settings-checkbox pref="[[item.pref]]" no-set-pref + sub-label="[[item.subLabel]]"> <div class="checkbox-title">[[item.label]]</div> </settings-checkbox> </template>
diff --git a/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog_v2.ts b/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog_v2.ts index 5b0a5cb..85bc9fe 100644 --- a/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog_v2.ts +++ b/chrome/browser/resources/settings/clear_browsing_data_dialog/clear_browsing_data_dialog_v2.ts
@@ -18,11 +18,14 @@ import {PrefsMixin} from '/shared/settings/prefs/prefs_mixin.js'; import type {CrButtonElement} from 'chrome://resources/cr_elements/cr_button/cr_button.js'; import type {CrDialogElement} from 'chrome://resources/cr_elements/cr_dialog/cr_dialog.js'; +import {WebUiListenerMixin} from 'chrome://resources/cr_elements/web_ui_listener_mixin.js'; +import {assert} from 'chrome://resources/js/assert.js'; import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {loadTimeData} from '../i18n_setup.js'; -import {BrowsingDataType} from './clear_browsing_data_browser_proxy.js'; +import type {ClearBrowsingDataBrowserProxy} from './clear_browsing_data_browser_proxy.js'; +import {BrowsingDataType, ClearBrowsingDataBrowserProxyImpl} from './clear_browsing_data_browser_proxy.js'; import {getTemplate} from './clear_browsing_data_dialog_v2.html.js'; import type {SettingsClearBrowsingDataTimePicker} from './clear_browsing_data_time_picker.js'; @@ -60,6 +63,7 @@ interface BrowsingDataTypeOption { label: string; + subLabel?: string; pref: chrome.settingsPrivate.PrefObject; } @@ -101,7 +105,8 @@ } } -const SettingsClearBrowsingDataDialogV2ElementBase = PrefsMixin(PolymerElement); +const SettingsClearBrowsingDataDialogV2ElementBase = + WebUiListenerMixin(PrefsMixin(PolymerElement)); export class SettingsClearBrowsingDataDialogV2Element extends SettingsClearBrowsingDataDialogV2ElementBase { @@ -131,12 +136,25 @@ BrowsingDataTypeOption[]; declare private moreBrowsingDataTypeOptionsList_: BrowsingDataTypeOption[]; + private clearBrowsingDataBrowserProxy_: ClearBrowsingDataBrowserProxy = + ClearBrowsingDataBrowserProxyImpl.getInstance(); + override ready() { super.ready(); + this.addWebUiListener( + 'browsing-data-counter-text-update', + this.updateCounterText_.bind(this)); + this.setUpDataTypeOptionLists_(); } + override connectedCallback() { + super.connectedCallback(); + + this.clearBrowsingDataBrowserProxy_.initialize(); + } + private setUpDataTypeOptionLists_() { const expandedOptionsList: BrowsingDataTypeOption[] = []; const moreOptionsList: BrowsingDataTypeOption[] = []; @@ -158,13 +176,43 @@ this.moreBrowsingDataTypeOptionsList_ = moreOptionsList; } + /** + * Updates the text of a browsing data counter corresponding to the given + * preference. + * @param prefName Browsing data type deletion preference. + * @param text The text with which to update the counter. + */ + private updateCounterText_(prefName: string, text: string) { + // If the corresponding datatype is in the expanded options list, update the + // sub-label. + const expandedListIndex = + this.expandedBrowsingDataTypeOptionsList_.map(option => option.pref.key) + .indexOf(prefName); + if (expandedListIndex !== -1) { + this.set( + `expandedBrowsingDataTypeOptionsList_.${expandedListIndex}.subLabel`, + text); + return; + } + + // If the datatype is not found in the expanded options list, it should be + // in the more options list. + const moreListIndex = + this.moreBrowsingDataTypeOptionsList_.map(option => option.pref.key) + .indexOf(prefName); + assert(moreListIndex !== -1); + this.set( + `moreBrowsingDataTypeOptionsList_.${moreListIndex}.subLabel`, text); + } + private shouldDataTypeBeExpanded_(datatype: BrowsingDataType) { return DEFAULT_BROWSING_DATATYPES_LIST.includes(datatype) || this.getPref(getDataTypePrefName(datatype)).value; } private onTimePeriodChanged_() { - // TODO(crbug.com/397187800): Restart counters. + this.clearBrowsingDataBrowserProxy_.restartCounters( + /*isBasic=*/ false, this.$.timePicker.getSelectedTimePeriod()); } private onCancelClick_() {
diff --git a/chrome/browser/resources/side_panel/read_anything/app.ts b/chrome/browser/resources/side_panel/read_anything/app.ts index ef181b2..a89c1f24 100644 --- a/chrome/browser/resources/side_panel/read_anything/app.ts +++ b/chrome/browser/resources/side_panel/read_anything/app.ts
@@ -19,13 +19,13 @@ import {getHtml} from './app.html.js'; import {AppStyleUpdater} from './app_style_updater.js'; import type {SettingsPrefs} from './common.js'; -import {minOverflowLengthToScroll, playFromSelectionTimeout} from './common.js'; +import {minOverflowLengthToScroll} from './common.js'; import type {LanguageToastElement} from './language_toast.js'; import {NodeStore} from './node_store.js'; import {ReadAloudHighlighter} from './read_aloud/highlighter.js'; import {SpeechController} from './read_aloud/speech_controller.js'; import type {SpeechListener} from './read_aloud/speech_controller.js'; -import {PauseActionSource, SpeechEngineState} from './read_aloud/speech_model.js'; +import {PauseActionSource} from './read_aloud/speech_model.js'; import {VoicePackController} from './read_aloud/voice_pack_controller.js'; import type {VoiceLanguageListener} from './read_aloud/voice_pack_controller.js'; import {WordBoundaries} from './read_aloud/word_boundaries.js'; @@ -33,8 +33,6 @@ import type {ReadAnythingToolbarElement} from './read_anything_toolbar.js'; import type {SpeechBrowserProxy} from './speech_browser_proxy.js'; import {SpeechBrowserProxyImpl} from './speech_browser_proxy.js'; -import {doesLanguageHaveNaturalVoices, getVoicePackConvertedLangIfExists, isNatural, isVoicePackStatusError, isVoicePackStatusSuccess, mojoVoicePackStatusToVoicePackStatusEnum, VoiceClientSideStatusCode, VoicePackServerStatusErrorCode, VoicePackServerStatusSuccessCode} from './voice_language_util.js'; -import type {VoicePackStatus} from './voice_language_util.js'; import {VoiceNotificationManager} from './voice_notification_manager.js'; const AppElementBase = WebUiListenerMixinLit(CrLitElement); @@ -162,8 +160,6 @@ this.logger_.logTimeFrom( TimeFrom.APP, this.startTime, this.constructorTime); this.isReadAloudEnabled_ = chrome.readingMode.isReadAloudEnabled; - this.voicePackController_.setCurrentLanguage( - chrome.readingMode.baseLanguageForSpeech); this.styleUpdater_ = new AppStyleUpdater(this); this.nodeStore_.clear(); ColorChangeUpdater.forDocument().start(); @@ -303,7 +299,7 @@ chrome.readingMode.updateVoicePackStatus = (lang: string, status: string) => { - this.updateVoicePackStatus(lang, status); + this.voicePackController_.updateVoicePackStatus(lang, status); }; chrome.readingMode.showLoading = () => { @@ -323,7 +319,7 @@ }; chrome.readingMode.onLockScreen = () => { - this.onLockScreen(); + this.speechController_.onLockScreen(); }; chrome.readingMode.onTtsEngineInstalled = () => { @@ -760,101 +756,6 @@ chrome.readingMode.onScrolledToBottom(); } - updateVoicePackStatus(lang: string, status: string) { - this.voicePackController_.stopWaitingForSpeechExtension(); - - if (!lang) { - return; - } - - const newVoicePackStatus = mojoVoicePackStatusToVoicePackStatusEnum(status); - - // Keep the server responses - this.voicePackController_.setServerStatus(lang, newVoicePackStatus); - - // Update application state - this.updateApplicationState(lang, newVoicePackStatus); - - if (isVoicePackStatusError(newVoicePackStatus)) { - this.voicePackController_.disableLangIfNoVoices(lang); - } - } - - // Store client side voice pack state and trigger side effects - private updateApplicationState( - lang: string, newVoicePackStatus: VoicePackStatus) { - if (isVoicePackStatusSuccess(newVoicePackStatus)) { - const newStatusCode = newVoicePackStatus.code; - - switch (newStatusCode) { - case VoicePackServerStatusSuccessCode.NOT_INSTALLED: - this.voicePackController_.triggerInstall(lang); - break; - case VoicePackServerStatusSuccessCode.INSTALLING: - // Do nothing- we mark our local state as installing when we send the - // request. Locally, we may time out a slow request and mark it as - // errored, and we don't want to overwrite that state here. - break; - case VoicePackServerStatusSuccessCode.INSTALLED: - // Force a refresh of the voices list since we might not get an update - // the voices have changed. - this.voicePackController_.refreshAvailableVoices( - /*forceRefresh=*/ true); - this.voicePackController_.autoSwitchVoice(lang); - - // Some languages may require a download from the voice pack - // but may not have associated natural voices. - const languageHasNaturalVoices = doesLanguageHaveNaturalVoices(lang); - - // Even though the voice may be installed on disk, it still may not be - // available to the speechSynthesis API. Check whether to mark the - // voice as AVAILABLE or INSTALLED_AND_UNAVAILABLE - const voicesForLanguageAreAvailable = - this.voicePackController_.getAvailableVoices().some( - voice => - ((isNatural(voice) || !languageHasNaturalVoices) && - getVoicePackConvertedLangIfExists(voice.lang) === lang)); - - // If natural voices are currently available for the language or the - // language does not support natural voices, set the status to - // available. Otherwise, set the status to install and unavailabled. - this.voicePackController_.setLocalStatus( - lang, - voicesForLanguageAreAvailable ? - VoiceClientSideStatusCode.AVAILABLE : - VoiceClientSideStatusCode.INSTALLED_AND_UNAVAILABLE); - break; - default: - // This ensures the switch statement is exhaustive - return newStatusCode satisfies never; - } - } else if (isVoicePackStatusError(newVoicePackStatus)) { - this.voicePackController_.autoSwitchVoice(lang); - const newStatusCode = newVoicePackStatus.code; - - switch (newStatusCode) { - case VoicePackServerStatusErrorCode.OTHER: - case VoicePackServerStatusErrorCode.WRONG_ID: - case VoicePackServerStatusErrorCode.NEED_REBOOT: - case VoicePackServerStatusErrorCode.UNSUPPORTED_PLATFORM: - this.voicePackController_.setLocalStatus( - lang, VoiceClientSideStatusCode.ERROR_INSTALLING); - break; - case VoicePackServerStatusErrorCode.ALLOCATION: - this.voicePackController_.setLocalStatus( - lang, VoiceClientSideStatusCode.INSTALL_ERROR_ALLOCATION); - break; - default: - // This ensures the switch statement is exhaustive - return newStatusCode satisfies never; - } - } else { - // Couldn't parse the response - this.voicePackController_.setLocalStatus( - lang, VoiceClientSideStatusCode.ERROR_INSTALLING); - } - } - protected onLanguageMenuOpen_() { this.notificationManager_.removeListener(this.$.languageToast); } @@ -910,6 +811,10 @@ this.previewVoicePlaying_ = this.speechController_.getPreviewVoicePlaying(); } + onSpeechRateChange(): void { + this.resetSpeechPostSettingChange_(); + } + onStop() { if (!chrome.readingMode.linksEnabled) { return; @@ -940,35 +845,11 @@ } protected playNextGranularity_() { - this.speechController_.setIsSpeechBeingRepositioned(true); - - this.speech_.cancel(); - this.highlighter_.resetPreviousHighlight(); - // Reset the word boundary index whenever we move the granularity position. - this.wordBoundaries_.resetToDefaultState(); - chrome.readingMode.movePositionToNextGranularity(); - - if (!this.highlightAndPlayMessage()) { - this.speechController_.onSpeechFinished(); - } + this.speechController_.playNextGranularity(); } protected playPreviousGranularity_() { - this.speechController_.setIsSpeechBeingRepositioned(true); - this.speech_.cancel(); - // This must be called BEFORE calling - // chrome.readingMode.movePositionToPreviousGranularity so we can accurately - // determine what's currently being highlighted. - this.highlighter_.removeCurrentHighlight(); - this.highlighter_.resetPreviousHighlight(); - // Reset the word boundary index whenever we move the granularity position. - this.wordBoundaries_.resetToDefaultState(); - chrome.readingMode.movePositionToPreviousGranularity(); - - if (!this.highlightAndPlayMessage(/*isInterrupted=*/ false, - /*isMovingBackward=*/ true)) { - this.speechController_.onSpeechFinished(); - } + this.speechController_.playPreviousGranularity(); } playSpeech() { @@ -996,7 +877,7 @@ this.speech_.resume(); } else { this.speech_.cancel(); - if (!this.highlightAndPlayInterruptedMessage()) { + if (!this.speechController_.highlightAndPlayInterruptedMessage()) { // Ensure we're updating Read Aloud state if there's no text to // speak. this.speechController_.onSpeechFinished(); @@ -1044,7 +925,7 @@ if (!playedFromSelection && this.firstTextNodeSetForReadAloud) { this.speechController_.initializeSpeechTree( this.firstTextNodeSetForReadAloud); - if (!this.highlightAndPlayMessage()) { + if (!this.speechController_.highlightAndPlayMessage()) { // Ensure we're updating Read Aloud state if there's no text to speak. this.speechController_.onSpeechFinished(); } @@ -1115,223 +996,10 @@ // Clear the selection so we don't keep trying to play from the same // selection every time they press play. selection.removeAllRanges(); - - // Iterate through the page from the beginning until we get to the - // selection. This is so clicking previous works before the selection and - // so the previous highlights are properly set. - chrome.readingMode.resetGranularityIndex(); - // Iterate through the nodes asynchronously so that we can show the spinner - // in the toolbar while we move up to the selection. - setTimeout(() => { - this.speechController_.movePlaybackToNode(startingNodeId, startingOffset); - // Set everything to previous and then play the next granularity, which - // includes the selection. - this.highlighter_.resetPreviousHighlight(); - if (!this.highlightAndPlayMessage()) { - this.speechController_.onSpeechFinished(); - } - }, playFromSelectionTimeout); - + this.speechController_.playFromSelection(startingNodeId, startingOffset); return true; } - highlightAndPlayInterruptedMessage(): boolean { - return this.highlightAndPlayMessage(/* isInterrupted = */ true); - } - - // Play text of these axNodeIds. When finished, read and highlight to read the - // following text. - // TODO: crbug.com/1474951 - Investigate using AXRange.GetText to get text - // between start node / end nodes and their offsets. - highlightAndPlayMessage( - isInterrupted: boolean = false, - isMovingBackward: boolean = false): boolean { - // getCurrentText gets the AX Node IDs of text that should be spoken and - // highlighted. - const axNodeIds: number[] = chrome.readingMode.getCurrentText(); - - // If there aren't any valid ax node ids returned by getCurrentText, - // speech should stop. - if (axNodeIds.length === 0) { - return false; - } - - if (this.nodeStore_.areNodesAllHidden(axNodeIds)) { - return this.skipCurrentPosition_(isInterrupted, isMovingBackward); - } - - const utteranceText = this.extractTextOf(axNodeIds); - // If node ids were returned but they don't exist in the Reading Mode panel, - // there's been a mismatch between Reading Mode and Read Aloud. In this - // case, we should move to the next Read Aloud node and attempt to continue - // playing. TODO: crbug.com/332694565 - This fallback should never be - // needed, but it is. Investigate root cause of Read Aloud / Reading Mode - // mismatch. Additionally, the TTS engine may not like attempts to speak - // whitespace, so move to the next utterance in that case. - if (!utteranceText || utteranceText.trim().length === 0) { - return this.skipCurrentPosition_(isInterrupted, isMovingBackward); - } - - // If we're resuming a previously interrupted message, use word - // boundaries (if available) to resume at the beginning of the current - // word. - if (isInterrupted && this.wordBoundaries_.hasBoundaries()) { - const utteranceTextForWordBoundary = - utteranceText.substring(this.wordBoundaries_.getResumeBoundary()); - // If we paused right at the end of the sentence, no need to speak the - // ending punctuation. - if (this.highlighter_.isInvalidHighlightForWordHighlighting( - utteranceTextForWordBoundary.trim())) { - this.wordBoundaries_.resetToDefaultState(); - return this.skipCurrentPosition_(isInterrupted, isMovingBackward); - } else { - this.playText(utteranceTextForWordBoundary); - } - } else { - this.playText(utteranceText); - } - - this.speechController_.highlightCurrentGranularity(axNodeIds); - return true; - } - - private skipCurrentPosition_( - isInterrupted: boolean, isMovingBackward: boolean): boolean { - if (isMovingBackward) { - chrome.readingMode.movePositionToPreviousGranularity(); - } else { - chrome.readingMode.movePositionToNextGranularity(); - } - return this.highlightAndPlayMessage(isInterrupted, isMovingBackward); - } - - private playText(utteranceText: string) { - // This check is needed due limits of TTS audio for remote voices. See - // crbug.com/1176078 for more details. - // Since the TTS bug only impacts remote voices, no need to check for - // maximum text length if we're using a local voice. If we do somehow - // attempt to speak text that's too long, this will be able to be handled - // by listening for a text-too-long error in message.onerror. - const isTextTooLong = this.speechController_.isTextTooLong(utteranceText); - const endBoundary = this.speechController_.getUtteranceEndBoundary( - utteranceText, isTextTooLong); - this.playTextWithBoundaries(utteranceText, isTextTooLong, endBoundary); - } - - private playTextWithBoundaries( - utteranceText: string, isTextTooLong: boolean, endBoundary: number) { - const message = - new SpeechSynthesisUtterance(utteranceText.substring(0, endBoundary)); - - message.onerror = (error) => { - this.handleSpeechSynthesisError(error, utteranceText); - }; - - this.speechController_.setOnBoundary(message); - this.speechController_.setOnSpeechSynthesisUtteranceStart(message); - - message.onend = () => { - if (isTextTooLong) { - // Since our previous utterance was too long, continue speaking pieces - // of the current utterance until the utterance is complete. The - // entire utterance is highlighted, so there's no need to update - // highlighting until the utterance substring is an acceptable size. - this.playText(utteranceText.substring(endBoundary)); - return; - } - - // Now that we've finiished reading this utterance, update the - // Granularity state to point to the next one Reset the word boundary - // index whenever we move the granularity position. - this.wordBoundaries_.resetToDefaultState(); - chrome.readingMode.movePositionToNextGranularity(); - // Continue speaking with the next block of text. - if (!this.highlightAndPlayMessage()) { - this.speechController_.onSpeechFinished(); - } - }; - - this.speechController_.speakMessage(message); - } - - handleSpeechSynthesisError( - error: SpeechSynthesisErrorEvent, utteranceText: string) { - // We can't be sure that the engine has loaded at this point, but - // if there's an error, we want to ensure we keep the play buttons - // to prevent trapping users in a state where they can no longer play - // Read Aloud, as this is preferable to a long delay before speech - // with no feedback. - this.speechController_.setEngineState(SpeechEngineState.LOADED); - - if (error.error === 'interrupted') { - this.speechController_.onSpeechInterrupted(); - return; - } - - // Log a speech error. We aren't concerned with logging an interrupted - // error, since that can be triggered from play / pause. - this.logger_.logSpeechError(error.error); - - if (error.error === 'text-too-long') { - // This is unlikely to happen, as the length limit on most voices - // is quite long. However, if we do hit a limit, we should just use - // the accessible text length boundaries to shorten the text. Even - // if this gives a much smaller sentence than TTS would have supported, - // this is still preferable to no speech. - this.speech_.cancel(); - this.playTextWithBoundaries( - utteranceText, true, - this.speechController_.getUtteranceEndBoundary(utteranceText, true)); - return; - } - if (error.error === 'invalid-argument') { - // invalid-argument can be triggered when the rate, pitch, or volume - // is not supported by the synthesizer. Since we're only setting the - // speech rate, update the speech rate to the WebSpeech default of 1. - chrome.readingMode.onSpeechRateChange(1); - this.resetSpeechPostSettingChange_(); - return; - } - - // When we hit an error, stop speech to clear all utterances, update the - // button state, and highlighting in order to give visual feedback that - // something went wrong. - // TODO: crbug.com/40927698 - Consider showing an error message. - this.logger_.logSpeechStopSource(chrome.readingMode.engineErrorStopSource); - this.speechController_.stopSpeech(PauseActionSource.DEFAULT); - - // No appropriate voice is available for the language designated in - // SpeechSynthesisUtterance lang. - if (error.error === 'language-unavailable') { - this.voicePackController_.onLanguageUnavailableError(); - } - - // The voice designated in SpeechSynthesisUtterance voice attribute - // is not available. - if (error.error === 'voice-unavailable') { - this.voicePackController_.onVoiceUnavailableError(); - } - } - - private extractTextOf(axNodeIds: number[]): string { - let utteranceText: string = ''; - for (const nodeId of axNodeIds) { - const startIndex = chrome.readingMode.getCurrentTextStartIndex(nodeId); - const endIndex = chrome.readingMode.getCurrentTextEndIndex(nodeId); - const element = this.nodeStore_.getDomNode(nodeId); - if (!element || startIndex < 0 || endIndex < 0) { - continue; - } - const content = chrome.readingMode.getTextContent(nodeId).substring( - startIndex, endIndex); - if (content) { - // Add all of the text from the current nodes into a single utterance. - utteranceText += content; - } - } - return utteranceText; - } - protected onSelectVoice_( event: CustomEvent<{selectedVoice: SpeechSynthesisVoice}>) { event.preventDefault(); @@ -1353,46 +1021,13 @@ protected onVoiceLanguageToggle_(event: CustomEvent<{language: string}>) { event.preventDefault(); event.stopPropagation(); - const toggledLanguage = event.detail.language; - const currentlyEnabled = - this.voicePackController_.isLangEnabled(toggledLanguage); - - if (!currentlyEnabled) { - this.voicePackController_.autoSwitchVoice(toggledLanguage); - this.voicePackController_.installVoicePackIfPossible( - toggledLanguage, /* onlyInstallExactGoogleLocaleMatch=*/ true, - /* retryIfPreviousInstallFailed= */ true); - this.voicePackController_.enableLang(toggledLanguage); - } else { - this.voicePackController_.uninstall(toggledLanguage); - this.voicePackController_.disableLang(toggledLanguage); - } - - chrome.readingMode.onLanguagePrefChange(toggledLanguage, !currentlyEnabled); - - if (!currentlyEnabled && !this.selectedVoice_) { - // If there were no enabled languages (and thus no selected voice), - // select a voice. - this.voicePackController_.getCurrentVoiceOrDefault(); - } + this.voicePackController_.onLanguageToggle(event.detail.language); } protected resetSpeechPostSettingChange_() { - // Don't call stopSpeech() if the speech tree hasn't been initialized or - // if speech hasn't been triggered yet. - if (!this.speechController_.isSpeechTreeInitialized() || - !this.speechController_.hasSpeechBeenTriggered()) { - return; - } - - const playSpeechOnChange = this.speechController_.isSpeechActive(); - - // Cancel the queued up Utterance using the old speech settings - this.speechController_.stopSpeech(PauseActionSource.VOICE_SETTINGS_CHANGE); - // If speech was playing when a setting was changed, continue playing // speech - if (playSpeechOnChange) { + if (this.speechController_.onSpeechSettingsChange()) { this.playSpeech(); } } @@ -1447,28 +1082,9 @@ } protected onHighlightChange_(event: CustomEvent<{data: number}>) { - // Handler for HIGHLIGHT_CHANGE. - const changedHighlight = event.detail.data; - chrome.readingMode.onHighlightGranularityChanged(changedHighlight); + this.speechController_.onHighlightGranularityChange(event.detail.data); // Apply highlighting changes to the DOM. this.styleUpdater_.setHighlight(); - - // Rehighlight the new granularity. - if (changedHighlight !== chrome.readingMode.noHighlighting) { - this.speechController_.highlightCurrentGranularity( - chrome.readingMode.getCurrentText()); - } - - // Log these highlight granularity changes when the phrase menu is shown. - // (Toggles are already logged in the toolbar.) - this.logger_.logHighlightGranularity(changedHighlight); - } - - // If the screen is locked during speech, we should stop speaking. - onLockScreen() { - if (this.speechController_.isSpeechActive()) { - this.speechController_.stopSpeech(PauseActionSource.DEFAULT); - } } onNodeWillBeDeleted(nodeId: number) { @@ -1485,14 +1101,8 @@ } languageChanged() { - this.voicePackController_.setCurrentLanguage( - chrome.readingMode.baseLanguageForSpeech); this.$.toolbar.updateFonts(); - // Don't check for Google locales when the language has changed. - this.voicePackController_.installVoicePackIfPossible( - chrome.readingMode.baseLanguageForSpeech, - /* onlyInstallExactGoogleLocaleMatch=*/ false, - /* retryIfPreviousInstallFailed= */ false); + this.voicePackController_.onPageLanguageChanged(); } protected computeIsReadAloudPlayable(): boolean {
diff --git a/chrome/browser/resources/side_panel/read_anything/read_aloud/speech_controller.ts b/chrome/browser/resources/side_panel/read_anything/read_aloud/speech_controller.ts index c081528..5e8a18f 100644 --- a/chrome/browser/resources/side_panel/read_anything/read_aloud/speech_controller.ts +++ b/chrome/browser/resources/side_panel/read_anything/read_aloud/speech_controller.ts
@@ -4,7 +4,7 @@ import {loadTimeData} from '//resources/js/load_time_data.js'; -import {getCurrentSpeechRate} from '../common.js'; +import {getCurrentSpeechRate, playFromSelectionTimeout} from '../common.js'; import {NodeStore} from '../node_store.js'; import {ReadAnythingLogger} from '../read_anything_logger.js'; import type {SpeechBrowserProxy} from '../speech_browser_proxy.js'; @@ -27,6 +27,7 @@ onIsAudioCurrentlyPlayingChange(): void; onEngineStateChange(): void; onPreviewVoicePlaying(): void; + onSpeechRateChange(): void; } export class SpeechController { @@ -156,10 +157,292 @@ chrome.readingMode.preprocessTextForSpeech(); } + // If the screen is locked during speech, we should stop speaking. + onLockScreen() { + if (this.isSpeechActive()) { + this.stopSpeech(PauseActionSource.DEFAULT); + } + } + + onSpeechSettingsChange(): boolean { + // Don't call stopSpeech() if the speech tree hasn't been initialized or + // if speech hasn't been triggered yet. + if (!this.isSpeechTreeInitialized() || !this.hasSpeechBeenTriggered()) { + return false; + } + + const playSpeechOnChange = this.isSpeechActive(); + + // Cancel the queued up Utterance using the old speech settings + this.stopSpeech(PauseActionSource.VOICE_SETTINGS_CHANGE); + return playSpeechOnChange; + } + + onHighlightGranularityChange(newGranularity: number) { + chrome.readingMode.onHighlightGranularityChanged(newGranularity); + + // Rehighlight the new granularity. + if (newGranularity !== chrome.readingMode.noHighlighting) { + this.highlightCurrentGranularity(chrome.readingMode.getCurrentText()); + } + + // Log these highlight granularity changes when the phrase menu is shown. + // (Toggles are already logged in the toolbar.) + this.logger_.logHighlightGranularity(newGranularity); + } + onPlay() { this.model_.setPlaySessionStartTime(Date.now()); } + playNextGranularity() { + this.setIsSpeechBeingRepositioned(true); + + this.speech_.cancel(); + this.highlighter_.resetPreviousHighlight(); + // Reset the word boundary index whenever we move the granularity position. + this.wordBoundaries_.resetToDefaultState(); + chrome.readingMode.movePositionToNextGranularity(); + + if (!this.highlightAndPlayMessage()) { + this.onSpeechFinished(); + } + } + + playPreviousGranularity() { + this.setIsSpeechBeingRepositioned(true); + this.speech_.cancel(); + // This must be called BEFORE calling + // chrome.readingMode.movePositionToPreviousGranularity so we can accurately + // determine what's currently being highlighted. + this.highlighter_.removeCurrentHighlight(); + this.highlighter_.resetPreviousHighlight(); + // Reset the word boundary index whenever we move the granularity position. + this.wordBoundaries_.resetToDefaultState(); + chrome.readingMode.movePositionToPreviousGranularity(); + + if (!this.highlightAndPlayMessage( + /*isInterrupted=*/ false, + /*isMovingBackward=*/ true)) { + this.onSpeechFinished(); + } + } + + playFromSelection(startingNodeId: number, startingOffset: number) { + // Iterate through the page from the beginning until we get to the + // selection. This is so clicking previous works before the selection and + // so the previous highlights are properly set. + chrome.readingMode.resetGranularityIndex(); + // Iterate through the nodes asynchronously so that we can show the spinner + // in the toolbar while we move up to the selection. + setTimeout(() => { + this.movePlaybackToNode(startingNodeId, startingOffset); + // Set everything to previous and then play the next granularity, which + // includes the selection. + this.highlighter_.resetPreviousHighlight(); + if (!this.highlightAndPlayMessage()) { + this.onSpeechFinished(); + } + }, playFromSelectionTimeout); + } + + highlightAndPlayInterruptedMessage(): boolean { + return this.highlightAndPlayMessage(/* isInterrupted = */ true); + } + + // Play text of these axNodeIds. When finished, read and highlight to read the + // following text. + // TODO: crbug.com/1474951 - Investigate using AXRange.GetText to get text + // between start node / end nodes and their offsets. + highlightAndPlayMessage( + isInterrupted: boolean = false, + isMovingBackward: boolean = false): boolean { + // getCurrentText gets the AX Node IDs of text that should be spoken and + // highlighted. + const axNodeIds: number[] = chrome.readingMode.getCurrentText(); + + // If there aren't any valid ax node ids returned by getCurrentText, + // speech should stop. + if (axNodeIds.length === 0) { + return false; + } + + if (this.nodeStore_.areNodesAllHidden(axNodeIds)) { + return this.skipCurrentPosition_(isInterrupted, isMovingBackward); + } + + const utteranceText = this.extractTextOf_(axNodeIds); + // If node ids were returned but they don't exist in the Reading Mode panel, + // there's been a mismatch between Reading Mode and Read Aloud. In this + // case, we should move to the next Read Aloud node and attempt to continue + // playing. TODO: crbug.com/332694565 - This fallback should never be + // needed, but it is. Investigate root cause of Read Aloud / Reading Mode + // mismatch. Additionally, the TTS engine may not like attempts to speak + // whitespace, so move to the next utterance in that case. + if (!utteranceText || utteranceText.trim().length === 0) { + return this.skipCurrentPosition_(isInterrupted, isMovingBackward); + } + + // If we're resuming a previously interrupted message, use word + // boundaries (if available) to resume at the beginning of the current + // word. + if (isInterrupted && this.wordBoundaries_.hasBoundaries()) { + const utteranceTextForWordBoundary = + utteranceText.substring(this.wordBoundaries_.getResumeBoundary()); + // If we paused right at the end of the sentence, no need to speak the + // ending punctuation. + if (this.highlighter_.isInvalidHighlightForWordHighlighting( + utteranceTextForWordBoundary.trim())) { + this.wordBoundaries_.resetToDefaultState(); + return this.skipCurrentPosition_(isInterrupted, isMovingBackward); + } else { + this.playText_(utteranceTextForWordBoundary); + } + } else { + this.playText_(utteranceText); + } + + this.highlightCurrentGranularity(axNodeIds); + return true; + } + + private skipCurrentPosition_( + isInterrupted: boolean, isMovingBackward: boolean): boolean { + if (isMovingBackward) { + chrome.readingMode.movePositionToPreviousGranularity(); + } else { + chrome.readingMode.movePositionToNextGranularity(); + } + return this.highlightAndPlayMessage(isInterrupted, isMovingBackward); + } + + private playText_(utteranceText: string) { + // This check is needed due limits of TTS audio for remote voices. See + // crbug.com/1176078 for more details. + // Since the TTS bug only impacts remote voices, no need to check for + // maximum text length if we're using a local voice. If we do somehow + // attempt to speak text that's too long, this will be able to be handled + // by listening for a text-too-long error in message.onerror. + const isTextTooLong = this.isTextTooLong(utteranceText); + const endBoundary = + this.getUtteranceEndBoundary(utteranceText, isTextTooLong); + this.playTextWithBoundaries_(utteranceText, isTextTooLong, endBoundary); + } + + private playTextWithBoundaries_( + utteranceText: string, isTextTooLong: boolean, endBoundary: number) { + const message = + new SpeechSynthesisUtterance(utteranceText.substring(0, endBoundary)); + + message.onerror = (error) => { + this.handleSpeechSynthesisError_(error, utteranceText); + }; + + this.setOnBoundary(message); + this.setOnSpeechSynthesisUtteranceStart(message); + + message.onend = () => { + if (isTextTooLong) { + // Since our previous utterance was too long, continue speaking pieces + // of the current utterance until the utterance is complete. The + // entire utterance is highlighted, so there's no need to update + // highlighting until the utterance substring is an acceptable size. + this.playText_(utteranceText.substring(endBoundary)); + return; + } + + // Now that we've finiished reading this utterance, update the + // Granularity state to point to the next one Reset the word boundary + // index whenever we move the granularity position. + this.wordBoundaries_.resetToDefaultState(); + chrome.readingMode.movePositionToNextGranularity(); + // Continue speaking with the next block of text. + if (!this.highlightAndPlayMessage()) { + this.onSpeechFinished(); + } + }; + + this.speakMessage(message); + } + + private handleSpeechSynthesisError_( + error: SpeechSynthesisErrorEvent, utteranceText: string) { + // We can't be sure that the engine has loaded at this point, but + // if there's an error, we want to ensure we keep the play buttons + // to prevent trapping users in a state where they can no longer play + // Read Aloud, as this is preferable to a long delay before speech + // with no feedback. + this.setEngineState(SpeechEngineState.LOADED); + + if (error.error === 'interrupted') { + this.onSpeechInterrupted(); + return; + } + + // Log a speech error. We aren't concerned with logging an interrupted + // error, since that can be triggered from play / pause. + this.logger_.logSpeechError(error.error); + + if (error.error === 'text-too-long') { + // This is unlikely to happen, as the length limit on most voices + // is quite long. However, if we do hit a limit, we should just use + // the accessible text length boundaries to shorten the text. Even + // if this gives a much smaller sentence than TTS would have supported, + // this is still preferable to no speech. + this.speech_.cancel(); + this.playTextWithBoundaries_( + utteranceText, true, + this.getUtteranceEndBoundary(utteranceText, true)); + return; + } + if (error.error === 'invalid-argument') { + // invalid-argument can be triggered when the rate, pitch, or volume + // is not supported by the synthesizer. Since we're only setting the + // speech rate, update the speech rate to the WebSpeech default of 1. + chrome.readingMode.onSpeechRateChange(1); + this.listeners_.forEach(l => l.onSpeechRateChange()); + return; + } + + // When we hit an error, stop speech to clear all utterances, update the + // button state, and highlighting in order to give visual feedback that + // something went wrong. + // TODO: crbug.com/40927698 - Consider showing an error message. + this.logger_.logSpeechStopSource(chrome.readingMode.engineErrorStopSource); + this.stopSpeech(PauseActionSource.DEFAULT); + + // No appropriate voice is available for the language designated in + // SpeechSynthesisUtterance lang. + if (error.error === 'language-unavailable') { + this.voicePackController_.onLanguageUnavailableError(); + } + + // The voice designated in SpeechSynthesisUtterance voice attribute + // is not available. + if (error.error === 'voice-unavailable') { + this.voicePackController_.onVoiceUnavailableError(); + } + } + + private extractTextOf_(axNodeIds: number[]): string { + let utteranceText: string = ''; + for (const nodeId of axNodeIds) { + const startIndex = chrome.readingMode.getCurrentTextStartIndex(nodeId); + const endIndex = chrome.readingMode.getCurrentTextEndIndex(nodeId); + const element = this.nodeStore_.getDomNode(nodeId); + if (!element || startIndex < 0 || endIndex < 0) { + continue; + } + const content = chrome.readingMode.getTextContent(nodeId).substring( + startIndex, endIndex); + if (content) { + // Add all of the text from the current nodes into a single utterance. + utteranceText += content; + } + } + return utteranceText; + } + stopSpeech(pauseSource: PauseActionSource) { this.setIsSpeechActive(false); this.setIsAudioCurrentlyPlaying(false);
diff --git a/chrome/browser/resources/side_panel/read_anything/read_aloud/voice_pack_controller.ts b/chrome/browser/resources/side_panel/read_anything/read_aloud/voice_pack_controller.ts index 25edfb5..594509b 100644 --- a/chrome/browser/resources/side_panel/read_anything/read_aloud/voice_pack_controller.ts +++ b/chrome/browser/resources/side_panel/read_anything/read_aloud/voice_pack_controller.ts
@@ -11,7 +11,7 @@ import type {SpeechBrowserProxy} from '../speech_browser_proxy.js'; import {SpeechBrowserProxyImpl} from '../speech_browser_proxy.js'; import type {VoicePackStatus} from '../voice_language_util.js'; -import {areVoicesEqual, AVAILABLE_GOOGLE_TTS_LOCALES, convertLangOrLocaleForVoicePackManager, convertLangOrLocaleToExactVoicePackLocale, convertLangToAnAvailableLangIfPresent, createInitialListOfEnabledLanguages, EXTENSION_RESPONSE_TIMEOUT_MS, getFilteredVoiceList, getNaturalVoiceOrDefault, getVoicePackConvertedLangIfExists, isNatural, isVoicePackStatusError, isVoicePackStatusSuccess, VoiceClientSideStatusCode, VoicePackServerStatusSuccessCode} from '../voice_language_util.js'; +import {areVoicesEqual, AVAILABLE_GOOGLE_TTS_LOCALES, convertLangOrLocaleForVoicePackManager, convertLangOrLocaleToExactVoicePackLocale, convertLangToAnAvailableLangIfPresent, createInitialListOfEnabledLanguages, doesLanguageHaveNaturalVoices, EXTENSION_RESPONSE_TIMEOUT_MS, getFilteredVoiceList, getNaturalVoiceOrDefault, getVoicePackConvertedLangIfExists, isNatural, isVoicePackStatusError, isVoicePackStatusSuccess, mojoVoicePackStatusToVoicePackStatusEnum, VoiceClientSideStatusCode, VoicePackServerStatusErrorCode, VoicePackServerStatusSuccessCode} from '../voice_language_util.js'; import {VoiceNotificationManager} from '../voice_notification_manager.js'; import {VoicePackModel} from './voice_pack_model.js'; @@ -36,6 +36,7 @@ private speechExtensionResponseCallbackHandle_?: number; constructor() { + this.setCurrentLanguage(chrome.readingMode.baseLanguageForSpeech); this.speech_.setOnVoicesChanged(this.onVoicesChanged.bind(this)); } @@ -134,7 +135,7 @@ // Kicks off request GetVoicePackInfo to see if the voice is installed 4) // Upon response, if we see the voice is not installed and that it's in // installVoicePackIfPossible, then we trigger an install request - installVoicePackIfPossible( + private installVoicePackIfPossible_( langOrLocale: string, onlyInstallExactGoogleLocaleMatch: boolean, retryIfPreviousInstallFailed: boolean) { // Don't attempt to install a language if it's not a Google TTS language @@ -146,7 +147,7 @@ // page language), this check can be skipped. if (onlyInstallExactGoogleLocaleMatch && !AVAILABLE_GOOGLE_TTS_LOCALES.has(langOrLocale)) { - this.autoSwitchVoice(langOrLocale); + this.autoSwitchVoice_(langOrLocale); return; } @@ -154,17 +155,17 @@ langOrLocale, this.getEnabledLangs(), this.getAvailableLangs()); if (!langCodeForVoicePackManager) { - this.autoSwitchVoice(langOrLocale); + this.autoSwitchVoice_(langOrLocale); return; } - if (!this.requestInstall( + if (!this.requestInstall_( langCodeForVoicePackManager, retryIfPreviousInstallFailed)) { - this.autoSwitchVoice(langCodeForVoicePackManager); + this.autoSwitchVoice_(langCodeForVoicePackManager); } } - autoSwitchVoice(lang: string) { + private autoSwitchVoice_(lang: string) { // Only enable this language if it has available voices and is the current // language. Otherwise switch to a default voice if nothing is selected. const availableLang = @@ -206,6 +207,39 @@ chrome.readingMode.onVoiceChange(selectedVoice.name, selectedVoice.lang); } + onPageLanguageChanged() { + const lang = chrome.readingMode.baseLanguageForSpeech; + this.setCurrentLanguage(lang); + // Don't check for Google locales when the language has changed. + this.installVoicePackIfPossible_( + lang, + /* onlyInstallExactGoogleLocaleMatch=*/ false, + /* retryIfPreviousInstallFailed= */ false); + } + + onLanguageToggle(toggledLanguage: string) { + const currentlyEnabled = this.isLangEnabled(toggledLanguage); + + if (!currentlyEnabled) { + this.autoSwitchVoice_(toggledLanguage); + this.installVoicePackIfPossible_( + toggledLanguage, /* onlyInstallExactGoogleLocaleMatch=*/ true, + /* retryIfPreviousInstallFailed= */ true); + this.enableLang(toggledLanguage); + } else { + this.uninstall_(toggledLanguage); + this.disableLang_(toggledLanguage); + } + + chrome.readingMode.onLanguagePrefChange(toggledLanguage, !currentlyEnabled); + + if (!currentlyEnabled) { + // If there were no enabled languages (and thus no selected voice), + // select a voice. + this.getCurrentVoiceOrDefault(); + } + } + private setUserPreferredVoiceFromPrefs_(): void { const storedVoiceName = chrome.readingMode.getStoredVoice(); if (!storedVoiceName) { @@ -317,7 +351,7 @@ this.setCurrentVoice(null); } - disableLangIfNoVoices(lang: string): void { + private disableLangIfNoVoices_(lang: string): void { const lowerLang = lang.toLowerCase(); this.refreshAvailableVoices(); const availableVoicesForLang = this.getAvailableVoicesForLang_(lowerLang); @@ -334,13 +368,13 @@ chrome.readingMode.onLanguagePrefChange(lowerLang, false); this.getEnabledLangs().forEach(enabledLang => { if (getVoicePackConvertedLangIfExists(enabledLang) === lowerLang) { - this.disableLang(enabledLang); + this.disableLang_(enabledLang); } }); } } - disableLang(lang?: string): void { + private disableLang_(lang?: string): void { if (!lang) { return; } @@ -463,7 +497,93 @@ } } - triggerInstall(voicePackLanguage: string) { + updateVoicePackStatus(lang: string, status: string) { + this.stopWaitingForSpeechExtension(); + if (!lang.length) { + return; + } + + const newVoicePackStatus = mojoVoicePackStatusToVoicePackStatusEnum(status); + this.setServerStatus(lang, newVoicePackStatus); + this.updateApplicationState_(lang, newVoicePackStatus); + + if (isVoicePackStatusError(newVoicePackStatus)) { + this.disableLangIfNoVoices_(lang); + } + } + + // Store client side voice pack state and trigger side effects. + private updateApplicationState_( + lang: string, newVoicePackStatus: VoicePackStatus) { + if (isVoicePackStatusSuccess(newVoicePackStatus)) { + const newStatusCode = newVoicePackStatus.code; + + switch (newStatusCode) { + case VoicePackServerStatusSuccessCode.NOT_INSTALLED: + this.triggerInstall_(lang); + break; + case VoicePackServerStatusSuccessCode.INSTALLING: + // Do nothing- we mark our local state as installing when we send the + // request. Locally, we may time out a slow request and mark it as + // errored, and we don't want to overwrite that state here. + break; + case VoicePackServerStatusSuccessCode.INSTALLED: + // Force a refresh of the voices list since we might not get an update + // the voices have changed. + this.refreshAvailableVoices(/*forceRefresh=*/ true); + this.autoSwitchVoice_(lang); + + // Some languages may require a download from the voice pack + // but may not have associated natural voices. + const languageHasNaturalVoices = doesLanguageHaveNaturalVoices(lang); + + // Even though the voice may be installed on disk, it still may not be + // available to the speechSynthesis API. Check whether to mark the + // voice as AVAILABLE or INSTALLED_AND_UNAVAILABLE + const voicesForLanguageAreAvailable = this.getAvailableVoices().some( + voice => + ((isNatural(voice) || !languageHasNaturalVoices) && + getVoicePackConvertedLangIfExists(voice.lang) === lang)); + + // If natural voices are currently available for the language or the + // language does not support natural voices, set the status to + // available. Otherwise, set the status to install and unavailabled. + this.setLocalStatus( + lang, + voicesForLanguageAreAvailable ? + VoiceClientSideStatusCode.AVAILABLE : + VoiceClientSideStatusCode.INSTALLED_AND_UNAVAILABLE); + break; + default: + // This ensures the switch statement is exhaustive + return newStatusCode satisfies never; + } + } else if (isVoicePackStatusError(newVoicePackStatus)) { + this.autoSwitchVoice_(lang); + const newStatusCode = newVoicePackStatus.code; + + switch (newStatusCode) { + case VoicePackServerStatusErrorCode.OTHER: + case VoicePackServerStatusErrorCode.WRONG_ID: + case VoicePackServerStatusErrorCode.NEED_REBOOT: + case VoicePackServerStatusErrorCode.UNSUPPORTED_PLATFORM: + this.setLocalStatus(lang, VoiceClientSideStatusCode.ERROR_INSTALLING); + break; + case VoicePackServerStatusErrorCode.ALLOCATION: + this.setLocalStatus( + lang, VoiceClientSideStatusCode.INSTALL_ERROR_ALLOCATION); + break; + default: + // This ensures the switch statement is exhaustive + return newStatusCode satisfies never; + } + } else { + // Couldn't parse the response + this.setLocalStatus(lang, VoiceClientSideStatusCode.ERROR_INSTALLING); + } + } + + private triggerInstall_(voicePackLanguage: string) { // Install the voice if it's not currently installed and it's marked // as a language that should be installed if (this.model_.hasLanguageForDownload(voicePackLanguage)) { @@ -479,7 +599,7 @@ } // Returns true if this requested either an install or more info. - requestInstall( + private requestInstall_( voicePackLanguage: string, retryIfPreviousInstallFailed: boolean): boolean { const serverStatus = this.getServerStatus(voicePackLanguage); @@ -519,7 +639,7 @@ return false; } - uninstall(langOrLocale: string) { + private uninstall_(langOrLocale: string) { const voicePackLang = convertLangOrLocaleForVoicePackManager(langOrLocale); if (voicePackLang) { this.notificationManager_.onCancelDownload(voicePackLang); @@ -539,7 +659,7 @@ onlyInstallExactGoogleLocaleMatch: boolean, retryIfPreviousInstallFailed: boolean) { for (const lang of this.getEnabledLangs()) { - this.installVoicePackIfPossible( + this.installVoicePackIfPossible_( lang, onlyInstallExactGoogleLocaleMatch, retryIfPreviousInstallFailed); }
diff --git a/chrome/browser/resources/side_panel/reading_list/reading_list_app.html.ts b/chrome/browser/resources/side_panel/reading_list/reading_list_app.html.ts index d1d6be08..2332fc6c 100644 --- a/chrome/browser/resources/side_panel/reading_list/reading_list_app.html.ts +++ b/chrome/browser/resources/side_panel/reading_list/reading_list_app.html.ts
@@ -33,6 +33,8 @@ <sp-heading compact hide-back-button> <h2 slot="heading">${item.title}</h2> <cr-icon-button slot="buttons" + aria-label="${this.getExpandButtonAriaLabel_(item.title)}" + title="${this.getExpandButtonAriaLabel_(item.title)}" data-title="${item.title}" iron-icon="${this.getExpandButtonIcon_(item.title)}" @click="${this.onExpandButtonClick_}">
diff --git a/chrome/browser/resources/side_panel/reading_list/reading_list_app.ts b/chrome/browser/resources/side_panel/reading_list/reading_list_app.ts index 7b2e3be8..3856cf0 100644 --- a/chrome/browser/resources/side_panel/reading_list/reading_list_app.ts +++ b/chrome/browser/resources/side_panel/reading_list/reading_list_app.ts
@@ -246,6 +246,23 @@ }; } + protected getExpandButtonAriaLabel_(title: string): string { + let labelString: string; + switch (title) { + case this.unreadHeader_: + labelString = this.unreadExpanded_ ? 'collapseButtonAriaLabel' : + 'expandButtonAriaLabel'; + break; + case this.readHeader_: + labelString = this.readExpanded_ ? 'collapseButtonAriaLabel' : + 'expandButtonAriaLabel'; + break; + default: + assertNotReached(); + } + return loadTimeData.getStringF(labelString, title); + } + protected getExpandButtonIcon_(title: string): string { switch (title) { case this.unreadHeader_:
diff --git a/chrome/browser/safe_browsing/android/java/src/org/chromium/chrome/browser/safe_browsing/AdvancedProtectionCoordinator.java b/chrome/browser/safe_browsing/android/java/src/org/chromium/chrome/browser/safe_browsing/AdvancedProtectionCoordinator.java index 68ed8e56..ac2f11a8 100644 --- a/chrome/browser/safe_browsing/android/java/src/org/chromium/chrome/browser/safe_browsing/AdvancedProtectionCoordinator.java +++ b/chrome/browser/safe_browsing/android/java/src/org/chromium/chrome/browser/safe_browsing/AdvancedProtectionCoordinator.java
@@ -12,7 +12,7 @@ /** A class for showing UI whenever the Android-OS-supplied advanced-protection state changes. */ @NullMarked public class AdvancedProtectionCoordinator { - private AdvancedProtectionMediator mMediator; + private final AdvancedProtectionMediator mMediator; public AdvancedProtectionCoordinator( WindowAndroid windowAndroid, Class<? extends Fragment> privacySettingsFragmentClass) {
diff --git a/chrome/browser/safe_browsing/android/java/src/org/chromium/chrome/browser/safe_browsing/AdvancedProtectionMediator.java b/chrome/browser/safe_browsing/android/java/src/org/chromium/chrome/browser/safe_browsing/AdvancedProtectionMediator.java index b1f39c50..791ecd4f 100644 --- a/chrome/browser/safe_browsing/android/java/src/org/chromium/chrome/browser/safe_browsing/AdvancedProtectionMediator.java +++ b/chrome/browser/safe_browsing/android/java/src/org/chromium/chrome/browser/safe_browsing/AdvancedProtectionMediator.java
@@ -27,8 +27,8 @@ /** A class for showing UI whenever the Android-OS-supplied advanced-protection state changes. */ @NullMarked public class AdvancedProtectionMediator implements OsAdditionalSecurityPermissionProvider.Observer { - private WindowAndroid mWindowAndroid; - private Class<? extends Fragment> mPrivacySettingsFragmentClass; + private final WindowAndroid mWindowAndroid; + private final Class<? extends Fragment> mPrivacySettingsFragmentClass; private boolean mShouldShowMessageOnStartup; public AdvancedProtectionMediator(
diff --git a/chrome/browser/safe_browsing/android/java/src/org/chromium/chrome/browser/safe_browsing/AdvancedProtectionMediatorTest.java b/chrome/browser/safe_browsing/android/java/src/org/chromium/chrome/browser/safe_browsing/AdvancedProtectionMediatorTest.java index 916c5f1..f65ec14 100644 --- a/chrome/browser/safe_browsing/android/java/src/org/chromium/chrome/browser/safe_browsing/AdvancedProtectionMediatorTest.java +++ b/chrome/browser/safe_browsing/android/java/src/org/chromium/chrome/browser/safe_browsing/AdvancedProtectionMediatorTest.java
@@ -52,7 +52,7 @@ public class AdvancedProtectionMediatorTest { @Mock private WindowAndroid mWindowAndroid; @Mock private Context mContext; - private WeakReference<Context> mWeakContext = new WeakReference<Context>(mContext); + private final WeakReference<Context> mWeakContext = new WeakReference<Context>(mContext); private final UnownedUserDataHost mWindowUserDataHost = new UnownedUserDataHost(); @Mock private ManagedMessageDispatcher mMessageDispatcher;
diff --git a/chrome/browser/safe_browsing/android/java/src/org/chromium/chrome/browser/safe_browsing/AdvancedProtectionStatusManagerAndroidBridge.java b/chrome/browser/safe_browsing/android/java/src/org/chromium/chrome/browser/safe_browsing/AdvancedProtectionStatusManagerAndroidBridge.java index 7ce4631..3ca43e4 100644 --- a/chrome/browser/safe_browsing/android/java/src/org/chromium/chrome/browser/safe_browsing/AdvancedProtectionStatusManagerAndroidBridge.java +++ b/chrome/browser/safe_browsing/android/java/src/org/chromium/chrome/browser/safe_browsing/AdvancedProtectionStatusManagerAndroidBridge.java
@@ -19,8 +19,8 @@ @NullMarked public class AdvancedProtectionStatusManagerAndroidBridge implements OsAdditionalSecurityPermissionProvider.Observer { - private long mNative; - private @Nullable OsAdditionalSecurityPermissionProvider mProvider; + private final long mNative; + private final @Nullable OsAdditionalSecurityPermissionProvider mProvider; @CalledByNative private static AdvancedProtectionStatusManagerAndroidBridge create(
diff --git a/chrome/browser/safe_browsing/android/java/src/org/chromium/chrome/browser/safe_browsing/AdvancedProtectionStatusManagerAndroidBridgeTest.java b/chrome/browser/safe_browsing/android/java/src/org/chromium/chrome/browser/safe_browsing/AdvancedProtectionStatusManagerAndroidBridgeTest.java index 774958a4..c79c350 100644 --- a/chrome/browser/safe_browsing/android/java/src/org/chromium/chrome/browser/safe_browsing/AdvancedProtectionStatusManagerAndroidBridgeTest.java +++ b/chrome/browser/safe_browsing/android/java/src/org/chromium/chrome/browser/safe_browsing/AdvancedProtectionStatusManagerAndroidBridgeTest.java
@@ -27,7 +27,7 @@ @Config(manifest = Config.NONE) public class AdvancedProtectionStatusManagerAndroidBridgeTest { private static class TestPermissionProvider extends OsAdditionalSecurityPermissionProvider { - private boolean mIsAdvancedProtectionRequestedByOs; + private final boolean mIsAdvancedProtectionRequestedByOs; public TestPermissionProvider(boolean isAdvancedProtectionRequestedByOs) { mIsAdvancedProtectionRequestedByOs = isAdvancedProtectionRequestedByOs;
diff --git a/chrome/browser/safe_browsing/android/java/src/org/chromium/chrome/browser/safe_browsing/AdvancedProtectionStatusManagerTestUtil.java b/chrome/browser/safe_browsing/android/java/src/org/chromium/chrome/browser/safe_browsing/AdvancedProtectionStatusManagerTestUtil.java index dfb99e0..d939761 100644 --- a/chrome/browser/safe_browsing/android/java/src/org/chromium/chrome/browser/safe_browsing/AdvancedProtectionStatusManagerTestUtil.java +++ b/chrome/browser/safe_browsing/android/java/src/org/chromium/chrome/browser/safe_browsing/AdvancedProtectionStatusManagerTestUtil.java
@@ -13,7 +13,7 @@ /** Enables setting a mock {@link OsAdditionalSecurityPermissionProvider} from native. */ public class AdvancedProtectionStatusManagerTestUtil { private static class TestPermissionProvider extends OsAdditionalSecurityPermissionProvider { - private boolean mIsAdvancedProtectionRequestedByOs; + private final boolean mIsAdvancedProtectionRequestedByOs; public TestPermissionProvider(boolean isAdvancedProtectionRequestedByOs) { mIsAdvancedProtectionRequestedByOs = isAdvancedProtectionRequestedByOs;
diff --git a/chrome/browser/safe_browsing/android/java/src/org/chromium/chrome/browser/safe_browsing/settings/NoProtectionConfirmationDialog.java b/chrome/browser/safe_browsing/android/java/src/org/chromium/chrome/browser/safe_browsing/settings/NoProtectionConfirmationDialog.java index 083dfbe..1748399c 100644 --- a/chrome/browser/safe_browsing/android/java/src/org/chromium/chrome/browser/safe_browsing/settings/NoProtectionConfirmationDialog.java +++ b/chrome/browser/safe_browsing/android/java/src/org/chromium/chrome/browser/safe_browsing/settings/NoProtectionConfirmationDialog.java
@@ -24,12 +24,12 @@ /** Dialog to confirm if the user is sure to disable Safe Browsing. */ @NullMarked public class NoProtectionConfirmationDialog { - private Context mContext; + private final Context mContext; @MonotonicNonNull private ModalDialogManager mManager; private @Nullable PropertyModel mModel; - private Callback<Boolean> mDidConfirmCallback; + private final Callback<Boolean> mDidConfirmCallback; public static NoProtectionConfirmationDialog create( Context context, Callback<Boolean> didConfirmCallback) {
diff --git a/chrome/browser/safe_browsing/android/safe_browsing_settings_navigation_android.cc b/chrome/browser/safe_browsing/android/safe_browsing_settings_navigation_android.cc index b081a739..2dcc01d 100644 --- a/chrome/browser/safe_browsing/android/safe_browsing_settings_navigation_android.cc +++ b/chrome/browser/safe_browsing/android/safe_browsing_settings_navigation_android.cc
@@ -19,4 +19,9 @@ static_cast<int>(access_point)); } +void ShowAdvancedProtectionSettings(ui::WindowAndroid* window) { + Java_SafeBrowsingSettingsNavigation_showAdvancedProtectionSettings( + base::android::AttachCurrentThread(), window->GetJavaObject()); +} + } // namespace safe_browsing
diff --git a/chrome/browser/safe_browsing/android/safe_browsing_settings_navigation_android.h b/chrome/browser/safe_browsing/android/safe_browsing_settings_navigation_android.h index d6dd490..a6a1436 100644 --- a/chrome/browser/safe_browsing/android/safe_browsing_settings_navigation_android.h +++ b/chrome/browser/safe_browsing/android/safe_browsing_settings_navigation_android.h
@@ -14,6 +14,9 @@ void ShowSafeBrowsingSettings(ui::WindowAndroid* window, SettingsAccessPoint access_point); +// Opens the advanced-protection settings. +void ShowAdvancedProtectionSettings(ui::WindowAndroid* window); + } // namespace safe_browsing #endif // CHROME_BROWSER_SAFE_BROWSING_ANDROID_SAFE_BROWSING_SETTINGS_NAVIGATION_ANDROID_H_
diff --git a/chrome/browser/safety_check/android/java/src/org/chromium/chrome/browser/safety_check/SafetyCheckCoordinator.java b/chrome/browser/safety_check/android/java/src/org/chromium/chrome/browser/safety_check/SafetyCheckCoordinator.java index 52b4302..a62cbb0 100644 --- a/chrome/browser/safety_check/android/java/src/org/chromium/chrome/browser/safety_check/SafetyCheckCoordinator.java +++ b/chrome/browser/safety_check/android/java/src/org/chromium/chrome/browser/safety_check/SafetyCheckCoordinator.java
@@ -39,8 +39,8 @@ private SafetyCheckSettingsFragment mSettingsFragment; private SafetyCheckUpdatesDelegate mUpdatesClient; private @MonotonicNonNull SafetyCheckMediator mMediator; - private @Nullable SyncService mSyncService; - private PrefService mPrefService; + private final @Nullable SyncService mSyncService; + private final PrefService mPrefService; private @Nullable PasswordStoreBridge mPasswordStoreBridge; private @Nullable PropertyModel mPasswordCheckLocalModel; private @Nullable PropertyModel mPasswordCheckAccountModel;
diff --git a/chrome/browser/safety_check/android/java/src/org/chromium/chrome/browser/safety_check/SafetyCheckMediator.java b/chrome/browser/safety_check/android/java/src/org/chromium/chrome/browser/safety_check/SafetyCheckMediator.java index 35a8344..a3070b2 100644 --- a/chrome/browser/safety_check/android/java/src/org/chromium/chrome/browser/safety_check/SafetyCheckMediator.java +++ b/chrome/browser/safety_check/android/java/src/org/chromium/chrome/browser/safety_check/SafetyCheckMediator.java
@@ -82,7 +82,7 @@ private static final String SAFETY_CHECK_INTERACTIONS = "Settings.SafetyCheck.Interactions"; /** Profile to launch SigninActivity. */ - private Profile mProfile; + private final Profile mProfile; /** Model representing the current state of the update and safe browsing checks. */ private PropertyModel mSafetyCheckModel; @@ -103,26 +103,26 @@ private SafetyCheckUpdatesDelegate mUpdatesClient; /** Provides access to C++ APIs. */ - private SafetyCheckBridge mBridge; + private final SafetyCheckBridge mBridge; /** Client to launch a SigninActivity. */ - private SigninAndHistorySyncActivityLauncher mSigninLauncher; + private final SigninAndHistorySyncActivityLauncher mSigninLauncher; /** Async logic for password check. */ private boolean mShowSafePasswordState; /** Handles the password check. Contains the logic for both UPM and non-UPM password check. */ - private PasswordCheckController mPasswordCheckController; + private final PasswordCheckController mPasswordCheckController; - private PasswordManagerHelper mPasswordManagerHelper; + private final PasswordManagerHelper mPasswordManagerHelper; /** * Used to open a p-link help center article in a custom tab. Needed by the password manager * settings. */ - private SettingsCustomTabLauncher mSettingsCustomTabLauncher; + private final SettingsCustomTabLauncher mSettingsCustomTabLauncher; - private ObservableSupplier<ModalDialogManager> mModalDialogManagerSupplier; + private final ObservableSupplier<ModalDialogManager> mModalDialogManagerSupplier; /** Callbacks and related objects to show the checking state for at least 1 second. */ private Handler mHandler;
diff --git a/chrome/browser/safety_check/android/javatests/src/org/chromium/chrome/browser/safety_check/PasswordsCheckPreferencePropertiesTest.java b/chrome/browser/safety_check/android/javatests/src/org/chromium/chrome/browser/safety_check/PasswordsCheckPreferencePropertiesTest.java index 53c1d219..94b2a6b4 100644 --- a/chrome/browser/safety_check/android/javatests/src/org/chromium/chrome/browser/safety_check/PasswordsCheckPreferencePropertiesTest.java +++ b/chrome/browser/safety_check/android/javatests/src/org/chromium/chrome/browser/safety_check/PasswordsCheckPreferencePropertiesTest.java
@@ -111,8 +111,8 @@ }); } - private PasswordCheckResult mPasswordCheckResult; - private @PasswordsState int mExpectedPasswordsState; + private final PasswordCheckResult mPasswordCheckResult; + private final @PasswordsState int mExpectedPasswordsState; public PasswordsCheckPreferencePropertiesTest( PasswordCheckResult passwordCheckResult, @PasswordsState int expectedPasswordsState) {
diff --git a/chrome/browser/safety_check/android/javatests/src/org/chromium/chrome/browser/safety_check/SafetyCheckMediatorTest.java b/chrome/browser/safety_check/android/javatests/src/org/chromium/chrome/browser/safety_check/SafetyCheckMediatorTest.java index 0961b322..1714788 100644 --- a/chrome/browser/safety_check/android/javatests/src/org/chromium/chrome/browser/safety_check/SafetyCheckMediatorTest.java +++ b/chrome/browser/safety_check/android/javatests/src/org/chromium/chrome/browser/safety_check/SafetyCheckMediatorTest.java
@@ -156,7 +156,7 @@ private SafetyCheckMediator mMediator; - private boolean mUseGmsApi; + private final boolean mUseGmsApi; private ModalDialogManager mModalDialogManager;
diff --git a/chrome/browser/safety_hub/android/java/src/org/chromium/chrome/browser/safety_hub/SafetyHubAccountPasswordsModuleMediator.java b/chrome/browser/safety_hub/android/java/src/org/chromium/chrome/browser/safety_hub/SafetyHubAccountPasswordsModuleMediator.java index 8e5bacf..f93a791 100644 --- a/chrome/browser/safety_hub/android/java/src/org/chromium/chrome/browser/safety_hub/SafetyHubAccountPasswordsModuleMediator.java +++ b/chrome/browser/safety_hub/android/java/src/org/chromium/chrome/browser/safety_hub/SafetyHubAccountPasswordsModuleMediator.java
@@ -29,7 +29,7 @@ private final SafetyHubModuleDelegate mModuleDelegate; private final PropertyModel mModel; - private SafetyHubAccountPasswordsDataSource mAccountPasswordsDataSource; + private final SafetyHubAccountPasswordsDataSource mAccountPasswordsDataSource; private @Nullable SafetyHubModuleHelper mModuleHelper; SafetyHubAccountPasswordsModuleMediator(
diff --git a/chrome/browser/safety_hub/android/java/src/org/chromium/chrome/browser/safety_hub/SafetyHubFetchService.java b/chrome/browser/safety_hub/android/java/src/org/chromium/chrome/browser/safety_hub/SafetyHubFetchService.java index 212cdaf..1f7940b 100644 --- a/chrome/browser/safety_hub/android/java/src/org/chromium/chrome/browser/safety_hub/SafetyHubFetchService.java +++ b/chrome/browser/safety_hub/android/java/src/org/chromium/chrome/browser/safety_hub/SafetyHubFetchService.java
@@ -61,7 +61,7 @@ */ private final SafetyHubPasswordsFetchService mAccountPasswordsFetchService; - private SafetyHubPasswordsFetchService mLocalPasswordsFetchService; + private final SafetyHubPasswordsFetchService mLocalPasswordsFetchService; @VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE) SafetyHubFetchService(Profile profile) {
diff --git a/chrome/browser/safety_hub/android/java/src/org/chromium/chrome/browser/safety_hub/SafetyHubHatsHelper.java b/chrome/browser/safety_hub/android/java/src/org/chromium/chrome/browser/safety_hub/SafetyHubHatsHelper.java index 307c87d..9640294 100644 --- a/chrome/browser/safety_hub/android/java/src/org/chromium/chrome/browser/safety_hub/SafetyHubHatsHelper.java +++ b/chrome/browser/safety_hub/android/java/src/org/chromium/chrome/browser/safety_hub/SafetyHubHatsHelper.java
@@ -53,7 +53,8 @@ private boolean mHasTappedCard; private boolean mHasVisited; - private SafetyHubSurveyUiDelegate mSafetyHubSurveyUiDelegate = new SafetyHubSurveyUiDelegate(); + private final SafetyHubSurveyUiDelegate mSafetyHubSurveyUiDelegate = + new SafetyHubSurveyUiDelegate(); private static class SafetyHubSurveyUiDelegate implements SurveyUiDelegate { @Override
diff --git a/chrome/browser/safety_hub/android/java/src/org/chromium/chrome/browser/safety_hub/SafetyHubLocalPasswordsModuleMediator.java b/chrome/browser/safety_hub/android/java/src/org/chromium/chrome/browser/safety_hub/SafetyHubLocalPasswordsModuleMediator.java index c25ec39..aa8b3dd 100644 --- a/chrome/browser/safety_hub/android/java/src/org/chromium/chrome/browser/safety_hub/SafetyHubLocalPasswordsModuleMediator.java +++ b/chrome/browser/safety_hub/android/java/src/org/chromium/chrome/browser/safety_hub/SafetyHubLocalPasswordsModuleMediator.java
@@ -63,7 +63,7 @@ private final SafetyHubModuleDelegate mModuleDelegate; private final PropertyModel mModel; - private SafetyHubLocalPasswordsDataSource mLocalPasswordsDataSource; + private final SafetyHubLocalPasswordsDataSource mLocalPasswordsDataSource; private @Nullable SafetyHubModuleHelper mModuleHelper; private @IndicatorState int mIndicatorState = IndicatorState.IDLE;
diff --git a/chrome/browser/safety_hub/android/java/src/org/chromium/chrome/browser/safety_hub/SafetyHubPasswordsModuleMediator.java b/chrome/browser/safety_hub/android/java/src/org/chromium/chrome/browser/safety_hub/SafetyHubPasswordsModuleMediator.java index 2e2dbaec..2fda3873 100644 --- a/chrome/browser/safety_hub/android/java/src/org/chromium/chrome/browser/safety_hub/SafetyHubPasswordsModuleMediator.java +++ b/chrome/browser/safety_hub/android/java/src/org/chromium/chrome/browser/safety_hub/SafetyHubPasswordsModuleMediator.java
@@ -28,8 +28,8 @@ private final SafetyHubModuleDelegate mModuleDelegate; private final PropertyModel mModel; - private SafetyHubAccountPasswordsDataSource mAccountPasswordsDataSource; - private SafetyHubLocalPasswordsDataSource mLocalPasswordsDataSource; + private final SafetyHubAccountPasswordsDataSource mAccountPasswordsDataSource; + private final SafetyHubLocalPasswordsDataSource mLocalPasswordsDataSource; private @Nullable SafetyHubModuleHelper mModuleHelper; private boolean mAccountPasswordsReturned;
diff --git a/chrome/browser/safety_hub/android/javatests/src/org/chromium/chrome/browser/safety_hub/FakeNotificationPermissionReviewBridge.java b/chrome/browser/safety_hub/android/javatests/src/org/chromium/chrome/browser/safety_hub/FakeNotificationPermissionReviewBridge.java index d83ea965..994b9f46 100644 --- a/chrome/browser/safety_hub/android/javatests/src/org/chromium/chrome/browser/safety_hub/FakeNotificationPermissionReviewBridge.java +++ b/chrome/browser/safety_hub/android/javatests/src/org/chromium/chrome/browser/safety_hub/FakeNotificationPermissionReviewBridge.java
@@ -13,8 +13,9 @@ /** Java implementation of NotificationPermissionReviewBridge for testing. */ class FakeNotificationPermissionReviewBridge implements NotificationPermissionReviewBridge.Natives { - private HashSet<String> mActiveOriginSet = new HashSet<>(); - private HashMap<String, NotificationPermissions> mNotificationPermissionMap = new HashMap<>(); + private final HashSet<String> mActiveOriginSet = new HashSet<>(); + private final HashMap<String, NotificationPermissions> mNotificationPermissionMap = + new HashMap<>(); public void setNotificationPermissionsForReview( NotificationPermissions[] notificationPermissionsList) {
diff --git a/chrome/browser/safety_hub/android/javatests/src/org/chromium/chrome/browser/safety_hub/FakeUnusedSitePermissionsBridge.java b/chrome/browser/safety_hub/android/javatests/src/org/chromium/chrome/browser/safety_hub/FakeUnusedSitePermissionsBridge.java index f44d9870..f601813 100644 --- a/chrome/browser/safety_hub/android/javatests/src/org/chromium/chrome/browser/safety_hub/FakeUnusedSitePermissionsBridge.java +++ b/chrome/browser/safety_hub/android/javatests/src/org/chromium/chrome/browser/safety_hub/FakeUnusedSitePermissionsBridge.java
@@ -12,7 +12,7 @@ /** Java implementation of UnusedSitePermissionsBridge for testing. */ class FakeUnusedSitePermissionsBridge implements UnusedSitePermissionsBridge.Natives { - private HashMap<String, PermissionsData> mUnusedPermissionsDataMap = new HashMap<>(); + private final HashMap<String, PermissionsData> mUnusedPermissionsDataMap = new HashMap<>(); public void setPermissionsDataForReview(PermissionsData[] permissionsDataList) { for (PermissionsData permissionsData : permissionsDataList) {
diff --git a/chrome/browser/safety_hub/android/javatests/src/org/chromium/chrome/browser/safety_hub/SafetyHubHatsHelperTest.java b/chrome/browser/safety_hub/android/javatests/src/org/chromium/chrome/browser/safety_hub/SafetyHubHatsHelperTest.java index 18a0994..4df4d7c7 100644 --- a/chrome/browser/safety_hub/android/javatests/src/org/chromium/chrome/browser/safety_hub/SafetyHubHatsHelperTest.java +++ b/chrome/browser/safety_hub/android/javatests/src/org/chromium/chrome/browser/safety_hub/SafetyHubHatsHelperTest.java
@@ -64,10 +64,10 @@ @Mock private SafetyHubFetchService mSafetyHubFetchService; @Mock private SafeBrowsingBridge.Natives mSafeBrowsingBridgeNativeMock; - private FakeUnusedSitePermissionsBridge mUnusedPermissionsBridge = + private final FakeUnusedSitePermissionsBridge mUnusedPermissionsBridge = new FakeUnusedSitePermissionsBridge(); - private FakeNotificationPermissionReviewBridge mNotificationPermissionReviewBridge = + private final FakeNotificationPermissionReviewBridge mNotificationPermissionReviewBridge = new FakeNotificationPermissionReviewBridge(); private TabModelSelector mTabModelSelector;
diff --git a/chrome/browser/safety_hub/android/javatests/src/org/chromium/chrome/browser/safety_hub/SafetyHubTest.java b/chrome/browser/safety_hub/android/javatests/src/org/chromium/chrome/browser/safety_hub/SafetyHubTest.java index 42f764c..8602684a 100644 --- a/chrome/browser/safety_hub/android/javatests/src/org/chromium/chrome/browser/safety_hub/SafetyHubTest.java +++ b/chrome/browser/safety_hub/android/javatests/src/org/chromium/chrome/browser/safety_hub/SafetyHubTest.java
@@ -189,10 +189,10 @@ @Rule public final SigninTestRule mSigninTestRule = new SigninTestRule(); - private FakeUnusedSitePermissionsBridge mUnusedPermissionsBridge = + private final FakeUnusedSitePermissionsBridge mUnusedPermissionsBridge = new FakeUnusedSitePermissionsBridge(); - private FakeNotificationPermissionReviewBridge mNotificationPermissionReviewBridge = + private final FakeNotificationPermissionReviewBridge mNotificationPermissionReviewBridge = new FakeNotificationPermissionReviewBridge(); private Profile mProfile;
diff --git a/chrome/browser/search_resumption/java/src/org/chromium/chrome/browser/search_resumption/SearchResumptionModuleMediator.java b/chrome/browser/search_resumption/java/src/org/chromium/chrome/browser/search_resumption/SearchResumptionModuleMediator.java index b07d9b9..8e49d0bf 100644 --- a/chrome/browser/search_resumption/java/src/org/chromium/chrome/browser/search_resumption/SearchResumptionModuleMediator.java +++ b/chrome/browser/search_resumption/java/src/org/chromium/chrome/browser/search_resumption/SearchResumptionModuleMediator.java
@@ -61,7 +61,7 @@ private boolean mIsDefaultSearchEngineGoogle = true; private boolean mIsSignedIn = true; private boolean mHasKeepEverythingSynced = true; - private boolean mUseNewServiceEnabled; + private final boolean mUseNewServiceEnabled; private @Nullable SearchResumptionModuleView mModuleLayoutView; private @Nullable SearchResumptionModuleBridge mSearchResumptionModuleBridge;
diff --git a/chrome/browser/search_resumption/java/src/org/chromium/chrome/browser/search_resumption/SearchResumptionUserData.java b/chrome/browser/search_resumption/java/src/org/chromium/chrome/browser/search_resumption/SearchResumptionUserData.java index c785498..d15efd10 100644 --- a/chrome/browser/search_resumption/java/src/org/chromium/chrome/browser/search_resumption/SearchResumptionUserData.java +++ b/chrome/browser/search_resumption/java/src/org/chromium/chrome/browser/search_resumption/SearchResumptionUserData.java
@@ -22,10 +22,10 @@ public class SearchResumptionUserData implements UserData { // The cached search suggestion results. static class SuggestionResult { - private GURL mLastUrlToTrack; - private String @Nullable [] mSuggestionTexts; - private GURL @Nullable [] mSuggestionUrls; - private @Nullable List<AutocompleteMatch> mSuggestions; + private final GURL mLastUrlToTrack; + private final String @Nullable [] mSuggestionTexts; + private final GURL @Nullable [] mSuggestionUrls; + private final @Nullable List<AutocompleteMatch> mSuggestions; SuggestionResult( GURL gurl, String @Nullable [] suggestionTexts, GURL @Nullable [] suggestionUrls) {
diff --git a/chrome/browser/segmentation_platform/android/javatests/src/org/chromium/chrome/browser/segmentation_platform/SegmentationPlatformServiceFactoryTest.java b/chrome/browser/segmentation_platform/android/javatests/src/org/chromium/chrome/browser/segmentation_platform/SegmentationPlatformServiceFactoryTest.java index 8b316642..742148a 100644 --- a/chrome/browser/segmentation_platform/android/javatests/src/org/chromium/chrome/browser/segmentation_platform/SegmentationPlatformServiceFactoryTest.java +++ b/chrome/browser/segmentation_platform/android/javatests/src/org/chromium/chrome/browser/segmentation_platform/SegmentationPlatformServiceFactoryTest.java
@@ -47,7 +47,7 @@ @Rule public ChromeTabbedActivityTestRule mActivityTestRule = new ChromeTabbedActivityTestRule(); - private CallbackHelper mCallbackHelper = new CallbackHelper(); + private final CallbackHelper mCallbackHelper = new CallbackHelper(); @Test @MediumTest
diff --git a/chrome/browser/serial/android/java/src/org/chromium/chrome/browser/serial/SerialNotificationManager.java b/chrome/browser/serial/android/java/src/org/chromium/chrome/browser/serial/SerialNotificationManager.java index a1a5fcc..bace2929 100644 --- a/chrome/browser/serial/android/java/src/org/chromium/chrome/browser/serial/SerialNotificationManager.java +++ b/chrome/browser/serial/android/java/src/org/chromium/chrome/browser/serial/SerialNotificationManager.java
@@ -48,9 +48,9 @@ public static final String NOTIFICATION_IS_INCOGNITO = "NotificationIsIncognito"; public static final String NOTIFICATION_URL_EXTRA = "NotificationUrl"; - private SerialNotificationManagerDelegate mDelegate; - private BaseNotificationManagerProxy mNotificationManager; - private SharedPreferencesManager mSharedPreferences; + private final SerialNotificationManagerDelegate mDelegate; + private final BaseNotificationManagerProxy mNotificationManager; + private final SharedPreferencesManager mSharedPreferences; private final List<Integer> mNotificationIds = new ArrayList<Integer>(); public SerialNotificationManager(
diff --git a/chrome/browser/serial/android/junit/src/org/chromium/chrome/browser/serial/SerialNotificationManagerTest.java b/chrome/browser/serial/android/junit/src/org/chromium/chrome/browser/serial/SerialNotificationManagerTest.java index 60ecbe8..34e68aa 100644 --- a/chrome/browser/serial/android/junit/src/org/chromium/chrome/browser/serial/SerialNotificationManagerTest.java +++ b/chrome/browser/serial/android/junit/src/org/chromium/chrome/browser/serial/SerialNotificationManagerTest.java
@@ -37,7 +37,7 @@ UrlFormatter.formatUrlForSecurityDisplay(TEST_URL, SchemeDisplay.OMIT_HTTP_AND_HTTPS); private MockNotificationManagerProxy mMockNotificationManager; - private SerialNotificationManagerDelegate mDelegate = + private final SerialNotificationManagerDelegate mDelegate = new SerialNotificationManagerDelegate() { @Override public Intent createTrustedBringTabToFrontIntent(int tabId) {
diff --git a/chrome/browser/settings/android/java/src/org/chromium/chrome/browser/settings/ChromeManagedPreferenceDelegate.java b/chrome/browser/settings/android/java/src/org/chromium/chrome/browser/settings/ChromeManagedPreferenceDelegate.java index 8448a08..d5ca2ea 100644 --- a/chrome/browser/settings/android/java/src/org/chromium/chrome/browser/settings/ChromeManagedPreferenceDelegate.java +++ b/chrome/browser/settings/android/java/src/org/chromium/chrome/browser/settings/ChromeManagedPreferenceDelegate.java
@@ -16,7 +16,7 @@ /** A ManagedPreferenceDelegate with Chrome-specific default behavior. */ @NullMarked public abstract class ChromeManagedPreferenceDelegate implements ManagedPreferenceDelegate { - private Profile mProfile; + private final Profile mProfile; /** Builds a ChromeManagedPreferenceDelegate for the given Profile. */ public ChromeManagedPreferenceDelegate(Profile profile) {
diff --git a/chrome/browser/settings/android/java/src/org/chromium/chrome/browser/settings/SettingsNavigationFactory.java b/chrome/browser/settings/android/java/src/org/chromium/chrome/browser/settings/SettingsNavigationFactory.java index 0514346..4e9f3a0a 100644 --- a/chrome/browser/settings/android/java/src/org/chromium/chrome/browser/settings/SettingsNavigationFactory.java +++ b/chrome/browser/settings/android/java/src/org/chromium/chrome/browser/settings/SettingsNavigationFactory.java
@@ -12,7 +12,7 @@ /** Factory for {@link SettingsNavigation}. Can be used from chrome/browser modules. */ @NullMarked public class SettingsNavigationFactory { - private static SettingsNavigation sInstance = new SettingsNavigationImpl(); + private static final SettingsNavigation sInstance = new SettingsNavigationImpl(); private static @Nullable SettingsNavigation sInstanceForTesting; /** Create a {@link SettingsNavigation}. */
diff --git a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/long_screenshots/LongScreenshotsMediator.java b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/long_screenshots/LongScreenshotsMediator.java index 4fe65d34..06a12a14 100644 --- a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/long_screenshots/LongScreenshotsMediator.java +++ b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/long_screenshots/LongScreenshotsMediator.java
@@ -61,7 +61,7 @@ private final Activity mActivity; private final EntryManager mEntryManager; private Bitmap mFullBitmap; - private float mDisplayDensity; + private final float mDisplayDensity; // Variables for tracking drag action. private int mDragStartEventY;
diff --git a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/long_screenshots/bitmap_generation/BitmapGenerator.java b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/long_screenshots/bitmap_generation/BitmapGenerator.java index 1ac65e6a9..04b8ec1 100644 --- a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/long_screenshots/bitmap_generation/BitmapGenerator.java +++ b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/long_screenshots/bitmap_generation/BitmapGenerator.java
@@ -25,13 +25,13 @@ // Compositor delegate responsible for compositing the skia private LongScreenshotsCompositor mCompositor; private LongScreenshotsTabService mTabService; - private Tab mTab; + private final Tab mTab; private static final String DIR_NAME = "long_screenshots_dir"; protected GeneratorCallBack mGeneratorCallBack; private CompositorFactory mCompositorFactory; - private ScreenshotBoundsManager mBoundsManager; + private final ScreenshotBoundsManager mBoundsManager; private float mScaleFactor; /**
diff --git a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/long_screenshots/bitmap_generation/EntryManager.java b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/long_screenshots/bitmap_generation/EntryManager.java index eac2352..8376630b 100644 --- a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/long_screenshots/bitmap_generation/EntryManager.java +++ b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/long_screenshots/bitmap_generation/EntryManager.java
@@ -26,14 +26,14 @@ */ public class EntryManager { // List of all entries in correspondence of the webpage. - private List<LongScreenshotsEntry> mEntries; + private final List<LongScreenshotsEntry> mEntries; // List of entries that are queued to generate the bitmap. Entries should only be queued // while the capture is in progress. - private List<LongScreenshotsEntry> mQueuedEntries; + private final List<LongScreenshotsEntry> mQueuedEntries; private BitmapGenerator mGenerator; - private ObserverList<BitmapGeneratorObserver> mGeneratorObservers; + private final ObserverList<BitmapGeneratorObserver> mGeneratorObservers; private @EntryStatus int mGeneratorStatus; - private ScreenshotBoundsManager mBoundsManager; + private final ScreenshotBoundsManager mBoundsManager; /** * Users of the {@link EntryManager} can implement this interface to be notified of changes to
diff --git a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/long_screenshots/bitmap_generation/LongScreenshotsCompositor.java b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/long_screenshots/bitmap_generation/LongScreenshotsCompositor.java index 5600719..66d85cb 100644 --- a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/long_screenshots/bitmap_generation/LongScreenshotsCompositor.java +++ b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/long_screenshots/bitmap_generation/LongScreenshotsCompositor.java
@@ -27,7 +27,7 @@ */ public class LongScreenshotsCompositor { private PlayerCompositorDelegate mDelegate; - private Callback<Integer> mCompositorCallback; + private final Callback<Integer> mCompositorCallback; private Size mContentSize; private Point mScrollOffset;
diff --git a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/long_screenshots/bitmap_generation/LongScreenshotsEntry.java b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/long_screenshots/bitmap_generation/LongScreenshotsEntry.java index 5a25d4c1..cae57811 100644 --- a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/long_screenshots/bitmap_generation/LongScreenshotsEntry.java +++ b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/long_screenshots/bitmap_generation/LongScreenshotsEntry.java
@@ -27,14 +27,14 @@ * {@link getBitmap} to retrieve the generated bitmap. */ public class LongScreenshotsEntry { - private Rect mRect; + private final Rect mRect; private BitmapGenerator mGenerator; private @EntryStatus int mCurrentStatus; // Generated bitmap private Bitmap mGeneratedBitmap; private EntryListener mEntryListener; - private Callback<Integer> mMemoryTracker; + private final Callback<Integer> mMemoryTracker; @IntDef({ EntryStatus.UNKNOWN,
diff --git a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/long_screenshots/bitmap_generation/ScreenshotBoundsManager.java b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/long_screenshots/bitmap_generation/ScreenshotBoundsManager.java index 770c808a..5f1424c 100644 --- a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/long_screenshots/bitmap_generation/ScreenshotBoundsManager.java +++ b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/long_screenshots/bitmap_generation/ScreenshotBoundsManager.java
@@ -22,7 +22,7 @@ private static final int NUM_VIEWPORTS_CAPTURE_ABOVE_FOR_FULL_CAPTURE = 2; private static final int NUM_VIEWPORTS_CAPTURE_BELOW_FOR_FULL_CAPTURE = 4; - private Tab mTab; + private final Tab mTab; private Rect mCaptureRect; private Size mContentSize; private Point mScrollOffset;
diff --git a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/qrcode/TabLayoutPageListener.java b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/qrcode/TabLayoutPageListener.java index b50f856..046adc2f 100644 --- a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/qrcode/TabLayoutPageListener.java +++ b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/qrcode/TabLayoutPageListener.java
@@ -15,7 +15,7 @@ * the camera on and off. */ public class TabLayoutPageListener extends TabLayout.TabLayoutOnPageChangeListener { - private ArrayList<QrCodeDialogTab> mTabs; + private final ArrayList<QrCodeDialogTab> mTabs; private int mVisibleTab; /**
diff --git a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/qrcode/share_tab/QrCodeShareMediator.java b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/qrcode/share_tab/QrCodeShareMediator.java index cefc1e00..d318f071 100644 --- a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/qrcode/share_tab/QrCodeShareMediator.java +++ b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/qrcode/share_tab/QrCodeShareMediator.java
@@ -47,8 +47,8 @@ private int mNumDownloads; private boolean mIsDownloadInProgress; - private String mUrl; - private Runnable mCloseDialog; + private final String mUrl; + private final Runnable mCloseDialog; /** * The QrCodeScanMediator constructor.
diff --git a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/scroll_capture/ScrollCaptureCallbackImpl.java b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/scroll_capture/ScrollCaptureCallbackImpl.java index 0ec43af8..9bc40cc 100644 --- a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/scroll_capture/ScrollCaptureCallbackImpl.java +++ b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/scroll_capture/ScrollCaptureCallbackImpl.java
@@ -24,7 +24,7 @@ */ @RequiresApi(api = VERSION_CODES.S) public class ScrollCaptureCallbackImpl implements ScrollCaptureCallback { - private ScrollCaptureCallbackDelegate mDelegate; + private final ScrollCaptureCallbackDelegate mDelegate; public ScrollCaptureCallbackImpl(EntryManagerWrapper entryManagerWrapper) { mDelegate = new ScrollCaptureCallbackDelegate(entryManagerWrapper);
diff --git a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetBottomSheetContent.java b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetBottomSheetContent.java index 7cfd90a..16699942 100644 --- a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetBottomSheetContent.java +++ b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetBottomSheetContent.java
@@ -605,7 +605,7 @@ /** One-shot reporter that records the first time the user scrolls a {@link RecyclerView}. */ private static class ScrollEventReporter extends RecyclerView.OnScrollListener { private boolean mFired; - private String mActionName; + private final String mActionName; public ScrollEventReporter(String actionName) { mActionName = actionName;
diff --git a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetCoordinator.java b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetCoordinator.java index 61467b9..55abbfbf 100644 --- a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetCoordinator.java +++ b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetCoordinator.java
@@ -83,11 +83,11 @@ private ChromeShareExtras mChromeShareExtras; private LinkToTextCoordinator mLinkToTextCoordinator; private ShareSheetLinkToggleCoordinator mShareSheetLinkToggleCoordinator; - private ShareSheetUsageRankingHelper mShareSheetUsageRankingHelper; + private final ShareSheetUsageRankingHelper mShareSheetUsageRankingHelper; private @LinkGeneration int mLinkGenerationStatusForMetrics = LinkGeneration.MAX; private LinkToggleMetricsDetails mLinkToggleMetricsDetails = new LinkToggleMetricsDetails(LinkToggleState.COUNT, DetailedContentType.NOT_SPECIFIED); - private DeviceLockActivityLauncher mDeviceLockActivityLauncher; + private final DeviceLockActivityLauncher mDeviceLockActivityLauncher; /** * Constructs a new ShareSheetCoordinator.
diff --git a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetUsageRankingHelper.java b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetUsageRankingHelper.java index bf64578..04fa26a 100644 --- a/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetUsageRankingHelper.java +++ b/chrome/browser/share/android/java/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetUsageRankingHelper.java
@@ -68,10 +68,10 @@ private final ShareSheetPropertyModelBuilder mPropertyModelBuilder; private final Profile mProfile; - private ShareSheetBottomSheetContent mBottomSheet; - private long mShareStartTime; - private @LinkGeneration int mLinkGenerationStatusForMetrics; - private LinkToggleMetricsDetails mLinkToggleMetricsDetails; + private final ShareSheetBottomSheetContent mBottomSheet; + private final long mShareStartTime; + private final @LinkGeneration int mLinkGenerationStatusForMetrics; + private final LinkToggleMetricsDetails mLinkToggleMetricsDetails; // Variables used for testing private boolean mDisableBridgeForTesting;
diff --git a/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/SaveBitmapDelegateTest.java b/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/SaveBitmapDelegateTest.java index 867da8c..2a0cf30 100644 --- a/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/SaveBitmapDelegateTest.java +++ b/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/SaveBitmapDelegateTest.java
@@ -114,7 +114,7 @@ private boolean mCalledHasPermission; private boolean mCalledCanRequestPermission; - private int mPermissionResult = PackageManager.PERMISSION_GRANTED; + private final int mPermissionResult = PackageManager.PERMISSION_GRANTED; public TestWindowAndroid(Context context) { super(context, /* trackOcclusion= */ true);
diff --git a/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/long_screenshots/bitmap_generation/LongScreenshotsCompositorTest.java b/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/long_screenshots/bitmap_generation/LongScreenshotsCompositorTest.java index 83229dd1f..d15752a 100644 --- a/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/long_screenshots/bitmap_generation/LongScreenshotsCompositorTest.java +++ b/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/long_screenshots/bitmap_generation/LongScreenshotsCompositorTest.java
@@ -35,8 +35,8 @@ public class LongScreenshotsCompositorTest { @Rule public final MockitoRule mMockitoRule = MockitoJUnit.rule(); private TestPlayerCompositorDelegate mCompositorDelegate; - private Bitmap mTestBitmap = Bitmap.createBitmap(512, 1024, Bitmap.Config.ARGB_8888); - private Rect mRect = new Rect(0, 100, 200, 1100); + private final Bitmap mTestBitmap = Bitmap.createBitmap(512, 1024, Bitmap.Config.ARGB_8888); + private final Rect mRect = new Rect(0, 100, 200, 1100); private boolean mErrorThrown; @Mock private GURL mTestGurl;
diff --git a/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/long_screenshots/bitmap_generation/LongScreenshotsEntryTest.java b/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/long_screenshots/bitmap_generation/LongScreenshotsEntryTest.java index 2bc6593..35d76109 100644 --- a/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/long_screenshots/bitmap_generation/LongScreenshotsEntryTest.java +++ b/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/long_screenshots/bitmap_generation/LongScreenshotsEntryTest.java
@@ -43,7 +43,7 @@ @Mock private ScreenshotBoundsManager mBoundsManager; - private Bitmap mTestBitmap = Bitmap.createBitmap(512, 1024, Bitmap.Config.ARGB_8888); + private final Bitmap mTestBitmap = Bitmap.createBitmap(512, 1024, Bitmap.Config.ARGB_8888); static class TestEntryListener implements LongScreenshotsEntry.EntryListener { @EntryStatus int mReturnedStatus;
diff --git a/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/qrcode/QrCodeDialogTest.java b/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/qrcode/QrCodeDialogTest.java index e503535..8f06f0d 100644 --- a/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/qrcode/QrCodeDialogTest.java +++ b/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/qrcode/QrCodeDialogTest.java
@@ -52,8 +52,8 @@ } public static class CustomQrCodeDialogTab implements QrCodeDialogTab { - private View mView; - private boolean mEnabled; + private final View mView; + private final boolean mEnabled; CustomQrCodeDialogTab(View view, boolean enabled) { mView = view;
diff --git a/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/screenshot/ScreenshotShareSheetViewTest.java b/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/screenshot/ScreenshotShareSheetViewTest.java index 18b13606..f45bb6e 100644 --- a/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/screenshot/ScreenshotShareSheetViewTest.java +++ b/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/screenshot/ScreenshotShareSheetViewTest.java
@@ -48,11 +48,11 @@ private PropertyModel mScreenshotModel; private PropertyModelChangeProcessor mScreenshotMCP; - private AtomicBoolean mCloseClicked = new AtomicBoolean(); - private AtomicBoolean mShareClicked = new AtomicBoolean(); - private AtomicBoolean mSaveClicked = new AtomicBoolean(); + private final AtomicBoolean mCloseClicked = new AtomicBoolean(); + private final AtomicBoolean mShareClicked = new AtomicBoolean(); + private final AtomicBoolean mSaveClicked = new AtomicBoolean(); - private Callback<Integer> mMockNoArgListener = + private final Callback<Integer> mMockNoArgListener = new Callback<Integer>() { @Override public void onResult(
diff --git a/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetTest.java b/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetTest.java index b2c0ee2..005018f 100644 --- a/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetTest.java +++ b/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetTest.java
@@ -203,7 +203,7 @@ * returns a configurable list of packages as available for ACTION_SEND type intents. */ private class PackageManagerReplacingContext extends ContextWrapper { - private ShareSheetTest mTest; + private final ShareSheetTest mTest; public PackageManagerReplacingContext(Context baseContext, ShareSheetTest test) { super(baseContext);
diff --git a/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetUsageRankingHelperTest.java b/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetUsageRankingHelperTest.java index 3534c2b..bdbd7c6 100644 --- a/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetUsageRankingHelperTest.java +++ b/chrome/browser/share/android/javatests/src/org/chromium/chrome/browser/share/share_sheet/ShareSheetUsageRankingHelperTest.java
@@ -72,8 +72,8 @@ private Activity mActivity; private ShareParams mParams; private ShareSheetUsageRankingHelper mShareSheetUsageRankingHelper; - private @LinkGeneration int mLinkGenerationStatusForMetrics = LinkGeneration.MAX; - private LinkToggleMetricsDetails mLinkToggleMetricsDetails = + private final @LinkGeneration int mLinkGenerationStatusForMetrics = LinkGeneration.MAX; + private final LinkToggleMetricsDetails mLinkToggleMetricsDetails = new LinkToggleMetricsDetails(LinkToggleState.COUNT, DetailedContentType.NOT_SPECIFIED); @Before
diff --git a/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/ProfileDataCache.java b/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/ProfileDataCache.java index c93f9e1..65324306 100644 --- a/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/ProfileDataCache.java +++ b/chrome/browser/signin/services/android/java/src/org/chromium/chrome/browser/signin/services/ProfileDataCache.java
@@ -123,7 +123,7 @@ // * Else if there is a default config, use that // * Else do not display a badge. private @Nullable BadgeConfig mDefaultBadgeConfig; - private Map<String, BadgeConfig> mPerAccountBadgeConfig = new HashMap<>(); + private final Map<String, BadgeConfig> mPerAccountBadgeConfig = new HashMap<>(); private final Drawable mPlaceholderImage; private final ObserverList<Observer> mObservers = new ObserverList<>(); private final Map<String, DisplayableProfileData> mCachedProfileData = new HashMap<>();
diff --git a/chrome/browser/single_tab/android/java/src/org/chromium/chrome/browser/single_tab/SingleTabSwitcherOnNtpMediator.java b/chrome/browser/single_tab/android/java/src/org/chromium/chrome/browser/single_tab/SingleTabSwitcherOnNtpMediator.java index bee6b4e..c183497 100644 --- a/chrome/browser/single_tab/android/java/src/org/chromium/chrome/browser/single_tab/SingleTabSwitcherOnNtpMediator.java +++ b/chrome/browser/single_tab/android/java/src/org/chromium/chrome/browser/single_tab/SingleTabSwitcherOnNtpMediator.java
@@ -63,10 +63,10 @@ private @Nullable Tab mMostRecentTab; private @Nullable Callback<Integer> mSingleTabCardClickedCallback; private @Nullable Runnable mSeeMoreLinkClickedCallback; - private @Nullable ThumbnailProvider mThumbnailProvider; + private final @Nullable ThumbnailProvider mThumbnailProvider; private @Nullable Size mThumbnailSize; private @Nullable DisplayStyleObserver mDisplayStyleObserver; - private @Nullable ModuleDelegate mModuleDelegate; + private final @Nullable ModuleDelegate mModuleDelegate; SingleTabSwitcherOnNtpMediator( Context context,
diff --git a/chrome/browser/single_tab/android/junit/src/org/chromium/chrome/browser/single_tab/SingleTabModuleViewBinderUnitTest.java b/chrome/browser/single_tab/android/junit/src/org/chromium/chrome/browser/single_tab/SingleTabModuleViewBinderUnitTest.java index 7756750..792d8109 100644 --- a/chrome/browser/single_tab/android/junit/src/org/chromium/chrome/browser/single_tab/SingleTabModuleViewBinderUnitTest.java +++ b/chrome/browser/single_tab/android/junit/src/org/chromium/chrome/browser/single_tab/SingleTabModuleViewBinderUnitTest.java
@@ -56,7 +56,7 @@ public class SingleTabModuleViewBinderUnitTest { private static final String TEST_TITLE = "test"; private static final String TEST_URL = "www.foo.com"; - private final int mTabId = 1; + private static final int TAB_ID = 1; private static final String HISTOGRAM_START_SURFACE_MODULE_CLICK = "StartSurface.Module.Click"; private Activity mActivity;
diff --git a/chrome/browser/ssl/chrome_security_blocking_page_factory.cc b/chrome/browser/ssl/chrome_security_blocking_page_factory.cc index 058d78e..6fc4c5a 100644 --- a/chrome/browser/ssl/chrome_security_blocking_page_factory.cc +++ b/chrome/browser/ssl/chrome_security_blocking_page_factory.cc
@@ -274,23 +274,39 @@ const GURL& request_url, security_interstitials::https_only_mode::HttpInterstitialState interstitial_state, + std::optional<std::string> url_type_param, security_interstitials::HttpsOnlyModeBlockingPage::MetricsCallback metrics_callback) { std::unique_ptr<HttpsOnlyModeControllerClient> client = - std::make_unique<HttpsOnlyModeControllerClient>(web_contents, - request_url); + std::make_unique<HttpsOnlyModeControllerClient>( + web_contents, request_url, CreateSettingsPageHelper()); Profile* profile = Profile::FromBrowserContext(web_contents->GetBrowserContext()); - interstitial_state.enabled_by_advanced_protection = - profile && - safe_browsing::AdvancedProtectionStatusManagerFactory::GetForProfile( - profile) - ->IsUnderAdvancedProtection(); - // HFM interstitial with Site Engagement heuristic is only shown if the - // feature flag is enabled, so update the relevant flag here. - interstitial_state.enabled_by_engagement_heuristic = - interstitial_state.enabled_by_engagement_heuristic && - base::FeatureList::IsEnabled(features::kHttpsFirstModeV2ForEngagedSites); + + if (url_type_param) { + if (*url_type_param == "advanced_protection") { + interstitial_state.enabled_by_advanced_protection = true; + } else if (*url_type_param == "site_engagement") { + interstitial_state.enabled_by_engagement_heuristic = true; + } else if (*url_type_param == "typically_secure") { + interstitial_state.enabled_by_typically_secure_browsing = true; + } else if (*url_type_param == "incognito") { + interstitial_state.enabled_by_incognito = true; + } + } else { + interstitial_state.enabled_by_advanced_protection = + profile && + safe_browsing::AdvancedProtectionStatusManagerFactory::GetForProfile( + profile) + ->IsUnderAdvancedProtection(); + // HFM interstitial with Site Engagement heuristic is only shown if the + // feature flag is enabled, so update the relevant flag here. + interstitial_state.enabled_by_engagement_heuristic = + interstitial_state.enabled_by_engagement_heuristic && + base::FeatureList::IsEnabled( + features::kHttpsFirstModeV2ForEngagedSites); + } + auto page = std::make_unique<security_interstitials::HttpsOnlyModeBlockingPage>( web_contents, request_url, std::move(client), interstitial_state,
diff --git a/chrome/browser/ssl/chrome_security_blocking_page_factory.h b/chrome/browser/ssl/chrome_security_blocking_page_factory.h index 68f57a02..4b58c2cc 100644 --- a/chrome/browser/ssl/chrome_security_blocking_page_factory.h +++ b/chrome/browser/ssl/chrome_security_blocking_page_factory.h
@@ -59,11 +59,10 @@ const net::SSLInfo& ssl_info, const std::string& mitm_software_name) override; std::unique_ptr<BlockedInterceptionBlockingPage> - CreateBlockedInterceptionBlockingPage( - content::WebContents* web_contents, - int cert_error, - const GURL& request_url, - const net::SSLInfo& ssl_info) override; + CreateBlockedInterceptionBlockingPage(content::WebContents* web_contents, + int cert_error, + const GURL& request_url, + const net::SSLInfo& ssl_info) override; std::unique_ptr<security_interstitials::InsecureFormBlockingPage> CreateInsecureFormBlockingPage(content::WebContents* web_contents, const GURL& request_url) override; @@ -73,6 +72,7 @@ const GURL& request_url, security_interstitials::https_only_mode::HttpInterstitialState interstitial_state, + std::optional<std::string> url_type_param, security_interstitials::HttpsOnlyModeBlockingPage::MetricsCallback metrics_callback) override;
diff --git a/chrome/browser/ssl/https_only_mode_controller_client.cc b/chrome/browser/ssl/https_only_mode_controller_client.cc index 47de6d90..f5d9b44 100644 --- a/chrome/browser/ssl/https_only_mode_controller_client.cc +++ b/chrome/browser/ssl/https_only_mode_controller_client.cc
@@ -26,7 +26,9 @@ HttpsOnlyModeControllerClient::HttpsOnlyModeControllerClient( content::WebContents* web_contents, - const GURL& request_url) + const GURL& request_url, + std::unique_ptr<security_interstitials::SettingsPageHelper> + settings_page_helper) : SecurityInterstitialControllerClient( web_contents, GetMetricsHelper(request_url), @@ -34,7 +36,7 @@ ->GetPrefs(), g_browser_process->GetApplicationLocale(), GURL(chrome::kChromeUINewTabURL), - /*settings_page_helper=*/nullptr), + std::move(settings_page_helper)), web_contents_(web_contents), request_url_(request_url) {}
diff --git a/chrome/browser/ssl/https_only_mode_controller_client.h b/chrome/browser/ssl/https_only_mode_controller_client.h index 3c782ce..630fe109 100644 --- a/chrome/browser/ssl/https_only_mode_controller_client.h +++ b/chrome/browser/ssl/https_only_mode_controller_client.h
@@ -14,6 +14,7 @@ namespace security_interstitials { class MetricsHelper; +class SettingsPageHelper; } // namespace security_interstitials class HttpsOnlyModeControllerClient @@ -22,8 +23,11 @@ static std::unique_ptr<security_interstitials::MetricsHelper> GetMetricsHelper(const GURL& url); - HttpsOnlyModeControllerClient(content::WebContents* web_contents, - const GURL& request_url); + HttpsOnlyModeControllerClient( + content::WebContents* web_contents, + const GURL& request_url, + std::unique_ptr<security_interstitials::SettingsPageHelper> + settings_page_helper); HttpsOnlyModeControllerClient(const HttpsOnlyModeControllerClient&) = delete; HttpsOnlyModeControllerClient& operator=( const HttpsOnlyModeControllerClient&) = delete;
diff --git a/chrome/browser/ssl/https_upgrades_navigation_throttle.cc b/chrome/browser/ssl/https_upgrades_navigation_throttle.cc index 7dc41cb0..a1695623 100644 --- a/chrome/browser/ssl/https_upgrades_navigation_throttle.cc +++ b/chrome/browser/ssl/https_upgrades_navigation_throttle.cc
@@ -168,6 +168,7 @@ blocking_page = blocking_page_factory_->CreateHttpsOnlyModeBlockingPage( contents, handle->GetURL(), interstitial_state_, + /*url_type_param=*/std::nullopt, base::BindRepeating(&RecordHttpsFirstModeUKM, source_id)); std::string interstitial_html = blocking_page->GetHTMLContents(); security_interstitials::SecurityInterstitialTabHelper:: @@ -229,6 +230,7 @@ std::unique_ptr<security_interstitials::HttpsOnlyModeBlockingPage> blocking_page = blocking_page_factory_->CreateHttpsOnlyModeBlockingPage( contents, handle->GetURL(), interstitial_state_, + /*url_type_param=*/std::nullopt, base::BindRepeating(&RecordHttpsFirstModeUKM, source_id)); std::string interstitial_html = blocking_page->GetHTMLContents(); security_interstitials::SecurityInterstitialTabHelper::
diff --git a/chrome/browser/supervised_user/android/javatests/src/org/chromium/chrome/browser/supervised_user/IncognitoSignInInteractionTest.java b/chrome/browser/supervised_user/android/javatests/src/org/chromium/chrome/browser/supervised_user/IncognitoSignInInteractionTest.java index 268dfde..ba35015 100644 --- a/chrome/browser/supervised_user/android/javatests/src/org/chromium/chrome/browser/supervised_user/IncognitoSignInInteractionTest.java +++ b/chrome/browser/supervised_user/android/javatests/src/org/chromium/chrome/browser/supervised_user/IncognitoSignInInteractionTest.java
@@ -38,7 +38,7 @@ /** Waits until the Incognito Tab is closed. */ private static class TabClosedWaiter extends EmptyTabObserver { - private CallbackHelper mCallbackHelper; + private final CallbackHelper mCallbackHelper; public TabClosedWaiter() { mCallbackHelper = new CallbackHelper();
diff --git a/chrome/browser/sync/android/java/src/org/chromium/chrome/browser/sync/ui/bookmark_batch_upload_card/BookmarkBatchUploadCardMediator.java b/chrome/browser/sync/android/java/src/org/chromium/chrome/browser/sync/ui/bookmark_batch_upload_card/BookmarkBatchUploadCardMediator.java index e38dedc..45c5bd51 100644 --- a/chrome/browser/sync/android/java/src/org/chromium/chrome/browser/sync/ui/bookmark_batch_upload_card/BookmarkBatchUploadCardMediator.java +++ b/chrome/browser/sync/android/java/src/org/chromium/chrome/browser/sync/ui/bookmark_batch_upload_card/BookmarkBatchUploadCardMediator.java
@@ -64,7 +64,7 @@ private final ReauthenticatorBridge mReauthenticatorBridge; private final Runnable mBatchUploadCardChangeAction; - private @Nullable SyncService mSyncService; + private final @Nullable SyncService mSyncService; private @MonotonicNonNull HashMap<Integer, LocalDataDescription> mLocalDataDescriptionsMap; private boolean mShouldBeVisible;
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/SadTabView.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/SadTabView.java index fc0dc94c..0596e72 100644 --- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/SadTabView.java +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/SadTabView.java
@@ -18,13 +18,12 @@ public class SadTabView extends ScrollView { // Dimension (dp) at which reload button is dynamically sized and content centers private static final int MAX_BUTTON_WIDTH_DP = 620; - private int mThresholdPx; - private float mDensity; + private final int mThresholdPx; public SadTabView(Context context, AttributeSet attrs) { super(context, attrs); - mDensity = context.getResources().getDisplayMetrics().density; - mThresholdPx = (int) (mDensity * MAX_BUTTON_WIDTH_DP); + float density = context.getResources().getDisplayMetrics().density; + mThresholdPx = (int) (density * MAX_BUTTON_WIDTH_DP); } @Override
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabSupplierObserverTest.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabSupplierObserverTest.java index 71e7ad06..cf71623 100644 --- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabSupplierObserverTest.java +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabSupplierObserverTest.java
@@ -34,7 +34,7 @@ @Mock private Tab mAnotherMockedTab; - private ObservableSupplierImpl<Tab> mObservableTabSupplier = + private final ObservableSupplierImpl<Tab> mObservableTabSupplier = new ObservableSupplierImpl<>(mMockTab); /** A test observer that provides access to the tab being observed. */
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/LevelDBPersistedDataStorage.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/LevelDBPersistedDataStorage.java index 5c4b8b9..e045c78 100644 --- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/LevelDBPersistedDataStorage.java +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/LevelDBPersistedDataStorage.java
@@ -21,7 +21,7 @@ public class LevelDBPersistedDataStorage implements PersistedDataStorage { private static boolean sSkipNativeAssertionsForTesting; private long mNativePersistedStateDB; - private String mNamespace; + private final String mNamespace; /** * @param profile corresponding to LevelDBPersistedDataStorage instance
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/LevelDBPersistedTabDataStorage.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/LevelDBPersistedTabDataStorage.java index 41cf8a7..f22d183 100644 --- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/LevelDBPersistedTabDataStorage.java +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/LevelDBPersistedTabDataStorage.java
@@ -29,8 +29,8 @@ // LevelDBPersitsedDataStorage is a generalization of the original // LevelDBPersistedTabDataStorage which introduced namespaces to avoid collisions between // clients. - private static String sNamespace = ""; - private LevelDBPersistedDataStorage mPersistedDataStorage; + private static final String NAMESPACE = ""; + private final LevelDBPersistedDataStorage mPersistedDataStorage; // Callback is only used for synchronization of save and delete in testing. // Otherwise it is a no-op. // TODO(crbug.com/40156389) Apply tricks like @CheckDiscard or proguard rules to improve @@ -40,7 +40,7 @@ LevelDBPersistedTabDataStorage(Profile profile) { assert !profile.isOffTheRecord() : "LevelDBPersistedTabDataStorage is not supported for incognito profiles"; - mPersistedDataStorage = new LevelDBPersistedDataStorage(profile, sNamespace); + mPersistedDataStorage = new LevelDBPersistedDataStorage(profile, NAMESPACE); } @MainThread
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/LevelDBPersistedTabDataStorageFactory.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/LevelDBPersistedTabDataStorageFactory.java index 1e5c54f5..6265c55 100644 --- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/LevelDBPersistedTabDataStorageFactory.java +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/LevelDBPersistedTabDataStorageFactory.java
@@ -13,8 +13,8 @@ @NullMarked public class LevelDBPersistedTabDataStorageFactory implements PersistedTabDataStorageFactory<LevelDBPersistedTabDataStorage> { - private static ProfileKeyedMap<LevelDBPersistedTabDataStorage> sProfileToLevelDBStorageMap = - ProfileKeyedMap.createMapOfDestroyables(); + private static final ProfileKeyedMap<LevelDBPersistedTabDataStorage> + sProfileToLevelDBStorageMap = ProfileKeyedMap.createMapOfDestroyables(); @Override public LevelDBPersistedTabDataStorage create() {
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/PersistedTabData.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/PersistedTabData.java index 5ce1764..fd709a3 100644 --- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/PersistedTabData.java +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/PersistedTabData.java
@@ -47,7 +47,7 @@ private static final Map<String, List<Callback>> sCachedCallbacks = new HashMap<>(); private static final long NEEDS_UPDATE_DISABLED = Long.MAX_VALUE; private static final long LAST_UPDATE_UNKNOWN = 0; - private static Set<Class<? extends PersistedTabData>> sSupportedMaintenanceClasses = + private static final Set<Class<? extends PersistedTabData>> sSupportedMaintenanceClasses = new HashSet<>(); protected final Tab mTab; private final PersistedTabDataStorage mPersistedTabDataStorage;
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/ShoppingPersistedTabData.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/ShoppingPersistedTabData.java index 6c93ea6..3a7f3fe 100644 --- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/ShoppingPersistedTabData.java +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/ShoppingPersistedTabData.java
@@ -77,14 +77,14 @@ @VisibleForTesting public static final long NO_PRICE_KNOWN = -1; - private static Queue<ShoppingDataRequest> sShoppingDataRequests = new ArrayDeque<>(); + private static final Queue<ShoppingDataRequest> sShoppingDataRequests = new ArrayDeque<>(); private static boolean sDelayedInitFinished; public long mLastPriceChangeTimeMs = NO_TRANSITIONS_OCCURRED; private PriceDropData mPriceDropData = new PriceDropData(); private PriceDropMetricsLogger mPriceDropMetricsLogger; - private Map<String, CurrencyFormatter> mCurrencyFormatterMap = new HashMap<>(); + private final Map<String, CurrencyFormatter> mCurrencyFormatterMap = new HashMap<>(); @VisibleForTesting protected ObservableSupplierImpl<Boolean> mIsTabSaveEnabledSupplier = @@ -111,8 +111,8 @@ * until DeferredStartup. */ private static class ShoppingDataRequest { - public Tab tab; - public Callback<@Nullable ShoppingPersistedTabData> callback; + public final Tab tab; + public final Callback<@Nullable ShoppingPersistedTabData> callback; /** * @param tab {@link Tab} {@link ShoppingPersistedTabData} is being acquired for
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/ShoppingPersistedTabDataService.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/ShoppingPersistedTabDataService.java index 67f4a1a1..5acc0bb2 100644 --- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/ShoppingPersistedTabDataService.java +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/state/ShoppingPersistedTabDataService.java
@@ -47,8 +47,8 @@ * service. */ public static class PriceChangeItem { - private Tab mTab; - private ShoppingPersistedTabData mData; + private final Tab mTab; + private final ShoppingPersistedTabData mData; public PriceChangeItem(Tab tab, ShoppingPersistedTabData data) { mTab = tab;
diff --git a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/NavigationTracker.java b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/NavigationTracker.java index 273d21f..be72fd80 100644 --- a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/NavigationTracker.java +++ b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/NavigationTracker.java
@@ -59,7 +59,7 @@ */ private static class SyncNavigationUserData implements UserData { /** An ID that can be used to track the navigation. */ - private int mRequestID; + private final int mRequestID; /** Constructor. */ public SyncNavigationUserData(int requestID) {
diff --git a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/NavigationTrackerUnitTest.java b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/NavigationTrackerUnitTest.java index 826ac67..3b8a8f9 100644 --- a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/NavigationTrackerUnitTest.java +++ b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/NavigationTrackerUnitTest.java
@@ -16,7 +16,7 @@ @RunWith(BaseRobolectricTestRunner.class) @Config(manifest = Config.NONE) public class NavigationTrackerUnitTest { - private NavigationTracker mNavigationTracker = new NavigationTracker(); + private final NavigationTracker mNavigationTracker = new NavigationTracker(); @Test public void testSyncInitiatedNavigation() {
diff --git a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncIntegrationTestHelper.java b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncIntegrationTestHelper.java index e4e58d1..ce6d75f 100644 --- a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncIntegrationTestHelper.java +++ b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncIntegrationTestHelper.java
@@ -62,7 +62,7 @@ GUID_10); private Iterator<String> mGuidIterator; - private SyncTestRule mSyncTestRule; + private final SyncTestRule mSyncTestRule; /** * Helper for handling or asserting on changes to the fake sync server.
diff --git a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TestTabGroupSyncService.java b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TestTabGroupSyncService.java index 8616b181..5457e93e 100644 --- a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TestTabGroupSyncService.java +++ b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TestTabGroupSyncService.java
@@ -26,7 +26,7 @@ public static final String SYNC_ID_1 = "SYNC_ID_1"; public static final String LOCAL_DEVICE_CACHE_GUID = "LocalDevice"; - private List<SavedTabGroup> mTabGroups = new ArrayList<>(); + private final List<SavedTabGroup> mTabGroups = new ArrayList<>(); @Override public void addObserver(Observer observer) {}
diff --git a/chrome/browser/tab_ui/android/java/src/org/chromium/chrome/browser/tab_ui/RecyclerViewPosition.java b/chrome/browser/tab_ui/android/java/src/org/chromium/chrome/browser/tab_ui/RecyclerViewPosition.java index 9091798e..d4bdb09e 100644 --- a/chrome/browser/tab_ui/android/java/src/org/chromium/chrome/browser/tab_ui/RecyclerViewPosition.java +++ b/chrome/browser/tab_ui/android/java/src/org/chromium/chrome/browser/tab_ui/RecyclerViewPosition.java
@@ -9,8 +9,8 @@ /** A structure for holding the a recycler view position and offset. */ @NullMarked public class RecyclerViewPosition { - private int mPosition; - private int mOffset; + private final int mPosition; + private final int mOffset; /** * @param position The position of the first visible item in the recyclerView.
diff --git a/chrome/browser/tab_ui/android/java/src/org/chromium/chrome/browser/tab_ui/TabContentManager.java b/chrome/browser/tab_ui/android/java/src/org/chromium/chrome/browser/tab_ui/TabContentManager.java index 1e31913a..e76a5b8 100644 --- a/chrome/browser/tab_ui/android/java/src/org/chromium/chrome/browser/tab_ui/TabContentManager.java +++ b/chrome/browser/tab_ui/android/java/src/org/chromium/chrome/browser/tab_ui/TabContentManager.java
@@ -87,14 +87,14 @@ private static final String UMA_THUMBNAIL_CAPTURE_DURATION_FORMAT = "Android.TabContentManager.CaptureThumbnail.%s.Duration"; - private float mThumbnailScale; + private final float mThumbnailScale; /** * The limit on the number of fullsized or ETC1 compressed thumbnails in the in-memory cache. * If in future there is a need for more bitmaps to be visible on the screen at once this value * can be increased. */ - private int mFullResThumbnailsMaxSize; + private final int mFullResThumbnailsMaxSize; private final BrowserControlsStateProvider mBrowserControlsStateProvider; private long mNativeTabContentManager;
diff --git a/chrome/browser/tab_ui/android/java/src/org/chromium/chrome/browser/tab_ui/TabThumbnailView.java b/chrome/browser/tab_ui/android/java/src/org/chromium/chrome/browser/tab_ui/TabThumbnailView.java index 7d58101..6cb1c4e 100644 --- a/chrome/browser/tab_ui/android/java/src/org/chromium/chrome/browser/tab_ui/TabThumbnailView.java +++ b/chrome/browser/tab_ui/android/java/src/org/chromium/chrome/browser/tab_ui/TabThumbnailView.java
@@ -52,7 +52,7 @@ private static @MonotonicNonNull Integer sVerticalOffsetPx; /** To prevent {@link TabThumbnailView#updateImage()} from running during inflation. */ - private boolean mInitialized; + private final boolean mInitialized; /** * Placeholder icon drawable to use if there is no thumbnail. This is drawn on-top of the {@link @@ -63,7 +63,7 @@ */ private @Nullable VectorDrawable mIconDrawable; - private Matrix mIconMatrix; + private final Matrix mIconMatrix; private int mIconColor; /**
diff --git a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabGroupMetadata.java b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabGroupMetadata.java index ea731be..8078f1f 100644 --- a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabGroupMetadata.java +++ b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabGroupMetadata.java
@@ -7,13 +7,14 @@ import android.os.Bundle; import androidx.annotation.ColorInt; +import androidx.annotation.VisibleForTesting; import org.chromium.base.Token; import org.chromium.build.annotations.NullMarked; import org.chromium.build.annotations.Nullable; -import java.util.HashMap; -import java.util.LinkedHashMap; +import java.util.ArrayList; +import java.util.Map; import java.util.Objects; /** @@ -26,7 +27,7 @@ private static final String KEY_SELECTED_TAB_ID = "selectedTabId"; private static final String KEY_SOURCE_WINDOW_ID = "sourceWindowId"; private static final String KEY_TAB_GROUP_ID = "tabGroupId"; - private static final String KEY_TAB_IDS_TO_URLS = "tabIdsToUrls"; + @VisibleForTesting static final String KEY_TAB_IDS_TO_URLS = "tabIdsToUrls"; private static final String KEY_TAB_GROUP_COLOR = "tabGroupColor"; private static final String KEY_TAB_GROUP_TITLE = "tabGroupTitle"; private static final String KEY_TAB_GROUP_COLLAPSED = "tabGroupCollapsed"; @@ -38,7 +39,6 @@ public final int selectedTabId; public final int sourceWindowId; public final Token tabGroupId; - public final LinkedHashMap<Integer, String> tabIdsToUrls; public final @ColorInt int tabGroupColor; public final @Nullable String tabGroupTitle; public final @Nullable String mhtmlTabTitle; @@ -47,13 +47,22 @@ public final boolean isIncognito; /** + * See <a href="https://crbug.com/416345985">bug</a> for more details. We previously attempted + * to preserve {@link org.chromium.chrome.browser.tab.Tab} order with a {@link + * java.util.LinkedHashMap}, but this gets clobbered when passing the {@link Bundle} to the + * target {@link android.app.Activity}. This is because the map gets parsed as a regular {@link + * Map} when to writing to (then reading from) a {@link android.os.Parcel}. + */ + public final ArrayList<Map.Entry<Integer, String>> tabIdsToUrls; + + /** * Constructs a {@link TabGroupMetadata} object that stores metadata about a tab group. * * @param rootId The root ID of the group. * @param selectedTabId The selected tab ID of the group. * @param sourceWindowId The ID of the window that holds the tab group before re-parenting. * @param tabGroupId The stable ID for the tab group. - * @param tabIdsToUrls The LinkedHashMap containing key-value pairs of tab IDs and URLs. + * @param tabIdsToUrls The {@link ArrayList} containing key-value pairs of tab IDs and URLs. * @param tabGroupColor The color of the tab group. * @param tabGroupTitle The title of the tab group. * @param mhtmlTabTitle The title of the first MHTML tab in the group if there is any. @@ -66,7 +75,7 @@ int selectedTabId, int sourceWindowId, Token tabGroupId, - LinkedHashMap<Integer, String> tabIdsToUrls, + ArrayList<Map.Entry<Integer, String>> tabIdsToUrls, @ColorInt int tabGroupColor, @Nullable String tabGroupTitle, @Nullable String mhtmlTabTitle, @@ -117,9 +126,8 @@ // A valid bundle should have all required properties. @Nullable Token tabGroupIdFromBundle = Token.maybeCreateFromBundle(bundle.getBundle(KEY_TAB_GROUP_ID)); - LinkedHashMap<Integer, String> tabIdsToUrls = - new LinkedHashMap<>( - (HashMap<Integer, String>) bundle.getSerializable(KEY_TAB_IDS_TO_URLS)); + ArrayList<Map.Entry<Integer, String>> tabIdsToUrls = + (ArrayList<Map.Entry<Integer, String>>) bundle.getSerializable(KEY_TAB_IDS_TO_URLS); if (tabGroupIdFromBundle == null || tabIdsToUrls == null || tabIdsToUrls.isEmpty() @@ -131,20 +139,18 @@ || !bundle.containsKey(KEY_IS_GROUP_SHARED) || !bundle.containsKey(KEY_IS_INCOGNITO)) return null; - TabGroupMetadata tabGroupMetadata = - new TabGroupMetadata( - bundle.getInt(KEY_ROOT_ID), - bundle.getInt(KEY_SELECTED_TAB_ID), - bundle.getInt(KEY_SOURCE_WINDOW_ID), - tabGroupIdFromBundle, - tabIdsToUrls, - bundle.getInt(KEY_TAB_GROUP_COLOR), - bundle.getString(KEY_TAB_GROUP_TITLE), - bundle.getString(KEY_MHTML_TAB_TITLE), - bundle.getBoolean(KEY_TAB_GROUP_COLLAPSED), - bundle.getBoolean(KEY_IS_GROUP_SHARED), - bundle.getBoolean(KEY_IS_INCOGNITO)); - return tabGroupMetadata; + return new TabGroupMetadata( + bundle.getInt(KEY_ROOT_ID), + bundle.getInt(KEY_SELECTED_TAB_ID), + bundle.getInt(KEY_SOURCE_WINDOW_ID), + tabGroupIdFromBundle, + tabIdsToUrls, + bundle.getInt(KEY_TAB_GROUP_COLOR), + bundle.getString(KEY_TAB_GROUP_TITLE), + bundle.getString(KEY_MHTML_TAB_TITLE), + bundle.getBoolean(KEY_TAB_GROUP_COLLAPSED), + bundle.getBoolean(KEY_IS_GROUP_SHARED), + bundle.getBoolean(KEY_IS_INCOGNITO)); } @Override
diff --git a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabGroupMetadataExtractor.java b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabGroupMetadataExtractor.java index 52e9dcaf..c16a697 100644 --- a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabGroupMetadataExtractor.java +++ b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabGroupMetadataExtractor.java
@@ -14,8 +14,10 @@ import org.chromium.components.embedder_support.util.UrlConstants; import org.chromium.components.external_intents.ExternalNavigationHandler; -import java.util.LinkedHashMap; +import java.util.AbstractMap; +import java.util.ArrayList; import java.util.List; +import java.util.Map; /** Utility class for extracting metadata from a list of tabs that form a tab group. */ @NullMarked @@ -36,12 +38,12 @@ int sourceWindowIndex, int selectedTabId, boolean isGroupShared) { - if (groupedTabs.size() == 0) return null; + if (groupedTabs.isEmpty()) return null; // 1. Collect IDs and URLs for each tab in the group. Check if the selected tab is in the // tab group, otherwise default select the first tab in the group after re-parenting to // destination window. - LinkedHashMap<Integer, String> tabIdsToUrls = new LinkedHashMap(); + ArrayList<Map.Entry<Integer, String>> tabIdsToUrls = new ArrayList<>(); @Nullable String mhtmlTabTitle = null; boolean selectedTabIsInGroup = false; // Tabs are stored in reverse to ensure the correct opening order. Because tabs are inserted @@ -51,7 +53,7 @@ Tab tab = groupedTabs.get(i); if (tab.getId() == selectedTabId) selectedTabIsInGroup = true; String url = tab.getUrl().getSpec(); - tabIdsToUrls.put(tab.getId(), url); + tabIdsToUrls.add(new AbstractMap.SimpleImmutableEntry<>(tab.getId(), url)); if (isMhtmlUrl(url)) { mhtmlTabTitle = tab.getTitle(); } @@ -73,20 +75,18 @@ if (tabGroupCollapsed) selectedTabId = Tab.INVALID_TAB_ID; // 4. Create and populate TabGroupMetadata with data gathered above. - TabGroupMetadata tabGroupMetadata = - new TabGroupMetadata( - rootId, - selectedTabId, - sourceWindowIndex, - tabGroupId, - tabIdsToUrls, - tabGroupColor, - tabGroupTitle, - mhtmlTabTitle, - tabGroupCollapsed, - isGroupShared, - firstTab.isIncognitoBranded()); - return tabGroupMetadata; + return new TabGroupMetadata( + rootId, + selectedTabId, + sourceWindowIndex, + tabGroupId, + tabIdsToUrls, + tabGroupColor, + tabGroupTitle, + mhtmlTabTitle, + tabGroupCollapsed, + isGroupShared, + firstTab.isIncognitoBranded()); } private static boolean isMhtmlUrl(String url) {
diff --git a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabGroupMetadataUnitTest.java b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabGroupMetadataUnitTest.java index 550e556..5eab4ddc 100644 --- a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabGroupMetadataUnitTest.java +++ b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabGroupMetadataUnitTest.java
@@ -4,12 +4,16 @@ package org.chromium.chrome.browser.tabmodel; -import static org.junit.Assert.assertTrue; +import static org.junit.Assert.assertEquals; +import android.annotation.SuppressLint; import android.content.Intent; +import android.os.Bundle; +import android.os.Parcel; import androidx.annotation.ColorInt; +import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.annotation.Config; @@ -20,8 +24,10 @@ import org.chromium.chrome.browser.IntentHandler; import org.chromium.chrome.browser.flags.ChromeFeatureList; -import java.util.LinkedHashMap; -import java.util.Map; +import java.util.AbstractMap; +import java.util.ArrayList; +import java.util.List; +import java.util.Map.Entry; /** Tests for {@link TabGroupMetadata}. */ @RunWith(BaseRobolectricTestRunner.class) @@ -29,12 +35,12 @@ @EnableFeatures({ChromeFeatureList.TAB_STRIP_GROUP_DRAG_DROP_ANDROID}) public class TabGroupMetadataUnitTest { - private static final LinkedHashMap<Integer, String> TAB_IDS_TO_URLS = - new LinkedHashMap<>( - Map.ofEntries( - Map.entry(1, "https://www.amazon.com"), - Map.entry(2, "https://www.youtube.com"), - Map.entry(3, "https://www.facebook.com"))); + private static final ArrayList<Entry<Integer, String>> TAB_IDS_TO_URLS = + new ArrayList<>( + List.of( + new AbstractMap.SimpleEntry<>(1, "https://www.amazon.com"), + new AbstractMap.SimpleEntry<>(2, "https://www.youtube.com"), + new AbstractMap.SimpleEntry<>(3, "https://www.facebook.com"))); private static final Token TAB_GROUP_ID = new Token(2L, 2L); private static final int ROOT_ID = 1; private static final int SELECTED_TAB_ID = 2; @@ -45,12 +51,12 @@ private static final boolean TAB_GROUP_COLLAPSED = true; private static final boolean IS_GROUP_SHARED = false; private static final boolean IS_INCOGNITO = false; - private Intent mIntent = new Intent(); + + private final Intent mIntent = new Intent(); private TabGroupMetadata mTabGroupMetadata; - @Test - public void testTabGroupMetadataIntentPersistence_SerializeAndDeserialize() { - // Initialize the metadata object and store it in the intent through serialization. + @Before + public void setup() { mTabGroupMetadata = new TabGroupMetadata( ROOT_ID, @@ -64,6 +70,11 @@ TAB_GROUP_COLLAPSED, IS_GROUP_SHARED, IS_INCOGNITO); + } + + @Test + public void testTabGroupMetadataIntentPersistence_SerializeAndDeserialize() { + // Store the metadata in the intent through serialization. IntentHandler.setTabGroupMetadata(mIntent, mTabGroupMetadata); // Get the deserialized metadata object from intent. @@ -71,8 +82,39 @@ // Assert that the deserialized metadata matches the original to confirm successful // deserialization. - assertTrue( + assertEquals( "The metadata should be the same as the original metadata", - mTabGroupMetadata.equals(deserializedMetadata)); + mTabGroupMetadata, + deserializedMetadata); + } + + /** See {@link TabGroupMetadata#tabIdsToUrls} for more context. */ + @Test + public void testTabIdsToUrlsOrder() { + // Write the metadata Bundle to a Parcel. + Parcel parcel = Parcel.obtain(); + try { + // Serialize the metadata. + parcel.writeBundle(mTabGroupMetadata.toBundle()); + + // Read back the metadata. + parcel.setDataPosition(0); + Bundle bundle = parcel.readBundle(getClass().getClassLoader()); + assert bundle != null; + @SuppressLint("VisibleForTests") + ArrayList<?> deserializedList = + (ArrayList<?>) bundle.getSerializable(TabGroupMetadata.KEY_TAB_IDS_TO_URLS); + + // Verify the ordering is retained. + assert deserializedList != null; + for (int i = 0; i < TAB_IDS_TO_URLS.size(); i++) { + assertEquals( + "Unexpected ordering after deserialization.", + TAB_IDS_TO_URLS.get(i), + deserializedList.get(i)); + } + } finally { + parcel.recycle(); + } } }
diff --git a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabGroupModelFilterImpl.java b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabGroupModelFilterImpl.java index a885169..642a7cd51 100644 --- a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabGroupModelFilterImpl.java +++ b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabGroupModelFilterImpl.java
@@ -92,7 +92,7 @@ * The set of tab group IDs that are currently hiding. This cannot be stored on {@link TabGroup} * as for undoable closures that object will already be gone before tab closures are finished. */ - private Set<Token> mHidingTabGroups = new HashSet<>(); + private final Set<Token> mHidingTabGroups = new HashSet<>(); private int mCurrentGroupIndex = TabList.INVALID_TAB_INDEX; private boolean mShouldRecordUma = true;
diff --git a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabGroupModelFilterImplUnitTest.java b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabGroupModelFilterImplUnitTest.java index 60bbf3c..be4add3 100644 --- a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabGroupModelFilterImplUnitTest.java +++ b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabGroupModelFilterImplUnitTest.java
@@ -160,7 +160,7 @@ private Tab mTab4; private Tab mTab5; private Tab mTab6; - private List<Tab> mTabs = new ArrayList<>(); + private final List<Tab> mTabs = new ArrayList<>(); private TabGroupModelFilterImpl mTabGroupModelFilter; private InOrder mTabModelInOrder;
diff --git a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabGroupUtilsUnitTest.java b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabGroupUtilsUnitTest.java index 15f1b0a..38bfb687 100644 --- a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabGroupUtilsUnitTest.java +++ b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabGroupUtilsUnitTest.java
@@ -51,7 +51,6 @@ import java.util.ArrayList; import java.util.Arrays; -import java.util.LinkedHashMap; import java.util.List; import java.util.Map; @@ -72,9 +71,9 @@ private static final Token TAB_GROUP_ID1 = new Token(2L, 2L); private static final Token TAB_GROUP_ID2 = new Token(4L, 4L); private static final String TAB_GROUP_TITLE = "Regrouped tabs"; - private static final LinkedHashMap<Integer, String> TAB_IDS_TO_URLS = - new LinkedHashMap<>( - Map.ofEntries( + private static final ArrayList<Map.Entry<Integer, String>> TAB_IDS_TO_URLS = + new ArrayList<>( + List.of( Map.entry(TAB1_ID, "https://www.amazon.com/"), Map.entry(TAB2_ID, "https://www.youtube.com/"), Map.entry(TAB3_ID, "https://www.facebook.com/")));
diff --git a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorTabObserver.java b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorTabObserver.java index fc9ab474..a95ea55 100644 --- a/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorTabObserver.java +++ b/chrome/browser/tabmodel/android/java/src/org/chromium/chrome/browser/tabmodel/TabModelSelectorTabObserver.java
@@ -19,7 +19,7 @@ public class TabModelSelectorTabObserver extends EmptyTabObserver { private final TabModelSelectorTabRegistrationObserver mTabRegistrationObserver; private boolean mShouldDeferTabRegisterNotifications; - private List<Tab> mDeferredTabs = new ArrayList<>(); + private final List<Tab> mDeferredTabs = new ArrayList<>(); private boolean mIsDestroyed; private boolean mIsDeferredInitializationFinished;
diff --git a/chrome/browser/task_manager/internal/android/java/src/org/chromium/chrome/browser/task_manager/TaskManagerServiceBridge.java b/chrome/browser/task_manager/internal/android/java/src/org/chromium/chrome/browser/task_manager/TaskManagerServiceBridge.java index db8f536..989dda0a 100644 --- a/chrome/browser/task_manager/internal/android/java/src/org/chromium/chrome/browser/task_manager/TaskManagerServiceBridge.java +++ b/chrome/browser/task_manager/internal/android/java/src/org/chromium/chrome/browser/task_manager/TaskManagerServiceBridge.java
@@ -103,7 +103,7 @@ } public static class ObserverHandle { - private long mPointer; + private final long mPointer; ObserverHandle(long pointer) { mPointer = pointer;
diff --git a/chrome/browser/thumbnail/generator/android/java/src/org/chromium/chrome/browser/thumbnail/generator/ThumbnailDiskStorage.java b/chrome/browser/thumbnail/generator/android/java/src/org/chromium/chrome/browser/thumbnail/generator/ThumbnailDiskStorage.java index 50c60ea..c723fed 100644 --- a/chrome/browser/thumbnail/generator/android/java/src/org/chromium/chrome/browser/thumbnail/generator/ThumbnailDiskStorage.java +++ b/chrome/browser/thumbnail/generator/android/java/src/org/chromium/chrome/browser/thumbnail/generator/ThumbnailDiskStorage.java
@@ -78,7 +78,7 @@ // This should be initialized once. private @Nullable File mDirectory; - private ThumbnailStorageDelegate mDelegate; + private final ThumbnailStorageDelegate mDelegate; // Maximum size in bytes for the disk cache. private final int mMaxCacheBytes;
diff --git a/chrome/browser/thumbnail/generator/android/java/src/org/chromium/chrome/browser/thumbnail/generator/ThumbnailDiskStorageTest.java b/chrome/browser/thumbnail/generator/android/java/src/org/chromium/chrome/browser/thumbnail/generator/ThumbnailDiskStorageTest.java index 81b0c60..4264c94 100644 --- a/chrome/browser/thumbnail/generator/android/java/src/org/chromium/chrome/browser/thumbnail/generator/ThumbnailDiskStorageTest.java +++ b/chrome/browser/thumbnail/generator/android/java/src/org/chromium/chrome/browser/thumbnail/generator/ThumbnailDiskStorageTest.java
@@ -45,7 +45,7 @@ private TestThumbnailDiskStorage mTestThumbnailDiskStorage; private static class TestThumbnailRequest implements ThumbnailProvider.ThumbnailRequest { - private String mContentId; + private final String mContentId; public TestThumbnailRequest(String contentId) { mContentId = contentId; @@ -78,7 +78,7 @@ private static class TestThumbnailDiskStorage extends ThumbnailDiskStorage { // Incremented when adding an existing entry and trimming. Accessed by test and UI threads. - public AtomicInteger removeCount = new AtomicInteger(); + public final AtomicInteger removeCount = new AtomicInteger(); public TestThumbnailDiskStorage(TestThumbnailGenerator thumbnailGenerator) { super(new ThumbnailStorageDelegate() {}, thumbnailGenerator, TEST_MAX_CACHE_BYTES);
diff --git a/chrome/browser/thumbnail/generator/android/java/src/org/chromium/chrome/browser/thumbnail/generator/ThumbnailProviderImplTest.java b/chrome/browser/thumbnail/generator/android/java/src/org/chromium/chrome/browser/thumbnail/generator/ThumbnailProviderImplTest.java index 7d2be81..164c208 100644 --- a/chrome/browser/thumbnail/generator/android/java/src/org/chromium/chrome/browser/thumbnail/generator/ThumbnailProviderImplTest.java +++ b/chrome/browser/thumbnail/generator/android/java/src/org/chromium/chrome/browser/thumbnail/generator/ThumbnailProviderImplTest.java
@@ -205,8 +205,8 @@ private final String mTestFilePath; private final int mRequiredSize; private Bitmap mRetrievedThumbnail; - private CallbackHelper mThumbnailRetrievedCallbackHelper; - private String mContentId; + private final CallbackHelper mThumbnailRetrievedCallbackHelper; + private final String mContentId; TestThumbnailRequest( String filepath,
diff --git a/chrome/browser/touch_to_fill/autofill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/payments/TouchToFillPaymentMethodControllerRobolectricTest.java b/chrome/browser/touch_to_fill/autofill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/payments/TouchToFillPaymentMethodControllerRobolectricTest.java index 019895b7..b5967480 100644 --- a/chrome/browser/touch_to_fill/autofill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/payments/TouchToFillPaymentMethodControllerRobolectricTest.java +++ b/chrome/browser/touch_to_fill/autofill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/payments/TouchToFillPaymentMethodControllerRobolectricTest.java
@@ -274,9 +274,9 @@ @Rule public MockitoRule mMockitoRule = MockitoJUnit.rule().strictness(Strictness.STRICT_STUBS); - private TouchToFillPaymentMethodCoordinator mCoordinator; + private final TouchToFillPaymentMethodCoordinator mCoordinator; private PropertyModel mTouchToFillPaymentMethodModel; - private FakeClock mClock = new FakeClock(); + private final FakeClock mClock = new FakeClock(); Context mContext; @Mock private BottomSheetController mBottomSheetController;
diff --git a/chrome/browser/touch_to_fill/autofill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/payments/TouchToFillPaymentMethodRenderTest.java b/chrome/browser/touch_to_fill/autofill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/payments/TouchToFillPaymentMethodRenderTest.java index 58a15191..dc397c2f 100644 --- a/chrome/browser/touch_to_fill/autofill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/payments/TouchToFillPaymentMethodRenderTest.java +++ b/chrome/browser/touch_to_fill/autofill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/payments/TouchToFillPaymentMethodRenderTest.java
@@ -65,7 +65,7 @@ @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) public class TouchToFillPaymentMethodRenderTest { @ParameterAnnotations.ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = Arrays.asList( new ParameterSet().value(false, false).name("Default"), new ParameterSet().value(false, true).name("RTL"),
diff --git a/chrome/browser/touch_to_fill/autofill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/payments/TouchToFillPaymentMethodViewBinder.java b/chrome/browser/touch_to_fill/autofill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/payments/TouchToFillPaymentMethodViewBinder.java index 4d20ae0..7a8668a 100644 --- a/chrome/browser/touch_to_fill/autofill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/payments/TouchToFillPaymentMethodViewBinder.java +++ b/chrome/browser/touch_to_fill/autofill/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/payments/TouchToFillPaymentMethodViewBinder.java
@@ -60,7 +60,7 @@ */ private static class TextViewCollectionInfoAccessibilityDelegate extends View.AccessibilityDelegate { - private FillableItemCollectionInfo mCollectionInfo; + private final FillableItemCollectionInfo mCollectionInfo; public TextViewCollectionInfoAccessibilityDelegate( @NonNull FillableItemCollectionInfo collectionInfo) {
diff --git a/chrome/browser/touch_to_fill/common/android/java/src/org/chromium/chrome/browser/touch_to_fill/common/BottomSheetFocusHelper.java b/chrome/browser/touch_to_fill/common/android/java/src/org/chromium/chrome/browser/touch_to_fill/common/BottomSheetFocusHelper.java index 058adf74..6303f015 100644 --- a/chrome/browser/touch_to_fill/common/android/java/src/org/chromium/chrome/browser/touch_to_fill/common/BottomSheetFocusHelper.java +++ b/chrome/browser/touch_to_fill/common/android/java/src/org/chromium/chrome/browser/touch_to_fill/common/BottomSheetFocusHelper.java
@@ -24,8 +24,8 @@ */ @NullMarked public class BottomSheetFocusHelper extends EmptyBottomSheetObserver { - private WindowAndroid mWindowAndroid; - private BottomSheetController mBottomSheetController; + private final WindowAndroid mWindowAndroid; + private final BottomSheetController mBottomSheetController; private @Nullable WebContentsAccessibility mWebContentsAccessibility; public BottomSheetFocusHelper(
diff --git a/chrome/browser/touch_to_fill/common/android/java/src/org/chromium/chrome/browser/touch_to_fill/common/TouchToFillViewBase.java b/chrome/browser/touch_to_fill/common/android/java/src/org/chromium/chrome/browser/touch_to_fill/common/TouchToFillViewBase.java index 4eb2dba..4c183524 100644 --- a/chrome/browser/touch_to_fill/common/android/java/src/org/chromium/chrome/browser/touch_to_fill/common/TouchToFillViewBase.java +++ b/chrome/browser/touch_to_fill/common/android/java/src/org/chromium/chrome/browser/touch_to_fill/common/TouchToFillViewBase.java
@@ -41,7 +41,7 @@ private final RelativeLayout mContentView; private final DetailScreenScrollListener mScrollListener; private @Nullable Callback<Integer> mDismissHandler; - private RecyclerView mSheetItemListView; + private final RecyclerView mSheetItemListView; private final BottomSheetObserver mBottomSheetObserver = new EmptyBottomSheetObserver() {
diff --git a/chrome/browser/touch_to_fill/password_manager/android/javatests/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillRenderTest.java b/chrome/browser/touch_to_fill/password_manager/android/javatests/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillRenderTest.java index 8e3d904f..6298121 100644 --- a/chrome/browser/touch_to_fill/password_manager/android/javatests/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillRenderTest.java +++ b/chrome/browser/touch_to_fill/password_manager/android/javatests/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillRenderTest.java
@@ -74,7 +74,7 @@ @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) public class TouchToFillRenderTest { @ParameterAnnotations.ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = Arrays.asList( new ParameterSet().value(false, false).name("Default"), new ParameterSet().value(false, true).name("RTL"),
diff --git a/chrome/browser/touch_to_fill/password_manager/android/junit/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillControllerTest.java b/chrome/browser/touch_to_fill/password_manager/android/junit/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillControllerTest.java index 19f4578c..be70f07 100644 --- a/chrome/browser/touch_to_fill/password_manager/android/junit/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillControllerTest.java +++ b/chrome/browser/touch_to_fill/password_manager/android/junit/src/org/chromium/chrome/browser/touch_to_fill/TouchToFillControllerTest.java
@@ -136,7 +136,7 @@ private static final WebauthnCredential DINO = new WebauthnCredential("dinos.com", new byte[] {1}, new byte[] {2}, "dino@example.com"); private static final @Px int DESIRED_FAVICON_SIZE = 64; - private Bitmap mBitmapFromImageFetcher = + private final Bitmap mBitmapFromImageFetcher = Bitmap.createBitmap(/* width= */ 1, /* height= */ 1, Bitmap.Config.ARGB_8888); @Rule public MockitoRule mMockitoRule = MockitoJUnit.rule(); @@ -147,7 +147,7 @@ // Can't be local, as it has to be initialized by initMocks. @Captor private ArgumentCaptor<LargeIconBridge.LargeIconCallback> mCallbackArgumentCaptor; - private TestImageFetcher mImageFetcher = spy(new TestImageFetcher()); + private final TestImageFetcher mImageFetcher = spy(new TestImageFetcher()); private final Context mContext = ContextUtils.getApplicationContext(); private final TouchToFillMediator mMediator = new TouchToFillMediator(); private final PropertyModel mModel =
diff --git a/chrome/browser/touch_to_fill/password_manager/no_passkeys/internal/android/java/src/org/chromium/chrome/browser/touch_to_fill/no_passkeys/NoPasskeysBottomSheetRenderTest.java b/chrome/browser/touch_to_fill/password_manager/no_passkeys/internal/android/java/src/org/chromium/chrome/browser/touch_to_fill/no_passkeys/NoPasskeysBottomSheetRenderTest.java index 887b728..8a7f3b4 100644 --- a/chrome/browser/touch_to_fill/password_manager/no_passkeys/internal/android/java/src/org/chromium/chrome/browser/touch_to_fill/no_passkeys/NoPasskeysBottomSheetRenderTest.java +++ b/chrome/browser/touch_to_fill/password_manager/no_passkeys/internal/android/java/src/org/chromium/chrome/browser/touch_to_fill/no_passkeys/NoPasskeysBottomSheetRenderTest.java
@@ -60,7 +60,7 @@ private static final String TEST_ORIGIN = "origin.com"; @ParameterAnnotations.ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = Arrays.asList( new ParameterSet().value(false, false).name("Default"), new ParameterSet().value(false, true).name("RTL"),
diff --git a/chrome/browser/touch_to_fill/password_manager/password_generation/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/password_generation/TouchToFillPasswordGenerationBridge.java b/chrome/browser/touch_to_fill/password_manager/password_generation/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/password_generation/TouchToFillPasswordGenerationBridge.java index 2f660d6e..e596f22 100644 --- a/chrome/browser/touch_to_fill/password_manager/password_generation/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/password_generation/TouchToFillPasswordGenerationBridge.java +++ b/chrome/browser/touch_to_fill/password_manager/password_generation/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/password_generation/TouchToFillPasswordGenerationBridge.java
@@ -21,8 +21,8 @@ @NullMarked class TouchToFillPasswordGenerationBridge implements TouchToFillPasswordGenerationCoordinator.Delegate { - private WindowAndroid mWindowAndroid; - private TouchToFillPasswordGenerationCoordinator mCoordinator; + private final WindowAndroid mWindowAndroid; + private final TouchToFillPasswordGenerationCoordinator mCoordinator; private long mNativeTouchToFillPasswordGenerationBridge; @CalledByNative
diff --git a/chrome/browser/touch_to_fill/password_manager/password_generation/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/password_generation/TouchToFillPasswordGenerationRenderTest.java b/chrome/browser/touch_to_fill/password_manager/password_generation/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/password_generation/TouchToFillPasswordGenerationRenderTest.java index 4a6bb01..4b3206c9 100644 --- a/chrome/browser/touch_to_fill/password_manager/password_generation/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/password_generation/TouchToFillPasswordGenerationRenderTest.java +++ b/chrome/browser/touch_to_fill/password_manager/password_generation/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/password_generation/TouchToFillPasswordGenerationRenderTest.java
@@ -51,7 +51,7 @@ @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) public class TouchToFillPasswordGenerationRenderTest { @ParameterAnnotations.ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = Arrays.asList( new ParameterSet().value(false, false).name("Default"), new ParameterSet().value(false, true).name("RTL"),
diff --git a/chrome/browser/touch_to_fill/password_manager/password_generation/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/password_generation/TouchToFillPasswordGenerationView.java b/chrome/browser/touch_to_fill/password_manager/password_generation/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/password_generation/TouchToFillPasswordGenerationView.java index 5ccd997e..755ff479 100644 --- a/chrome/browser/touch_to_fill/password_manager/password_generation/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/password_generation/TouchToFillPasswordGenerationView.java +++ b/chrome/browser/touch_to_fill/password_manager/password_generation/android/internal/java/src/org/chromium/chrome/browser/touch_to_fill/password_generation/TouchToFillPasswordGenerationView.java
@@ -31,7 +31,7 @@ class TouchToFillPasswordGenerationView implements BottomSheetContent { private final View mContent; private final Context mContext; - private TextView mPasswordView; + private final TextView mPasswordView; // Minimum password length that allows to label the password as strong in // the UI. Must stay in sync with kLengthSufficientForStrongLabel in
diff --git a/chrome/browser/tpcd/metadata/manager_browsertest.cc b/chrome/browser/tpcd/metadata/manager_browsertest.cc index c4a9bd23d..f030dc8c 100644 --- a/chrome/browser/tpcd/metadata/manager_browsertest.cc +++ b/chrome/browser/tpcd/metadata/manager_browsertest.cc
@@ -40,6 +40,7 @@ #include "content/public/test/browser_test_utils.h" #include "content/public/test/test_navigation_observer.h" #include "net/base/features.h" +#include "net/cookies/cookie_partition_key.h" #include "net/cookies/cookie_setting_override.h" #include "net/cookies/site_for_cookies.h" #include "net/dns/mock_host_resolver.h" @@ -237,9 +238,12 @@ const GURL kEmbedded = GURL("http://www.bar.com"); const url::Origin kEmbedder = url::Origin::Create(GURL("http://www.foo.com")); + net::CookiePartitionKey cookie_partition_key = + net::CookiePartitionKey::FromURLForTesting(kEmbedder.GetURL()); + ASSERT_EQ(GetCookieSettings()->GetTpcdMetadataGrants().size(), 0u); EXPECT_FALSE(GetCookieSettings()->IsFullCookieAccessAllowed( - kEmbedded, net::SiteForCookies(), kEmbedder, {})); + kEmbedded, net::SiteForCookies(), kEmbedder, {}, cookie_partition_key)); Metadata metadata; tpcd::metadata::helpers::AddEntryToMetadata(metadata, "[*.]bar.com", @@ -255,7 +259,7 @@ .metadata.tpcd_metadata_rule_source(), content_settings::mojom::TpcdMetadataRuleSource::SOURCE_TEST); EXPECT_TRUE(GetCookieSettings()->IsFullCookieAccessAllowed( - kEmbedded, net::SiteForCookies(), kEmbedder, {})); + kEmbedded, net::SiteForCookies(), kEmbedder, {}, cookie_partition_key)); } IN_PROC_BROWSER_TEST_F(ManagerBrowserTest, SuccessfullyUpdated) { @@ -264,9 +268,13 @@ const GURL kEmbedded1 = GURL("http://www.bar.com"); const url::Origin kEmbedder1 = url::Origin::Create(GURL("http://www.foo.com")); + net::CookiePartitionKey cookie_partition_key_1 = + net::CookiePartitionKey::FromURLForTesting(kEmbedder1.GetURL()); const GURL kEmbedded2 = GURL("http://www.baz.com"); const url::Origin kEmbedder2 = url::Origin::Create(GURL("http://www.daz.com")); + net::CookiePartitionKey cookie_partition_key_2 = + net::CookiePartitionKey::FromURLForTesting(kEmbedder2.GetURL()); { Metadata metadata; @@ -276,13 +284,15 @@ ASSERT_EQ(GetCookieSettings()->GetTpcdMetadataGrants().size(), 0u); EXPECT_FALSE(GetCookieSettings()->IsFullCookieAccessAllowed( - kEmbedded1, net::SiteForCookies(), kEmbedder1, {})); + kEmbedded1, net::SiteForCookies(), kEmbedder1, {}, + cookie_partition_key_1)); MockComponentInstallation(metadata); ASSERT_EQ(GetCookieSettings()->GetTpcdMetadataGrants().size(), 1u); EXPECT_TRUE(GetCookieSettings()->IsFullCookieAccessAllowed( - kEmbedded1, net::SiteForCookies(), kEmbedder1, {})); + kEmbedded1, net::SiteForCookies(), kEmbedder1, {}, + cookie_partition_key_1)); } { @@ -293,17 +303,21 @@ ASSERT_EQ(GetCookieSettings()->GetTpcdMetadataGrants().size(), 1u); EXPECT_TRUE(GetCookieSettings()->IsFullCookieAccessAllowed( - kEmbedded1, net::SiteForCookies(), kEmbedder1, {})); + kEmbedded1, net::SiteForCookies(), kEmbedder1, {}, + cookie_partition_key_1)); EXPECT_FALSE(GetCookieSettings()->IsFullCookieAccessAllowed( - kEmbedded2, net::SiteForCookies(), kEmbedder2, {})); + kEmbedded2, net::SiteForCookies(), kEmbedder2, {}, + cookie_partition_key_2)); MockComponentInstallation(metadata); ASSERT_EQ(GetCookieSettings()->GetTpcdMetadataGrants().size(), 1u); EXPECT_FALSE(GetCookieSettings()->IsFullCookieAccessAllowed( - kEmbedded1, net::SiteForCookies(), kEmbedder1, {})); + kEmbedded1, net::SiteForCookies(), kEmbedder1, {}, + cookie_partition_key_1)); EXPECT_TRUE(GetCookieSettings()->IsFullCookieAccessAllowed( - kEmbedded2, net::SiteForCookies(), kEmbedder2, {})); + kEmbedded2, net::SiteForCookies(), kEmbedder2, {}, + cookie_partition_key_2)); } } @@ -348,11 +362,14 @@ auto* service = tpcd::trial::TopLevelTrialServiceFactory::GetForProfile( browser()->profile()); auto embedder_origin = url::Origin::Create(first_party_url); + net::CookiePartitionKey cookie_partition_key = + net::CookiePartitionKey::FromURLForTesting(embedder_origin.GetURL()); service->UpdateTopLevelTrialSettingsForTesting( embedder_origin, /*match_subdomains=*/true, /*enabled=*/true); EXPECT_TRUE(GetCookieSettings()->IsFullCookieAccessAllowed( - third_party_url_1, net::SiteForCookies(), embedder_origin, {})); + third_party_url_1, net::SiteForCookies(), embedder_origin, {}, + cookie_partition_key)); { base::HistogramTester histogram_tester; content::CookieChangeObserver observer(GetWebContents(), @@ -370,7 +387,8 @@ } EXPECT_TRUE(GetCookieSettings()->IsFullCookieAccessAllowed( - third_party_url_2, net::SiteForCookies(), embedder_origin, {})); + third_party_url_2, net::SiteForCookies(), embedder_origin, {}, + cookie_partition_key)); { base::HistogramTester histogram_tester; content::CookieChangeObserver observer(GetWebContents(), @@ -388,7 +406,8 @@ } EXPECT_TRUE(GetCookieSettings()->IsFullCookieAccessAllowed( - third_party_url_3, net::SiteForCookies(), embedder_origin, {})); + third_party_url_3, net::SiteForCookies(), embedder_origin, {}, + cookie_partition_key)); { base::HistogramTester histogram_tester; content::CookieChangeObserver observer(GetWebContents(), @@ -449,9 +468,12 @@ EXPECT_EQ(GetCookieSettings()->GetTpcdMetadataGrants().size(), 2u); auto embedder_origin = url::Origin::Create(first_party_url); + net::CookiePartitionKey cookie_partition_key = + net::CookiePartitionKey::FromURLForTesting(embedder_origin.GetURL()); EXPECT_TRUE(GetCookieSettings()->IsFullCookieAccessAllowed( - third_party_url_1, net::SiteForCookies(), embedder_origin, {})); + third_party_url_1, net::SiteForCookies(), embedder_origin, {}, + cookie_partition_key)); { base::HistogramTester histogram_tester; @@ -470,7 +492,8 @@ } EXPECT_FALSE(GetCookieSettings()->IsFullCookieAccessAllowed( - third_party_url_1_sub, net::SiteForCookies(), embedder_origin, {})); + third_party_url_1_sub, net::SiteForCookies(), embedder_origin, {}, + cookie_partition_key)); { base::HistogramTester histogram_tester; @@ -527,9 +550,12 @@ EXPECT_EQ(GetCookieSettings()->GetTpcdMetadataGrants().size(), 2u); auto embedder_origin = url::Origin::Create(first_party_url); + net::CookiePartitionKey cookie_partition_key = + net::CookiePartitionKey::FromURLForTesting(embedder_origin.GetURL()); EXPECT_FALSE(GetCookieSettings()->IsFullCookieAccessAllowed( - third_party_url_1, net::SiteForCookies(), embedder_origin, {})); + third_party_url_1, net::SiteForCookies(), embedder_origin, {}, + cookie_partition_key)); { base::HistogramTester histogram_tester; @@ -545,7 +571,8 @@ } EXPECT_TRUE(GetCookieSettings()->IsFullCookieAccessAllowed( - third_party_url_1_sub, net::SiteForCookies(), embedder_origin, {})); + third_party_url_1_sub, net::SiteForCookies(), embedder_origin, {}, + cookie_partition_key)); { base::HistogramTester histogram_tester; @@ -603,9 +630,12 @@ EXPECT_EQ(GetCookieSettings()->GetTpcdMetadataGrants().size(), 3u); auto embedder_origin = url::Origin::Create(first_party_url); + net::CookiePartitionKey cookie_partition_key = + net::CookiePartitionKey::FromURLForTesting(embedder_origin.GetURL()); EXPECT_TRUE(GetCookieSettings()->IsFullCookieAccessAllowed( - third_party_url_1, net::SiteForCookies(), embedder_origin, {})); + third_party_url_1, net::SiteForCookies(), embedder_origin, {}, + cookie_partition_key)); { base::HistogramTester histogram_tester; content::CookieChangeObserver observer(GetWebContents(), @@ -623,7 +653,8 @@ } EXPECT_FALSE(GetCookieSettings()->IsFullCookieAccessAllowed( - third_party_url_2, net::SiteForCookies(), embedder_origin, {})); + third_party_url_2, net::SiteForCookies(), embedder_origin, {}, + cookie_partition_key)); { base::HistogramTester histogram_tester; NavigateToPageWithFrame(kFirstPartyHost); @@ -638,7 +669,8 @@ } EXPECT_TRUE(GetCookieSettings()->IsFullCookieAccessAllowed( - third_party_url_3, net::SiteForCookies(), embedder_origin, {})); + third_party_url_3, net::SiteForCookies(), embedder_origin, {}, + cookie_partition_key)); { base::HistogramTester histogram_tester; content::CookieChangeObserver observer(GetWebContents(),
diff --git a/chrome/browser/translate/android/java/src/org/chromium/chrome/browser/translate/AutoTranslateSnackbarController.java b/chrome/browser/translate/android/java/src/org/chromium/chrome/browser/translate/AutoTranslateSnackbarController.java index 113e2cb..b40bf5b 100644 --- a/chrome/browser/translate/android/java/src/org/chromium/chrome/browser/translate/AutoTranslateSnackbarController.java +++ b/chrome/browser/translate/android/java/src/org/chromium/chrome/browser/translate/AutoTranslateSnackbarController.java
@@ -35,13 +35,13 @@ class AutoTranslateSnackbarController implements SnackbarManager.SnackbarController { private static final int AUTO_TRANSLATE_SNACKBAR_DURATION_MS = 4000; - private WeakReference<Activity> mActivity; - private long mNativeAutoTranslateSnackbarController; - private SnackbarManager mSnackbarManager; + private final WeakReference<Activity> mActivity; + private final long mNativeAutoTranslateSnackbarController; + private final SnackbarManager mSnackbarManager; @VisibleForTesting static class TargetLanguageData { - private String mTargetLanguage; + private final String mTargetLanguage; TargetLanguageData(String targetLanguage) { mTargetLanguage = targetLanguage;
diff --git a/chrome/browser/ui/BUILD.gn b/chrome/browser/ui/BUILD.gn index b53ffb90..1fafd79 100644 --- a/chrome/browser/ui/BUILD.gn +++ b/chrome/browser/ui/BUILD.gn
@@ -86,14 +86,6 @@ "recently_audible_helper.cc", "recently_audible_helper.h", "screen_capture_notification_ui.h", - "search_engines/edit_search_engine_controller.cc", - "search_engines/edit_search_engine_controller.h", - "search_engines/keyword_editor_controller.cc", - "search_engines/keyword_editor_controller.h", - "search_engines/search_engine_tab_helper.cc", - "search_engines/search_engine_tab_helper.h", - "search_engines/template_url_table_model.cc", - "search_engines/template_url_table_model.h", "serial/serial_chooser_controller.cc", "serial/serial_chooser_controller.h", "session_crashed_bubble.h", @@ -423,6 +415,7 @@ "//chrome/browser/ui/prefs", "//chrome/browser/ui/prefs:impl", "//chrome/browser/ui/safety_hub", + "//chrome/browser/ui/search_engines", "//chrome/browser/ui/tab_contents", "//chrome/browser/ui/tab_contents:impl", "//chrome/browser/ui/webui",
diff --git a/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenu.java b/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenu.java index 6df2e541..4e271bb 100644 --- a/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenu.java +++ b/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenu.java
@@ -88,7 +88,7 @@ private @Nullable PopupWindow mPopup; private @Nullable ListView mListView; private @Nullable ModelListAdapter mAdapter; - private AppMenuHandlerImpl mHandler; + private final AppMenuHandlerImpl mHandler; private @Nullable View mFooterView; private int mCurrentScreenRotation = -1; private boolean mIsByPermanentButton;
diff --git a/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuCoordinatorImpl.java b/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuCoordinatorImpl.java index 7ec79e9..d967863 100644 --- a/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuCoordinatorImpl.java +++ b/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuCoordinatorImpl.java
@@ -27,8 +27,8 @@ private final MenuButtonDelegate mButtonDelegate; private final AppMenuDelegate mAppMenuDelegate; - private AppMenuPropertiesDelegate mAppMenuPropertiesDelegate; - private AppMenuHandlerImpl mAppMenuHandler; + private final AppMenuPropertiesDelegate mAppMenuPropertiesDelegate; + private final AppMenuHandlerImpl mAppMenuHandler; /** * Construct a new AppMenuCoordinatorImpl.
diff --git a/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuHandlerImpl.java b/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuHandlerImpl.java index 1c27ee6..fc2c3b3 100644 --- a/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuHandlerImpl.java +++ b/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuHandlerImpl.java
@@ -71,7 +71,7 @@ private final WindowAndroid mWindowAndroid; private final BrowserControlsStateProvider mBrowserControlsStateProvider; private @Nullable ModelList mModelList; - private ListObserver<Void> mListObserver; + private final ListObserver<Void> mListObserver; private @Nullable Callback<Integer> mTestOptionsItemSelectedListener; private @MonotonicNonNull KeyboardVisibilityDelegate.KeyboardVisibilityListener mKeyboardVisibilityListener;
diff --git a/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuItemViewBinderRenderTest.java b/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuItemViewBinderRenderTest.java index 4682178..fe24349 100644 --- a/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuItemViewBinderRenderTest.java +++ b/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuItemViewBinderRenderTest.java
@@ -48,7 +48,7 @@ @ParameterAnnotations.UseRunnerDelegate(ChromeJUnit4RunnerDelegate.class) public class AppMenuItemViewBinderRenderTest { @ParameterAnnotations.ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = Arrays.asList( new ParameterSet().value(false, true).name("LiteMode_MenuItemEnabled"), new ParameterSet().value(false, false).name("LiteMode_MenuItemDisabled"), @@ -83,7 +83,7 @@ private ModelListAdapter.ModelList mMenuList; private ModelListAdapter mModelListAdapter; - private boolean mMenuItemEnabled; + private final boolean mMenuItemEnabled; public AppMenuItemViewBinderRenderTest(boolean nightMode, boolean menuItemEnabled) { mMenuItemEnabled = menuItemEnabled;
diff --git a/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuItemViewBinderTest.java b/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuItemViewBinderTest.java index f3eacd2..32936eb 100644 --- a/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuItemViewBinderTest.java +++ b/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuItemViewBinderTest.java
@@ -75,13 +75,13 @@ public static final int VIEW_TYPE_2 = 1; public static final int VIEW_TYPE_COUNT = 2; - public int supportedId1; - public int supportedId2; - public int supportedId3; + public final int supportedId1; + public final int supportedId2; + public final int supportedId3; public int lastBindId; - public CallbackHelper getViewItemCallbackHelper = new CallbackHelper(); + public final CallbackHelper getViewItemCallbackHelper = new CallbackHelper(); public CustomViewBinderOne() { supportedId1 = View.generateViewId(); @@ -133,11 +133,11 @@ public static final int VIEW_TYPE_1 = 0; public static final int VIEW_TYPE_COUNT = 1; - public int supportedId1; + public final int supportedId1; public int lastBindId; - public CallbackHelper getViewItemCallbackHelper = new CallbackHelper(); + public final CallbackHelper getViewItemCallbackHelper = new CallbackHelper(); public CustomViewBinderTwo() { supportedId1 = View.generateViewId();
diff --git a/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuPopupPositionTest.java b/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuPopupPositionTest.java index cf34f74..1a4f808 100644 --- a/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuPopupPositionTest.java +++ b/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuPopupPositionTest.java
@@ -25,24 +25,24 @@ private final int[] mTempLocation = new int[2]; - private final int mAppWidth = 400; - private final int mAppHeight = 1000; - private final int mBgPadding = 10; - private final int mPopupWidth = 300; - private final int mAnchorX = 100; - private final int mAnchorY = 300; - private final int mAnchorWidth = 40; - private final int mNegativeSoftwareVerticalOffset = 25; + private static final int APP_WIDTH = 400; + private static final int APP_HEIGHT = 1000; + private static final int BG_PADDING = 10; + private static final int POPUP_WIDTH = 300; + private static final int ANCHOR_X = 100; + private static final int ANCHOR_Y = 300; + private static final int ANCHOR_WIDTH = 40; + private static final int NEGATIVE_SOFTWARE_VERTICAL_OFFSET = 25; private final View mAnchorView = Mockito.mock(View.class); - private final Rect mAppRect = new Rect(0, 0, mAppWidth, mAppHeight); - private final Rect mBgPaddingRect = new Rect(mBgPadding, mBgPadding, mBgPadding, mBgPadding); + private final Rect mAppRect = new Rect(0, 0, APP_WIDTH, APP_HEIGHT); + private final Rect mBgPaddingRect = new Rect(BG_PADDING, BG_PADDING, BG_PADDING, BG_PADDING); @Before public void setUp() { Mockito.doAnswer( (InvocationOnMock invocation) -> { - mTempLocation[0] = mAnchorX; - mTempLocation[1] = mAnchorY; + mTempLocation[0] = ANCHOR_X; + mTempLocation[1] = ANCHOR_Y; return null; }) .when(mAnchorView) @@ -50,21 +50,21 @@ Mockito.doAnswer( (InvocationOnMock invocation) -> { - mTempLocation[0] = mAnchorX; - mTempLocation[1] = mAnchorY; + mTempLocation[0] = ANCHOR_X; + mTempLocation[1] = ANCHOR_Y; return null; }) .when(mAnchorView) .getLocationOnScreen(mTempLocation); - Mockito.when(mAnchorView.getWidth()).thenReturn(mAnchorWidth); + Mockito.when(mAnchorView.getWidth()).thenReturn(ANCHOR_WIDTH); } @Test public void testPermanentButton_Portrait() { // Popup should should be in the middle of the screen, anchored near the anchor view. - int expectedX = (mAppWidth - mPopupWidth) / 2; - int expectedY = mAnchorY - mBgPadding; + int expectedX = (APP_WIDTH - POPUP_WIDTH) / 2; + int expectedY = ANCHOR_Y - BG_PADDING; int[] results = getPopupPosition(true, Surface.ROTATION_0, View.LAYOUT_DIRECTION_LTR); Assert.assertEquals("Incorrect popup x", expectedX, results[0]); @@ -81,8 +81,8 @@ // Popup should be positioned toward the right edge of the screen, anchored near the anchor // view. - int expectedX = mAppWidth - mPopupWidth; - int expectedY = mAnchorY - mBgPadding; + int expectedX = APP_WIDTH - POPUP_WIDTH; + int expectedY = ANCHOR_Y - BG_PADDING; Assert.assertEquals("Incorrect popup x", expectedX, results[0]); Assert.assertEquals("Incorrect popup y", expectedY, results[1]); @@ -99,8 +99,8 @@ int[] results = getPopupPosition(false, Surface.ROTATION_0, View.LAYOUT_DIRECTION_LTR); // The top right edge of the popup should be aligned with the top right edge of the button. - int expectedX = mAnchorX + mAnchorWidth - mPopupWidth; - int expectedY = mAnchorY - mNegativeSoftwareVerticalOffset; + int expectedX = ANCHOR_X + ANCHOR_WIDTH - POPUP_WIDTH; + int expectedY = ANCHOR_Y - NEGATIVE_SOFTWARE_VERTICAL_OFFSET; Assert.assertEquals("Incorrect popup x", expectedX, results[0]); Assert.assertEquals("Incorrect popup y", expectedY, results[1]); } @@ -110,8 +110,8 @@ int[] results = getPopupPosition(false, Surface.ROTATION_0, View.LAYOUT_DIRECTION_RTL); // The top left edge of the popup should be aligned with the top left edge of the button. - int expectedX = mAnchorX; - int expectedY = mAnchorY - mNegativeSoftwareVerticalOffset; + int expectedX = ANCHOR_X; + int expectedY = ANCHOR_Y - NEGATIVE_SOFTWARE_VERTICAL_OFFSET; Assert.assertEquals("Incorrect popup x", expectedX, results[0]); Assert.assertEquals("Incorrect popup y", expectedY, results[1]); } @@ -120,12 +120,12 @@ return AppMenu.getPopupPosition( mTempLocation, isByPermanentButton, - mNegativeSoftwareVerticalOffset, + NEGATIVE_SOFTWARE_VERTICAL_OFFSET, rotation, mAppRect, mBgPaddingRect, mAnchorView, - mPopupWidth, + POPUP_WIDTH, layoutDirection); } }
diff --git a/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuTest.java b/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuTest.java index 3e1f515..49d4436 100644 --- a/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuTest.java +++ b/chrome/browser/ui/android/appmenu/internal/java/src/org/chromium/chrome/browser/ui/appmenu/AppMenuTest.java
@@ -1269,7 +1269,7 @@ } private static class TestActivityLifecycleDispatcher implements ActivityLifecycleDispatcher { - public CallbackHelper observerRegisteredCallbackHelper = new CallbackHelper(); + public final CallbackHelper observerRegisteredCallbackHelper = new CallbackHelper(); @Override public void register(LifecycleObserver observer) {
diff --git a/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/AuthenticatorSelectionDialogBridge.java b/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/AuthenticatorSelectionDialogBridge.java index 0fc90dbd..3ad743b 100644 --- a/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/AuthenticatorSelectionDialogBridge.java +++ b/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/AuthenticatorSelectionDialogBridge.java
@@ -26,7 +26,7 @@ @NullMarked public class AuthenticatorSelectionDialogBridge implements AuthenticatorSelectionDialog.Listener { private final long mNativeCardUnmaskAuthenticationSelectionDialogView; - private AuthenticatorSelectionDialog mAuthenticatorSelectionDialog; + private final AuthenticatorSelectionDialog mAuthenticatorSelectionDialog; public AuthenticatorSelectionDialogBridge( long nativeAuthenticatorSelectionDialogView,
diff --git a/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/AuthenticatorSelectionDialogBridgeTest.java b/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/AuthenticatorSelectionDialogBridgeTest.java index e1bc6de7..0194ba0 100644 --- a/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/AuthenticatorSelectionDialogBridgeTest.java +++ b/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/AuthenticatorSelectionDialogBridgeTest.java
@@ -52,7 +52,7 @@ private static final long NATIVE_AUTHENTICATOR_SELECTION_DIALOG_VIEW = 100L; - private List<AuthenticatorOption> mOptions = new ArrayList<>(); + private final List<AuthenticatorOption> mOptions = new ArrayList<>(); private FakeModalDialogManager mModalDialogManager; private AuthenticatorSelectionDialogBridge mAuthenticatorSelectionDialogBridge;
diff --git a/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/OtpVerificationDialogBridge.java b/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/OtpVerificationDialogBridge.java index f040e32..7b0d098f 100644 --- a/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/OtpVerificationDialogBridge.java +++ b/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/OtpVerificationDialogBridge.java
@@ -23,7 +23,7 @@ @NullMarked class OtpVerificationDialogBridge implements OtpVerificationDialogCoordinator.Delegate { private final long mNativeOtpVerificationDialogView; - private OtpVerificationDialogCoordinator mDialogCoordinator; + private final OtpVerificationDialogCoordinator mDialogCoordinator; OtpVerificationDialogBridge( long nativeOtpVerificationDialogView,
diff --git a/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/OtpVerificationDialogMediator.java b/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/OtpVerificationDialogMediator.java index 14d8f2f..9a2bad87 100644 --- a/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/OtpVerificationDialogMediator.java +++ b/chrome/browser/ui/android/autofill/internal/java/src/org/chromium/chrome/browser/ui/autofill/OtpVerificationDialogMediator.java
@@ -29,8 +29,8 @@ class OtpVerificationDialogMediator implements ModalDialogProperties.Controller, OtpVerificationDialogProperties.ViewDelegate { private final ModalDialogManager mModalDialogManager; - private PropertyModel mModalDialogModel; - private Delegate mDelegate; + private final PropertyModel mModalDialogModel; + private final Delegate mDelegate; private @Nullable PropertyModel mOtpVerificationDialogModel; OtpVerificationDialogMediator(
diff --git a/chrome/browser/ui/android/device_lock/java/src/org/chromium/chrome/browser/ui/device_lock/MissingDeviceLockLauncher.java b/chrome/browser/ui/android/device_lock/java/src/org/chromium/chrome/browser/ui/device_lock/MissingDeviceLockLauncher.java index fd028704..9136411 100644 --- a/chrome/browser/ui/android/device_lock/java/src/org/chromium/chrome/browser/ui/device_lock/MissingDeviceLockLauncher.java +++ b/chrome/browser/ui/android/device_lock/java/src/org/chromium/chrome/browser/ui/device_lock/MissingDeviceLockLauncher.java
@@ -31,9 +31,9 @@ @NullMarked public class MissingDeviceLockLauncher { - private Context mContext; - private Profile mProfile; - private ModalDialogManager mModalDialogManager; + private final Context mContext; + private final Profile mProfile; + private final ModalDialogManager mModalDialogManager; private @Nullable MissingDeviceLockCoordinator mMissingDeviceLockCoordinator; private @Nullable PasswordStoreBridge mPasswordStoreBridge;
diff --git a/chrome/browser/ui/android/device_lock/javatests/src/org/chromium/chrome/browser/ui/device_lock/DeviceLockViewBinderTest.java b/chrome/browser/ui/android/device_lock/javatests/src/org/chromium/chrome/browser/ui/device_lock/DeviceLockViewBinderTest.java index d25e68d..e70c01b 100644 --- a/chrome/browser/ui/android/device_lock/javatests/src/org/chromium/chrome/browser/ui/device_lock/DeviceLockViewBinderTest.java +++ b/chrome/browser/ui/android/device_lock/javatests/src/org/chromium/chrome/browser/ui/device_lock/DeviceLockViewBinderTest.java
@@ -59,10 +59,10 @@ private static Activity sActivity; - private AtomicBoolean mCreateDeviceLockButtonClicked = new AtomicBoolean(); - private AtomicBoolean mGoToOSSettingsButtonClicked = new AtomicBoolean(); - private AtomicBoolean mUserUnderstandsButtonClicked = new AtomicBoolean(); - private AtomicBoolean mDismissButtonClicked = new AtomicBoolean(); + private final AtomicBoolean mCreateDeviceLockButtonClicked = new AtomicBoolean(); + private final AtomicBoolean mGoToOSSettingsButtonClicked = new AtomicBoolean(); + private final AtomicBoolean mUserUnderstandsButtonClicked = new AtomicBoolean(); + private final AtomicBoolean mDismissButtonClicked = new AtomicBoolean(); private DeviceLockView mView; private PropertyModel mViewModel;
diff --git a/chrome/browser/ui/android/device_lock/javatests/src/org/chromium/chrome/browser/ui/device_lock/MissingDeviceLockLauncherTest.java b/chrome/browser/ui/android/device_lock/javatests/src/org/chromium/chrome/browser/ui/device_lock/MissingDeviceLockLauncherTest.java index 6dbd8b2c..f5f5a15 100644 --- a/chrome/browser/ui/android/device_lock/javatests/src/org/chromium/chrome/browser/ui/device_lock/MissingDeviceLockLauncherTest.java +++ b/chrome/browser/ui/android/device_lock/javatests/src/org/chromium/chrome/browser/ui/device_lock/MissingDeviceLockLauncherTest.java
@@ -82,7 +82,7 @@ private MissingDeviceLockLauncher mMissingDeviceLockLauncher; private SharedPreferencesManager mSharedPreferencesManager; - private AtomicBoolean mWipeDataCallbackCalled = new AtomicBoolean(); + private final AtomicBoolean mWipeDataCallbackCalled = new AtomicBoolean(); @Before public void setUp() {
diff --git a/chrome/browser/ui/android/device_lock/javatests/src/org/chromium/chrome/browser/ui/device_lock/MissingDeviceLockViewBinderTest.java b/chrome/browser/ui/android/device_lock/javatests/src/org/chromium/chrome/browser/ui/device_lock/MissingDeviceLockViewBinderTest.java index e56ac15..bfcbdb4d 100644 --- a/chrome/browser/ui/android/device_lock/javatests/src/org/chromium/chrome/browser/ui/device_lock/MissingDeviceLockViewBinderTest.java +++ b/chrome/browser/ui/android/device_lock/javatests/src/org/chromium/chrome/browser/ui/device_lock/MissingDeviceLockViewBinderTest.java
@@ -48,9 +48,9 @@ private static Activity sActivity; - private AtomicBoolean mCreateDeviceLockButtonClicked = new AtomicBoolean(); - private AtomicBoolean mContinueClicked = new AtomicBoolean(); - private AtomicBoolean mCheckboxToggled = new AtomicBoolean(); + private final AtomicBoolean mCreateDeviceLockButtonClicked = new AtomicBoolean(); + private final AtomicBoolean mContinueClicked = new AtomicBoolean(); + private final AtomicBoolean mCheckboxToggled = new AtomicBoolean(); private MissingDeviceLockView mView; private PropertyModel mViewModel;
diff --git a/chrome/browser/ui/android/digital_credentials/java/src/org/chromium/chrome/browser/ui/android/digital_credentials/DigitalIdentitySafetyInterstitialController.java b/chrome/browser/ui/android/digital_credentials/java/src/org/chromium/chrome/browser/ui/android/digital_credentials/DigitalIdentitySafetyInterstitialController.java index 25585bb7..f9051bf 100644 --- a/chrome/browser/ui/android/digital_credentials/java/src/org/chromium/chrome/browser/ui/android/digital_credentials/DigitalIdentitySafetyInterstitialController.java +++ b/chrome/browser/ui/android/digital_credentials/java/src/org/chromium/chrome/browser/ui/android/digital_credentials/DigitalIdentitySafetyInterstitialController.java
@@ -26,7 +26,7 @@ @NullMarked public class DigitalIdentitySafetyInterstitialController { private PropertyModel mDialogModel; - private Origin mOrigin; + private final Origin mOrigin; public DigitalIdentitySafetyInterstitialController(Origin origin) { mOrigin = origin;
diff --git a/chrome/browser/ui/android/digital_credentials/java/src/org/chromium/chrome/browser/ui/android/digital_credentials/DigitalIdentitySafetyInterstitialIntegrationTest.java b/chrome/browser/ui/android/digital_credentials/java/src/org/chromium/chrome/browser/ui/android/digital_credentials/DigitalIdentitySafetyInterstitialIntegrationTest.java index 9d0d405..c7c13b4 100644 --- a/chrome/browser/ui/android/digital_credentials/java/src/org/chromium/chrome/browser/ui/android/digital_credentials/DigitalIdentitySafetyInterstitialIntegrationTest.java +++ b/chrome/browser/ui/android/digital_credentials/java/src/org/chromium/chrome/browser/ui/android/digital_credentials/DigitalIdentitySafetyInterstitialIntegrationTest.java
@@ -62,10 +62,10 @@ * ModalDialogProperties.MESSAGE_PARAGRAPH1} matches the parameter passed to the constructor. */ private static class ModalDialogButtonPresser implements ModalDialogManagerObserver { - private String mSearchParagraph1; + private final String mSearchParagraph1; private boolean mWasDialogShown; private boolean mWasAnyDialogShown; - private boolean mPressButtonOnShow; + private final boolean mPressButtonOnShow; private PropertyModel mDialogPropertyModel; public ModalDialogButtonPresser(String searchParagraph1, boolean pressButtonOnShow) {
diff --git a/chrome/browser/ui/android/edge_to_edge/internal/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerImpl.java b/chrome/browser/ui/android/edge_to_edge/internal/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerImpl.java index c653237..d48fa99f 100644 --- a/chrome/browser/ui/android/edge_to_edge/internal/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerImpl.java +++ b/chrome/browser/ui/android/edge_to_edge/internal/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerImpl.java
@@ -12,6 +12,7 @@ import android.view.View; import androidx.annotation.CallSuper; +import androidx.annotation.IntDef; import androidx.annotation.RequiresApi; import androidx.annotation.VisibleForTesting; import androidx.core.graphics.Insets; @@ -21,6 +22,7 @@ import org.chromium.base.Log; import org.chromium.base.ObserverList; import org.chromium.base.ValueChangedCallback; +import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.supplier.ObservableSupplier; import org.chromium.build.annotations.NullMarked; import org.chromium.build.annotations.Nullable; @@ -57,6 +59,21 @@ LayoutStateProvider.LayoutStateObserver, FullscreenManager.Observer { private static final String TAG = "E2E_ControllerImpl"; + private static final String SUPPORTED_CONFIGURATION_SWITCH_HISTOGRAM = + "Android.EdgeToEdge.SupportedConfigurationSwitch"; + + // These values are persisted to logs. Entries should not be renumbered and + // numeric values should never be reused. + @IntDef({ + SupportedConfigurationSwitch.FROM_SUPPORTED_TO_UNSUPPORTED, + SupportedConfigurationSwitch.FROM_UNSUPPORTED_TO_SUPPORTED, + SupportedConfigurationSwitch.NUM_ENTRIES + }) + @interface SupportedConfigurationSwitch { + int FROM_SUPPORTED_TO_UNSUPPORTED = 0; + int FROM_UNSUPPORTED_TO_SUPPORTED = 1; + int NUM_ENTRIES = 2; + } /** The outermost view in our view hierarchy that is identified with a resource ID. */ private static final int ROOT_UI_VIEW_ID = android.R.id.content; @@ -91,6 +108,8 @@ private @Nullable Tab mCurrentTab; private @Nullable WebContentsObserver mWebContentsObserver; + private boolean mIsSupportedConfiguration; + /** * Whether the system is drawing "toEdge" (i.e. the edge-to-edge wrapper has no bottom padding). * This could be due to the current page being opted into edge-to-edge, or a partial @@ -116,7 +135,7 @@ private Insets mSystemInsets = Insets.NONE; private Insets mAppliedContentViewPadding = Insets.NONE; private @Nullable Insets mKeyboardInsets; - private @Nullable WindowInsetsConsumer mWindowInsetsConsumer; + private final @Nullable WindowInsetsConsumer mWindowInsetsConsumer; private boolean mBottomControlsAreVisible; private int mBottomControlsHeight; @@ -217,6 +236,7 @@ // retriggerOnApplyWindowInsets to populate all the initial state. mIsPageOptedIntoEdgeToEdge = EdgeToEdgeUtils.isPageOptedIntoEdgeToEdge(mCurrentTab); mInsetObserver.retriggerOnApplyWindowInsets(); + mIsSupportedConfiguration = EdgeToEdgeControllerFactory.isSupportedConfiguration(mActivity); } @VisibleForTesting @@ -450,6 +470,24 @@ @VisibleForTesting WindowInsetsCompat handleWindowInsets(View rootView, WindowInsetsCompat windowInsets) { + if (mIsSupportedConfiguration + != EdgeToEdgeControllerFactory.isSupportedConfiguration(mActivity)) { + Log.v( + TAG, + "Switching supported configuration from %s", + (mIsSupportedConfiguration + ? "supported to unsupported" + : "unsupported to supported")); + RecordHistogram.recordEnumeratedHistogram( + SUPPORTED_CONFIGURATION_SWITCH_HISTOGRAM, + mIsSupportedConfiguration + ? SupportedConfigurationSwitch.FROM_SUPPORTED_TO_UNSUPPORTED + : SupportedConfigurationSwitch.FROM_UNSUPPORTED_TO_SUPPORTED, + SupportedConfigurationSwitch.NUM_ENTRIES); + mIsSupportedConfiguration = + EdgeToEdgeControllerFactory.isSupportedConfiguration(mActivity); + } + // Exit early if there is a tappable navbar (3-button) as the controller should not function // when 3-button nav is enabled. if (EdgeToEdgeUtils.hasTappableNavigationBar(mActivity.getWindow())) {
diff --git a/chrome/browser/ui/android/edge_to_edge/internal/junit/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeBottomChinMediatorTest.java b/chrome/browser/ui/android/edge_to_edge/internal/junit/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeBottomChinMediatorTest.java index bbae298..8e81477 100644 --- a/chrome/browser/ui/android/edge_to_edge/internal/junit/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeBottomChinMediatorTest.java +++ b/chrome/browser/ui/android/edge_to_edge/internal/junit/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeBottomChinMediatorTest.java
@@ -67,7 +67,7 @@ private PropertyModel mModel; private EdgeToEdgeBottomChinMediator mMediator; - private final int mDefaultHeight = 60; + private static final int DEFAULT_HEIGHT = 60; @Before public void setUp() { @@ -130,7 +130,7 @@ enableDispatchYOffset(); // make view visible - mModel.set(HEIGHT, mDefaultHeight); + mModel.set(HEIGHT, DEFAULT_HEIGHT); mMediator.onBrowserControlsOffsetUpdate(0); mMediator.changeBottomChinColor(Color.BLUE); @@ -165,7 +165,7 @@ enableDispatchYOffset(); OffsetTag offsetTag = OffsetTag.createRandom(); mModel.set(OFFSET_TAG, offsetTag); - mModel.set(HEIGHT, mDefaultHeight); + mModel.set(HEIGHT, DEFAULT_HEIGHT); assertEquals("The color should default to 0.", 0, mModel.get(COLOR)); // make view visible @@ -176,12 +176,12 @@ assertEquals("The color should have been updated to blue.", Color.BLUE, mModel.get(COLOR)); // scroll view but keep it visible - doReturn(mDefaultHeight / 2).when(mBrowserControlsStateProvider).getBottomControlOffset(); + doReturn(DEFAULT_HEIGHT / 2).when(mBrowserControlsStateProvider).getBottomControlOffset(); mMediator.changeBottomChinColor(Color.RED); assertEquals("The color should have been updated to red.", Color.RED, mModel.get(COLOR)); // scroll view offscreen - doReturn(mDefaultHeight).when(mBrowserControlsStateProvider).getBottomControlOffset(); + doReturn(DEFAULT_HEIGHT).when(mBrowserControlsStateProvider).getBottomControlOffset(); mMediator.changeBottomChinColor(Color.WHITE); assertEquals("The color should have not been updated.", Color.RED, mModel.get(COLOR)); @@ -196,7 +196,7 @@ enableDispatchYOffset(); // make view visible - mModel.set(HEIGHT, mDefaultHeight); + mModel.set(HEIGHT, DEFAULT_HEIGHT); mMediator.onBrowserControlsOffsetUpdate(0); mMediator.changeBottomChinDividerColor(Color.WHITE);
diff --git a/chrome/browser/ui/android/edge_to_edge/internal/junit/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerTest.java b/chrome/browser/ui/android/edge_to_edge/internal/junit/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerTest.java index 325dbef..51980cb2 100644 --- a/chrome/browser/ui/android/edge_to_edge/internal/junit/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerTest.java +++ b/chrome/browser/ui/android/edge_to_edge/internal/junit/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerTest.java
@@ -140,7 +140,7 @@ private final ObservableSupplierImpl<LayoutManager> mLayoutManagerSupplier = new ObservableSupplierImpl<>(); - private UserDataHost mTabDataHost = new UserDataHost(); + private final UserDataHost mTabDataHost = new UserDataHost(); @Rule public MockitoRule mMockitoRule = MockitoJUnit.rule();
diff --git a/chrome/browser/ui/android/fast_checkout/internal/java/src/org/chromium/chrome/browser/ui/fast_checkout/FastCheckoutCoordinator.java b/chrome/browser/ui/android/fast_checkout/internal/java/src/org/chromium/chrome/browser/ui/fast_checkout/FastCheckoutCoordinator.java index d31fd4b..bd75f76a 100644 --- a/chrome/browser/ui/android/fast_checkout/internal/java/src/org/chromium/chrome/browser/ui/fast_checkout/FastCheckoutCoordinator.java +++ b/chrome/browser/ui/android/fast_checkout/internal/java/src/org/chromium/chrome/browser/ui/fast_checkout/FastCheckoutCoordinator.java
@@ -24,8 +24,8 @@ @NullMarked class FastCheckoutCoordinator implements FastCheckoutComponent { - private FastCheckoutMediator mMediator = new FastCheckoutMediator(); - private PropertyModel mModel = FastCheckoutProperties.createDefaultModel(); + private final FastCheckoutMediator mMediator = new FastCheckoutMediator(); + private final PropertyModel mModel = FastCheckoutProperties.createDefaultModel(); private FastCheckoutSheetContent mContent; private BottomSheetController mBottomSheetController;
diff --git a/chrome/browser/ui/android/fast_checkout/internal/junit/src/org/chromium/chrome/browser/ui/fast_checkout/FastCheckoutMediatorTest.java b/chrome/browser/ui/android/fast_checkout/internal/junit/src/org/chromium/chrome/browser/ui/fast_checkout/FastCheckoutMediatorTest.java index 07bddeb..23b67ba3 100644 --- a/chrome/browser/ui/android/fast_checkout/internal/junit/src/org/chromium/chrome/browser/ui/fast_checkout/FastCheckoutMediatorTest.java +++ b/chrome/browser/ui/android/fast_checkout/internal/junit/src/org/chromium/chrome/browser/ui/fast_checkout/FastCheckoutMediatorTest.java
@@ -112,7 +112,7 @@ @Mock private BottomSheetContent mMockBottomSheetContent; @Mock private BottomSheetController mMockBottomSheetController; - private FastCheckoutMediator mMediator = new FastCheckoutMediator(); + private final FastCheckoutMediator mMediator = new FastCheckoutMediator(); private UserActionTester mActionTester; private final PropertyModel mModel = FastCheckoutProperties.createDefaultModel();
diff --git a/chrome/browser/ui/android/fast_checkout/internal/junit/src/org/chromium/chrome/browser/ui/fast_checkout/FastCheckoutRenderTest.java b/chrome/browser/ui/android/fast_checkout/internal/junit/src/org/chromium/chrome/browser/ui/fast_checkout/FastCheckoutRenderTest.java index 8459397..a767922 100644 --- a/chrome/browser/ui/android/fast_checkout/internal/junit/src/org/chromium/chrome/browser/ui/fast_checkout/FastCheckoutRenderTest.java +++ b/chrome/browser/ui/android/fast_checkout/internal/junit/src/org/chromium/chrome/browser/ui/fast_checkout/FastCheckoutRenderTest.java
@@ -93,7 +93,7 @@ /* issuerIcon= */ Icon.CARD_VISA); @ParameterAnnotations.ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = Arrays.asList( new ParameterSet().value(false, false).name("Default"), new ParameterSet().value(false, true).name("RTL"),
diff --git a/chrome/browser/ui/android/fast_checkout/java/src/org/chromium/chrome/browser/ui/fast_checkout/data/FastCheckoutAutofillProfile.java b/chrome/browser/ui/android/fast_checkout/java/src/org/chromium/chrome/browser/ui/fast_checkout/data/FastCheckoutAutofillProfile.java index 522bed2..252bbc2 100644 --- a/chrome/browser/ui/android/fast_checkout/java/src/org/chromium/chrome/browser/ui/fast_checkout/data/FastCheckoutAutofillProfile.java +++ b/chrome/browser/ui/android/fast_checkout/java/src/org/chromium/chrome/browser/ui/fast_checkout/data/FastCheckoutAutofillProfile.java
@@ -28,7 +28,7 @@ private final String mPhoneNumber; private final String mEmailAddress; private final String mLanguageCode; - private @RecordType int mRecordType; + private final @RecordType int mRecordType; @CalledByNative public FastCheckoutAutofillProfile(
diff --git a/chrome/browser/ui/android/hats/test/java/src/org/chromium/chrome/browser/ui/hats/TestSurveyUtils.java b/chrome/browser/ui/android/hats/test/java/src/org/chromium/chrome/browser/ui/hats/TestSurveyUtils.java index 71afbde..c2917d6c 100644 --- a/chrome/browser/ui/android/hats/test/java/src/org/chromium/chrome/browser/ui/hats/TestSurveyUtils.java +++ b/chrome/browser/ui/android/hats/test/java/src/org/chromium/chrome/browser/ui/hats/TestSurveyUtils.java
@@ -253,9 +253,9 @@ } private static class SurveyEntry { - public String triggerId; - public Runnable onSuccessRunnable; - public Runnable onFailureRunnable; + public final String triggerId; + public final Runnable onSuccessRunnable; + public final Runnable onFailureRunnable; public boolean isShown; public boolean isExpired;
diff --git a/chrome/browser/ui/android/layouts/java/src/org/chromium/chrome/browser/layouts/CompositorModelChangeProcessorUnitTest.java b/chrome/browser/ui/android/layouts/java/src/org/chromium/chrome/browser/layouts/CompositorModelChangeProcessorUnitTest.java index 15d8d66..4bd19c0 100644 --- a/chrome/browser/ui/android/layouts/java/src/org/chromium/chrome/browser/layouts/CompositorModelChangeProcessorUnitTest.java +++ b/chrome/browser/ui/android/layouts/java/src/org/chromium/chrome/browser/layouts/CompositorModelChangeProcessorUnitTest.java
@@ -50,7 +50,7 @@ private CompositorModelChangeProcessor.FrameRequestSupplier mFrameSupplier; private CompositorModelChangeProcessor mCompositorMCP; private PropertyModel mModel; - private AtomicBoolean mPropertyChangedValue = new AtomicBoolean(false); + private final AtomicBoolean mPropertyChangedValue = new AtomicBoolean(false); @Before public void setUp() {
diff --git a/chrome/browser/ui/android/layouts/java/src/org/chromium/chrome/browser/layouts/EventFilter.java b/chrome/browser/ui/android/layouts/java/src/org/chromium/chrome/browser/layouts/EventFilter.java index e5d73d7..7d28fcad 100644 --- a/chrome/browser/ui/android/layouts/java/src/org/chromium/chrome/browser/layouts/EventFilter.java +++ b/chrome/browser/ui/android/layouts/java/src/org/chromium/chrome/browser/layouts/EventFilter.java
@@ -30,7 +30,7 @@ protected final float mPxToDp; private boolean mSimulateIntercepting; - private boolean mAutoOffset; + private final boolean mAutoOffset; protected float mCurrentMotionOffsetX; protected float mCurrentMotionOffsetY;
diff --git a/chrome/browser/ui/android/logo/java/src/org/chromium/chrome/browser/logo/LogoView.java b/chrome/browser/ui/android/logo/java/src/org/chromium/chrome/browser/logo/LogoView.java index 049df2d..c506d7a 100644 --- a/chrome/browser/ui/android/logo/java/src/org/chromium/chrome/browser/logo/LogoView.java +++ b/chrome/browser/ui/android/logo/java/src/org/chromium/chrome/browser/logo/LogoView.java
@@ -53,7 +53,7 @@ private @Nullable BaseGifDrawable mAnimatedLogoDrawable; private @Nullable ObjectAnimator mFadeAnimation; - private Paint mPaint; + private final Paint mPaint; private @Nullable Matrix mLogoMatrix; private @Nullable Matrix mNewLogoMatrix; private @Nullable Matrix mAnimatedLogoMatrix; @@ -61,7 +61,7 @@ private boolean mNewLogoIsDefault; private boolean mAnimationEnabled = true; - private LoadingView mLoadingView; + private final LoadingView mLoadingView; /** * A measure from 0 to 1 of how much the new logo has faded in. 0 shows the old logo, 1 shows
diff --git a/chrome/browser/ui/android/management/java/src/org/chromium/chrome/browser/management/ManagementPage.java b/chrome/browser/ui/android/management/java/src/org/chromium/chrome/browser/management/ManagementPage.java index 2d25b728..c88776c 100644 --- a/chrome/browser/ui/android/management/java/src/org/chromium/chrome/browser/management/ManagementPage.java +++ b/chrome/browser/ui/android/management/java/src/org/chromium/chrome/browser/management/ManagementPage.java
@@ -14,7 +14,7 @@ @NullMarked public class ManagementPage extends BasicNativePage { private final ManagementCoordinator mManagementCoordinator; - private String mTitle; + private final String mTitle; /** * Create a new instance of the management page.
diff --git a/chrome/browser/ui/android/multiwindow/BUILD.gn b/chrome/browser/ui/android/multiwindow/BUILD.gn index dcf4a2f..1c1ec18 100644 --- a/chrome/browser/ui/android/multiwindow/BUILD.gn +++ b/chrome/browser/ui/android/multiwindow/BUILD.gn
@@ -55,7 +55,6 @@ "java/res/drawable/checkmark_24dp.xml", "java/res/drawable/circle_green.xml", "java/res/layout/close_confirmation_dialog.xml", - "java/res/layout/instance_switcher_active_list.xml", "java/res/layout/instance_switcher_cmd_item.xml", "java/res/layout/instance_switcher_dialog.xml", "java/res/layout/instance_switcher_dialog_v2.xml",
diff --git a/chrome/browser/ui/android/multiwindow/java/res/layout/instance_switcher_active_list.xml b/chrome/browser/ui/android/multiwindow/java/res/layout/instance_switcher_active_list.xml deleted file mode 100644 index 1e90466..0000000 --- a/chrome/browser/ui/android/multiwindow/java/res/layout/instance_switcher_active_list.xml +++ /dev/null
@@ -1,15 +0,0 @@ -<?xml version="1.0" encoding="utf-8"?> -<!-- -Copyright 2025 The Chromium Authors -Use of this source code is governed by a BSD-style license that can be -found in the LICENSE file. ---> - -<merge xmlns:android="http://schemas.android.com/apk/res/android" - xmlns:app="http://schemas.android.com/apk/res-auto"> - <androidx.recyclerview.widget.RecyclerView - android:id="@+id/active_instance_list" - android:layout_width="match_parent" - android:layout_height="wrap_content" - android:divider="@null"/> -</merge>
diff --git a/chrome/browser/ui/android/multiwindow/java/res/layout/instance_switcher_dialog_v2.xml b/chrome/browser/ui/android/multiwindow/java/res/layout/instance_switcher_dialog_v2.xml index 252ba321..29f3fa5 100644 --- a/chrome/browser/ui/android/multiwindow/java/res/layout/instance_switcher_dialog_v2.xml +++ b/chrome/browser/ui/android/multiwindow/java/res/layout/instance_switcher_dialog_v2.xml
@@ -34,6 +34,16 @@ android:id="@+id/instance_list_container" android:layout_width="match_parent" android:layout_height="wrap_content"> - <include layout="@layout/instance_switcher_active_list"/> + <androidx.recyclerview.widget.RecyclerView + android:id="@+id/active_instance_list" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:divider="@null"/> + <androidx.recyclerview.widget.RecyclerView + android:id="@+id/inactive_instance_list" + android:layout_width="match_parent" + android:layout_height="wrap_content" + android:visibility="gone" + android:divider="@null"/> </FrameLayout> </LinearLayout>
diff --git a/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/InstanceSwitcherCoordinator.java b/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/InstanceSwitcherCoordinator.java index 655e3bd..fe1eabc 100644 --- a/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/InstanceSwitcherCoordinator.java +++ b/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/InstanceSwitcherCoordinator.java
@@ -5,6 +5,7 @@ package org.chromium.chrome.browser.multiwindow; import static org.chromium.build.NullUtil.assumeNonNull; +import static org.chromium.chrome.browser.multiwindow.UiUtils.INVALID_TASK_ID; import static org.chromium.components.browser_ui.widget.BrowserUiListMenuUtils.buildMenuListItem; import android.annotation.SuppressLint; @@ -23,6 +24,7 @@ import androidx.recyclerview.widget.RecyclerView; import com.google.android.material.tabs.TabLayout; +import com.google.android.material.tabs.TabLayout.OnTabSelectedListener; import com.google.android.material.tabs.TabLayout.Tab; import org.chromium.base.Callback; @@ -50,7 +52,6 @@ import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; -import java.util.Iterator; import java.util.List; /** @@ -79,6 +80,8 @@ private final ModalDialogManager mModalDialogManager; private final ModelList mModelList = new ModelList(); + private final ModelList mActiveModelList = new ModelList(); + private final ModelList mInactiveModelList = new ModelList(); private final UiUtils mUiUtils; private final View mDialogView; private @Nullable TabLayout mTabHeaderRow; @@ -132,30 +135,42 @@ mUiUtils = new UiUtils(mContext, iconBridge); mNewWindowAction = newWindowAction; - if (ChromeFeatureList.isEnabled(ChromeFeatureList.INSTANCE_SWITCHER_V2)) { - var adapter = new SimpleRecyclerViewAdapter(mModelList); - adapter.registerType( - EntryType.INSTANCE, - parentView -> - LayoutInflater.from(mContext) - .inflate(R.layout.instance_switcher_item, null), - InstanceSwitcherItemViewBinder::bind); - adapter.registerType( - EntryType.COMMAND, - parentView -> - LayoutInflater.from(mContext) - .inflate(R.layout.instance_switcher_cmd_item, null), - InstanceSwitcherItemViewBinder::bind); + if (isInstanceSwitcherV2Enabled()) { + var activeListAdapter = getInstanceListAdapter(/* active= */ true); + var inactiveListAdapter = getInstanceListAdapter(/* active= */ false); mDialogView = LayoutInflater.from(context) .inflate(R.layout.instance_switcher_dialog_v2, null); - mTabHeaderRow = mDialogView.findViewById(R.id.tabs); - View listContainer = mDialogView.findViewById(R.id.instance_list_container); - RecyclerView recyclerView = listContainer.findViewById(R.id.active_instance_list); - recyclerView.setLayoutManager( + + RecyclerView activeInstancesList = mDialogView.findViewById(R.id.active_instance_list); + activeInstancesList.setLayoutManager( new LinearLayoutManager(mContext, LinearLayoutManager.VERTICAL, false)); - recyclerView.setAdapter(adapter); + activeInstancesList.setAdapter(activeListAdapter); + RecyclerView inactiveInstancesList = + mDialogView.findViewById(R.id.inactive_instance_list); + inactiveInstancesList.setLayoutManager( + new LinearLayoutManager(mContext, LinearLayoutManager.VERTICAL, false)); + inactiveInstancesList.setAdapter(inactiveListAdapter); + + mTabHeaderRow = mDialogView.findViewById(R.id.tabs); + mTabHeaderRow.addOnTabSelectedListener( + new OnTabSelectedListener() { + @Override + public void onTabSelected(Tab tab) { + boolean isActiveTab = tab.getPosition() == 0; + activeInstancesList.setVisibility( + isActiveTab ? View.VISIBLE : View.GONE); + inactiveInstancesList.setVisibility( + isActiveTab ? View.GONE : View.VISIBLE); + } + + @Override + public void onTabUnselected(Tab tab) {} + + @Override + public void onTabReselected(Tab tab) {} + }); } else { ModelListAdapter adapter = new ModelListAdapter(mModelList); // TODO: Extend modern_list_item_view.xml to replace instance_switcher_item.xml @@ -179,17 +194,52 @@ } } + private SimpleRecyclerViewAdapter getInstanceListAdapter(boolean active) { + var adapter = new SimpleRecyclerViewAdapter(active ? mActiveModelList : mInactiveModelList); + adapter.registerType( + EntryType.INSTANCE, + parentView -> + LayoutInflater.from(mContext) + .inflate(R.layout.instance_switcher_item, null), + InstanceSwitcherItemViewBinder::bind); + adapter.registerType( + EntryType.COMMAND, + parentView -> + LayoutInflater.from(mContext) + .inflate(R.layout.instance_switcher_cmd_item, null), + InstanceSwitcherItemViewBinder::bind); + return adapter; + } + private void show(List<InstanceInfo> items, boolean newWindowEnabled) { UiUtils.closeOpenDialogs(); sPrevInstance = this; for (int i = 0; i < items.size(); ++i) { + // An active instance should have an associated live task. + boolean isActiveInstance = items.get(i).taskId != INVALID_TASK_ID; PropertyModel itemModel = generateListItem(items.get(i)); - mModelList.add(new ModelListAdapter.ListItem(EntryType.INSTANCE, itemModel)); + if (isInstanceSwitcherV2Enabled()) { + if (isActiveInstance) { + mActiveModelList.add( + new ModelListAdapter.ListItem(EntryType.INSTANCE, itemModel)); + } else { + mInactiveModelList.add( + new ModelListAdapter.ListItem(EntryType.INSTANCE, itemModel)); + } + } else { + mModelList.add(new ModelListAdapter.ListItem(EntryType.INSTANCE, itemModel)); + } } mNewWindowModel = new PropertyModel(InstanceSwitcherItemProperties.ALL_KEYS); enableNewWindowCommand(newWindowEnabled); mModelList.add(new ModelListAdapter.ListItem(EntryType.COMMAND, mNewWindowModel)); - updateTabTitle(items.size(), items.size()); + if (isInstanceSwitcherV2Enabled()) { + // "+New window" should only be added to the active instances list. + mActiveModelList.add(new ModelListAdapter.ListItem(EntryType.COMMAND, mNewWindowModel)); + // Exclude COMMAND item from active instance count. + int numActiveInstances = mActiveModelList.size() - 1; + updateTabTitle(numActiveInstances, mInactiveModelList.size()); + } mDialog = createDialog(mDialogView); mModalDialogManager.showDialog(mDialog, ModalDialogType.APP); @@ -305,22 +355,36 @@ private void removeInstance(InstanceInfo item) { int instanceId = item.instanceId; - Iterator<ListItem> it = mModelList.iterator(); - while (it.hasNext()) { - ListItem li = it.next(); - int id = li.model.get(InstanceSwitcherItemProperties.INSTANCE_ID); - if (id == instanceId) { - mModelList.remove(li); - break; - } + + if (isInstanceSwitcherV2Enabled()) { + removeItemFromModelList( + instanceId, + item.taskId == INVALID_TASK_ID ? mInactiveModelList : mActiveModelList); + } else { + removeItemFromModelList(instanceId, mModelList); } + mCloseCallback.onResult(item); RecordUserAction.record("Android.WindowManager.CloseWindow"); // Removing an instance enables the new window item. enableNewWindowCommand(true); - // Number of instances is one less than the list size to exclude the new window item. - int numInstances = mModelList.size() - 1; - updateTabTitle(numInstances, numInstances); + + if (isInstanceSwitcherV2Enabled()) { + // Exclude COMMAND item from active instance count. + int numActiveInstances = mActiveModelList.size() - 1; + int numInactiveInstances = mInactiveModelList.size(); + updateTabTitle(numActiveInstances, numInactiveInstances); + } + } + + private void removeItemFromModelList(int instanceId, ModelList list) { + for (ListItem li : list) { + int id = li.model.get(InstanceSwitcherItemProperties.INSTANCE_ID); + if (id == instanceId) { + list.remove(li); + return; + } + } } private static boolean canSkipConfirm(InstanceInfo item) { @@ -380,4 +444,8 @@ inactiveTab.setText( mContext.getString(R.string.instance_switcher_tabs_inactive, numInactiveInstances)); } + + private static boolean isInstanceSwitcherV2Enabled() { + return ChromeFeatureList.isEnabled(ChromeFeatureList.INSTANCE_SWITCHER_V2); + } }
diff --git a/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/InstanceSwitcherCoordinatorTest.java b/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/InstanceSwitcherCoordinatorTest.java index aafcc4b..f748f6d9 100644 --- a/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/InstanceSwitcherCoordinatorTest.java +++ b/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/InstanceSwitcherCoordinatorTest.java
@@ -13,6 +13,7 @@ import static androidx.test.espresso.matcher.RootMatchers.withDecorView; import static androidx.test.espresso.matcher.ViewMatchers.Visibility.GONE; import static androidx.test.espresso.matcher.ViewMatchers.Visibility.VISIBLE; +import static androidx.test.espresso.matcher.ViewMatchers.isDescendantOfA; import static androidx.test.espresso.matcher.ViewMatchers.isDisplayed; import static androidx.test.espresso.matcher.ViewMatchers.withClassName; import static androidx.test.espresso.matcher.ViewMatchers.withEffectiveVisibility; @@ -22,6 +23,7 @@ import static org.hamcrest.Matchers.allOf; import static org.hamcrest.Matchers.anything; import static org.hamcrest.Matchers.containsString; +import static org.hamcrest.Matchers.not; import androidx.test.filters.SmallTest; @@ -164,6 +166,56 @@ @Test @SmallTest + @EnableFeatures(ChromeFeatureList.INSTANCE_SWITCHER_V2) + public void testActiveInactiveTabSwitch_InstanceSwitcherV2() throws Exception { + // Initialize instance list with 2 active instances and 1 inactive instance. + InstanceInfo[] instances = + new InstanceInfo[] { + new InstanceInfo( + 0, 57, InstanceInfo.Type.CURRENT, "url0", "title0", 1, 0, false, 0), + new InstanceInfo( + 1, 58, InstanceInfo.Type.OTHER, "ur11", "title1", 2, 0, false, 0), + new InstanceInfo( + 2, -1, InstanceInfo.Type.OTHER, "url2", "title2", 0, 0, false, 0) + }; + final CallbackHelper itemClickCallbackHelper = new CallbackHelper(); + final int itemClickCount = itemClickCallbackHelper.getCallCount(); + Callback<InstanceInfo> openCallback = (item) -> itemClickCallbackHelper.notifyCalled(); + ThreadUtils.runOnUiThreadBlocking( + () -> { + InstanceSwitcherCoordinator.showDialog( + mActivityTestRule.getActivity(), + mModalDialogManager, + mIconBridge, + openCallback, + null, + null, + false, + Arrays.asList(instances)); + }); + + onView(withId(R.id.active_instance_list)).inRoot(isDialog()).check(matches(isDisplayed())); + onView(withId(R.id.inactive_instance_list)) + .inRoot(isDialog()) + .check(matches(not(isDisplayed()))); + + onView(allOf(withText("Inactive (1)"), isDescendantOfA(withId(R.id.tabs)))) + .perform(click()); + + onView(withId(R.id.active_instance_list)) + .inRoot(isDialog()) + .check(matches(not(isDisplayed()))); + onView(withId(R.id.inactive_instance_list)) + .inRoot(isDialog()) + .check(matches(isDisplayed())); + onView(withId(R.id.inactive_instance_list)) + .inRoot(isDialog()) + .perform(actionOnItemAtPosition(0, click())); + itemClickCallbackHelper.waitForCallback(itemClickCount); + } + + @Test + @SmallTest public void testNewWindow() throws Exception { InstanceInfo[] instances = new InstanceInfo[] {
diff --git a/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/MultiInstanceStateUnitTest.java b/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/MultiInstanceStateUnitTest.java index bb0e4ca..7be65757 100644 --- a/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/MultiInstanceStateUnitTest.java +++ b/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/MultiInstanceStateUnitTest.java
@@ -44,11 +44,11 @@ } } - private static Map<AppTask, RecentTaskInfo> sTasks = new HashMap<>(); + private static final Map<AppTask, RecentTaskInfo> sTasks = new HashMap<>(); private MultiInstanceState mMultiInstanceState; - private String mBaseActivityClassName = BrowserActivity.class.getName(); + private final String mBaseActivityClassName = BrowserActivity.class.getName(); private static class BaseActivity extends Activity { private int mTaskId;
diff --git a/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/UiUtils.java b/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/UiUtils.java index 39de99e..fb26066 100644 --- a/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/UiUtils.java +++ b/chrome/browser/ui/android/multiwindow/java/src/org/chromium/chrome/browser/multiwindow/UiUtils.java
@@ -34,7 +34,7 @@ private final int mDisplayedIconSize; private final Drawable mIncognitoFavicon; private final Drawable mGlobeFavicon; - private LargeIconBridge mLargeIconBridge; + private final LargeIconBridge mLargeIconBridge; private final RoundedIconGenerator mIconGenerator; UiUtils(Context context, LargeIconBridge iconBridge) {
diff --git a/chrome/browser/ui/android/native_page/java/src/org/chromium/chrome/browser/ui/native_page/BasicSmoothTransitionDelegate.java b/chrome/browser/ui/android/native_page/java/src/org/chromium/chrome/browser/ui/native_page/BasicSmoothTransitionDelegate.java index c14a493..39d3e0a 100644 --- a/chrome/browser/ui/android/native_page/java/src/org/chromium/chrome/browser/ui/native_page/BasicSmoothTransitionDelegate.java +++ b/chrome/browser/ui/android/native_page/java/src/org/chromium/chrome/browser/ui/native_page/BasicSmoothTransitionDelegate.java
@@ -22,8 +22,8 @@ public class BasicSmoothTransitionDelegate implements SmoothTransitionDelegate { private static final int SMOOTH_TRANSITION_DURATION_MS = 100; - private View mView; - private Animator mAnimator; + private final View mView; + private final Animator mAnimator; public BasicSmoothTransitionDelegate(View view) { mView = view;
diff --git a/chrome/browser/ui/android/night_mode/java/src/org/chromium/chrome/browser/night_mode/GlobalNightModeStateController.java b/chrome/browser/ui/android/night_mode/java/src/org/chromium/chrome/browser/night_mode/GlobalNightModeStateController.java index 211d191a..a542aa2 100644 --- a/chrome/browser/ui/android/night_mode/java/src/org/chromium/chrome/browser/night_mode/GlobalNightModeStateController.java +++ b/chrome/browser/ui/android/night_mode/java/src/org/chromium/chrome/browser/night_mode/GlobalNightModeStateController.java
@@ -34,7 +34,7 @@ */ private Boolean mNightModeOn; - private SharedPreferences.OnSharedPreferenceChangeListener mPreferenceListener; + private final SharedPreferences.OnSharedPreferenceChangeListener mPreferenceListener; /** Whether this class has started listening to relevant states for night mode. */ private boolean mIsStarted;
diff --git a/chrome/browser/ui/android/night_mode/java/src/org/chromium/chrome/browser/night_mode/WebContentsDarkModeMessageController.java b/chrome/browser/ui/android/night_mode/java/src/org/chromium/chrome/browser/night_mode/WebContentsDarkModeMessageController.java index 8fcbd90..88074c4 100644 --- a/chrome/browser/ui/android/night_mode/java/src/org/chromium/chrome/browser/night_mode/WebContentsDarkModeMessageController.java +++ b/chrome/browser/ui/android/night_mode/java/src/org/chromium/chrome/browser/night_mode/WebContentsDarkModeMessageController.java
@@ -367,7 +367,7 @@ @VisibleForTesting static class AutoDarkClickableSpan extends ClickableSpan { - private Context mContext; + private final Context mContext; AutoDarkClickableSpan(Context context) { mContext = context;
diff --git a/chrome/browser/ui/android/night_mode/java/src/org/chromium/chrome/browser/night_mode/settings/RadioButtonGroupThemePreference.java b/chrome/browser/ui/android/night_mode/java/src/org/chromium/chrome/browser/night_mode/settings/RadioButtonGroupThemePreference.java index 29a6033..8744c389 100644 --- a/chrome/browser/ui/android/night_mode/java/src/org/chromium/chrome/browser/night_mode/settings/RadioButtonGroupThemePreference.java +++ b/chrome/browser/ui/android/night_mode/java/src/org/chromium/chrome/browser/night_mode/settings/RadioButtonGroupThemePreference.java
@@ -42,7 +42,7 @@ private @ThemeType int mSetting; private @MonotonicNonNull RadioButtonWithDescription mSettingRadioButton; private @MonotonicNonNull RadioButtonWithDescriptionLayout mGroup; - private ArrayList<RadioButtonWithDescription> mButtons; + private final ArrayList<RadioButtonWithDescription> mButtons; // Additional view that darkens website contents. private @MonotonicNonNull LinearLayout mCheckboxContainer;
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/AutocompleteEditTextTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/AutocompleteEditTextTest.java index 12853c9..ee96656f 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/AutocompleteEditTextTest.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/AutocompleteEditTextTest.java
@@ -172,9 +172,9 @@ private class TestAutocompleteEditText extends AutocompleteEditText { private static final String JAVASCRIPT_SCHEME = "javascript:"; - private AtomicInteger mVerifierCallCount = new AtomicInteger(); - private AtomicInteger mAccessibilityVerifierCallCount = new AtomicInteger(); - private AtomicReference<String> mKeyboardPackageName = + private final AtomicInteger mVerifierCallCount = new AtomicInteger(); + private final AtomicInteger mAccessibilityVerifierCallCount = new AtomicInteger(); + private final AtomicReference<String> mKeyboardPackageName = new AtomicReference<>("placeholder.ime"); public TestAutocompleteEditText(Context context, AttributeSet attrs) {
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarCoordinator.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarCoordinator.java index ab7fd30..be6aa53 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarCoordinator.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarCoordinator.java
@@ -112,7 +112,7 @@ private UrlBarCoordinator mUrlCoordinator; private AutocompleteCoordinator mAutocompleteCoordinator; private StatusCoordinator mStatusCoordinator; - private WindowAndroid mWindowAndroid; + private final WindowAndroid mWindowAndroid; private LocationBarMediator mLocationBarMediator; private View mUrlBar; private @Nullable View mDeleteButton;
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java index 62415ad..9428fbbd 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarLayout.java
@@ -67,7 +67,7 @@ protected @Nullable SearchEngineUtils mSearchEngineUtils; private float mUrlFocusPercentage; private boolean mUrlBarLaidOutAtFocusedWidth; - private int mStatusIconAndUrlBarOffset; + private final int mStatusIconAndUrlBarOffset; private int mUrlActionContainerEndMargin; private boolean mIsUrlFocusChangeInProgress;
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediator.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediator.java index 711c10f2..65f685d 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediator.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediator.java
@@ -178,8 +178,8 @@ private AutocompleteCoordinator mAutocompleteCoordinator; private @Nullable OmniboxPrerender mOmniboxPrerender; private UrlBarCoordinator mUrlCoordinator; - private ObservableSupplier<Profile> mProfileSupplier; - private CallbackController mCallbackController = new CallbackController(); + private final ObservableSupplier<Profile> mProfileSupplier; + private final CallbackController mCallbackController = new CallbackController(); private final OverrideUrlLoadingDelegate mOverrideUrlLoadingDelegate; private final LocaleManager mLocaleManager; private final List<Runnable> mDeferredNativeRunnables = new ArrayList<>(); @@ -215,9 +215,9 @@ // Tracks if the location bar is laid out in a focused state due to an ntp scroll. private boolean mIsLocationBarFocusedFromNtpScroll; private @BrandedColorScheme int mBrandedColorScheme = BrandedColorScheme.APP_DEFAULT; - private ObservableSupplierImpl<Boolean> mBackPressStateSupplier = + private final ObservableSupplierImpl<Boolean> mBackPressStateSupplier = new ObservableSupplierImpl<>(); - private @Nullable ObservableSupplier<TabModelSelector> mTabModelSelectorSupplier; + private final @Nullable ObservableSupplier<TabModelSelector> mTabModelSelectorSupplier; private @Nullable SearchEngineUtils mSearchEngineUtils; /*package */ LocationBarMediator(
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediatorTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediatorTest.java index 6a06115..c77fa817 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediatorTest.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/LocationBarMediatorTest.java
@@ -216,7 +216,7 @@ @Captor private ArgumentCaptor<TabObserver> mTabObserverCaptor; private Context mContext; - private ObservableSupplierImpl<Profile> mProfileSupplier = new ObservableSupplierImpl<>(); + private final ObservableSupplierImpl<Profile> mProfileSupplier = new ObservableSupplierImpl<>(); private LocationBarMediator mMediator; private LocationBarMediator mTabletMediator; private UrlBarData mUrlBarData;
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/OmniboxPrerender.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/OmniboxPrerender.java index cf7b6ee..7b853ed 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/OmniboxPrerender.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/OmniboxPrerender.java
@@ -22,7 +22,7 @@ */ @NullMarked public class OmniboxPrerender { - private long mNativeOmniboxPrerender; + private final long mNativeOmniboxPrerender; /** Constructor for creating a OmniboxPrerender instanace. */ public OmniboxPrerender() {
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/OmniboxSuggestionsDropdownEmbedderImpl.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/OmniboxSuggestionsDropdownEmbedderImpl.java index f998122..d3251ea 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/OmniboxSuggestionsDropdownEmbedderImpl.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/OmniboxSuggestionsDropdownEmbedderImpl.java
@@ -56,7 +56,7 @@ private int mWindowWidthDp; private int mWindowHeightDp; private @Nullable WindowInsetsCompat mWindowInsetsCompat; - private @Nullable View mBaseChromeLayout; + private final @Nullable View mBaseChromeLayout; /** * @param windowAndroid Window object in which the dropdown will be displayed.
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/SearchEngineUtils.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/SearchEngineUtils.java index 3bc8b95..6d6f68f0 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/SearchEngineUtils.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/SearchEngineUtils.java
@@ -38,7 +38,7 @@ @NullMarked public class SearchEngineUtils implements Destroyable, TemplateUrlServiceObserver { private static final String TAG = "DSEUtils"; - private static ProfileKeyedMap<SearchEngineUtils> sProfileKeyedUtils = + private static final ProfileKeyedMap<SearchEngineUtils> sProfileKeyedUtils = ProfileKeyedMap.createMapOfDestroyables(); private static @Nullable SearchEngineUtils sInstanceForTesting;
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBarUnitTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBarUnitTest.java index e0e62745..59e312a 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBarUnitTest.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/UrlBarUnitTest.java
@@ -90,7 +90,7 @@ private static final int MIN_LENGTH_FOR_TRUNCATION = 100; private UrlBar mUrlBar; - private Paint.FontMetrics mFontMetrics = new Paint.FontMetrics(); + private final Paint.FontMetrics mFontMetrics = new Paint.FontMetrics(); public @Rule MockitoRule mockitoRule = MockitoJUnit.rule(); private @Mock UrlBarDelegate mUrlBarDelegate; private @Mock ViewStructure mViewStructure;
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/status/PageInfoIphControllerUnitTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/status/PageInfoIphControllerUnitTest.java index 17167cc..5532374 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/status/PageInfoIphControllerUnitTest.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/status/PageInfoIphControllerUnitTest.java
@@ -45,7 +45,8 @@ private @Mock Tracker mTracker; private View mView; private PageInfoIphController mController; - private ArgumentCaptor<IphCommand> mIphCmdCaptor = ArgumentCaptor.forClass(IphCommand.class); + private final ArgumentCaptor<IphCommand> mIphCmdCaptor = + ArgumentCaptor.forClass(IphCommand.class); @Before public void setUp() {
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/status/StatusMediator.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/status/StatusMediator.java index bc2998fa..2632a9b 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/status/StatusMediator.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/status/StatusMediator.java
@@ -80,7 +80,7 @@ private boolean mPageIsOffline; private boolean mShowStatusIconWhenUrlFocused; private boolean mIsSecurityViewShown; - private boolean mIsTablet; + private final boolean mIsTablet; private int mUrlMinWidth; private int mSeparatorMinWidth; @@ -94,10 +94,10 @@ private @StringRes int mSecurityIconDescriptionRes; private @ColorRes int mNavigationIconTintRes; - private Context mContext; + private final Context mContext; - private LocationBarDataProvider mLocationBarDataProvider; - private UrlBarEditingTextStateProvider mUrlBarEditingTextStateProvider; + private final LocationBarDataProvider mLocationBarDataProvider; + private final UrlBarEditingTextStateProvider mUrlBarEditingTextStateProvider; private final PermissionDialogController mPermissionDialogController; private final Handler mPermissionTaskHandler = new Handler(); @@ -112,7 +112,7 @@ private float mUrlFocusPercent; - private int mPermissionIconDisplayTimeoutMs = PERMISSION_ICON_DEFAULT_DISPLAY_TIMEOUT_MS; + private final int mPermissionIconDisplayTimeoutMs = PERMISSION_ICON_DEFAULT_DISPLAY_TIMEOUT_MS; private @Nullable CookieControlsBridge mCookieControlsBridge; private boolean mCookieControlsVisible;
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/status/StatusProperties.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/status/StatusProperties.java index 4701960..968d8ef 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/status/StatusProperties.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/status/StatusProperties.java
@@ -173,7 +173,7 @@ public static final int OMNIBOX_ICON_DP = 24; public static final int INNER_ICON_DP = 20; - private boolean mIsIncognito; + private final boolean mIsIncognito; PermissionIconResource(@Nullable Drawable drawable, boolean isIncognito) { super(drawable);
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/styles/OmniboxImageSupplier.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/styles/OmniboxImageSupplier.java index 5c5f678c..db9fb609 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/styles/OmniboxImageSupplier.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/styles/OmniboxImageSupplier.java
@@ -34,7 +34,7 @@ private static final int MAX_IMAGE_CACHE_SIZE = 500 * ConversionUtils.BYTES_PER_KILOBYTE; private final Map<GURL, List<Callback<Bitmap>>> mPendingImageRequests; - private int mDesiredFaviconWidthPx; + private final int mDesiredFaviconWidthPx; private RoundedIconGenerator mIconGenerator; private @Nullable LargeIconBridge mIconBridge; private @Nullable ImageFetcher mImageFetcher;
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/styles/OmniboxImageSupplierUnitTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/styles/OmniboxImageSupplierUnitTest.java index 7a302e2..319ce880 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/styles/OmniboxImageSupplierUnitTest.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/styles/OmniboxImageSupplierUnitTest.java
@@ -53,7 +53,7 @@ public @Rule MockitoRule mockitoRule = MockitoJUnit.rule(); - private ArgumentCaptor<LargeIconCallback> mIconCallbackCaptor = + private final ArgumentCaptor<LargeIconCallback> mIconCallbackCaptor = ArgumentCaptor.forClass(LargeIconCallback.class); private OmniboxImageSupplier mSupplier;
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinator.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinator.java index 017c7e0..4c96be8 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinator.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteCoordinator.java
@@ -67,7 +67,7 @@ private final OmniboxSuggestionsDropdownAdapter mAdapter; private final Optional<PreWarmingRecycledViewPool> mRecycledViewPool; private @Nullable OmniboxSuggestionsDropdown mDropdown; - private ObserverList<OmniboxSuggestionsDropdownScrollListener> mScrollListenerList = + private final ObserverList<OmniboxSuggestionsDropdownScrollListener> mScrollListenerList = new ObserverList<>(); /** An observer watching for changes to the visual state of the omnibox suggestions. */ @@ -204,7 +204,7 @@ boolean forcePhoneStyleOmnibox) { return new ViewProvider<SuggestionListViewHolder>() { private AsyncViewProvider<ViewGroup> mAsyncProvider; - private List<Callback<SuggestionListViewHolder>> mCallbacks = new ArrayList<>(); + private final List<Callback<SuggestionListViewHolder>> mCallbacks = new ArrayList<>(); private @Nullable SuggestionListViewHolder mHolder; @Override
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediatorUnitTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediatorUnitTest.java index 0f46274..8db33a3 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediatorUnitTest.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediatorUnitTest.java
@@ -149,7 +149,7 @@ private AutocompleteResult mAutocompleteResult; private ModelList mSuggestionModels; private ObservableSupplierImpl<TabWindowManager> mTabWindowManagerSupplier; - private Activity mActivity = Robolectric.buildActivity(Activity.class).setup().get(); + private final Activity mActivity = Robolectric.buildActivity(Activity.class).setup().get(); // Interface abstracting calls to CachedZeroSuggestionsManager, making interactions with that // more idiomatic.
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListBuilder.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListBuilder.java index 465ee21d..180edf29 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListBuilder.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListBuilder.java
@@ -49,7 +49,7 @@ private HeaderProcessor mHeaderProcessor; private @Nullable Supplier<ShareDelegate> mShareDelegateSupplier; private Optional<OmniboxImageSupplier> mImageSupplier; - private BookmarkState mBookmarkState; + private final BookmarkState mBookmarkState; DropdownItemViewInfoListBuilder( Supplier<@Nullable Tab> tabSupplier, BookmarkState bookmarkState) {
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListBuilderUnitTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListBuilderUnitTest.java index a3f5697f..0b4d4bf 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListBuilderUnitTest.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/DropdownItemViewInfoListBuilderUnitTest.java
@@ -55,7 +55,7 @@ /** Tests for {@link DropdownItemViewInfoListBuilder}. */ @RunWith(BaseRobolectricTestRunner.class) public class DropdownItemViewInfoListBuilderUnitTest { - private Context mContext = ContextUtils.getApplicationContext(); + private final Context mContext = ContextUtils.getApplicationContext(); public @Rule MockitoRule mockitoRule = MockitoJUnit.rule(); private @Spy HeaderProcessor mMockHeaderProcessor = new HeaderProcessor(mContext); @@ -64,7 +64,7 @@ private @Mock SuggestionProcessor mMockSuggestionProcessor; private @Mock AutocompleteInput mInput; - private GroupSeparatorProcessor mGroupSeparatorProcessor = + private final GroupSeparatorProcessor mGroupSeparatorProcessor = new GroupSeparatorProcessor(mContext); DropdownItemViewInfoListBuilder mBuilder;
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdown.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdown.java index fa9ec2a..70ab41d 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdown.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdown.java
@@ -86,7 +86,8 @@ private int mListViewMaxHeight; private int mLastBroadcastedListViewMaxHeight; - private Callback<OmniboxAlignment> mOmniboxAlignmentObserver = this::onOmniboxAlignmentChanged; + private final Callback<OmniboxAlignment> mOmniboxAlignmentObserver = + this::onOmniboxAlignmentChanged; private float mChildVerticalTranslation; private float mChildAlpha = 1.0f;
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdownUnitTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdownUnitTest.java index 5e282f6..012a449 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdownUnitTest.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/OmniboxSuggestionsDropdownUnitTest.java
@@ -65,11 +65,11 @@ private TestOmniboxSuggestionsDropdown mDropdown; private OmniboxSuggestionsDropdown.SuggestionLayoutScrollListener mListener; private OmniboxAlignment mOmniboxAlignment; - private ObservableSupplierImpl<OmniboxAlignment> mOmniboxAlignmentSupplier = + private final ObservableSupplierImpl<OmniboxAlignment> mOmniboxAlignmentSupplier = new ObservableSupplierImpl<>(); private boolean mIsTablet; private boolean mAttachedToWindow; - private OmniboxSuggestionsDropdownEmbedder mEmbedder = + private final OmniboxSuggestionsDropdownEmbedder mEmbedder = new OmniboxSuggestionsDropdownEmbedder() { @Override public boolean isTablet() {
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/RecyclerViewSelectionController.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/RecyclerViewSelectionController.java index c8ee44b7..17f5615 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/RecyclerViewSelectionController.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/RecyclerViewSelectionController.java
@@ -19,7 +19,7 @@ implements RecyclerView.OnChildAttachStateChangeListener { private static final int ADVANCE_EXPOSE_VIEWS = 2; private int mSelectedItemIndex = RecyclerView.NO_POSITION; - private LayoutManager mLayoutManager; + private final LayoutManager mLayoutManager; /** When true, cycling to next/previous item will go through null selection. */ private boolean mCycleThroughNoSelection;
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/SelectionController.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/SelectionController.java index e0f2af9..6be37e2 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/SelectionController.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/SelectionController.java
@@ -57,7 +57,7 @@ private final OnSelectionChangedListener mListener; private final @Mode int mMode; private final int mDefaultPosition; - private int mMaxPosition; + private int mNumItems; private int mPosition; @FunctionalInterface @@ -85,13 +85,12 @@ * SelectionController constructor. * * @param listener the listener receiving notifications about selection changes - * @param maxPosition the maximum valid position that can be reported to the listener + * @param itemCount the number of valid positions [0; itemCount-1) * @param mode Selection mode that defines how the controller will behave */ - public SelectionController( - OnSelectionChangedListener listener, int maxPosition, @Mode int mode) { - assert maxPosition < Integer.MAX_VALUE; - assert maxPosition >= 0; + public SelectionController(OnSelectionChangedListener listener, int itemCount, @Mode int mode) { + assert itemCount < Integer.MAX_VALUE; + assert itemCount >= 0; switch (mode) { case Mode.SATURATING: @@ -100,7 +99,7 @@ case Mode.SATURATING_WITH_SENTINEL: default: - mDefaultPosition = -1; // Just before the first entry. + mDefaultPosition = Integer.MIN_VALUE; // Lower-end sentinel. break; } @@ -108,20 +107,20 @@ mPosition = Integer.MIN_VALUE; mListener = listener; mMode = mode; - updateMaxPosition(maxPosition); + updateMaxPosition(itemCount); } /** * Update range of valid positions. * - * @param maxPosition the upper value in the selection range (inclusive) + * @param numItems total number of items, determining the upper position. */ - public void updateMaxPosition(int maxPosition) { + public void updateMaxPosition(int numItems) { if (!isParkedAtSentinel()) { mListener.onSelectionChanged(mPosition, false); } - mMaxPosition = maxPosition; + mNumItems = numItems; mPosition = mDefaultPosition; if (!isParkedAtSentinel()) { @@ -141,6 +140,8 @@ * @return whether selection was applied to the new element. */ public boolean advanceForward() { + if (mPosition == Integer.MAX_VALUE) return false; + if (mPosition == Integer.MIN_VALUE) return setPosition(0); return setPosition(mPosition + 1); } @@ -151,12 +152,14 @@ * @return whether selection was applied to the new element. */ public boolean advanceBack() { + if (mPosition == Integer.MIN_VALUE) return false; + if (mPosition == Integer.MAX_VALUE) return setPosition(mNumItems - 1); return setPosition(mPosition - 1); } /** Returns true if selection controller is currently parked outside the valid range. */ public boolean isParkedAtSentinel() { - return mPosition < 0 || mPosition > mMaxPosition; + return mPosition == Integer.MIN_VALUE || mPosition == Integer.MAX_VALUE; } /** Returns current counter value (unless saturated). */ @@ -181,12 +184,20 @@ mPosition = newPosition; switch (mMode) { case Mode.SATURATING: - mPosition = MathUtils.clamp(mPosition, 0, mMaxPosition); + if (mNumItems == 0) { + mPosition = Integer.MIN_VALUE; + } else { + mPosition = MathUtils.clamp(mPosition, 0, mNumItems - 1); + } break; case Mode.SATURATING_WITH_SENTINEL: // Park outside the valid range, keeping the information which edge we hit. - mPosition = MathUtils.clamp(mPosition, -1, mMaxPosition + 1); + if (mPosition < 0) { // Underflow + mPosition = Integer.MIN_VALUE; + } else if (mPosition >= mNumItems) { + mPosition = Integer.MAX_VALUE; + } break; }
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/SelectionControllerUnitTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/SelectionControllerUnitTest.java index bc0d767..e5d0379 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/SelectionControllerUnitTest.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/SelectionControllerUnitTest.java
@@ -30,7 +30,7 @@ /** Robolectric unit tests for {@link SelectionController}. */ @RunWith(BaseRobolectricTestRunner.class) public class SelectionControllerUnitTest { - private static final int MAX_POSITION = 2; // Items 0‒2 inclusive. + private static final int MAX_POSITION = 3; // Items 0‒2 inclusive. public @Rule MockitoRule mMockitoRule = MockitoJUnit.rule(); private @Mock SelectionController.OnSelectionChangedListener mListener; @@ -124,7 +124,7 @@ public void advanceBack_saturatingWithSentinel() { SelectionController c = new SelectionController(mListener, MAX_POSITION, Mode.SATURATING_WITH_SENTINEL); - c.setPosition(MAX_POSITION); + c.setPosition(MAX_POSITION - 1); verifyPositionSet(c, 2); assertTrue(c.advanceBack()); @@ -158,7 +158,7 @@ verifyPositionSet(c, 0); // Grow list of items - c.updateMaxPosition(4); + c.updateMaxPosition(5); verifyPositionSet(c, 0); assertTrue(c.advanceForward()); // Should now reach index 4 without saturating
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/SuggestionHorizontalDividerTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/SuggestionHorizontalDividerTest.java index fd3c6d646..d2e6879d 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/SuggestionHorizontalDividerTest.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/SuggestionHorizontalDividerTest.java
@@ -44,11 +44,11 @@ @Mock private SimpleRecyclerViewAdapter.ViewHolder mNoDividerViewHolder; @Mock private Canvas mCanvas; - private PropertyModel mShowDividerModel = + private final PropertyModel mShowDividerModel = new PropertyModel.Builder(DropdownCommonProperties.ALL_KEYS) .with(DropdownCommonProperties.SHOW_DIVIDER, true) .build(); - private PropertyModel mNoDividerModel = + private final PropertyModel mNoDividerModel = new PropertyModel.Builder(DropdownCommonProperties.ALL_KEYS) .with(DropdownCommonProperties.SHOW_DIVIDER, false) .build();
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/SuggestionListViewBinderUnitTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/SuggestionListViewBinderUnitTest.java index 9b93e97..b48b4c2 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/SuggestionListViewBinderUnitTest.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/SuggestionListViewBinderUnitTest.java
@@ -51,7 +51,7 @@ private ViewGroup mContainer; private OmniboxSuggestionsDropdown mDropdown; private ModelList mSuggestionModels; - private Activity mActivity = Robolectric.buildActivity(Activity.class).setup().get(); + private final Activity mActivity = Robolectric.buildActivity(Activity.class).setup().get(); @Before public void setUp() {
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/UnsyncedSuggestionsListAnimationDriverTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/UnsyncedSuggestionsListAnimationDriverTest.java index 864d97c..7f74168 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/UnsyncedSuggestionsListAnimationDriverTest.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/UnsyncedSuggestionsListAnimationDriverTest.java
@@ -38,7 +38,7 @@ public @Rule MockitoRule mMockitoRule = MockitoJUnit.rule(); private UnsyncedSuggestionsListAnimationDriver mDriver; - private PropertyModel mListModel = new PropertyModel(SuggestionListProperties.ALL_KEYS); + private final PropertyModel mListModel = new PropertyModel(SuggestionListProperties.ALL_KEYS); @Mock Runnable mShowRunnable; @Mock private ValueAnimator mValueAnimator; private Context mContext;
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/action/OmniboxActionDelegateImplUnitTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/action/OmniboxActionDelegateImplUnitTest.java index ff42948..6c49176 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/action/OmniboxActionDelegateImplUnitTest.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/action/OmniboxActionDelegateImplUnitTest.java
@@ -49,7 +49,7 @@ private @Mock SettingsNavigation mMockSettingsNavigation; private @Mock Tab mTab; private @Mock Runnable mMockOpenQuickDeleteDialog; - private AtomicReference<Tab> mTabReference = new AtomicReference<>(); + private final AtomicReference<Tab> mTabReference = new AtomicReference<>(); private Context mContext; private OmniboxActionDelegateImpl mDelegate;
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/action/OmniboxPedalUnitTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/action/OmniboxPedalUnitTest.java index f25537c..f6c1d481 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/action/OmniboxPedalUnitTest.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/action/OmniboxPedalUnitTest.java
@@ -35,7 +35,7 @@ public class OmniboxPedalUnitTest { public @Rule MockitoRule mockitoRule = MockitoJUnit.rule(); private @Mock OmniboxActionDelegate mDelegate; - private static List<Integer> sPedalsWithCustomIcons = + private static final List<Integer> sPedalsWithCustomIcons = List.of(OmniboxPedalId.PLAY_CHROME_DINO_GAME); @Test
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/answer/CalculatorAnswerTextLayout.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/answer/CalculatorAnswerTextLayout.java index b8ab27f0..e35032a 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/answer/CalculatorAnswerTextLayout.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/answer/CalculatorAnswerTextLayout.java
@@ -31,7 +31,7 @@ private final SpannableStringBuilder mText = new SpannableStringBuilder(); private @Nullable String mAccessibilityDescription; - private int mMaxLines = 1; + private final int mMaxLines = 1; // AnswerText implementation. @Override
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/answer/RichAnswerText.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/answer/RichAnswerText.java index b7e03c0..28c9415a 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/answer/RichAnswerText.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/answer/RichAnswerText.java
@@ -36,7 +36,7 @@ private String mAccessibilityDescription; private int mMaxLines = 1; private final AnswerType mAnswerType; - private boolean mUseRichAnswerCard; + private final boolean mUseRichAnswerCard; @Override public SpannableStringBuilder getText() {
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionView.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionView.java index 848b140..832273a 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionView.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/BaseSuggestionView.java
@@ -42,8 +42,8 @@ public final ActionChipsView actionChipsView; public final RoundedCornerOutlineProvider decorationIconOutline; private final List<ImageView> mActionButtons; + private final SelectionController mActionButtonsHighlighter; private Optional<Runnable> mOnFocusViaSelectionListener = Optional.empty(); - private @Nullable SelectionController mActionButtonsHighlighter; /** * Constructs a new suggestion view and inflates supplied layout as the contents view. @@ -85,6 +85,12 @@ contentView.setLayoutParams( LayoutParams.forViewType(LayoutParams.SuggestionViewType.CONTENT)); addView(contentView); + + mActionButtonsHighlighter = + new SelectionController( + this::highlightActionButton, + 0, + SelectionController.Mode.SATURATING_WITH_SENTINEL); } /** @@ -101,14 +107,7 @@ decreaseActionButtonsCount(desiredViewCount); } - mActionButtonsHighlighter = null; - if (desiredViewCount > 0) { - mActionButtonsHighlighter = - new SelectionController( - this::highlightActionButton, - desiredViewCount - 1, - SelectionController.Mode.SATURATING_WITH_SENTINEL); - } + mActionButtonsHighlighter.updateMaxPosition(desiredViewCount); } /** @@ -173,8 +172,7 @@ // navigation. if (actionChipsView.onKeyDown(keyCode, event)) return true; if (KeyNavigationUtil.isEnter(event)) { - if (mActionButtonsHighlighter != null - && !mActionButtonsHighlighter.isParkedAtSentinel()) { + if (!mActionButtonsHighlighter.isParkedAtSentinel()) { OptionalInt selection = mActionButtonsHighlighter.getPosition(); return mActionButtons.get(selection.getAsInt()).performClick(); } @@ -185,16 +183,11 @@ if (keyCode == KeyEvent.KEYCODE_TAB) { if (!event.isShiftPressed()) { // Pass the TAB key to Action Buttons, then to Action Chips. - if (mActionButtonsHighlighter != null - && mActionButtonsHighlighter.advanceForward()) { - return true; - } - return super_onKeyDown(keyCode, event); + return mActionButtonsHighlighter.advanceForward() + || super_onKeyDown(keyCode, event); } else { // Pass the TAB key to Action Chips, then to Action Buttons. - if (super_onKeyDown(keyCode, event)) return true; - return (mActionButtonsHighlighter != null - && mActionButtonsHighlighter.advanceBack()); + return super_onKeyDown(keyCode, event) || mActionButtonsHighlighter.advanceBack(); } }
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/SuggestionLayoutUnitTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/SuggestionLayoutUnitTest.java index a0532e1..796bad0 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/SuggestionLayoutUnitTest.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/base/SuggestionLayoutUnitTest.java
@@ -40,9 +40,9 @@ public @Rule MockitoRule mMockitoRule = MockitoJUnit.rule(); - private Context mContext = ContextUtils.getApplicationContext(); - private View mDecorationView = new View(mContext); - private View mContentView = new View(mContext); + private final Context mContext = ContextUtils.getApplicationContext(); + private final View mDecorationView = new View(mContext); + private final View mContentView = new View(mContext); private SuggestionLayout mLayout = new SuggestionLayout(mContext); @Test
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/mostvisited/MostVisitedTilesProcessorUnitTest.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/mostvisited/MostVisitedTilesProcessorUnitTest.java index 2c51ce15..63fc0b4 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/mostvisited/MostVisitedTilesProcessorUnitTest.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/mostvisited/MostVisitedTilesProcessorUnitTest.java
@@ -75,9 +75,9 @@ private MostVisitedTilesProcessor mProcessor; private List<AutocompleteMatch> mMatches; - private ArgumentCaptor<Callback<Bitmap>> mFavIconCallbackCaptor = + private final ArgumentCaptor<Callback<Bitmap>> mFavIconCallbackCaptor = ArgumentCaptor.forClass(Callback.class); - private ArgumentCaptor<Callback<Bitmap>> mGenIconCallbackCaptor = + private final ArgumentCaptor<Callback<Bitmap>> mGenIconCallbackCaptor = ArgumentCaptor.forClass(Callback.class); private @Mock Bitmap mFaviconBitmap; private @Mock SuggestionHost mSuggestionHost;
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/voice/VoiceRecognitionHandler.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/voice/VoiceRecognitionHandler.java index 3c1fc6f..0e610f4c 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/voice/VoiceRecognitionHandler.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/voice/VoiceRecognitionHandler.java
@@ -63,7 +63,7 @@ private @Nullable Long mQueryStartTimeMs; private @Nullable WebContentsObserver mVoiceSearchWebContentsObserver; private CallbackController mCallbackController = new CallbackController(); - private ObservableSupplier<Profile> mProfileSupplier; + private final ObservableSupplier<Profile> mProfileSupplier; private @Nullable Boolean mIsVoiceSearchEnabledCached; private boolean mRegisteredActivityStateListener;
diff --git a/chrome/browser/ui/android/pdf/java/src/org/chromium/chrome/browser/pdf/PdfCoordinator.java b/chrome/browser/ui/android/pdf/java/src/org/chromium/chrome/browser/pdf/PdfCoordinator.java index 2442b269..0c3ff13 100644 --- a/chrome/browser/ui/android/pdf/java/src/org/chromium/chrome/browser/pdf/PdfCoordinator.java +++ b/chrome/browser/ui/android/pdf/java/src/org/chromium/chrome/browser/pdf/PdfCoordinator.java
@@ -46,7 +46,7 @@ private final View mView; private final FragmentManager mFragmentManager; private final Activity mActivity; - private String mTabId; + private final String mTabId; /** A unique id to identity the FragmentContainerView in the current PdfPage. */ private final int mFragmentContainerViewId; @@ -68,7 +68,7 @@ private int mFindInPageCount; /** ProgressBar to be shown during PDF download. */ - private ProgressBar mProgressBar; + private final ProgressBar mProgressBar; /** * Creates a PdfCoordinator for the PdfPage.
diff --git a/chrome/browser/ui/android/pdf/java/src/org/chromium/chrome/browser/pdf/PdfPage.java b/chrome/browser/ui/android/pdf/java/src/org/chromium/chrome/browser/pdf/PdfPage.java index f2cd596f..3b428f5 100644 --- a/chrome/browser/ui/android/pdf/java/src/org/chromium/chrome/browser/pdf/PdfPage.java +++ b/chrome/browser/ui/android/pdf/java/src/org/chromium/chrome/browser/pdf/PdfPage.java
@@ -23,7 +23,7 @@ @VisibleForTesting final PdfCoordinator mPdfCoordinator; private String mTitle; private final String mUrl; - private boolean mIsIncognito; + private final boolean mIsIncognito; private boolean mIsDownloadSafe; private long mTransientDownloadStartTimestamp;
diff --git a/chrome/browser/ui/android/preloading/java/src/org/chromium/chrome/browser/preloading/AndroidPrerenderManager.java b/chrome/browser/ui/android/preloading/java/src/org/chromium/chrome/browser/preloading/AndroidPrerenderManager.java index 447cb2d..2501d6c 100644 --- a/chrome/browser/ui/android/preloading/java/src/org/chromium/chrome/browser/preloading/AndroidPrerenderManager.java +++ b/chrome/browser/ui/android/preloading/java/src/org/chromium/chrome/browser/preloading/AndroidPrerenderManager.java
@@ -24,7 +24,7 @@ */ @NullMarked public class AndroidPrerenderManager { - private long mNativeAndroidPrerenderManager; + private final long mNativeAndroidPrerenderManager; private @Nullable WebContents mWebContents; private static @Nullable AndroidPrerenderManager sAndroidPrerenderManager;
diff --git a/chrome/browser/ui/android/settings_promo_card/java/src/org/chromium/chrome/browser/ui/settings_promo_card/SettingsPromoCardPreference.java b/chrome/browser/ui/android/settings_promo_card/java/src/org/chromium/chrome/browser/ui/settings_promo_card/SettingsPromoCardPreference.java index 77e9557..aeeb761 100644 --- a/chrome/browser/ui/android/settings_promo_card/java/src/org/chromium/chrome/browser/ui/settings_promo_card/SettingsPromoCardPreference.java +++ b/chrome/browser/ui/android/settings_promo_card/java/src/org/chromium/chrome/browser/ui/settings_promo_card/SettingsPromoCardPreference.java
@@ -18,7 +18,7 @@ /** A preference that displays a settings promo card. */ @NullMarked public class SettingsPromoCardPreference extends Preference { - private @Nullable SettingsPromoCardProvider mProvider; + private final @Nullable SettingsPromoCardProvider mProvider; /** Construct and initialize SettingsPromoCardPreference to be shown in main settings. */ public SettingsPromoCardPreference(Context context, AttributeSet attrs, Tracker tracker) {
diff --git a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/BottomSheetSigninAndHistorySyncConfig.java b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/BottomSheetSigninAndHistorySyncConfig.java index 5441908..a53159c 100644 --- a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/BottomSheetSigninAndHistorySyncConfig.java +++ b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/BottomSheetSigninAndHistorySyncConfig.java
@@ -65,12 +65,12 @@ /** Builder for {@link BottomSheetSigninAndHistorySyncConfig}. */ public static class Builder { - private AccountPickerBottomSheetStrings mBottomSheetStrings; + private final AccountPickerBottomSheetStrings mBottomSheetStrings; private @StringRes int mHistorySyncTitleId; private @StringRes int mHistorySyncSubtitleId; - private @NoAccountSigninMode int mNoAccountSigninMode; - private @WithAccountSigninMode int mWithAccountSigninMode; - private @HistorySyncConfig.OptInMode int mHistoryOptInMode; + private final @NoAccountSigninMode int mNoAccountSigninMode; + private final @WithAccountSigninMode int mWithAccountSigninMode; + private final @HistorySyncConfig.OptInMode int mHistoryOptInMode; private @Nullable CoreAccountId mSelectedCoreAccountId; /**
diff --git a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/DialogWhenLargeContentLayout.java b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/DialogWhenLargeContentLayout.java index 61b8d8d..57f0394 100644 --- a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/DialogWhenLargeContentLayout.java +++ b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/DialogWhenLargeContentLayout.java
@@ -30,10 +30,10 @@ */ @NullMarked public class DialogWhenLargeContentLayout extends FrameLayout { - private TypedValue mFixedWidthMajor = new TypedValue(); - private TypedValue mFixedWidthMinor = new TypedValue(); - private TypedValue mFixedHeightMajor = new TypedValue(); - private TypedValue mFixedHeightMinor = new TypedValue(); + private final TypedValue mFixedWidthMajor = new TypedValue(); + private final TypedValue mFixedWidthMinor = new TypedValue(); + private final TypedValue mFixedHeightMajor = new TypedValue(); + private final TypedValue mFixedHeightMinor = new TypedValue(); private static boolean sShouldShowAsDialogForTesting;
diff --git a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/fullscreen_signin/FreManagementNoticeDialogHelper.java b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/fullscreen_signin/FreManagementNoticeDialogHelper.java index 48bbcb0..f6fde77 100644 --- a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/fullscreen_signin/FreManagementNoticeDialogHelper.java +++ b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/fullscreen_signin/FreManagementNoticeDialogHelper.java
@@ -55,7 +55,7 @@ private FreManagementNoticeDialogHelper() {} private static class WrappedSigninCallback implements SignInCallback { - private @Nullable SignInCallback mWrappedCallback; + private final @Nullable SignInCallback mWrappedCallback; public WrappedSigninCallback(@Nullable SignInCallback callback) { mWrappedCallback = callback;
diff --git a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/history_sync/HistorySyncRenderTest.java b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/history_sync/HistorySyncRenderTest.java index c9c1c1a..22e87e99 100644 --- a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/history_sync/HistorySyncRenderTest.java +++ b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/history_sync/HistorySyncRenderTest.java
@@ -65,7 +65,7 @@ public class HistorySyncRenderTest { /** Parameter provider for night mode state and device orientation. */ public static class NightModeAndOrientationParameterProvider implements ParameterProvider { - private static List<ParameterSet> sParams = + private static final List<ParameterSet> sParams = Arrays.asList( new ParameterSet() .value(/* firstArg= */ false, Configuration.ORIENTATION_PORTRAIT)
diff --git a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/signin_promo/HistoryPageSigninPromoDelegate.java b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/signin_promo/HistoryPageSigninPromoDelegate.java index 0ef8fcac..d1fdd86 100644 --- a/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/signin_promo/HistoryPageSigninPromoDelegate.java +++ b/chrome/browser/ui/android/signin/java/src/org/chromium/chrome/browser/ui/signin/signin_promo/HistoryPageSigninPromoDelegate.java
@@ -59,7 +59,7 @@ @VisibleForTesting static final int MAX_IMPRESSIONS = 10; - private boolean mIsCreatedInCct; + private final boolean mIsCreatedInCct; private final String mPromoShowCountPreferenceName; private @PromoState int mPromoState = PromoState.NONE;
diff --git a/chrome/browser/ui/android/signin/junit/src/org/chromium/chrome/browser/ui/signin/SigninAccountPickerCoordinatorTest.java b/chrome/browser/ui/android/signin/junit/src/org/chromium/chrome/browser/ui/signin/SigninAccountPickerCoordinatorTest.java index 7deb5b9..4b72e7d0 100644 --- a/chrome/browser/ui/android/signin/junit/src/org/chromium/chrome/browser/ui/signin/SigninAccountPickerCoordinatorTest.java +++ b/chrome/browser/ui/android/signin/junit/src/org/chromium/chrome/browser/ui/signin/SigninAccountPickerCoordinatorTest.java
@@ -67,7 +67,8 @@ @Mock private SigninAccountPickerCoordinator.Delegate mDelegateMock; @Mock private AccountPickerBottomSheetMediator mMediator; - private final @SigninAccessPoint int mAccessPoint = SigninAccessPoint.NTP_SIGNED_OUT_ICON; + private static final @SigninAccessPoint int ACCESS_POINT = + SigninAccessPoint.NTP_SIGNED_OUT_ICON; private ComponentActivity mActivity; private ViewGroup mContainerView; private SigninAccountPickerCoordinator mCoordinator; @@ -100,7 +101,7 @@ mSigninManagerMock, bottomSheetStrings, AccountPickerLaunchMode.DEFAULT, - mAccessPoint, + ACCESS_POINT, /* selectedAccountId= */ null); } @@ -119,7 +120,7 @@ // Verify that the SigninManager starts sign-in then a dialog is shown for history opt-in. verify(mSigninManagerMock, times(1)) - .signin(eq(mCoreAccountInfoMock), eq(mAccessPoint), any()); + .signin(eq(mCoreAccountInfoMock), eq(ACCESS_POINT), any()); verify(mDelegateMock, times(1)).onSignInComplete(); verify(mDelegateMock, never()).onSignInCancel(); } @@ -156,7 +157,7 @@ // be implemented, and add test to ensure that the delegate is called only once in the // coordinator's lifetime. verify(mSigninManagerMock, times(1)) - .signin(eq(mCoreAccountInfoMock), eq(mAccessPoint), any()); + .signin(eq(mCoreAccountInfoMock), eq(ACCESS_POINT), any()); verify(mDelegateMock, never()).onSignInComplete(); verify(mDelegateMock, never()).onSignInCancel(); }
diff --git a/chrome/browser/ui/android/signin/junit/src/org/chromium/chrome/browser/ui/signin/fullscreen_signin/FreManagementNoticeDialogHelperTest.java b/chrome/browser/ui/android/signin/junit/src/org/chromium/chrome/browser/ui/signin/fullscreen_signin/FreManagementNoticeDialogHelperTest.java index 0845f14..83bd6a0 100644 --- a/chrome/browser/ui/android/signin/junit/src/org/chromium/chrome/browser/ui/signin/fullscreen_signin/FreManagementNoticeDialogHelperTest.java +++ b/chrome/browser/ui/android/signin/junit/src/org/chromium/chrome/browser/ui/signin/fullscreen_signin/FreManagementNoticeDialogHelperTest.java
@@ -53,7 +53,7 @@ @Mock private ModalDialogManager mModalDialogManager; @Mock private Context mContext; - private CoreAccountInfo mCoreAccountInfo = + private final CoreAccountInfo mCoreAccountInfo = CoreAccountInfo.createFromEmailAndGaiaId("email@domain.com", new GaiaId("gaia-id")); private SignInCallback mCallback; private boolean mSignInCompleted;
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd index bc3f230..71e7f31 100644 --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -5575,7 +5575,7 @@ Open a new tab in Incognito mode </message> <message name="IDS_KEYBOARD_SHORTCUT_SPECIFIC_TAB" desc="A text label that appears next to the keyboard shortcut that will move the user to a specific tab in the Chrome app. The shortcut description is shown in a system dialog along with all other supported shortcuts. [CHAR_LIMIT=55]"> - Jump to a specific tab (1–8) + Jump to a specific tab (1–8) </message> <message name="IDS_KEYBOARD_SHORTCUT_LAST_TAB" desc="A text label that appears next to the keyboard shortcut that will move the user to the last tab in the Chrome app. The shortcut description is shown in a system dialog along with all other supported shortcuts. [CHAR_LIMIT=55]"> Jump to the last tab
diff --git a/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/SurfaceColorUpdateUtils.java b/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/SurfaceColorUpdateUtils.java index 8665245a..51bd53d 100644 --- a/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/SurfaceColorUpdateUtils.java +++ b/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/SurfaceColorUpdateUtils.java
@@ -188,4 +188,31 @@ ? SemanticColorUtils.getColorSurfaceContainerLow(context) : SemanticColorUtils.getCardBackgroundColor(context); } + + /** + * Returns the background color for the grid tab switcher search box based on the enabled flag + * and incognito. + * + * @param context {@link Context} used to retrieve colors. + * @param isIncognito Whether the color is used for incognito mode. + * @return The background color. + */ + public static @ColorInt int getGtsSearchBoxBackgroundColor( + Context context, boolean isIncognito) { + // TODO(crbug.com/414404094): Add semantic color for incognito. + if (useNewGtsSurfaceColor()) { + return isIncognito + ? ContextCompat.getColor(context, R.color.gm3_baseline_surface_dark) + : SemanticColorUtils.getColorSurface(context); + } + @ColorInt + int defaultBackground = + ColorUtils.inNightMode(context) + ? SemanticColorUtils.getColorSurfaceContainerHighest(context) + : SemanticColorUtils.getColorSurfaceContainerHigh(context); + return isIncognito + ? ContextCompat.getColor( + context, R.color.gm3_baseline_surface_container_highest_dark) + : defaultBackground; + } }
diff --git a/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/SurfaceColorUpdateUtilsUnitTest.java b/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/SurfaceColorUpdateUtilsUnitTest.java index 1c405959..ff2525b 100644 --- a/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/SurfaceColorUpdateUtilsUnitTest.java +++ b/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/SurfaceColorUpdateUtilsUnitTest.java
@@ -108,6 +108,18 @@ assertEquals( SemanticColorUtils.getColorSurfaceContainerLow(mContext), messageCardBackgroundColor); + + int searchBoxBgColor = + SurfaceColorUpdateUtils.getGtsSearchBoxBackgroundColor( + mContext, /* isIncognito= */ false); + assertEquals(SemanticColorUtils.getColorSurface(mContext), searchBoxBgColor); + + int searchBoxBgColorIncognito = + SurfaceColorUpdateUtils.getGtsSearchBoxBackgroundColor( + mContext, /* isIncognito= */ true); + assertEquals( + ContextCompat.getColor(mContext, R.color.gm3_baseline_surface_dark), + searchBoxBgColorIncognito); } @Test @@ -144,6 +156,19 @@ SurfaceColorUpdateUtils.getMessageCardBackgroundColor(mContext); assertEquals( SemanticColorUtils.getCardBackgroundColor(mContext), messageCardBackgroundColor); + + int searchBoxBgColor = + SurfaceColorUpdateUtils.getGtsSearchBoxBackgroundColor( + mContext, /* isIncognito= */ false); + assertEquals(SemanticColorUtils.getColorSurfaceContainerHigh(mContext), searchBoxBgColor); + + int searchBoxBgColorIncognito = + SurfaceColorUpdateUtils.getGtsSearchBoxBackgroundColor( + mContext, /* isIncognito= */ true); + assertEquals( + ContextCompat.getColor( + mContext, R.color.gm3_baseline_surface_container_highest_dark), + searchBoxBgColorIncognito); } @Test
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ConstraintsCheckerTest.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ConstraintsCheckerTest.java index d8d5a1c..caa529a 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ConstraintsCheckerTest.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ConstraintsCheckerTest.java
@@ -32,7 +32,7 @@ @Mock private ViewResourceAdapter mViewResourceAdapter; - private ObservableSupplierImpl mConstraintsSupplier = new ObservableSupplierImpl(); + private final ObservableSupplierImpl mConstraintsSupplier = new ObservableSupplierImpl(); @Test public void testScheduleRequestResourceOnUnlock() {
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/LocationBarFocusScrimHandler.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/LocationBarFocusScrimHandler.java index b9108e5..3206a4f 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/LocationBarFocusScrimHandler.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/LocationBarFocusScrimHandler.java
@@ -22,7 +22,7 @@ @NullMarked public class LocationBarFocusScrimHandler implements UrlFocusChangeListener { /** The params used to control how the scrim behaves when shown for the omnibox. */ - private PropertyModel mScrimModel; + private final PropertyModel mScrimModel; private final ScrimManager mScrimManager; @@ -30,13 +30,13 @@ private boolean mScrimShown; /** The light color to use for the scrim on the NTP. */ - private int mLightScrimColor; + private final int mLightScrimColor; private final LocationBarDataProvider mLocationBarDataProvider; private final Runnable mClickDelegate; private final Context mContext; - private ObservableSupplier<Integer> mTabStripHeightSupplier; - private Callback<Integer> mTabStripHeightChangeCallback; + private final ObservableSupplier<Integer> mTabStripHeightSupplier; + private final Callback<Integer> mTabStripHeightChangeCallback; /** * @param scrimManager Coordinator responsible for showing and hiding the scrim view.
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/LocationBarModel.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/LocationBarModel.java index ab936b4..d0d1e1e 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/LocationBarModel.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/LocationBarModel.java
@@ -157,9 +157,10 @@ private boolean mIsUsingBrandColor; private long mNativeLocationBarModelAndroid; - private ObserverList<LocationBarDataProvider.Observer> mLocationBarDataObservers = + private final ObserverList<LocationBarDataProvider.Observer> mLocationBarDataObservers = new ObserverList<>(); - private ObserverList<ToolbarDataProvider.Observer> mToolbarDataObservers = new ObserverList<>(); + private final ObserverList<ToolbarDataProvider.Observer> mToolbarDataObservers = + new ObserverList<>(); protected GURL mVisibleGurl = GURL.emptyGURL(); protected String mFormattedFullUrl; protected String mUrlForDisplay;
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/MiniOriginBarController.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/MiniOriginBarController.java index 445dec1..5da568d 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/MiniOriginBarController.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/MiniOriginBarController.java
@@ -38,9 +38,9 @@ private final ObservableSupplierImpl<Boolean> mSuppressToolbarSceneLayerSupplier; private final BrowserControlsSizer mBrowserControlsSizer; private boolean mShowMiniOriginBar; - private int mDefaultLocationBarGravity; + private final int mDefaultLocationBarGravity; private boolean mOriginBarClickedInSession; - private TouchEventObserver mTouchEventObserver; + private final TouchEventObserver mTouchEventObserver; /** * @param locationBar LocationBar instance used to change the presentation of e.g. the UrlBar
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/MiniOriginBarControllerTest.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/MiniOriginBarControllerTest.java index 6b5db3d..393fc2d 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/MiniOriginBarControllerTest.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/MiniOriginBarControllerTest.java
@@ -51,16 +51,16 @@ @Captor ArgumentCaptor<TouchEventObserver> mTouchEventObserverCaptor; private Context mContext; - private CoordinatorLayout.LayoutParams mControlContainerLayoutParams = + private final CoordinatorLayout.LayoutParams mControlContainerLayoutParams = new LayoutParams(400, 800); - private FrameLayout.LayoutParams mLocationBarLayoutParams = + private final FrameLayout.LayoutParams mLocationBarLayoutParams = new FrameLayout.LayoutParams(400, 800, Gravity.TOP); - private FormFieldFocusedSupplier mIsFormFieldFocused = new FormFieldFocusedSupplier(); - private ToolbarPositionControllerTest.FakeKeyboardVisibilityDelegate + private final FormFieldFocusedSupplier mIsFormFieldFocused = new FormFieldFocusedSupplier(); + private final ToolbarPositionControllerTest.FakeKeyboardVisibilityDelegate mKeyboardVisibilityDelegate = new ToolbarPositionControllerTest.FakeKeyboardVisibilityDelegate(); private MiniOriginBarController mMiniOriginBarController; - private ObservableSupplierImpl<Boolean> mSuppressToolbarSceneLayerSupplier = + private final ObservableSupplierImpl<Boolean> mSuppressToolbarSceneLayerSupplier = new ObservableSupplierImpl<>(false); @Before
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/TabSwitcherDrawable.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/TabSwitcherDrawable.java index 203ba81..d8b6ac2c 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/TabSwitcherDrawable.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/TabSwitcherDrawable.java
@@ -67,11 +67,11 @@ private int mTabCount; private boolean mIncognito; private @Nullable String mTextRenderedForTesting; - private Canvas mIconCanvas; - private Bitmap mIconBitmap; + private final Canvas mIconCanvas; + private final Bitmap mIconBitmap; private boolean mShouldShowNotificationIcon; - private @TabSwitcherDrawableLocation int mTabSwitcherDrawableLocation; - private ObserverList<Observer> mTabSwitcherDrawableObservers = new ObserverList<>(); + private final @TabSwitcherDrawableLocation int mTabSwitcherDrawableLocation; + private final ObserverList<Observer> mTabSwitcherDrawableObservers = new ObserverList<>(); /** * Creates a {@link TabSwitcherDrawable}.
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarPositionController.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarPositionController.java index b59c4f3..ab42b072 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarPositionController.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarPositionController.java
@@ -86,7 +86,7 @@ private final BottomControlsLayer mProgressBarLayer; @ControlsPosition private int mCurrentPosition; - private int mHairlineHeight; + private final int mHairlineHeight; /** * @param browserControlsSizer {@link BrowserControlsSizer}, used to manipulate position of the
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarPositionControllerTest.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarPositionControllerTest.java index 15905a9..981d2bea7 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarPositionControllerTest.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarPositionControllerTest.java
@@ -67,7 +67,7 @@ private static final int TOOLBAR_HEIGHT = 56; private static final int CONTROL_CONTAINER_ID = 12356; - private BrowserControlsSizer mBrowserControlsSizer = + private final BrowserControlsSizer mBrowserControlsSizer = new BrowserControlsSizer() { @ControlsPosition private int mControlsPosition = ControlsPosition.TOP; private int mTopControlsHeight; @@ -218,26 +218,29 @@ } }; - private CoordinatorLayout.LayoutParams mControlContainerLayoutParams = + private final CoordinatorLayout.LayoutParams mControlContainerLayoutParams = new CoordinatorLayout.LayoutParams(400, TOOLBAR_HEIGHT); - private CoordinatorLayout.LayoutParams mProgressBarLayoutParams = + private final CoordinatorLayout.LayoutParams mProgressBarLayoutParams = new CoordinatorLayout.LayoutParams(400, 5); - private FrameLayout.LayoutParams mToolbarLayoutPrams = new LayoutParams(400, 80); - private FrameLayout.LayoutParams mHairlineLayoutParams = new LayoutParams(400, 5); + private final FrameLayout.LayoutParams mToolbarLayoutPrams = new LayoutParams(400, 80); + private final FrameLayout.LayoutParams mHairlineLayoutParams = new LayoutParams(400, 5); @Mock private ControlContainer mControlContainer; @Mock private View mControlContainerView; @Mock private View mProgressBarContainer; private Context mContext; - private ObservableSupplierImpl<Boolean> mIsNtpShowing = new ObservableSupplierImpl<>(false); - private ObservableSupplierImpl<Boolean> mIsTabSwitcherShowing = new ObservableSupplierImpl<>(false); - private ObservableSupplierImpl<Boolean> mIsOmniboxFocused = new ObservableSupplierImpl<>(false); - private ObservableSupplierImpl<Boolean> mIsFindInPageShowing = + private final ObservableSupplierImpl<Boolean> mIsNtpShowing = new ObservableSupplierImpl<>(false); - private FormFieldFocusedSupplier mIsFormFieldFocused = new FormFieldFocusedSupplier(); + private final ObservableSupplierImpl<Boolean> mIsTabSwitcherShowing = + new ObservableSupplierImpl<>(false); + private final ObservableSupplierImpl<Boolean> mIsOmniboxFocused = + new ObservableSupplierImpl<>(false); + private final ObservableSupplierImpl<Boolean> mIsFindInPageShowing = + new ObservableSupplierImpl<>(false); + private final FormFieldFocusedSupplier mIsFormFieldFocused = new FormFieldFocusedSupplier(); private BottomControlsStacker mBottomControlsStacker; private ToolbarPositionController mController; - private ObservableSupplierImpl<Integer> mBottomToolbarOffsetSupplier = + private final ObservableSupplierImpl<Integer> mBottomToolbarOffsetSupplier = new ObservableSupplierImpl<>(); private HistogramWatcher mStartupExpectation; private WindowAndroid mWindowAndroid; @@ -256,7 +259,7 @@ } } - private FakeKeyboardVisibilityDelegate mKeyboardVisibilityDelegate = + private final FakeKeyboardVisibilityDelegate mKeyboardVisibilityDelegate = new FakeKeyboardVisibilityDelegate(); @Before
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBarAnimatingView.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBarAnimatingView.java index 53585c59f..4948870d 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBarAnimatingView.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/ToolbarProgressBarAnimatingView.java
@@ -79,7 +79,7 @@ private final boolean mIsRtl; /** The update listener for the animation. */ - private ProgressBarUpdateListener mListener; + private final ProgressBarUpdateListener mListener; /** The last fraction of the animation that was drawn. */ private float mLastAnimatedFraction;
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/VoiceToolbarButtonControllerUnitTest.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/VoiceToolbarButtonControllerUnitTest.java index 3665b6a8..7c75007 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/VoiceToolbarButtonControllerUnitTest.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/VoiceToolbarButtonControllerUnitTest.java
@@ -58,7 +58,7 @@ @Mock private Drawable mDrawable; @Mock private Tracker mTracker; - private Configuration mConfiguration = new Configuration(); + private final Configuration mConfiguration = new Configuration(); private VoiceToolbarButtonController mVoiceToolbarButtonController; @Before
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarButtonController.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarButtonController.java index a9241d9..c9c49ac 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarButtonController.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/AdaptiveToolbarButtonController.java
@@ -65,11 +65,11 @@ ConfigurationChangedObserver { private final Context mContext; - private ObserverList<ButtonDataObserver> mObservers = new ObserverList<>(); + private final ObserverList<ButtonDataObserver> mObservers = new ObserverList<>(); private @Nullable ButtonDataProvider mSingleProvider; // Maps from {@link AdaptiveToolbarButtonVariant} to {@link ButtonDataProvider}. - private Map<Integer, ButtonDataProvider> mButtonDataProviderMap = new HashMap<>(); + private final Map<Integer, ButtonDataProvider> mButtonDataProviderMap = new HashMap<>(); /** * {@link ButtonData} instance returned by {@link AdaptiveToolbarButtonController#get(Tab)}
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/OptionalNewTabButtonControllerUnitTest.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/OptionalNewTabButtonControllerUnitTest.java index 2980722c..68c5923 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/OptionalNewTabButtonControllerUnitTest.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/OptionalNewTabButtonControllerUnitTest.java
@@ -62,7 +62,7 @@ @Mock private Supplier<Tab> mTabSupplier; @Mock private Tracker mTracker; - private Configuration mConfiguration = new Configuration(); + private final Configuration mConfiguration = new Configuration(); private OptionalNewTabButtonController mOptionalNewTabButtonController; @Before
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/bottom/BottomControlsMediator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/bottom/BottomControlsMediator.java index b820836..78103bd 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/bottom/BottomControlsMediator.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/bottom/BottomControlsMediator.java
@@ -63,10 +63,10 @@ private final Supplier<Boolean> mReadAloudRestoringSupplier; /** The height of the bottom bar in pixels, not including the top shadow. */ - private int mBottomControlsHeight; + private final int mBottomControlsHeight; /** The height of the top shadow. */ - private int mBottomControlsShadowHeight; + private final int mBottomControlsShadowHeight; /** A {@link WindowAndroid} for watching keyboard visibility events. */ private final WindowAndroid mWindowAndroid;
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/bottom/BottomControlsMediatorTest.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/bottom/BottomControlsMediatorTest.java index 0c96ef96..3eb9ea8 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/bottom/BottomControlsMediatorTest.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/bottom/BottomControlsMediatorTest.java
@@ -91,8 +91,8 @@ @Mock EdgeToEdgeManager mEdgeToEdgeManager; private ObservableSupplierImpl<EdgeToEdgeController> mEdgeToEdgeControllerSupplier; - private ObservableSupplierImpl<Tab> mTabObservableSupplier = new ObservableSupplierImpl(); - private ObservableSupplierImpl<Boolean> mOverlayPanelVisibilitySupplier = + private final ObservableSupplierImpl<Tab> mTabObservableSupplier = new ObservableSupplierImpl(); + private final ObservableSupplierImpl<Boolean> mOverlayPanelVisibilitySupplier = new ObservableSupplierImpl(); private PropertyModel mModel;
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/bottom/ScrollingBottomViewSceneLayer.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/bottom/ScrollingBottomViewSceneLayer.java index d5c17dc..aa4c5d7 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/bottom/ScrollingBottomViewSceneLayer.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/bottom/ScrollingBottomViewSceneLayer.java
@@ -36,10 +36,10 @@ private long mNativePtr; /** The resource ID used to reference the view bitmap in native. */ - private int mResourceId; + private final int mResourceId; /** The height of the view's top shadow. */ - private int mTopShadowHeightPx; + private final int mTopShadowHeightPx; /** The current Y offset of the bottom view in px. */ private int mCurrentYOffsetPx; @@ -54,7 +54,7 @@ private @Nullable OffsetTag mOffsetTag; /** The {@link ViewResourceFrameLayout} that this scene layer represents. */ - private ViewResourceFrameLayout mBottomView; + private final ViewResourceFrameLayout mBottomView; /** * Build a composited bottom view layer.
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonMediator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonMediator.java index 2803c7e..21d14b9 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonMediator.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/menu_button/MenuButtonMediator.java
@@ -48,10 +48,10 @@ */ @NullMarked class MenuButtonMediator implements AppMenuObserver { - private Callback<AppMenuCoordinator> mAppMenuCoordinatorSupplierObserver; + private final Callback<AppMenuCoordinator> mAppMenuCoordinatorSupplierObserver; private @Nullable AppMenuPropertiesDelegate mAppMenuPropertiesDelegate; private @Nullable AppMenuButtonHelper mAppMenuButtonHelper; - private ObservableSupplierImpl<AppMenuButtonHelper> mAppMenuButtonHelperSupplier; + private final ObservableSupplierImpl<AppMenuButtonHelper> mAppMenuButtonHelperSupplier; private @Nullable AppMenuHandler mAppMenuHandler; private final BrowserStateBrowserControlsVisibilityDelegate mControlsVisibilityDelegate; private final SetFocusFunction mSetUrlBarFocusFunction; @@ -60,12 +60,12 @@ private final ThemeColorProvider mThemeColorProvider; private final Activity mActivity; private final KeyboardVisibilityDelegate mKeyboardDelegate; - private boolean mCanShowAppUpdateBadge; + private final boolean mCanShowAppUpdateBadge; private final Supplier<Boolean> mIsActivityFinishingSupplier; private int mFullscreenMenuToken = TokenHolder.INVALID_TOKEN; private int mFullscreenHighlightToken = TokenHolder.INVALID_TOKEN; private final Supplier<Boolean> mIsInOverviewModeSupplier; - private Resources mResources; + private final Resources mResources; private final OneshotSupplier<AppMenuCoordinator> mAppMenuCoordinatorSupplier; private final Supplier<MenuButtonState> mMenuButtonStateSupplier; private final Runnable mOnMenuButtonClicked;
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ActionModeController.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ActionModeController.java index 1645734c..46b2f940 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ActionModeController.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ActionModeController.java
@@ -27,10 +27,10 @@ public class ActionModeController { private static final int SLIDE_DURATION_MS = 200; - private ToolbarActionModeCallback mToolbarActionModeCallback; + private final ToolbarActionModeCallback mToolbarActionModeCallback; private @Nullable ObjectAnimator mCurrentAnimation; private boolean mShowingActionMode; - private ObservableSupplier<Integer> mTabStripHeightSupplier; + private final ObservableSupplier<Integer> mTabStripHeightSupplier; private final Context mContext; private final ActionBarDelegate mActionBarDelegate;
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/NavigationPopup.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/NavigationPopup.java index 3539aab5..fa9e6d3b 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/NavigationPopup.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/NavigationPopup.java
@@ -79,7 +79,7 @@ private final Context mContext; private final ListPopupWindow mPopup; private final NavigationController mNavigationController; - private NavigationHistory mHistory; + private final NavigationHistory mHistory; private final NavigationAdapter mAdapter; private final @Type int mType; private final int mFaviconSize; @@ -409,8 +409,8 @@ mTextView = textView; } - View mContainer; - ImageView mImageView; - TextView mTextView; + final View mContainer; + final ImageView mImageView; + final TextView mTextView; } }
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/OptionalBrowsingModeButtonController.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/OptionalBrowsingModeButtonController.java index ab5752e..dbc0ad1 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/OptionalBrowsingModeButtonController.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/OptionalBrowsingModeButtonController.java
@@ -29,7 +29,7 @@ private final UserEducationHelper mUserEducationHelper; private final Map<ButtonDataProvider, ButtonDataProvider.ButtonDataObserver> mObserverMap; private @Nullable ButtonDataProvider mCurrentProvider; - private List<ButtonDataProvider> mButtonDataProviders; + private final List<ButtonDataProvider> mButtonDataProviders; private final ToolbarLayout mToolbarLayout; private final Supplier<@Nullable Tab> mTabSupplier;
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToggleTabStackButtonCoordinator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToggleTabStackButtonCoordinator.java index 2afbf1be..2a61055b 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToggleTabStackButtonCoordinator.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToggleTabStackButtonCoordinator.java
@@ -52,7 +52,7 @@ public class ToggleTabStackButtonCoordinator { private final CallbackController mCallbackController = new CallbackController(); private final Context mContext; - private ToggleTabStackButton mToggleTabStackButton; + private final ToggleTabStackButton mToggleTabStackButton; private final UserEducationHelper mUserEducationHelper; private final Supplier<Boolean> mIsIncognitoSupplier; private final OneshotSupplier<Boolean> mPromoShownOneshotSupplier; @@ -66,7 +66,7 @@ private @Nullable ObservableSupplier<Integer> mArchivedTabCountSupplier; private @Nullable Runnable mArchivedTabsIphShownCallback; private @Nullable Runnable mArchivedTabsIphDismissedCallback; - private Callback<Integer> mArchivedTabCountObserver = this::maybeShowDeclutterIph; + private final Callback<Integer> mArchivedTabCountObserver = this::maybeShowDeclutterIph; private boolean mAlreadyRequestedDeclutterIph; /**
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java index 9df1d2b9..aa52ea4 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/ToolbarPhone.java
@@ -238,8 +238,8 @@ private @Nullable PhoneCaptureStateToken mPhoneCaptureStateToken; private @Nullable ButtonData mButtonData; - private @ColorInt int mToolbarBackgroundColorForNtp; - private @ColorInt int mLocationBarBackgroundColorForNtp; + private final @ColorInt int mToolbarBackgroundColorForNtp; + private final @ColorInt int mLocationBarBackgroundColorForNtp; /** Used to specify the visual state of the toolbar. */ @IntDef({
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java index 9f912d6..5c5de6ec 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarCoordinator.java
@@ -86,7 +86,7 @@ private OptionalBrowsingModeButtonController mOptionalButtonController; - private MenuButtonCoordinator mMenuButtonCoordinator; + private final MenuButtonCoordinator mMenuButtonCoordinator; private @Nullable ReloadButtonCoordinator mReloadButtonCoordinator; private @Nullable final BackButtonCoordinator mBackButtonCoordinator; private @Nullable ObservableSupplier<AppMenuButtonHelper> mAppMenuButtonHelperSupplier; @@ -95,29 +95,29 @@ private @Nullable TabStripTransitionCoordinator mTabStripTransitionCoordinator; private ToolbarControlContainer mControlContainer; - private Supplier<ResourceManager> mResourceManagerSupplier; + private final Supplier<ResourceManager> mResourceManagerSupplier; private @Nullable TopToolbarOverlayCoordinator mOverlayCoordinator; /** * The observer manager will receive all types of toolbar color change updates from toolbar * components and send the rendering toolbar color to the ToolbarColorObserver. */ - private ToolbarColorObserverManager mToolbarColorObserverManager; + private final ToolbarColorObserverManager mToolbarColorObserverManager; private @Nullable IncognitoStateProvider mIncognitoStateProvider; private @Nullable IncognitoStateObserver mIncognitoStateObserver; - private TabObscuringHandler mTabObscuringHandler; - private @Nullable DesktopWindowStateManager mDesktopWindowStateManager; - private OneshotSupplier<TabStripTransitionDelegate> mTabStripTransitionDelegateSupplier; - private ObservableSupplierImpl<Boolean> mNtpLoadingSupplier; + private final TabObscuringHandler mTabObscuringHandler; + private final @Nullable DesktopWindowStateManager mDesktopWindowStateManager; + private final OneshotSupplier<TabStripTransitionDelegate> mTabStripTransitionDelegateSupplier; + private final ObservableSupplierImpl<Boolean> mNtpLoadingSupplier; private ObservableSupplier<Integer> mTabCountSupplier; /** Token used to block the tab strip transition when find in page toolbar is showing. */ private int mFindToolbarToken = TokenHolder.INVALID_TOKEN; - private int mIndexOfLocationBarInToolbar; + private final int mIndexOfLocationBarInToolbar; /** * Creates a new {@link TopToolbarCoordinator}.
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediator.java index 053a798..7996bc30 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediator.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediator.java
@@ -85,7 +85,7 @@ /** Whether a layout that this overlay can be displayed on is showing. */ private boolean mIsOnValidLayout; - private ObservableSupplier<@Nullable Tab> mTabSupplier; + private final ObservableSupplier<@Nullable Tab> mTabSupplier; private float mViewportHeight; private @Nullable OffsetTag mTopControlsOffsetTag;
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediatorTest.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediatorTest.java index 7104934..32deadf58 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediatorTest.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/TopToolbarOverlayMediatorTest.java
@@ -72,9 +72,9 @@ @Mock private ObservableSupplier<Tab> mTabSupplier; @Captor private ArgumentCaptor<Callback<Tab>> mActivityTabObserverCaptor; - private ObservableSupplierImpl<Integer> mBottomControlsOffsetSupplier = + private final ObservableSupplierImpl<Integer> mBottomControlsOffsetSupplier = new ObservableSupplierImpl<>(0); - private ObservableSupplierImpl<Boolean> mSuppressToolbarSceneLayerSupplier = + private final ObservableSupplierImpl<Boolean> mSuppressToolbarSceneLayerSupplier = new ObservableSupplierImpl<>(false); @Before
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/tab_strip/TabStripTransitionCoordinatorUnitTest.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/tab_strip/TabStripTransitionCoordinatorUnitTest.java index c84c535..464d055 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/tab_strip/TabStripTransitionCoordinatorUnitTest.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/top/tab_strip/TabStripTransitionCoordinatorUnitTest.java
@@ -98,7 +98,7 @@ private TestControlContainerView mSpyControlContainer; private TabStripTransitionCoordinator mCoordinator; private TestActivity mActivity; - private TabObscuringHandler mTabObscuringHandler = new TabObscuringHandler(); + private final TabObscuringHandler mTabObscuringHandler = new TabObscuringHandler(); private TestObserver mObserver; private TestDelegate mDelegate; private OneshotSupplierImpl<TabStripTransitionDelegate> mDelegateSupplier;
diff --git a/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionCoordinator.java b/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionCoordinator.java index a044d6f4..beba901 100644 --- a/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionCoordinator.java +++ b/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionCoordinator.java
@@ -60,20 +60,20 @@ */ public class AccountSelectionCoordinator implements AccountSelectionComponent, ActivityStateObserver { - private static Map<Integer, WeakReference<AccountSelectionComponent.Delegate>> + private static final Map<Integer, WeakReference<AccountSelectionComponent.Delegate>> sFedCMDelegateMap = new HashMap<>(); // A counter used to generate a unique ID every time a new showModalDialog() // call occurs. private static int sCurrentFedcmId; - private Tab mTab; - private WindowAndroid mWindowAndroid; - private BottomSheetController mBottomSheetController; - private AccountSelectionBottomSheetContent mBottomSheetContent; - private AccountSelectionComponent.Delegate mDelegate; - private AccountSelectionMediator mMediator; - private RecyclerView mSheetItemListView; + private final Tab mTab; + private final WindowAndroid mWindowAndroid; + private final BottomSheetController mBottomSheetController; + private final AccountSelectionBottomSheetContent mBottomSheetContent; + private final AccountSelectionComponent.Delegate mDelegate; + private final AccountSelectionMediator mMediator; + private final RecyclerView mSheetItemListView; private WeakReference<AccountSelectionComponent> mPopupComponent; private WeakReference<AccountSelectionComponent.Delegate> mOpenerDelegate;
diff --git a/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionIntegrationTest.java b/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionIntegrationTest.java index 4359c06..adf575d 100644 --- a/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionIntegrationTest.java +++ b/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionIntegrationTest.java
@@ -78,12 +78,12 @@ @CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) public class AccountSelectionIntegrationTest extends AccountSelectionIntegrationTestBase { @ParameterAnnotations.ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = Arrays.asList( new ParameterSet().value(RpMode.PASSIVE).name("passive"), new ParameterSet().value(RpMode.ACTIVE).name("active")); - private @BottomSheetController.SheetState int mExpectedSheetState; + private final @BottomSheetController.SheetState int mExpectedSheetState; @Mock AccountSelectionComponent.Delegate mCustomTabMockBridge;
diff --git a/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionMediator.java b/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionMediator.java index ee1a70a..4aab757 100644 --- a/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionMediator.java +++ b/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionMediator.java
@@ -274,7 +274,7 @@ // could mean that the user successfully completed the login to IDP flow. private boolean mIsLoadingDialogLoginToIdpClosed; - private KeyboardVisibilityListener mKeyboardVisibilityListener = + private final KeyboardVisibilityListener mKeyboardVisibilityListener = new KeyboardVisibilityListener() { @Override public void keyboardVisibilityChanged(boolean isShowing) {
diff --git a/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionViewTest.java b/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionViewTest.java index a1ad340..7eb0ffd2 100644 --- a/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionViewTest.java +++ b/chrome/browser/ui/android/webid/internal/java/src/org/chromium/chrome/browser/ui/android/webid/AccountSelectionViewTest.java
@@ -79,11 +79,11 @@ private static final String LINK_TAG_REGEX = "<[^>]*>"; private class TokenError { - public String mCode; - public GURL mUrl; - public String mExpectedSummary; - public String mExpectedDescription; - public boolean mClickableText; + public final String mCode; + public final GURL mUrl; + public final String mExpectedSummary; + public final String mExpectedDescription; + public final boolean mClickableText; TokenError(String code, GURL url, boolean clickableText) { mCode = code;
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc index 0654215e..75c32a1 100644 --- a/chrome/browser/ui/browser.cc +++ b/chrome/browser/ui/browser.cc
@@ -1912,6 +1912,10 @@ window()->PreHandleDragUpdate(drop_data, client_pt); } +void Browser::PreHandleDragExit() { + window()->PreHandleDragExit(); +} + content::KeyboardEventProcessingResult Browser::PreHandleKeyboardEvent( content::WebContents* source, const NativeWebKeyboardEvent& event) {
diff --git a/chrome/browser/ui/browser.h b/chrome/browser/ui/browser.h index 8722fba..8cb8eb63 100644 --- a/chrome/browser/ui/browser.h +++ b/chrome/browser/ui/browser.h
@@ -778,6 +778,7 @@ const blink::WebMouseEvent& event) override; void PreHandleDragUpdate(const content::DropData& drop_data, const gfx::PointF& client_pt) override; + void PreHandleDragExit() override; content::KeyboardEventProcessingResult PreHandleKeyboardEvent( content::WebContents* source, const input::NativeWebKeyboardEvent& event) override;
diff --git a/chrome/browser/ui/browser_command_controller.cc b/chrome/browser/ui/browser_command_controller.cc index d5e652e..6f2feda 100644 --- a/chrome/browser/ui/browser_command_controller.cc +++ b/chrome/browser/ui/browser_command_controller.cc
@@ -261,7 +261,22 @@ base::BindRepeating( &BrowserCommandController::UpdateCommandsForFullscreenMode, base::Unretained(this))); -#endif +#endif //! BUILDFLAG(IS_MAC) + +#if BUILDFLAG(ENABLE_GLIC) + if (glic::GlicEnabling::IsEnabledByFlags()) { + auto* glic_service = + glic::GlicKeyedServiceFactory::GetGlicKeyedService(profile()); + if (glic_service) { + glic_enabling_subscription_ = std::make_unique< + base::CallbackListSubscription>( + + glic_service->enabling().RegisterAllowedChanged(base::BindRepeating( + &BrowserCommandController::UpdateCommandsForEnableGlicChanged, + base::Unretained(this)))); + } + } +#endif // BUILDFLAG(ENABLE_GLIC) InitCommandState(); @@ -285,6 +300,7 @@ } profile_pref_registrar_.RemoveAll(); local_pref_registrar_.RemoveAll(); + glic_enabling_subscription_.reset(); browser_->tab_strip_model()->RemoveObserver(this); } @@ -2159,6 +2175,13 @@ } } +void BrowserCommandController::UpdateCommandsForEnableGlicChanged() { +#if BUILDFLAG(ENABLE_GLIC) + command_updater_.UpdateCommandEnabled( + IDC_OPEN_GLIC, glic::GlicEnabling::IsEnabledForProfile(profile())); +#endif // BUILDFLAG(ENABLE_GLIC) +} + BrowserWindow* BrowserCommandController::window() { return browser_->window(); }
diff --git a/chrome/browser/ui/browser_command_controller.h b/chrome/browser/ui/browser_command_controller.h index 8055928..44b109d 100644 --- a/chrome/browser/ui/browser_command_controller.h +++ b/chrome/browser/ui/browser_command_controller.h
@@ -204,6 +204,9 @@ // Updates commands that depend on the state of the tab strip model. void UpdateCommandsForTabStripStateChanged(); + // Updates commands that depend on the enabled state of glic. + void UpdateCommandsForEnableGlicChanged(); + // Returns the relevant action for the current browser for a given // `action_id`. actions::ActionItem* FindAction(actions::ActionId action_id); @@ -229,6 +232,7 @@ PrefChangeRegistrar profile_pref_registrar_; PrefChangeRegistrar local_pref_registrar_; + std::unique_ptr<base::CallbackListSubscription> glic_enabling_subscription_; // In locked fullscreen mode disallow enabling/disabling commands. bool is_locked_fullscreen_ = false;
diff --git a/chrome/browser/ui/browser_window.h b/chrome/browser/ui/browser_window.h index 3185b25..7bd9837 100644 --- a/chrome/browser/ui/browser_window.h +++ b/chrome/browser/ui/browser_window.h
@@ -534,6 +534,7 @@ // `point` is relative to the content view. virtual void PreHandleDragUpdate(const content::DropData& drop_data, const gfx::PointF& point) = 0; + virtual void PreHandleDragExit() = 0; // Allows the BrowserWindow object to handle the specified keyboard event // before sending it to the renderer. virtual content::KeyboardEventProcessingResult PreHandleKeyboardEvent(
diff --git a/chrome/browser/ui/lens/lens_overlay_controller.cc b/chrome/browser/ui/lens/lens_overlay_controller.cc index 73c26c6a..3090b8af 100644 --- a/chrome/browser/ui/lens/lens_overlay_controller.cc +++ b/chrome/browser/ui/lens/lens_overlay_controller.cc
@@ -330,16 +330,6 @@ theme_service_(theme_service), gen204_controller_( std::make_unique<lens::LensOverlayGen204Controller>()) { - tab_subscriptions_.push_back(tab_->RegisterDidActivate(base::BindRepeating( - &LensOverlayController::TabForegrounded, weak_factory_.GetWeakPtr()))); - tab_subscriptions_.push_back(tab_->RegisterWillDeactivate( - base::BindRepeating(&LensOverlayController::TabWillEnterBackground, - weak_factory_.GetWeakPtr()))); - tab_subscriptions_.push_back(tab_->RegisterWillDiscardContents( - base::BindRepeating(&LensOverlayController::WillDiscardContents, - weak_factory_.GetWeakPtr()))); - tab_subscriptions_.push_back(tab_->RegisterWillDetach(base::BindRepeating( - &LensOverlayController::WillDetach, weak_factory_.GetWeakPtr()))); lens_overlay_event_handler_ = std::make_unique<lens::LensOverlayEventHandler>(this); @@ -2782,10 +2772,7 @@ } void LensOverlayController::TabForegrounded(tabs::TabInterface* tab) { - // Ignore the event if the overlay is not backgrounded. - if (state_ != State::kBackground) { - return; - } + CHECK(state_ == State::kBackground); // If the overlay was backgrounded, restore the previous state. if (backgrounded_state_ != State::kLivePageAndResults) { @@ -2804,10 +2791,7 @@ } void LensOverlayController::TabWillEnterBackground(tabs::TabInterface* tab) { - // If the current tab was already backgrounded, do nothing. - if (state_ == State::kBackground) { - return; - } + CHECK(state_ != State::kBackground); // If the overlay is active, background it. if (IsOverlayActive()) { @@ -2831,33 +2815,6 @@ lens::LensOverlayDismissalSource::kTabBackgroundedWhileScreenshotting); } -void LensOverlayController::WillDiscardContents( - tabs::TabInterface* tab, - content::WebContents* old_contents, - content::WebContents* new_contents) { - // Background tab contents discarded. - lens_search_controller_->CloseLensSync( - lens::LensOverlayDismissalSource::kTabContentsDiscarded); -} - -void LensOverlayController::WillDetach( - tabs::TabInterface* tab, - tabs::TabInterface::DetachReason reason) { - // When dragging a tab into a new window, all window-specific state must be - // reset. As this flow is not fully functional, close the overlay regardless - // of `reason`. https://crbug.com/342921671. - switch (reason) { - case tabs::TabInterface::DetachReason::kDelete: - lens_search_controller_->CloseLensSync( - lens::LensOverlayDismissalSource::kTabClosed); - return; - case tabs::TabInterface::DetachReason::kInsertIntoOtherWindow: - lens_search_controller_->CloseLensSync( - lens::LensOverlayDismissalSource::kTabDragNewWindow); - return; - } -} - void LensOverlayController::ActivityRequestedByOverlay( ui::mojom::ClickModifiersPtr click_modifiers) { // The tab is expected to be in the foreground.
diff --git a/chrome/browser/ui/lens/lens_overlay_controller.h b/chrome/browser/ui/lens/lens_overlay_controller.h index 0df117a..3a1a8b1 100644 --- a/chrome/browser/ui/lens/lens_overlay_controller.h +++ b/chrome/browser/ui/lens/lens_overlay_controller.h
@@ -1021,15 +1021,6 @@ // Called when the associated tab will enter the background. void TabWillEnterBackground(tabs::TabInterface* tab); - // Called when the tab's WebContents is discarded. - void WillDiscardContents(tabs::TabInterface* tab, - content::WebContents* old_contents, - content::WebContents* new_contents); - - // Called when the tab will be removed from the window. - void WillDetach(tabs::TabInterface* tab, - tabs::TabInterface::DetachReason reason); - // Suggest a name for the save as image feature incorporating the hostname of // the page. Protocol, TLD, etc are not taken into consideration. Duplicate // names get automatic suffixes. @@ -1241,9 +1232,6 @@ // until the overlay is closed. raw_ptr<lens::LensOverlayQueryController> lens_overlay_query_controller_; - // Holds subscriptions for TabInterface callbacks. - std::vector<base::CallbackListSubscription> tab_subscriptions_; - // The callbacks pending the handshake to complete so the Lens suggest inputs // can be retrieved. base::OnceCallbackList<void(
diff --git a/chrome/browser/ui/lens/lens_search_controller.cc b/chrome/browser/ui/lens/lens_search_controller.cc index b6270577..541cfe3 100644 --- a/chrome/browser/ui/lens/lens_search_controller.cc +++ b/chrome/browser/ui/lens/lens_search_controller.cc
@@ -40,7 +40,18 @@ } // namespace LensSearchController::LensSearchController(tabs::TabInterface* tab) - : tab_(tab) {} + : tab_(tab) { + tab_subscriptions_.push_back(tab_->RegisterDidActivate(base::BindRepeating( + &LensSearchController::TabForegrounded, weak_ptr_factory_.GetWeakPtr()))); + tab_subscriptions_.push_back(tab_->RegisterWillDeactivate( + base::BindRepeating(&LensSearchController::TabWillEnterBackground, + weak_ptr_factory_.GetWeakPtr()))); + tab_subscriptions_.push_back(tab_->RegisterWillDiscardContents( + base::BindRepeating(&LensSearchController::WillDiscardContents, + weak_ptr_factory_.GetWeakPtr()))); + tab_subscriptions_.push_back(tab_->RegisterWillDetach(base::BindRepeating( + &LensSearchController::WillDetach, weak_ptr_factory_.GetWeakPtr()))); +} LensSearchController::~LensSearchController() = default; // TODO(crbug.com/404941800): Reconsider which of these controllers should be @@ -422,3 +433,56 @@ const std::string& thumbnail_bytes) { lens_searchbox_controller_->HandleThumbnailCreated(thumbnail_bytes); } + +void LensSearchController::TabForegrounded(tabs::TabInterface* tab) { + // Ignore the event if the overlay is not backgrounded. + if (state_ != State::kBackground) { + return; + } + + // Notify the overlay controller of the tab foregrounded event so it can + // restore to the previous state. + lens_overlay_controller_->TabForegrounded(tab); + + state_ = State::kActive; +} + +void LensSearchController::TabWillEnterBackground(tabs::TabInterface* tab) { + if (state_ == State::kOff) { + return; + } + + // Ignore the event if the overlay is already backgrounded. + if (state_ == State::kBackground) { + return; + } + + // Notify the overlay controller of the tab will enter background event so + // it can hide the overlay. + lens_overlay_controller_->TabWillEnterBackground(tab); + + state_ = State::kBackground; +} + +void LensSearchController::WillDiscardContents( + tabs::TabInterface* tab, + content::WebContents* old_contents, + content::WebContents* new_contents) { + // Background tab contents discarded. + CloseLensSync(lens::LensOverlayDismissalSource::kTabContentsDiscarded); +} + +void LensSearchController::WillDetach(tabs::TabInterface* tab, + tabs::TabInterface::DetachReason reason) { + // When dragging a tab into a new window, all window-specific state must be + // reset. As this flow is not fully functional, close the overlay regardless + // of `reason`. https://crbug.com/342921671. + switch (reason) { + case tabs::TabInterface::DetachReason::kDelete: + CloseLensSync(lens::LensOverlayDismissalSource::kTabClosed); + return; + case tabs::TabInterface::DetachReason::kInsertIntoOtherWindow: + CloseLensSync(lens::LensOverlayDismissalSource::kTabDragNewWindow); + return; + } +}
diff --git a/chrome/browser/ui/lens/lens_search_controller.h b/chrome/browser/ui/lens/lens_search_controller.h index d4beb3ca..19b48831 100644 --- a/chrome/browser/ui/lens/lens_search_controller.h +++ b/chrome/browser/ui/lens/lens_search_controller.h
@@ -223,6 +223,11 @@ // One or more Lens features are active on this tab. kActive, + // The UI has been made inactive / backgrounded and is hidden. This differs + // from kSuspended as the overlay and web view are not freed and could be + // immediately reshown. + kBackground, + // The controller is in the process of closing all dependencies and cleaning // up. Will soon be kOff. kClosing, @@ -273,6 +278,21 @@ // the progress of the page content upload. void HandlePageContentUploadProgress(uint64_t position, uint64_t total); + // Called when the associated tab enters the foreground. + void TabForegrounded(tabs::TabInterface* tab); + + // Called when the associated tab will enter the background. + void TabWillEnterBackground(tabs::TabInterface* tab); + + // Called when the tab's WebContents is discarded. + void WillDiscardContents(tabs::TabInterface* tab, + content::WebContents* old_contents, + content::WebContents* new_contents); + + // Called when the tab will be removed from the window. + void WillDetach(tabs::TabInterface* tab, + tabs::TabInterface::DetachReason reason); + // Whether the LensSearchController has been initialized. Meaning, all the // dependencies have been initialized and the controller is ready to use. bool initialized_ = false; @@ -302,6 +322,9 @@ // interactions, without a dependency on the overlay controller. std::unique_ptr<lens::LensSearchboxController> lens_searchbox_controller_; + // Holds subscriptions for TabInterface callbacks. + std::vector<base::CallbackListSubscription> tab_subscriptions_; + // The page context eligibility API if it has been fetched. Can be nullptr. raw_ptr<optimization_guide::PageContextEligibility> page_context_eligibility_;
diff --git a/chrome/browser/ui/messages/android/java/src/org/chromium/chrome/browser/ui/messages/snackbar/Snackbar.java b/chrome/browser/ui/messages/android/java/src/org/chromium/chrome/browser/ui/messages/snackbar/Snackbar.java index c31b6480..ec1620cd 100644 --- a/chrome/browser/ui/messages/android/java/src/org/chromium/chrome/browser/ui/messages/snackbar/Snackbar.java +++ b/chrome/browser/ui/messages/android/java/src/org/chromium/chrome/browser/ui/messages/snackbar/Snackbar.java
@@ -130,8 +130,8 @@ public static final int UMA_SEARCH_ENGINE_CHANGED_NOTIFICATION = 73; public static final int UMA_BOOKMARK_BATCH_UPLOAD = 74; - private @Nullable SnackbarController mController; - private CharSequence mText; + private final @Nullable SnackbarController mController; + private final CharSequence mText; private @Nullable String mTemplateText; private @Nullable String mActionText; private @Nullable Object mActionData; @@ -140,7 +140,7 @@ private boolean mSingleLine = true; private int mDurationMs; private @Nullable Drawable mProfileImage; - private int mType; + private final int mType; private int mIdentifier = UMA_UNKNOWN; private @Theme int mTheme = Theme.BASIC;
diff --git a/chrome/browser/ui/messages/android/java/src/org/chromium/chrome/browser/ui/messages/snackbar/SnackbarCollection.java b/chrome/browser/ui/messages/android/java/src/org/chromium/chrome/browser/ui/messages/snackbar/SnackbarCollection.java index 532e3d1..e6fd02f 100644 --- a/chrome/browser/ui/messages/android/java/src/org/chromium/chrome/browser/ui/messages/snackbar/SnackbarCollection.java +++ b/chrome/browser/ui/messages/android/java/src/org/chromium/chrome/browser/ui/messages/snackbar/SnackbarCollection.java
@@ -19,8 +19,8 @@ /** A data structure that holds all the {@link Snackbar}s managed by {@link SnackbarManager}. */ @NullMarked class SnackbarCollection { - private Deque<Snackbar> mSnackbars = new LinkedList<>(); - private Deque<Snackbar> mPersistentSnackbars = new LinkedList<>(); + private final Deque<Snackbar> mSnackbars = new LinkedList<>(); + private final Deque<Snackbar> mPersistentSnackbars = new LinkedList<>(); /** * Adds a new snackbar to the collection. If the new snackbar is of
diff --git a/chrome/browser/ui/messages/android/java/src/org/chromium/chrome/browser/ui/messages/snackbar/SnackbarRenderTest.java b/chrome/browser/ui/messages/android/java/src/org/chromium/chrome/browser/ui/messages/snackbar/SnackbarRenderTest.java index ff99e4d..86bf1a8 100644 --- a/chrome/browser/ui/messages/android/java/src/org/chromium/chrome/browser/ui/messages/snackbar/SnackbarRenderTest.java +++ b/chrome/browser/ui/messages/android/java/src/org/chromium/chrome/browser/ui/messages/snackbar/SnackbarRenderTest.java
@@ -48,7 +48,7 @@ private static final int SNACKBAR_MAX_TIMEOUT_MS = 10000; @ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = new NightModeTestUtils.NightModeParams().getParameters(); @Rule
diff --git a/chrome/browser/ui/messages/android/java/src/org/chromium/chrome/browser/ui/messages/snackbar/SnackbarTest.java b/chrome/browser/ui/messages/android/java/src/org/chromium/chrome/browser/ui/messages/snackbar/SnackbarTest.java index 4ae0854..d0fc470 100644 --- a/chrome/browser/ui/messages/android/java/src/org/chromium/chrome/browser/ui/messages/snackbar/SnackbarTest.java +++ b/chrome/browser/ui/messages/android/java/src/org/chromium/chrome/browser/ui/messages/snackbar/SnackbarTest.java
@@ -42,7 +42,7 @@ @Batch(Batch.UNIT_TESTS) public class SnackbarTest { private SnackbarManager mManager; - private SnackbarController mDefaultController = + private final SnackbarController mDefaultController = new SnackbarController() { @Override public void onDismissNoAction(Object actionData) {} @@ -51,7 +51,7 @@ public void onAction(Object actionData) {} }; - private SnackbarController mDismissController = + private final SnackbarController mDismissController = new SnackbarController() { @Override public void onDismissNoAction(Object actionData) {
diff --git a/chrome/browser/ui/messages/android/java/src/org/chromium/chrome/browser/ui/messages/snackbar/SnackbarView.java b/chrome/browser/ui/messages/android/java/src/org/chromium/chrome/browser/ui/messages/snackbar/SnackbarView.java index b73f479..45af866 100644 --- a/chrome/browser/ui/messages/android/java/src/org/chromium/chrome/browser/ui/messages/snackbar/SnackbarView.java +++ b/chrome/browser/ui/messages/android/java/src/org/chromium/chrome/browser/ui/messages/snackbar/SnackbarView.java
@@ -60,17 +60,17 @@ private final boolean mIsTablet; private final @Nullable EdgeToEdgeController mEdgeToEdgeSupplier; private final @Nullable EdgeToEdgePadAdjuster mEdgeToEdgePadAdjuster; - private ViewGroup mOriginalParent; + private final ViewGroup mOriginalParent; protected ViewGroup mParent; protected Snackbar mSnackbar; - private View mRootContentView; + private final View mRootContentView; private @ColorInt int mBackgroundColor; // Variables used to adjust view position and size when visible frame is changed. - private Rect mCurrentVisibleRect = new Rect(); - private Rect mPreviousVisibleRect = new Rect(); + private final Rect mCurrentVisibleRect = new Rect(); + private final Rect mPreviousVisibleRect = new Rect(); - private OnLayoutChangeListener mLayoutListener = + private final OnLayoutChangeListener mLayoutListener = new OnLayoutChangeListener() { @Override public void onLayoutChange(
diff --git a/chrome/browser/ui/plus_addresses/android/java/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationViewBridge.java b/chrome/browser/ui/plus_addresses/android/java/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationViewBridge.java index ce7c70f..d1f7409 100644 --- a/chrome/browser/ui/plus_addresses/android/java/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationViewBridge.java +++ b/chrome/browser/ui/plus_addresses/android/java/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationViewBridge.java
@@ -31,12 +31,12 @@ @JNINamespace("plus_addresses") public class PlusAddressCreationViewBridge { private long mNativePlusAddressCreationPromptAndroid; - private Context mContext; - private BottomSheetController mBottomSheetController; - private LayoutStateProvider mLayoutStateProvider; + private final Context mContext; + private final BottomSheetController mBottomSheetController; + private final LayoutStateProvider mLayoutStateProvider; private final TabModel mTabModel; private final TabModelSelector mTabModelSelector; - private CoordinatorFactory mCoordinatorFactory; + private final CoordinatorFactory mCoordinatorFactory; @Nullable private PlusAddressCreationCoordinator mCoordinator; @VisibleForTesting
diff --git a/chrome/browser/ui/plus_addresses/android/java/src/org/chromium/chrome/browser/ui/plus_addresses/PlusProfile.java b/chrome/browser/ui/plus_addresses/android/java/src/org/chromium/chrome/browser/ui/plus_addresses/PlusProfile.java index 4275c9c..d806b8e4 100644 --- a/chrome/browser/ui/plus_addresses/android/java/src/org/chromium/chrome/browser/ui/plus_addresses/PlusProfile.java +++ b/chrome/browser/ui/plus_addresses/android/java/src/org/chromium/chrome/browser/ui/plus_addresses/PlusProfile.java
@@ -18,11 +18,11 @@ @JNINamespace("plus_addresses") class PlusProfile { // Plus address email address. - private String mPlusAddress; + private final String mPlusAddress; // The string used to display the origin of the plus profile. - private String mDisplayName; + private final String mDisplayName; // The domain where the plus address was created. - private String mOrigin; + private final String mOrigin; @CalledByNative public PlusProfile(
diff --git a/chrome/browser/ui/plus_addresses/android/javatests/src/org/chromium/chrome/browser/ui/plus_addresses/AllPlusAddressesBottomSheetRenderTest.java b/chrome/browser/ui/plus_addresses/android/javatests/src/org/chromium/chrome/browser/ui/plus_addresses/AllPlusAddressesBottomSheetRenderTest.java index 2133a17b..fd7b12c 100644 --- a/chrome/browser/ui/plus_addresses/android/javatests/src/org/chromium/chrome/browser/ui/plus_addresses/AllPlusAddressesBottomSheetRenderTest.java +++ b/chrome/browser/ui/plus_addresses/android/javatests/src/org/chromium/chrome/browser/ui/plus_addresses/AllPlusAddressesBottomSheetRenderTest.java
@@ -60,7 +60,7 @@ new PlusProfile("lake@gmail.com", "microsoft.com", "http://microsoft.com"); @ParameterAnnotations.ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = Arrays.asList( new ParameterSet().value(false, false).name("Default"), new ParameterSet().value(false, true).name("RTL"),
diff --git a/chrome/browser/ui/plus_addresses/android/javatests/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationRenderTest.java b/chrome/browser/ui/plus_addresses/android/javatests/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationRenderTest.java index c265614..d638235 100644 --- a/chrome/browser/ui/plus_addresses/android/javatests/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationRenderTest.java +++ b/chrome/browser/ui/plus_addresses/android/javatests/src/org/chromium/chrome/browser/ui/plus_addresses/PlusAddressCreationRenderTest.java
@@ -73,7 +73,7 @@ "Cancel"); @ParameterAnnotations.ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = Arrays.asList( new ParameterSet().value(false, false).name("Default"), new ParameterSet().value(false, true).name("RTL"),
diff --git a/chrome/browser/ui/search_engines/BUILD.gn b/chrome/browser/ui/search_engines/BUILD.gn new file mode 100644 index 0000000..df373cf0 --- /dev/null +++ b/chrome/browser/ui/search_engines/BUILD.gn
@@ -0,0 +1,82 @@ +# Copyright 2025 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +source_set("search_engines") { + public = [ + "edit_search_engine_controller.h", + "keyword_editor_controller.h", + "search_engine_tab_helper.h", + "template_url_table_model.h", + ] + + public_deps = [ + "//base", + "//chrome/browser/ui/find_bar", + "//chrome/common:mojo_bindings", + "//components/favicon/core", + "//components/find_in_page", + "//components/search_engines", + "//content/public/browser", + "//mojo/public/cpp/bindings", + "//ui/base", + "//ui/gfx", + ] + + sources = [ + "edit_search_engine_controller.cc", + "keyword_editor_controller.cc", + "search_engine_tab_helper.cc", + "template_url_table_model.cc", + ] + + deps = [ + "//base:i18n", + "//chrome/app:generated_resources", + "//chrome/browser/favicon", + "//chrome/browser/profiles:profile", + "//chrome/browser/search_engines", + "//chrome/common", + "//components/omnibox/browser", + "//components/omnibox/common", + "//components/prefs", + "//components/search_engines", + "//components/url_formatter", + "//services/network/public/mojom", + "//third_party/icu:icui18n", + "//third_party/icu:icuuc_public", + "//url", + ] +} + +source_set("unit_tests") { + testonly = true + sources = [ "keyword_editor_controller_unittest.cc" ] + deps = [ + ":search_engines", + "//chrome/browser/profiles:profile", + "//chrome/test:test_support", + "//components/omnibox/common", + "//components/sync_preferences:test_support", + "//content/test:test_support", + ] +} + +if (!is_android) { + source_set("browser_tests") { + testonly = true + defines = [ "HAS_OUT_OF_PROC_TEST_RUNNER" ] + sources = [ "search_engine_tab_helper_browsertest.cc" ] + deps = [ + ":search_engines", + "//chrome/browser/profiles:profile", + "//chrome/browser/search_engines", + "//chrome/browser/ui/tabs:tab_enums", + "//chrome/browser/ui/tabs:tab_strip", + "//chrome/test:test_support", + "//chrome/test:test_support_ui", + "//content/test:test_support", + "//net:test_support", + ] + } +}
diff --git a/chrome/browser/ui/tabs/tab_style.cc b/chrome/browser/ui/tabs/tab_style.cc index c42b7cd..d32b182b 100644 --- a/chrome/browser/ui/tabs/tab_style.cc +++ b/chrome/browser/ui/tabs/tab_style.cc
@@ -38,24 +38,31 @@ return GetLayoutConstant(TAB_STRIP_HEIGHT); } -int TabStyle::GetStandardWidth() const { - // The full width includes two extensions with the bottom corner radius. - return kTabWidth + 2 * GetBottomCornerRadius(); +int TabStyle::GetStandardWidth(const bool is_split) const { + if (is_split) { + // Split tabs appear as half width with one bottom extension. They also must + // include half the tab overlap as the tabs fill the space between them. + return kTabWidth / 2 + GetBottomCornerRadius() + GetTabOverlap() / 2; + } else { + // The full width includes two extensions with the bottom corner radius. + return kTabWidth + 2 * GetBottomCornerRadius(); + } } -int TabStyle::GetStandardSplitWidth() const { - // Split tabs appear as half width with one bottom extension. They also must - // include half the tab overlap as the tabs fill the space between them. - return kTabWidth / 2 + GetBottomCornerRadius() + GetTabOverlap() / 2; -} - -int TabStyle::GetPinnedWidth() const { +int TabStyle::GetPinnedWidth(const bool is_split) const { constexpr int kTabPinnedContentWidth = 24; - return kTabPinnedContentWidth + GetContentsInsets().left() + - GetContentsInsets().right(); + const int standard_pinned_width = kTabPinnedContentWidth + + GetContentsInsets().left() + + GetContentsInsets().right(); + if (is_split) { + // Split tabs will recoup half of the tab overlap to reduce extra + // whitespace. + return standard_pinned_width - GetTabOverlap() / 2; + } + return standard_pinned_width; } -int TabStyle::GetMinimumActiveWidth() const { +int TabStyle::GetMinimumActiveWidth(const bool is_split) const { const int close_button_size = GetLayoutConstant(TAB_CLOSE_BUTTON_SIZE); const gfx::Insets insets = GetContentsInsets(); const int min_active_width = @@ -67,13 +74,13 @@ tabs::kScrollableTabStrip, tabs::kMinimumTabWidthFeatureParameterName, min_active_width)); } - return min_active_width; -} -int TabStyle::GetMinimumActiveSplitWidth() const { - // Split tabs take over half of the overlap space between them so they can - // appear larger. - return GetMinimumActiveWidth() / 2 + GetTabOverlap() / 2; + if (is_split) { + // Split tabs take over half of the overlap space between them so they can + // appear larger. + return min_active_width / 2 + GetTabOverlap() / 2; + } + return min_active_width; } int TabStyle::GetMinimumInactiveWidth() const { @@ -114,7 +121,7 @@ gfx::Size TabStyle::GetPreviewImageSize() const { constexpr float kTabHoverCardPreviewImageAspectRatio = 16.0f / 9.0f; - const int width = GetStandardWidth(); + const int width = GetStandardWidth(/*is_split*/ false); return gfx::Size(width, width / kTabHoverCardPreviewImageAspectRatio); }
diff --git a/chrome/browser/ui/tabs/tab_style.h b/chrome/browser/ui/tabs/tab_style.h index dc95be7..b2dcced3 100644 --- a/chrome/browser/ui/tabs/tab_style.h +++ b/chrome/browser/ui/tabs/tab_style.h
@@ -118,24 +118,15 @@ // Returns the preferred width of a single Tab, assuming space is // available. - int GetStandardWidth() const; - - // Returns the preferred width of half of a split Tab, assuming space is - // available. - int GetStandardSplitWidth() const; + int GetStandardWidth(const bool is_split) const; // Returns the width for pinned tabs. Pinned tabs always have this width. - int GetPinnedWidth() const; + int GetPinnedWidth(const bool is_split) const; // Returns the minimum possible width of an active Tab. Active tabs must // always show a close button, and thus have a larger minimum size than // inactive tabs. - int GetMinimumActiveWidth() const; - - // Returns the minimum possible width of an active split Tab. Active tabs must - // always show a close button, and thus have a larger minimum size than - // inactive tabs. - int GetMinimumActiveSplitWidth() const; + int GetMinimumActiveWidth(const bool is_split) const; // Returns the minimum possible width of a single inactive Tab. int GetMinimumInactiveWidth() const;
diff --git a/chrome/browser/ui/toolbar/pinned_toolbar/pinned_toolbar_actions_model_browsertest.cc b/chrome/browser/ui/toolbar/pinned_toolbar/pinned_toolbar_actions_model_browsertest.cc index b6f32de..77effcf 100644 --- a/chrome/browser/ui/toolbar/pinned_toolbar/pinned_toolbar_actions_model_browsertest.cc +++ b/chrome/browser/ui/toolbar/pinned_toolbar/pinned_toolbar_actions_model_browsertest.cc
@@ -10,6 +10,7 @@ #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/toolbar/pinned_toolbar/pinned_toolbar_actions_model_factory.h" #include "chrome/browser/ui/toolbar/toolbar_pref_names.h" +#include "chrome/common/chrome_features.h" #include "chrome/common/pref_names.h" #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/testing_profile.h" @@ -146,12 +147,20 @@ const base::Value::List& list = browser()->profile()->GetPrefs()->GetList(prefs::kPinnedActions); - ASSERT_EQ(4u, list.size()); - - ASSERT_EQ("kActionShowChromeLabs", list[0].GetString()); - EXPECT_EQ("kActionSidePanelShowBookmarks", list[1].GetString()); - EXPECT_EQ("kActionSidePanelShowReadingList", list[2].GetString()); - EXPECT_EQ("kActionSidePanelShowHistoryCluster", list[3].GetString()); + if (features::HasTabSearchToolbarButton()) { + ASSERT_EQ(5u, list.size()); + ASSERT_EQ("kActionShowChromeLabs", list[0].GetString()); + ASSERT_EQ("kActionTabSearch", list[1].GetString()); + EXPECT_EQ("kActionSidePanelShowBookmarks", list[2].GetString()); + EXPECT_EQ("kActionSidePanelShowReadingList", list[3].GetString()); + EXPECT_EQ("kActionSidePanelShowHistoryCluster", list[4].GetString()); + } else { + ASSERT_EQ(4u, list.size()); + ASSERT_EQ("kActionShowChromeLabs", list[0].GetString()); + EXPECT_EQ("kActionSidePanelShowBookmarks", list[1].GetString()); + EXPECT_EQ("kActionSidePanelShowReadingList", list[2].GetString()); + EXPECT_EQ("kActionSidePanelShowHistoryCluster", list[3].GetString()); + } } // Verify that we are able to remove pinned actions from the model and that @@ -165,20 +174,28 @@ model()->UpdatePinnedState(kActionSidePanelShowHistoryCluster, /*should_pin=*/true); - // Expect unpinning the second ActionId will remove it from the model and the - // prefs object. + // Expect unpinning the reading list ActionId will remove it from the model + // and the prefs object. model()->UpdatePinnedState(kActionSidePanelShowReadingList, /*should_pin=*/false); EXPECT_EQ(1, observer()->removed_count()); EXPECT_EQ(3, observer()->inserted_count()); - // Verify only the second ActionId was removed. + // Verify only the reading list ActionId was removed. const base::Value::List& list = browser()->profile()->GetPrefs()->GetList(prefs::kPinnedActions); - ASSERT_EQ(3u, list.size()); - ASSERT_EQ("kActionShowChromeLabs", list[0].GetString()); - EXPECT_EQ("kActionSidePanelShowBookmarks", list[1].GetString()); - EXPECT_EQ("kActionSidePanelShowHistoryCluster", list[2].GetString()); + if (features::HasTabSearchToolbarButton()) { + ASSERT_EQ(4u, list.size()); + ASSERT_EQ("kActionShowChromeLabs", list[0].GetString()); + ASSERT_EQ("kActionTabSearch", list[1].GetString()); + EXPECT_EQ("kActionSidePanelShowBookmarks", list[2].GetString()); + EXPECT_EQ("kActionSidePanelShowHistoryCluster", list[3].GetString()); + } else { + ASSERT_EQ(3u, list.size()); + ASSERT_EQ("kActionShowChromeLabs", list[0].GetString()); + EXPECT_EQ("kActionSidePanelShowBookmarks", list[1].GetString()); + EXPECT_EQ("kActionSidePanelShowHistoryCluster", list[2].GetString()); + } } // Verify that we are able to move pinned actions in the model and that @@ -194,51 +211,84 @@ /*should_pin=*/true); // Expect moving the second action will put it at the end of the list. - model()->MovePinnedAction(kActionSidePanelShowReadingList, 3); + model()->MovePinnedAction(kActionSidePanelShowReadingList, + features::HasTabSearchToolbarButton() ? 4 : 3); EXPECT_EQ(0, observer()->removed_count()); EXPECT_EQ(3, observer()->inserted_count()); - EXPECT_EQ(3, observer()->moved_to_index()); + EXPECT_EQ(features::HasTabSearchToolbarButton() ? 4 : 3, + observer()->moved_to_index()); // Verify kActionCopy was moved to the end of the list which should be // index 2. const base::Value::List& list_1 = browser()->profile()->GetPrefs()->GetList(prefs::kPinnedActions); - ASSERT_EQ(4u, list_1.size()); - ASSERT_EQ("kActionShowChromeLabs", list_1[0].GetString()); - EXPECT_EQ("kActionSidePanelShowBookmarks", list_1[1].GetString()); - EXPECT_EQ("kActionSidePanelShowHistoryCluster", list_1[2].GetString()); - EXPECT_EQ("kActionSidePanelShowReadingList", list_1[3].GetString()); + if (features::HasTabSearchToolbarButton()) { + ASSERT_EQ(5u, list_1.size()); + ASSERT_EQ("kActionShowChromeLabs", list_1[0].GetString()); + ASSERT_EQ("kActionTabSearch", list_1[1].GetString()); + EXPECT_EQ("kActionSidePanelShowBookmarks", list_1[2].GetString()); + EXPECT_EQ("kActionSidePanelShowHistoryCluster", list_1[3].GetString()); + EXPECT_EQ("kActionSidePanelShowReadingList", list_1[4].GetString()); + } else { + ASSERT_EQ(4u, list_1.size()); + ASSERT_EQ("kActionShowChromeLabs", list_1[0].GetString()); + EXPECT_EQ("kActionSidePanelShowBookmarks", list_1[1].GetString()); + EXPECT_EQ("kActionSidePanelShowHistoryCluster", list_1[2].GetString()); + EXPECT_EQ("kActionSidePanelShowReadingList", list_1[3].GetString()); + } // Expect that we can move the first action after the second action correctly. - model()->MovePinnedAction(kActionSidePanelShowBookmarks, 2); + model()->MovePinnedAction(kActionSidePanelShowBookmarks, + features::HasTabSearchToolbarButton() ? 3 : 2); EXPECT_EQ(0, observer()->removed_count()); EXPECT_EQ(3, observer()->inserted_count()); - EXPECT_EQ(2, observer()->moved_to_index()); + EXPECT_EQ(features::HasTabSearchToolbarButton() ? 3 : 2, + observer()->moved_to_index()); // kActionSidePanelShowBookmarks was move to the end. const base::Value::List& list_2 = browser()->profile()->GetPrefs()->GetList(prefs::kPinnedActions); - ASSERT_EQ(4u, list_2.size()); - ASSERT_EQ("kActionShowChromeLabs", list_2[0].GetString()); - EXPECT_EQ("kActionSidePanelShowHistoryCluster", list_2[1].GetString()); - EXPECT_EQ("kActionSidePanelShowBookmarks", list_2[2].GetString()); - EXPECT_EQ("kActionSidePanelShowReadingList", list_2[3].GetString()); + if (features::HasTabSearchToolbarButton()) { + ASSERT_EQ(5u, list_2.size()); + ASSERT_EQ("kActionShowChromeLabs", list_2[0].GetString()); + ASSERT_EQ("kActionTabSearch", list_2[1].GetString()); + EXPECT_EQ("kActionSidePanelShowHistoryCluster", list_2[2].GetString()); + EXPECT_EQ("kActionSidePanelShowBookmarks", list_2[3].GetString()); + EXPECT_EQ("kActionSidePanelShowReadingList", list_2[4].GetString()); + } else { + ASSERT_EQ(4u, list_2.size()); + ASSERT_EQ("kActionShowChromeLabs", list_2[0].GetString()); + EXPECT_EQ("kActionSidePanelShowHistoryCluster", list_2[1].GetString()); + EXPECT_EQ("kActionSidePanelShowBookmarks", list_2[2].GetString()); + EXPECT_EQ("kActionSidePanelShowReadingList", list_2[3].GetString()); + } // Expect that moving the kActionCopy action to the beginning of the list will // place it in front of the current first element. - model()->MovePinnedAction(kActionSidePanelShowReadingList, 1); + model()->MovePinnedAction(kActionSidePanelShowReadingList, + features::HasTabSearchToolbarButton() ? 2 : 1); EXPECT_EQ(0, observer()->removed_count()); EXPECT_EQ(3, observer()->inserted_count()); - EXPECT_EQ(1, observer()->moved_to_index()); + EXPECT_EQ(features::HasTabSearchToolbarButton() ? 2 : 1, + observer()->moved_to_index()); // Verify kActionCopy was moved to index 0. const base::Value::List& list_3 = browser()->profile()->GetPrefs()->GetList(prefs::kPinnedActions); - ASSERT_EQ(4u, list_3.size()); - ASSERT_EQ("kActionShowChromeLabs", list_3[0].GetString()); - EXPECT_EQ("kActionSidePanelShowReadingList", list_3[1].GetString()); - EXPECT_EQ("kActionSidePanelShowHistoryCluster", list_3[2].GetString()); - EXPECT_EQ("kActionSidePanelShowBookmarks", list_3[3].GetString()); + if (features::HasTabSearchToolbarButton()) { + ASSERT_EQ(5u, list_3.size()); + ASSERT_EQ("kActionShowChromeLabs", list_3[0].GetString()); + ASSERT_EQ("kActionTabSearch", list_3[1].GetString()); + EXPECT_EQ("kActionSidePanelShowReadingList", list_3[2].GetString()); + EXPECT_EQ("kActionSidePanelShowHistoryCluster", list_3[3].GetString()); + EXPECT_EQ("kActionSidePanelShowBookmarks", list_3[4].GetString()); + } else { + ASSERT_EQ(4u, list_3.size()); + ASSERT_EQ("kActionShowChromeLabs", list_3[0].GetString()); + EXPECT_EQ("kActionSidePanelShowReadingList", list_3[1].GetString()); + EXPECT_EQ("kActionSidePanelShowHistoryCluster", list_3[2].GetString()); + EXPECT_EQ("kActionSidePanelShowBookmarks", list_3[3].GetString()); + } } // Verify that trying to move a pinned action out of bounds will do nothing. @@ -254,7 +304,8 @@ // Expect that moving an Action out of bounds at the end of the list does // nothing. - model()->MovePinnedAction(kActionSidePanelShowReadingList, 4); + model()->MovePinnedAction(kActionSidePanelShowReadingList, + features::HasTabSearchToolbarButton() ? 5 : 4); EXPECT_EQ(0, observer()->removed_count()); EXPECT_EQ(3, observer()->inserted_count()); EXPECT_EQ(-1, observer()->moved_to_index()); @@ -262,11 +313,20 @@ // Verify the action did not move. const base::Value::List& list_1 = browser()->profile()->GetPrefs()->GetList(prefs::kPinnedActions); - ASSERT_EQ(4u, list_1.size()); - ASSERT_EQ("kActionShowChromeLabs", list_1[0].GetString()); - EXPECT_EQ("kActionSidePanelShowBookmarks", list_1[1].GetString()); - EXPECT_EQ("kActionSidePanelShowReadingList", list_1[2].GetString()); - EXPECT_EQ("kActionSidePanelShowHistoryCluster", list_1[3].GetString()); + if (features::HasTabSearchToolbarButton()) { + ASSERT_EQ(5u, list_1.size()); + ASSERT_EQ("kActionShowChromeLabs", list_1[0].GetString()); + ASSERT_EQ("kActionTabSearch", list_1[1].GetString()); + EXPECT_EQ("kActionSidePanelShowBookmarks", list_1[2].GetString()); + EXPECT_EQ("kActionSidePanelShowReadingList", list_1[3].GetString()); + EXPECT_EQ("kActionSidePanelShowHistoryCluster", list_1[4].GetString()); + } else { + ASSERT_EQ(4u, list_1.size()); + ASSERT_EQ("kActionShowChromeLabs", list_1[0].GetString()); + EXPECT_EQ("kActionSidePanelShowBookmarks", list_1[1].GetString()); + EXPECT_EQ("kActionSidePanelShowReadingList", list_1[2].GetString()); + EXPECT_EQ("kActionSidePanelShowHistoryCluster", list_1[3].GetString()); + } // Expect that moving an action out of bounds before the list does nothing. model()->MovePinnedAction(kActionSidePanelShowBookmarks, -1); @@ -277,12 +337,20 @@ // Verify the action did not move. const base::Value::List& list_2 = browser()->profile()->GetPrefs()->GetList(prefs::kPinnedActions); - ASSERT_EQ(4u, list_2.size()); - - ASSERT_EQ("kActionShowChromeLabs", list_2[0].GetString()); - EXPECT_EQ("kActionSidePanelShowBookmarks", list_2[1].GetString()); - EXPECT_EQ("kActionSidePanelShowReadingList", list_2[2].GetString()); - EXPECT_EQ("kActionSidePanelShowHistoryCluster", list_2[3].GetString()); + if (features::HasTabSearchToolbarButton()) { + ASSERT_EQ(5u, list_2.size()); + ASSERT_EQ("kActionShowChromeLabs", list_2[0].GetString()); + ASSERT_EQ("kActionTabSearch", list_2[1].GetString()); + EXPECT_EQ("kActionSidePanelShowBookmarks", list_2[2].GetString()); + EXPECT_EQ("kActionSidePanelShowReadingList", list_2[3].GetString()); + EXPECT_EQ("kActionSidePanelShowHistoryCluster", list_2[4].GetString()); + } else { + ASSERT_EQ(4u, list_2.size()); + ASSERT_EQ("kActionShowChromeLabs", list_2[0].GetString()); + EXPECT_EQ("kActionSidePanelShowBookmarks", list_2[1].GetString()); + EXPECT_EQ("kActionSidePanelShowReadingList", list_2[2].GetString()); + EXPECT_EQ("kActionSidePanelShowHistoryCluster", list_2[3].GetString()); + } } // Verify that trying to move a pinned action out of bounds will do nothing. @@ -303,10 +371,18 @@ // Verify nothing changed. const base::Value::List& list_1 = browser()->profile()->GetPrefs()->GetList(prefs::kPinnedActions); - ASSERT_EQ(3u, list_1.size()); - ASSERT_EQ("kActionShowChromeLabs", list_1[0].GetString()); - EXPECT_EQ("kActionSidePanelShowBookmarks", list_1[1].GetString()); - EXPECT_EQ("kActionSidePanelShowReadingList", list_1[2].GetString()); + if (features::HasTabSearchToolbarButton()) { + ASSERT_EQ(4u, list_1.size()); + ASSERT_EQ("kActionShowChromeLabs", list_1[0].GetString()); + ASSERT_EQ("kActionTabSearch", list_1[1].GetString()); + EXPECT_EQ("kActionSidePanelShowBookmarks", list_1[2].GetString()); + EXPECT_EQ("kActionSidePanelShowReadingList", list_1[3].GetString()); + } else { + ASSERT_EQ(3u, list_1.size()); + ASSERT_EQ("kActionShowChromeLabs", list_1[0].GetString()); + EXPECT_EQ("kActionSidePanelShowBookmarks", list_1[1].GetString()); + EXPECT_EQ("kActionSidePanelShowReadingList", list_1[2].GetString()); + } } // Verify that trying to move a pinned action to its current index does nothing. @@ -321,7 +397,8 @@ /*should_pin=*/true); // Expect that moving an action to the same index does nothing. - model()->MovePinnedAction(kActionSidePanelShowHistoryCluster, 3); + model()->MovePinnedAction(kActionSidePanelShowHistoryCluster, + features::HasTabSearchToolbarButton() ? 4 : 3); EXPECT_EQ(0, observer()->removed_count()); EXPECT_EQ(3, observer()->inserted_count()); EXPECT_EQ(-1, observer()->moved_to_index()); @@ -329,11 +406,20 @@ // Verify no action moved. const base::Value::List& list_1 = browser()->profile()->GetPrefs()->GetList(prefs::kPinnedActions); - ASSERT_EQ(4u, list_1.size()); - ASSERT_EQ("kActionShowChromeLabs", list_1[0].GetString()); - EXPECT_EQ("kActionSidePanelShowBookmarks", list_1[1].GetString()); - EXPECT_EQ("kActionSidePanelShowReadingList", list_1[2].GetString()); - EXPECT_EQ("kActionSidePanelShowHistoryCluster", list_1[3].GetString()); + if (features::HasTabSearchToolbarButton()) { + ASSERT_EQ(5u, list_1.size()); + ASSERT_EQ("kActionShowChromeLabs", list_1[0].GetString()); + ASSERT_EQ("kActionTabSearch", list_1[1].GetString()); + EXPECT_EQ("kActionSidePanelShowBookmarks", list_1[2].GetString()); + EXPECT_EQ("kActionSidePanelShowReadingList", list_1[3].GetString()); + EXPECT_EQ("kActionSidePanelShowHistoryCluster", list_1[4].GetString()); + } else { + ASSERT_EQ(4u, list_1.size()); + ASSERT_EQ("kActionShowChromeLabs", list_1[0].GetString()); + EXPECT_EQ("kActionSidePanelShowBookmarks", list_1[1].GetString()); + EXPECT_EQ("kActionSidePanelShowReadingList", list_1[2].GetString()); + EXPECT_EQ("kActionSidePanelShowHistoryCluster", list_1[3].GetString()); + } } IN_PROC_BROWSER_TEST_F(PinnedToolbarActionsModelBrowserTest, @@ -341,19 +427,28 @@ EXPECT_TRUE(model()->IsDefault()); EXPECT_FALSE(model()->Contains(kActionSidePanelShowBookmarks)); EXPECT_TRUE(model()->Contains(kActionShowChromeLabs)); - + if (features::HasTabSearchToolbarButton()) { + EXPECT_TRUE(model()->Contains(kActionTabSearch)); + model()->UpdatePinnedState(kActionTabSearch, false); + } model()->UpdatePinnedState(kActionShowChromeLabs, false); model()->UpdatePinnedState(kActionSidePanelShowBookmarks, true); EXPECT_FALSE(model()->IsDefault()); EXPECT_TRUE(model()->Contains(kActionSidePanelShowBookmarks)); EXPECT_FALSE(model()->Contains(kActionShowChromeLabs)); + if (features::HasTabSearchToolbarButton()) { + EXPECT_FALSE(model()->Contains(kActionTabSearch)); + } model()->ResetToDefault(); EXPECT_TRUE(model()->IsDefault()); EXPECT_FALSE(model()->Contains(kActionSidePanelShowBookmarks)); EXPECT_TRUE(model()->Contains(kActionShowChromeLabs)); + if (features::HasTabSearchToolbarButton()) { + EXPECT_TRUE(model()->Contains(kActionTabSearch)); + } } // TODO(dljames): Write tests for guest and incognito mode profile that check
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc index ec75237..3e97bf7c 100644 --- a/chrome/browser/ui/views/frame/browser_view.cc +++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -3660,6 +3660,12 @@ } } +void BrowserView::PreHandleDragExit() { + if (multi_contents_view_) { + multi_contents_view_->drop_target_controller().OnWebContentsDragExit(); + } +} + content::KeyboardEventProcessingResult BrowserView::PreHandleKeyboardEvent( const NativeWebKeyboardEvent& event) { if ((event.GetType() != blink::WebInputEvent::Type::kRawKeyDown) &&
diff --git a/chrome/browser/ui/views/frame/browser_view.h b/chrome/browser/ui/views/frame/browser_view.h index df72db62..469ac91 100644 --- a/chrome/browser/ui/views/frame/browser_view.h +++ b/chrome/browser/ui/views/frame/browser_view.h
@@ -665,6 +665,7 @@ bool PreHandleMouseEvent(const blink::WebMouseEvent& event) override; void PreHandleDragUpdate(const content::DropData& drop_data, const gfx::PointF& point) override; + void PreHandleDragExit() override; content::KeyboardEventProcessingResult PreHandleKeyboardEvent( const input::NativeWebKeyboardEvent& event) override; bool HandleKeyboardEvent(const input::NativeWebKeyboardEvent& event) override;
diff --git a/chrome/browser/ui/views/frame/multi_contents_view_drop_target_controller.cc b/chrome/browser/ui/views/frame/multi_contents_view_drop_target_controller.cc index 42cf722e..4efa26a 100644 --- a/chrome/browser/ui/views/frame/multi_contents_view_drop_target_controller.cc +++ b/chrome/browser/ui/views/frame/multi_contents_view_drop_target_controller.cc
@@ -27,3 +27,7 @@ // TODO(crbug.com/394369035): Add a timer to delay showing the drop zone. drop_target_view_->SetVisible(should_show_drop_zone); } + +void MultiContentsViewDropTargetController::OnWebContentsDragExit() { + drop_target_view_->SetVisible(false); +}
diff --git a/chrome/browser/ui/views/frame/multi_contents_view_drop_target_controller.h b/chrome/browser/ui/views/frame/multi_contents_view_drop_target_controller.h index f2fb90f..4aaf681 100644 --- a/chrome/browser/ui/views/frame/multi_contents_view_drop_target_controller.h +++ b/chrome/browser/ui/views/frame/multi_contents_view_drop_target_controller.h
@@ -30,6 +30,7 @@ // `point` should be relative to the multi contents view. void OnWebContentsDragUpdate(const content::DropData& data, const gfx::PointF& point); + void OnWebContentsDragExit(); private: // The view that is displayed when drags hover over the "drop" region of
diff --git a/chrome/browser/ui/views/frame/multi_contents_view_drop_target_controller_unittest.cc b/chrome/browser/ui/views/frame/multi_contents_view_drop_target_controller_unittest.cc index 36202ba9..748063e 100644 --- a/chrome/browser/ui/views/frame/multi_contents_view_drop_target_controller_unittest.cc +++ b/chrome/browser/ui/views/frame/multi_contents_view_drop_target_controller_unittest.cc
@@ -88,4 +88,10 @@ EXPECT_FALSE(drop_target_view().GetVisible()); } +TEST_F(MultiContentsViewDropTargetControllerTest, OnWebContentsDragExit) { + drop_target_view().SetVisible(true); + controller().OnWebContentsDragExit(); + EXPECT_FALSE(drop_target_view().GetVisible()); +} + } // namespace
diff --git a/chrome/browser/ui/views/frame/tab_strip_region_view_interactive_uitest.cc b/chrome/browser/ui/views/frame/tab_strip_region_view_interactive_uitest.cc index 4fdcb726..fe7aa57c 100644 --- a/chrome/browser/ui/views/frame/tab_strip_region_view_interactive_uitest.cc +++ b/chrome/browser/ui/views/frame/tab_strip_region_view_interactive_uitest.cc
@@ -122,14 +122,19 @@ press_right(); if (features::HasTabstripComboButtonWithReverseButtonOrder()) { EXPECT_TRUE(new_tab_button()->HasFocus()); - } else { + } else if (!features::HasTabSearchToolbarButton()) { EXPECT_TRUE(tab_search_button()->HasFocus()); + } else { + EXPECT_TRUE(tab_0->HasFocus()); + EXPECT_TRUE(tab_strip_region_view()->pane_has_focus()); } - // Focus should cycle back around to tab_0. - press_right(); - EXPECT_TRUE(tab_0->HasFocus()); - EXPECT_TRUE(tab_strip_region_view()->pane_has_focus()); + if (!features::HasTabSearchToolbarButton()) { + // Focus should cycle back around to tab_0. + press_right(); + EXPECT_TRUE(tab_0->HasFocus()); + EXPECT_TRUE(tab_strip_region_view()->pane_has_focus()); + } } IN_PROC_BROWSER_TEST_P(TabStripRegionViewBrowserTest, TestReverseFocus) { @@ -161,7 +166,8 @@ // Pressing left should immediately cycle back around to the last button. press_left(); - if (features::HasTabstripComboButtonWithReverseButtonOrder()) { + if (features::HasTabstripComboButtonWithReverseButtonOrder() || + features::HasTabSearchToolbarButton()) { EXPECT_TRUE(new_tab_button()->HasFocus()); } else { EXPECT_TRUE(tab_search_button()->HasFocus()); @@ -170,12 +176,16 @@ press_left(); if (features::HasTabstripComboButtonWithReverseButtonOrder()) { EXPECT_TRUE(tab_search_button()->HasFocus()); - } else { + } else if (!features::HasTabSearchToolbarButton()) { EXPECT_TRUE(new_tab_button()->HasFocus()); + } else { + EXPECT_TRUE(tab_2->HasFocus()); } - move_back_to_tab(tab_2); - EXPECT_TRUE(tab_2->HasFocus()); + if (!features::HasTabSearchToolbarButton()) { + move_back_to_tab(tab_2); + EXPECT_TRUE(tab_2->HasFocus()); + } move_back_to_tab(tab_1); EXPECT_TRUE(tab_1->HasFocus()); @@ -211,7 +221,8 @@ EXPECT_TRUE(tab_strip_region_view()->AcceleratorPressed( tab_strip_region_view()->home_key())); - if (features::HasTabstripComboButtonWithReverseButtonOrder()) { + if (features::HasTabstripComboButtonWithReverseButtonOrder() || + features::HasTabSearchToolbarButton()) { EXPECT_TRUE(new_tab_button()->HasFocus()); } else { EXPECT_TRUE(tab_search_button()->HasFocus()); @@ -224,7 +235,8 @@ #if !BUILDFLAG(IS_WIN) EXPECT_TRUE(tab_strip_region_view()->AcceleratorPressed( tab_strip_region_view()->end_key())); - if (features::HasTabstripComboButtonWithReverseButtonOrder()) { + if (features::HasTabstripComboButtonWithReverseButtonOrder() || + features::HasTabSearchToolbarButton()) { EXPECT_TRUE(new_tab_button()->HasFocus()); } else { EXPECT_TRUE(tab_search_button()->HasFocus());
diff --git a/chrome/browser/ui/views/infobars/confirm_infobar.cc b/chrome/browser/ui/views/infobars/confirm_infobar.cc index 1f7aa265..f6a03f6 100644 --- a/chrome/browser/ui/views/infobars/confirm_infobar.cc +++ b/chrome/browser/ui/views/infobars/confirm_infobar.cc
@@ -99,6 +99,21 @@ DISTANCE_INFOBAR_HORIZONTAL_ICON_LABEL_PADDING); } + if (GetDelegate()->ShouldShowLinkBeforeButton()) { + const int link_spacing = + GetDelegate()->GetLinkSpacingWhenPositionedBeforeButton(); + link_->SetPosition( + gfx::Point(label_->bounds().right() + link_spacing, OffsetY(link_))); + + if (!link_->GetText().empty()) { + x = link_->bounds().right() + + layout_provider->GetDistanceMetric( + views::DISTANCE_RELATED_LABEL_HORIZONTAL); + } + } else { + link_->SetPosition(gfx::Point(GetEndX() - link_->width(), OffsetY(link_))); + } + // Add buttons into a vector to be displayed in an ordered row. // Depending on the PlatformStyle, reverse the vector so the ok button will be // on the correct leading style. @@ -120,8 +135,6 @@ layout_provider->GetDistanceMetric( views::DISTANCE_RELATED_BUTTON_HORIZONTAL); } - - link_->SetPosition(gfx::Point(GetEndX() - link_->width(), OffsetY(link_))); } void ConfirmInfoBar::OkButtonPressed() { @@ -146,6 +159,10 @@ return delegate()->AsConfirmInfoBarDelegate(); } +const ConfirmInfoBarDelegate* ConfirmInfoBar::GetDelegate() const { + return delegate()->AsConfirmInfoBarDelegate(); +} + int ConfirmInfoBar::GetContentMinimumWidth() const { return label_->GetMinimumSize().width() + link_->GetMinimumSize().width() + NonLabelWidth(); @@ -154,8 +171,18 @@ int ConfirmInfoBar::NonLabelWidth() const { ChromeLayoutProvider* layout_provider = ChromeLayoutProvider::Get(); - const int label_spacing = layout_provider->GetDistanceMetric( - views::DISTANCE_RELATED_LABEL_HORIZONTAL); + const bool should_show_link_before_button = + GetDelegate()->ShouldShowLinkBeforeButton(); + // The link should be shown before the button if the custom layout is + // enabled, the spacing between the label and the link is different than the + // spacing between the link and the button. + const int label_spacing = + should_show_link_before_button + ? layout_provider->GetDistanceMetric( + DISTANCE_INFOBAR_HORIZONTAL_ICON_LABEL_PADDING) + : layout_provider->GetDistanceMetric( + views::DISTANCE_RELATED_LABEL_HORIZONTAL); + const int button_spacing = layout_provider->GetDistanceMetric( views::DISTANCE_RELATED_BUTTON_HORIZONTAL);
diff --git a/chrome/browser/ui/views/infobars/confirm_infobar.h b/chrome/browser/ui/views/infobars/confirm_infobar.h index fea6e5b..e73d142 100644 --- a/chrome/browser/ui/views/infobars/confirm_infobar.h +++ b/chrome/browser/ui/views/infobars/confirm_infobar.h
@@ -36,6 +36,7 @@ void Layout(PassKey) override; ConfirmInfoBarDelegate* GetDelegate(); + const ConfirmInfoBarDelegate* GetDelegate() const; views::MdTextButton* ok_button_for_testing() { return ok_button_; }
diff --git a/chrome/browser/ui/views/infobars/confirm_infobar_custom_layout_browsertest.cc b/chrome/browser/ui/views/infobars/confirm_infobar_custom_layout_browsertest.cc new file mode 100644 index 0000000..060f551 --- /dev/null +++ b/chrome/browser/ui/views/infobars/confirm_infobar_custom_layout_browsertest.cc
@@ -0,0 +1,159 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/tabs/tab_strip_model.h" +#include "chrome/browser/ui/views/chrome_layout_provider.h" +#include "chrome/browser/ui/views/infobars/confirm_infobar.h" +#include "chrome/test/base/in_process_browser_test.h" +#include "components/infobars/content/content_infobar_manager.h" +#include "components/infobars/core/infobar.h" +#include "components/infobars/core/infobar_manager.h" +#include "content/public/browser/web_contents.h" +#include "content/public/test/browser_test.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "ui/base/interaction/element_identifier.h" +#include "ui/base/l10n/l10n_util.h" +#include "ui/views/controls/button/md_text_button.h" +#include "ui/views/controls/label.h" +#include "ui/views/controls/link.h" +#include "ui/views/view_utils.h" + +namespace { + +// Delegate for testing ConfirmInfoBar show link before button. +class CustomLayoutTestConfirmInfoBarDelegate : public ConfirmInfoBarDelegate { + public: + explicit CustomLayoutTestConfirmInfoBarDelegate(bool show_link_before_button) + : show_link_before_button_(show_link_before_button) {} + ~CustomLayoutTestConfirmInfoBarDelegate() override = default; + + infobars::InfoBarDelegate::InfoBarIdentifier GetIdentifier() const override { + return infobars::InfoBarDelegate::TEST_INFOBAR; + } + + std::u16string GetMessageText() const override { return u"Test Message"; } + std::u16string GetLinkText() const override { return u"Test Link"; } + int GetButtons() const override { return BUTTON_OK; } + + // Enable the show link before button (to show link before button in infobar). + bool ShouldShowLinkBeforeButton() const override { + return show_link_before_button_; + } + + private: + const bool show_link_before_button_; +}; + +} // namespace + +class ConfirmInfobarCustomLayoutBrowserTest : public InProcessBrowserTest { + protected: + ConfirmInfobarCustomLayoutBrowserTest() = default; + + void SetUp() override { InProcessBrowserTest::SetUp(); } + + infobars::ContentInfoBarManager* GetInfoBarManager() { + content::WebContents* web_contents = + browser()->tab_strip_model()->GetActiveWebContents(); + EXPECT_TRUE(web_contents); + return infobars::ContentInfoBarManager::FromWebContents(web_contents); + } + + void AddCustomLayoutTestConfirmInfobar(bool show_link_before_button) { + infobars::ContentInfoBarManager* infobar_manager = GetInfoBarManager(); + ASSERT_TRUE(infobar_manager); + auto delegate = std::make_unique<CustomLayoutTestConfirmInfoBarDelegate>( + show_link_before_button); + infobar_manager->AddInfoBar( + std::make_unique<ConfirmInfoBar>(std::move(delegate))); + } + + ConfirmInfoBar* GetActiveConfirmInfoBar() { + infobars::ContentInfoBarManager* infobar_manager = GetInfoBarManager(); + EXPECT_TRUE(infobar_manager); + EXPECT_EQ(1u, infobar_manager->infobars().size()); + return static_cast<ConfirmInfoBar*>(infobar_manager->infobars()[0]); + } +}; + +IN_PROC_BROWSER_TEST_F(ConfirmInfobarCustomLayoutBrowserTest, + ShowsCustomLayoutWhenEnabled) { + // Add a ConfirmInfoBar with a delegate that enables show link before button + // (link before button). + AddCustomLayoutTestConfirmInfobar(true); + + ConfirmInfoBar* info_bar = GetActiveConfirmInfoBar(); + ASSERT_TRUE(info_bar); + // Check the layout. + const ConfirmInfoBarDelegate* delegate = info_bar->GetDelegate(); + ASSERT_TRUE(delegate); + EXPECT_TRUE(delegate->ShouldShowLinkBeforeButton()); + + views::Label* message_label = nullptr; + views::Link* test_link = nullptr; + views::MdTextButton* ok_button = info_bar->ok_button_for_testing(); + ASSERT_TRUE(ok_button); + + // Find the specific label and link views by their text content. + for (views::View* child : info_bar->children()) { + if (auto* link_view = views::AsViewClass<views::Link>(child)) { + if (link_view->GetText() == u"Test Link") { + test_link = link_view; + } + } else if (auto* label_view = views::AsViewClass<views::Label>(child)) { + if (label_view->GetText() == u"Test Message") { + message_label = label_view; + } + } + } + ASSERT_TRUE(message_label); + ASSERT_TRUE(test_link); + // Ensure the views have been laid out. + info_bar->GetWidget()->LayoutRootViewIfNecessary(); + // Check relative horizontal positions: Label then Link then OK_Button. + EXPECT_EQ(message_label->bounds().right(), test_link->bounds().x()); + EXPECT_LT(test_link->bounds().right(), ok_button->bounds().x()); +} + +IN_PROC_BROWSER_TEST_F(ConfirmInfobarCustomLayoutBrowserTest, + ShowsDefaultLayout) { + // Add a ConfirmInfoBar with a delegate that uses the default + // layout (link after buttons). + AddCustomLayoutTestConfirmInfobar(false); + + ConfirmInfoBar* info_bar = GetActiveConfirmInfoBar(); + ASSERT_TRUE(info_bar); + // Check the layout. + const ConfirmInfoBarDelegate* delegate = info_bar->GetDelegate(); + ASSERT_TRUE(delegate); + EXPECT_FALSE(delegate->ShouldShowLinkBeforeButton()); + + views::Label* message_label = nullptr; + views::Link* test_link = nullptr; + views::MdTextButton* ok_button = info_bar->ok_button_for_testing(); + ASSERT_TRUE(ok_button); + + for (views::View* child : info_bar->children()) { + if (auto* link_view = views::AsViewClass<views::Link>(child)) { + if (link_view->GetText() == u"Test Link") { + test_link = link_view; + } + } else if (auto* label_view = views::AsViewClass<views::Label>(child)) { + if (label_view->GetText() == u"Test Message") { + message_label = label_view; + } + } + } + ASSERT_TRUE(message_label); + ASSERT_TRUE(test_link); + // Ensure the views have been laid out. + info_bar->GetWidget()->LayoutRootViewIfNecessary(); + // Check relative horizontal positions: Label then OK_Button. + ChromeLayoutProvider* layout_provider = ChromeLayoutProvider::Get(); + EXPECT_EQ(message_label->bounds().right() + + layout_provider->GetDistanceMetric( + DISTANCE_INFOBAR_HORIZONTAL_ICON_LABEL_PADDING), + ok_button->bounds().x()); +}
diff --git a/chrome/browser/ui/views/privacy_sandbox/BUILD.gn b/chrome/browser/ui/views/privacy_sandbox/BUILD.gn index c46e0cce..212c3cc 100644 --- a/chrome/browser/ui/views/privacy_sandbox/BUILD.gn +++ b/chrome/browser/ui/views/privacy_sandbox/BUILD.gn
@@ -5,9 +5,9 @@ assert(!is_android) source_set("privacy_sandbox") { - public = [ "dialog_origin_marker.h" ] + public = [ "dialog_view_context.h" ] - sources = [ "dialog_origin_marker.cc" ] + sources = [ "dialog_view_context.cc" ] deps = [ "//content/public/browser" ] }
diff --git a/chrome/browser/ui/views/privacy_sandbox/dialog_origin_marker.cc b/chrome/browser/ui/views/privacy_sandbox/dialog_origin_marker.cc deleted file mode 100644 index 787a099..0000000 --- a/chrome/browser/ui/views/privacy_sandbox/dialog_origin_marker.cc +++ /dev/null
@@ -1,24 +0,0 @@ -// Copyright 2025 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "chrome/browser/ui/views/privacy_sandbox/dialog_origin_marker.h" - -#include "content/public/browser/web_contents.h" - -namespace privacy_sandbox { - -DialogOriginMarker::DialogOriginMarker(content::WebContents* contents, - BaseDialogUIDelegate& delegate) - : content::WebContentsUserData<DialogOriginMarker>(*contents), - delegate_(delegate) {} - -DialogOriginMarker::~DialogOriginMarker() = default; - -BaseDialogUIDelegate& DialogOriginMarker::GetDelegate() { - return *delegate_; -} - -WEB_CONTENTS_USER_DATA_KEY_IMPL(DialogOriginMarker); - -} // namespace privacy_sandbox
diff --git a/chrome/browser/ui/views/privacy_sandbox/dialog_origin_marker.h b/chrome/browser/ui/views/privacy_sandbox/dialog_origin_marker.h deleted file mode 100644 index 31712f2..0000000 --- a/chrome/browser/ui/views/privacy_sandbox/dialog_origin_marker.h +++ /dev/null
@@ -1,37 +0,0 @@ -// Copyright 2025 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#ifndef CHROME_BROWSER_UI_VIEWS_PRIVACY_SANDBOX_DIALOG_ORIGIN_MARKER_H_ -#define CHROME_BROWSER_UI_VIEWS_PRIVACY_SANDBOX_DIALOG_ORIGIN_MARKER_H_ - -#include "content/public/browser/web_contents_user_data.h" - -namespace privacy_sandbox { - -class BaseDialogUIDelegate; - -// A marker class attached via WebContentsUserData to WebContents specifically -// created for the Privacy Sandbox dialog view. This allows Privacy Sandbox -// WebUI controllers to differentiate between WebContents hosted within the -// dialog and those loaded in a standard browser tab. -// TODO(crbug.com/398005782): Change class name to better reflect its -// responsibility. -class DialogOriginMarker - : public content::WebContentsUserData<DialogOriginMarker> { - public: - DialogOriginMarker(content::WebContents* contents, - BaseDialogUIDelegate& delegate); - ~DialogOriginMarker() override; - BaseDialogUIDelegate& GetDelegate(); - - private: - raw_ref<BaseDialogUIDelegate> delegate_; - - friend class content::WebContentsUserData<DialogOriginMarker>; - WEB_CONTENTS_USER_DATA_KEY_DECL(); -}; - -} // namespace privacy_sandbox - -#endif // CHROME_BROWSER_UI_VIEWS_PRIVACY_SANDBOX_DIALOG_ORIGIN_MARKER_H_
diff --git a/chrome/browser/ui/views/privacy_sandbox/dialog_view_context.cc b/chrome/browser/ui/views/privacy_sandbox/dialog_view_context.cc new file mode 100644 index 0000000..1b199be --- /dev/null +++ b/chrome/browser/ui/views/privacy_sandbox/dialog_view_context.cc
@@ -0,0 +1,24 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/browser/ui/views/privacy_sandbox/dialog_view_context.h" + +#include "content/public/browser/web_contents.h" + +namespace privacy_sandbox { + +DialogViewContext::DialogViewContext(content::WebContents* contents, + BaseDialogUIDelegate& delegate) + : content::WebContentsUserData<DialogViewContext>(*contents), + delegate_(delegate) {} + +DialogViewContext::~DialogViewContext() = default; + +BaseDialogUIDelegate& DialogViewContext::GetDelegate() { + return *delegate_; +} + +WEB_CONTENTS_USER_DATA_KEY_IMPL(DialogViewContext); + +} // namespace privacy_sandbox
diff --git a/chrome/browser/ui/views/privacy_sandbox/dialog_view_context.h b/chrome/browser/ui/views/privacy_sandbox/dialog_view_context.h new file mode 100644 index 0000000..b19a0a9d --- /dev/null +++ b/chrome/browser/ui/views/privacy_sandbox/dialog_view_context.h
@@ -0,0 +1,36 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_BROWSER_UI_VIEWS_PRIVACY_SANDBOX_DIALOG_VIEW_CONTEXT_H_ +#define CHROME_BROWSER_UI_VIEWS_PRIVACY_SANDBOX_DIALOG_VIEW_CONTEXT_H_ + +#include "content/public/browser/web_contents_user_data.h" + +namespace privacy_sandbox { + +class BaseDialogUIDelegate; + +// A context class, attached via WebContentsUserData, for WebContents +// specifically created for the privacy sandbox dialog view. It allows WebUI +// controllers to differentiate between WebContents hosted within the dialog and +// those loaded in a standard browser tab and provides access to the dialog's +// BaseDialogUIDelegate. +class DialogViewContext + : public content::WebContentsUserData<DialogViewContext> { + public: + DialogViewContext(content::WebContents* contents, + BaseDialogUIDelegate& delegate); + ~DialogViewContext() override; + BaseDialogUIDelegate& GetDelegate(); + + private: + raw_ref<BaseDialogUIDelegate> delegate_; + + friend class content::WebContentsUserData<DialogViewContext>; + WEB_CONTENTS_USER_DATA_KEY_DECL(); +}; + +} // namespace privacy_sandbox + +#endif // CHROME_BROWSER_UI_VIEWS_PRIVACY_SANDBOX_DIALOG_VIEW_CONTEXT_H_
diff --git a/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view.cc b/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view.cc index 8b5761f..5af94469 100644 --- a/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view.cc +++ b/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view.cc
@@ -16,7 +16,7 @@ #include "chrome/browser/ui/views/frame/app_menu_button.h" #include "chrome/browser/ui/views/frame/browser_view.h" #include "chrome/browser/ui/views/frame/toolbar_button_provider.h" -#include "chrome/browser/ui/views/privacy_sandbox/dialog_origin_marker.h" +#include "chrome/browser/ui/views/privacy_sandbox/dialog_view_context.h" #include "chrome/browser/ui/webui/privacy_sandbox/base_dialog_ui.h" #include "chrome/browser/ui/webui/privacy_sandbox/privacy_sandbox_dialog_ui.h" #include "chrome/common/webui_url_constants.h" @@ -125,9 +125,11 @@ BrowserWindowInterface* browser) : web_view_(AddChildView(std::make_unique<WebView>(browser->GetProfile()))), browser_(browser) { - // Attach the marker to identify that this WebContents instance originates - // from the dialog view, allowing WebUI controllers to tailor behavior. - privacy_sandbox::DialogOriginMarker::CreateForWebContents( + // Attach DialogViewContext to this WebContents. This identifies the + // WebContents as originating from the dialog and provides WebUI controllers + // with access to this view (as the BaseDialogUIDelegate) for native dialog + // operations. + privacy_sandbox::DialogViewContext::CreateForWebContents( web_view_->GetWebContents(), *this); // Override the default zoom level for the Privacy Sandbox dialog. Its size // should align with native UI elements, rather than web content.
diff --git a/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view_browsertest.cc b/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view_browsertest.cc index 958a2a4..efa1d97 100644 --- a/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view_browsertest.cc +++ b/chrome/browser/ui/views/privacy_sandbox/privacy_sandbox_dialog_view_browsertest.cc
@@ -17,7 +17,7 @@ #include "chrome/browser/ui/tabs/tab_strip_model.h" #include "chrome/browser/ui/test/test_browser_dialog.h" #include "chrome/browser/ui/views/frame/browser_view.h" -#include "chrome/browser/ui/views/privacy_sandbox/dialog_origin_marker.h" +#include "chrome/browser/ui/views/privacy_sandbox/dialog_view_context.h" #include "components/privacy_sandbox/privacy_sandbox_features.h" #include "content/public/browser/web_contents.h" #include "content/public/test/browser_test.h" @@ -36,6 +36,8 @@ constexpr int kAverageBrowserHeight = 700; constexpr base::TimeDelta kMaxWaitTime = base::Seconds(30); +// TODO(crbug.com/371041180): Refactor tests to remove these scripts and notify +// from the notice components instead. std::string ScrollToBottomScript() { return R"```( (async () => { @@ -78,6 +80,35 @@ )```"; } +std::string WaitForPrivacyPolicyPageLoadScript() { + return R"( + (async () => { + return new Promise(async (resolve) => { + requestAnimationFrame(async () => { + dialogElement = document.querySelector("body > "+$1); + if($2 !== "") dialogElement = dialogElement.shadowRoot.querySelector($2); + waitForPrivacyPolicyResolve = (el) => new Promise(privacyPolicyResolve => { + let timeout = setTimeout(() => { + el.removeEventListener('privacy-policy-loaded', privacyPolicyLoadCallback); + privacyPolicyResolve(); + }, 2000); + const privacyPolicyLoadCallback = () => { + clearTimeout(timeout); + el.removeEventListener('privacy-policy-loaded', privacyPolicyLoadCallback); + privacyPolicyResolve(); + }; + el.addEventListener('privacy-policy-loaded', privacyPolicyLoadCallback); + }); + const privacyPolicyEl = dialogElement.shadowRoot.querySelector('privacy-sandbox-privacy-policy-dialog'); + privacyPolicyEl.shadowRoot.querySelector('#privacyPolicy').src = "about:blank"; + await waitForPrivacyPolicyResolve(privacyPolicyEl); + setTimeout(resolve,0); + }); + }); + })(); + )"; +} + std::string ClickLearnMoreButton3TimesScript() { return R"( (async () => { @@ -123,10 +154,6 @@ } void SetUpOnMainThread() override { - host_resolver()->AddRule("*", "127.0.0.1"); - embedded_test_server()->ServeFilesFromSourceDirectory("content/test/data"); - - ASSERT_TRUE(embedded_test_server()->Start()); mock_service_ = static_cast<MockPrivacySandboxService*>( PrivacySandboxServiceFactory::GetInstance()->SetTestingFactoryAndUse( browser()->profile(), @@ -159,9 +186,8 @@ views::Widget* dialog_widget = waiter.WaitIfNeededAndGet(); auto* privacy_sandbox_dialog_view = static_cast<PrivacySandboxDialogView*>( dialog_widget->widget_delegate()->GetContentsView()); - // Verify that the DialogOriginMarker is present for WebContents created - // within the dialog view context. - ASSERT_NE(privacy_sandbox::DialogOriginMarker::FromWebContents( + // Verify that the DialogViewContext is present from the WebContents. + ASSERT_NE(privacy_sandbox::DialogViewContext::FromWebContents( privacy_sandbox_dialog_view->GetWebContentsForTesting()), nullptr); } @@ -314,13 +340,13 @@ auto* privacy_sandbox_dialog_view = static_cast<PrivacySandboxDialogView*>( dialog_widget->widget_delegate()->GetContentsView()); - // Verify that the DialogOriginMarker is present for WebContents created - // within the dialog view context. - ASSERT_NE(privacy_sandbox::DialogOriginMarker::FromWebContents( + // Verify that the DialogViewContext is present from the WebContents. + ASSERT_NE(privacy_sandbox::DialogViewContext::FromWebContents( privacy_sandbox_dialog_view->GetWebContentsForTesting()), nullptr); - // Click expand button. + // Privacy policy is initially not visible, click expand button and trigger + // visibility. EXPECT_TRUE( content::ExecJs(privacy_sandbox_dialog_view->GetWebContentsForTesting(), "document.querySelector('body > " @@ -329,6 +355,11 @@ "privacy-sandbox-dialog-learn-more').shadowRoot." "querySelector('div > cr-expand-button').click()")); + EXPECT_TRUE(content::ExecJs( + privacy_sandbox_dialog_view->GetWebContentsForTesting(), + content::JsReplace(WaitForPrivacyPolicyPageLoadScript(), + "privacy-sandbox-combined-dialog-app", "#consent"))); + // Click Privacy Policy link. EXPECT_TRUE( content::ExecJs(privacy_sandbox_dialog_view->GetWebContentsForTesting(), @@ -339,17 +370,6 @@ GetPrivacyPolicyLinkElementId() + "')" ".click()")); - - // Intentionally navigate to some blocked content to avoid flakiness. - auto script = content::JsReplace( - "document.querySelector('body > " - "privacy-sandbox-combined-dialog-app')" - ".shadowRoot.querySelector('#consent')" - ".shadowRoot.querySelector('privacy-sandbox-privacy-policy-dialog')" - ".shadowRoot.querySelector('#privacyPolicy').src = $1;", - embedded_test_server()->GetURL("/blue.html")); - EXPECT_TRUE(content::ExecJs( - privacy_sandbox_dialog_view->GetWebContentsForTesting(), script)); } private: @@ -358,7 +378,7 @@ // TODO(https://crbug.com/415305952): High failure rate. IN_PROC_BROWSER_TEST_F(PrivacySandboxDialogViewPrivacyPolicyBrowserTest, - DISABLED_InvokeUi_PrivacyPolicy) { + InvokeUi_PrivacyPolicy) { ShowAndVerifyUi(); } @@ -384,7 +404,7 @@ // TODO(https://crbug.com/415305952): High failure rate. IN_PROC_BROWSER_TEST_F( PrivacySandboxDialogViewAdsApiUxEnhancementPrivacyPolicyBrowserTest, - DISABLED_InvokeUi_PrivacyPolicy) { + InvokeUi_PrivacyPolicy) { ShowAndVerifyUi(); } @@ -417,9 +437,8 @@ auto* privacy_sandbox_dialog_view = static_cast<PrivacySandboxDialogView*>( dialog_widget->widget_delegate()->GetContentsView()); - // Verify that the DialogOriginMarker is present for WebContents created - // within the dialog view context. - ASSERT_NE(privacy_sandbox::DialogOriginMarker::FromWebContents( + // Verify that the DialogViewContext is present from the WebContents. + ASSERT_NE(privacy_sandbox::DialogViewContext::FromWebContents( privacy_sandbox_dialog_view->GetWebContentsForTesting()), nullptr);
diff --git a/chrome/browser/ui/views/side_panel/side_panel_interactive_uitest.cc b/chrome/browser/ui/views/side_panel/side_panel_interactive_uitest.cc index 49c70c2..1560727 100644 --- a/chrome/browser/ui/views/side_panel/side_panel_interactive_uitest.cc +++ b/chrome/browser/ui/views/side_panel/side_panel_interactive_uitest.cc
@@ -26,6 +26,7 @@ #include "chrome/browser/ui/views/toolbar/toolbar_view.h" #include "chrome/browser/ui/web_applications/web_app_launch_utils.h" #include "chrome/browser/web_applications/test/web_app_install_test_utils.h" +#include "chrome/common/chrome_features.h" #include "chrome/common/webui_url_constants.h" #include "chrome/test/interaction/interaction_test_util_browser.h" #include "chrome/test/interaction/interactive_browser_test.h" @@ -136,6 +137,9 @@ PinnedToolbarActionsModel* const actions_model = PinnedToolbarActionsModel::Get(browser()->profile()); actions_model->UpdatePinnedState(kActionShowChromeLabs, false); + if (features::HasTabSearchToolbarButton()) { + actions_model->UpdatePinnedState(kActionTabSearch, false); + } views::test::WaitForAnimatingLayoutManager( BrowserView::GetBrowserViewForBrowser(browser()) ->toolbar()
diff --git a/chrome/browser/ui/views/tabs/compound_tab_container_unittest.cc b/chrome/browser/ui/views/tabs/compound_tab_container_unittest.cc index 4c3e29f..b70dd4ab 100644 --- a/chrome/browser/ui/views/tabs/compound_tab_container_unittest.cc +++ b/chrome/browser/ui/views/tabs/compound_tab_container_unittest.cc
@@ -411,7 +411,8 @@ AddTab(0, TabPinned::kUnpinned, std::nullopt, TabActive::kActive); // Create just enough tabs so tabs are not full size. - const int standard_width = TabStyle::Get()->GetStandardWidth(); + const int standard_width = + TabStyle::Get()->GetStandardWidth(/*is_split*/ false); while (tab_container_->GetActiveTabWidth() == standard_width) { AddTab(0, TabPinned::kUnpinned); tab_container_->CompleteAnimationAndLayout(); @@ -446,7 +447,8 @@ AddTab(1, TabPinned::kUnpinned, std::nullopt, TabActive::kInactive); // Create just enough (pinned) tabs so the active tab is not full size. - const int standard_width = TabStyle::Get()->GetStandardWidth(); + const int standard_width = + TabStyle::Get()->GetStandardWidth(/*is_split*/ false); while (tab_container_->GetActiveTabWidth() == standard_width) { AddTab(0, TabPinned::kPinned, std::nullopt, TabActive::kInactive); tab_container_->CompleteAnimationAndLayout(); @@ -478,7 +480,8 @@ AddTab(1, TabPinned::kUnpinned, std::nullopt, TabActive::kActive); // Create just enough (pinned) tabs so the active tab is not full size. - const int standard_width = TabStyle::Get()->GetStandardWidth(); + const int standard_width = + TabStyle::Get()->GetStandardWidth(/*is_split*/ false); while (tab_container_->GetActiveTabWidth() == standard_width) { AddTab(0, TabPinned::kPinned); tab_container_->CompleteAnimationAndLayout();
diff --git a/chrome/browser/ui/views/tabs/dragging/tab_drag_controller_interactive_uitest.cc b/chrome/browser/ui/views/tabs/dragging/tab_drag_controller_interactive_uitest.cc index f70ba9d..47b1756 100644 --- a/chrome/browser/ui/views/tabs/dragging/tab_drag_controller_interactive_uitest.cc +++ b/chrome/browser/ui/views/tabs/dragging/tab_drag_controller_interactive_uitest.cc
@@ -3564,17 +3564,18 @@ const TabStyle* tab_style = TabStyle::Get(); // We must ensure that we set the bounds of the browser window such that it is // wide enough to allow the tab strip to expand to accommodate this tab. - browser()->window()->SetBounds( - gfx::Rect(0, 0, tab_style->GetStandardWidth() * 5, 400)); + browser()->window()->SetBounds(gfx::Rect( + 0, 0, tab_style->GetStandardWidth(/*is_split*/ false) * 5, 400)); const int tab_strip_width = tab_strip->width(); ASSERT_TRUE(PressInputAtCenter(tab_strip->tab_at(1))); ASSERT_TRUE(DragInputToCenter( - tab_strip->tab_at(1), gfx::Vector2d(tab_style->GetStandardWidth(), 0))); + tab_strip->tab_at(1), + gfx::Vector2d(tab_style->GetStandardWidth(/*is_split*/ false), 0))); BrowserView::GetBrowserViewForBrowser(browser()) ->GetWidget() ->LayoutRootViewIfNecessary(); - EXPECT_EQ(tab_strip_width + tab_style->GetStandardWidth(), + EXPECT_EQ(tab_strip_width + tab_style->GetStandardWidth(/*is_split*/ false), tab_strip->width()); ASSERT_TRUE(ReleaseInput()); }
diff --git a/chrome/browser/ui/views/tabs/tab.cc b/chrome/browser/ui/views/tabs/tab.cc index 5a16ad73..8867580 100644 --- a/chrome/browser/ui/views/tabs/tab.cc +++ b/chrome/browser/ui/views/tabs/tab.cc
@@ -818,12 +818,10 @@ } TabSizeInfo Tab::GetTabSizeInfo() const { - return {tab_style()->GetPinnedWidth(), - split().has_value() ? tab_style()->GetMinimumActiveSplitWidth() - : tab_style()->GetMinimumActiveWidth(), + return {tab_style()->GetPinnedWidth(split().has_value()), + tab_style()->GetMinimumActiveWidth(split().has_value()), tab_style()->GetMinimumInactiveWidth(), - split().has_value() ? tab_style()->GetStandardSplitWidth() - : tab_style()->GetStandardWidth()}; + tab_style()->GetStandardWidth(split().has_value())}; } void Tab::SetClosing(bool closing) { @@ -1093,11 +1091,9 @@ if (ShouldRenderAsNormalTab()) { return; } - const int pinned_width = tab_style()->GetPinnedWidth(); + const int pinned_width = GetTabSizeInfo().pinned_tab_width; const int ideal_delta = width() - pinned_width; const int ideal_x = (pinned_width - visual_width) / 2; - // TODO(crbug.com/40436434): This code is broken when the current width is - // less than the pinned width. bounds->set_x( bounds->x() + base::ClampRound( @@ -1223,7 +1219,7 @@ } bool Tab::ShouldRenderAsNormalTab() const { - return !data().pinned || (width() >= (tab_style()->GetPinnedWidth() + + return !data().pinned || (width() >= (GetTabSizeInfo().pinned_tab_width + kPinnedTabExtraWidthToRenderAsNormal)); }
diff --git a/chrome/browser/ui/views/tabs/tab_container_unittest.cc b/chrome/browser/ui/views/tabs/tab_container_unittest.cc index e789c7c..1c88b4a 100644 --- a/chrome/browser/ui/views/tabs/tab_container_unittest.cc +++ b/chrome/browser/ui/views/tabs/tab_container_unittest.cc
@@ -388,7 +388,8 @@ AddTab(0, std::nullopt, TabActive::kActive); // Create just enough tabs so tabs are not full size. - const int standard_width = TabStyle::Get()->GetStandardWidth(); + const int standard_width = + TabStyle::Get()->GetStandardWidth(/*is_split*/ false); while (tab_container_->GetActiveTabWidth() == standard_width) { AddTab(0); tab_container_->CompleteAnimationAndLayout(); @@ -418,7 +419,8 @@ AddTab(0, std::nullopt, TabActive::kActive); // Create just enough tabs so tabs are not full size. - const int standard_width = TabStyle::Get()->GetStandardWidth(); + const int standard_width = + TabStyle::Get()->GetStandardWidth(/*is_split*/ false); while (tab_container_->GetActiveTabWidth() == standard_width) { AddTab(0); tab_container_->CompleteAnimationAndLayout(); @@ -452,7 +454,8 @@ AddTab(0, std::nullopt, TabActive::kActive); // Create just enough tabs so tabs are not full size. - const int standard_width = TabStyle::Get()->GetStandardWidth(); + const int standard_width = + TabStyle::Get()->GetStandardWidth(/*is_split*/ false); while (tab_container_->GetActiveTabWidth() == standard_width) { AddTab(0); tab_container_->CompleteAnimationAndLayout(); @@ -482,7 +485,8 @@ AddTab(0, std::nullopt, TabActive::kActive); // Create enough tabs so tabs are not full size. - const int standard_width = TabStyle::Get()->GetStandardWidth(); + const int standard_width = + TabStyle::Get()->GetStandardWidth(/*is_split*/ false); // Set a tab_counter to avoid infinite loop int tab_counter = 0;
diff --git a/chrome/browser/ui/views/tabs/tab_group_header.cc b/chrome/browser/ui/views/tabs/tab_group_header.cc index 7f01dd11..6e122ec 100644 --- a/chrome/browser/ui/views/tabs/tab_group_header.cc +++ b/chrome/browser/ui/views/tabs/tab_group_header.cc
@@ -646,9 +646,10 @@ // The max width of the content should be half the standard tab width (not // counting overlap). - const int text_max_width = - (tab_style_->GetStandardWidth() - tab_style_->GetTabOverlap()) / 2 - - sync_icon_width - padding_between_label_sync_icon; + const int text_max_width = (tab_style_->GetStandardWidth(/*is_split*/ false) - + tab_style_->GetTabOverlap()) / + 2 - + sync_icon_width - padding_between_label_sync_icon; const int text_width = std::min( title_->GetPreferredSize(views::SizeBounds(title_->width(), {})).width(), text_max_width);
diff --git a/chrome/browser/ui/views/tabs/tab_hover_card_controller.cc b/chrome/browser/ui/views/tabs/tab_hover_card_controller.cc index f67a951..cffcfca9 100644 --- a/chrome/browser/ui/views/tabs/tab_hover_card_controller.cc +++ b/chrome/browser/ui/views/tabs/tab_hover_card_controller.cc
@@ -104,17 +104,20 @@ // | | // pinned tab width standard tab width constexpr base::TimeDelta kMinimumTriggerDelay = base::Milliseconds(300); - if (tab_width < tab_style->GetPinnedWidth()) { + const int tab_pinned_width = tab_style->GetPinnedWidth(/*is_split=*/false); + const int tab_standard_width = + tab_style->GetStandardWidth(/*is_split=*/false); + if (tab_width < tab_pinned_width) { return kMinimumTriggerDelay; } constexpr base::TimeDelta kMaximumTriggerDelay = base::Milliseconds(800); double logarithmic_fraction = - std::log(tab_width - tab_style->GetPinnedWidth() + 1) / - std::log(tab_style->GetStandardWidth() - tab_style->GetPinnedWidth() + 1); + std::log(tab_width - tab_pinned_width + 1) / + std::log(tab_standard_width - tab_pinned_width + 1); base::TimeDelta scaling_factor = kMaximumTriggerDelay - kMinimumTriggerDelay; base::TimeDelta delay = logarithmic_fraction * scaling_factor + kMinimumTriggerDelay; - if (tab_width >= tab_style->GetStandardWidth()) { + if (tab_width >= tab_standard_width) { delay += base::Milliseconds(max_width_additional_delay); } return delay;
diff --git a/chrome/browser/ui/views/tabs/tab_search_button_browsertest.cc b/chrome/browser/ui/views/tabs/tab_search_button_browsertest.cc index aee93ade..322b6d9 100644 --- a/chrome/browser/ui/views/tabs/tab_search_button_browsertest.cc +++ b/chrome/browser/ui/views/tabs/tab_search_button_browsertest.cc
@@ -21,6 +21,7 @@ #include "chrome/browser/ui/views/frame/tab_strip_region_view.h" #include "chrome/browser/ui/views/tab_search_bubble_host.h" #include "chrome/browser/ui/views/tabs/tab_search_button.h" +#include "chrome/common/chrome_features.h" #include "chrome/common/webui_url_constants.h" #include "chrome/test/base/in_process_browser_test.h" #include "content/public/test/browser_test.h" @@ -35,6 +36,13 @@ class TabSearchButtonBrowserTest : public InProcessBrowserTest { public: + TabSearchButtonBrowserTest() { + feature_list_.InitWithFeaturesAndParameters( + {{features::kTabstripComboButton, + {{"tab_search_toolbar_button", "false"}}}}, + {}); + } + BrowserView* browser_view() { return BrowserView::GetBrowserViewForBrowser(browser()); } @@ -59,6 +67,9 @@ run_loop.Run(); ASSERT_EQ(nullptr, bubble_manager()->GetBubbleWidget()); } + + private: + base::test::ScopedFeatureList feature_list_; }; IN_PROC_BROWSER_TEST_F(TabSearchButtonBrowserTest, ButtonClickCreatesBubble) { @@ -74,6 +85,13 @@ class TabSearchButtonBrowserUITest : public DialogBrowserTest { public: + TabSearchButtonBrowserUITest() { + feature_list_.InitWithFeaturesAndParameters( + {{features::kTabstripComboButton, + {{"tab_search_toolbar_button", "false"}}}}, + {}); + } + // DialogBrowserTest: void ShowUi(const std::string& name) override { AppendTab(chrome::kChromeUISettingsURL); @@ -88,6 +106,9 @@ void AppendTab(std::string url) { chrome::AddTabAt(browser(), GURL(url), -1, true); } + + private: + base::test::ScopedFeatureList feature_list_; }; // Invokes a tab search bubble.
diff --git a/chrome/browser/ui/views/tabs/tab_strip.cc b/chrome/browser/ui/views/tabs/tab_strip.cc index bbebc5eb..64597aee 100644 --- a/chrome/browser/ui/views/tabs/tab_strip.cc +++ b/chrome/browser/ui/views/tabs/tab_strip.cc
@@ -509,7 +509,7 @@ constexpr int kHorizontalMoveThreshold = 16; // DIPs. double ratio = static_cast<double>(tab_strip_->GetInactiveTabWidth()) / - TabStyle::Get()->GetStandardWidth(); + TabStyle::Get()->GetStandardWidth(/*is_split=*/false); return base::ClampRound(ratio * kHorizontalMoveThreshold); }
diff --git a/chrome/browser/ui/views/tabs/tab_strip_action_container.cc b/chrome/browser/ui/views/tabs/tab_strip_action_container.cc index 431778b..26e150e5 100644 --- a/chrome/browser/ui/views/tabs/tab_strip_action_container.cc +++ b/chrome/browser/ui/views/tabs/tab_strip_action_container.cc
@@ -205,10 +205,7 @@ opacity_animation_done_ = true; } - bool opacity_animation_running = - opacity_animation_done_ || !is_opacity_animated_; - - if (expansion_animation_done_ && opacity_animation_running) { + if (expansion_animation_done_ && opacity_animation_done_) { if (on_animation_ended_) { std::move(on_animation_ended_).Run(); }
diff --git a/chrome/browser/ui/views/tabs/tab_strip_combo_button_browsertest.cc b/chrome/browser/ui/views/tabs/tab_strip_combo_button_browsertest.cc index 3064af3..b3b4718 100644 --- a/chrome/browser/ui/views/tabs/tab_strip_combo_button_browsertest.cc +++ b/chrome/browser/ui/views/tabs/tab_strip_combo_button_browsertest.cc
@@ -16,7 +16,10 @@ class TabStripComboButtonBrowserTest : public InProcessBrowserTest { public: TabStripComboButtonBrowserTest() { - feature_list_.InitWithFeatures({features::kTabstripComboButton}, {}); + feature_list_.InitWithFeaturesAndParameters( + {{features::kTabstripComboButton, + {{"tab_search_toolbar_button", "false"}}}}, + {}); } BrowserView* browser_view() {
diff --git a/chrome/browser/ui/views/tabs/tab_strip_layout_helper.cc b/chrome/browser/ui/views/tabs/tab_strip_layout_helper.cc index 35869200..8d6fb051 100644 --- a/chrome/browser/ui/views/tabs/tab_strip_layout_helper.cc +++ b/chrome/browser/ui/views/tabs/tab_strip_layout_helper.cc
@@ -47,8 +47,9 @@ GetTabsCallback get_tabs_callback) : controller_(controller), get_tabs_callback_(get_tabs_callback), - active_tab_width_(TabStyle::Get()->GetStandardWidth()), - inactive_tab_width_(TabStyle::Get()->GetStandardWidth()) {} + active_tab_width_(TabStyle::Get()->GetStandardWidth(/*is_split=*/false)), + inactive_tab_width_( + TabStyle::Get()->GetStandardWidth(/*is_split=*/false)) {} TabStripLayoutHelper::~TabStripLayoutHelper() = default;
diff --git a/chrome/browser/ui/views/tabs/tab_strip_layout_unittest.cc b/chrome/browser/ui/views/tabs/tab_strip_layout_unittest.cc index 87929c04..59f8766 100644 --- a/chrome/browser/ui/views/tabs/tab_strip_layout_unittest.cc +++ b/chrome/browser/ui/views/tabs/tab_strip_layout_unittest.cc
@@ -61,6 +61,7 @@ constexpr int kMinActiveSplitWidth = 37; constexpr int kMinInactiveWidth = 32; constexpr int kPinnedWidth = 64; +constexpr int kPinnedSplitWidth = 55; constexpr int kTabOverlap = 18; std::vector<gfx::Rect> CalculateTabBounds(TestCase test_case) { @@ -71,7 +72,7 @@ size_info.standard_width = kStandardWidth; TabSizeInfo split_size_info; - split_size_info.pinned_tab_width = kPinnedWidth; + split_size_info.pinned_tab_width = kPinnedSplitWidth; split_size_info.min_active_width = kMinActiveSplitWidth; split_size_info.min_inactive_width = kMinInactiveWidth; split_size_info.standard_width = kStandardSplitWidth; @@ -161,6 +162,19 @@ ExpectTabsNarrowerThanTabStrip(bounds, test_case.tabstrip_width); } +TEST(TabStripLayoutTest, SplitPinnedTabs) { + TestCase test_case; + test_case.tabstrip_width = 1000; + test_case.num_tabs = 2; + test_case.num_pinned_tabs = 2; + test_case.split_tabs = {0, 1}; + + auto bounds = CalculateTabBounds(test_case); + EXPECT_EQ("55 55", TabWidthsAsString(bounds)); + EXPECT_EQ("0 37", TabXPositionsAsString(bounds)); + ExpectTabsNarrowerThanTabStrip(bounds, test_case.tabstrip_width); +} + TEST(TabStripLayoutTest, MiddleWidth) { TestCase test_case; test_case.tabstrip_width = 598;
diff --git a/chrome/browser/ui/views/tabs/tab_strip_unittest.cc b/chrome/browser/ui/views/tabs/tab_strip_unittest.cc index dceed334..8d2baa09 100644 --- a/chrome/browser/ui/views/tabs/tab_strip_unittest.cc +++ b/chrome/browser/ui/views/tabs/tab_strip_unittest.cc
@@ -471,7 +471,8 @@ controller_->AddTab(1, TabActive::kActive); controller_->AddTab(2, TabActive::kInactive); - const int standard_width = TabStyle::Get()->GetStandardWidth(); + const int standard_width = + TabStyle::Get()->GetStandardWidth(/*is_split*/ false); SetMaxTabStripWidth(1000); @@ -485,7 +486,8 @@ SetMaxTabStripWidth(50); - EXPECT_EQ(TabStyle::Get()->GetMinimumActiveWidth(), GetActiveTabWidth()); + EXPECT_EQ(TabStyle::Get()->GetMinimumActiveWidth(/*is_split*/ false), + GetActiveTabWidth()); EXPECT_EQ(TabStyle::Get()->GetMinimumInactiveWidth(), GetInactiveTabWidth()); } @@ -517,7 +519,7 @@ while (tab_strip_->GetTabCount() > 0) { active_index = tab_strip_->GetActiveIndex().value(); EXPECT_GE(tab_strip_->tab_at(active_index)->bounds().width(), - TabStyle::Get()->GetMinimumActiveWidth()); + TabStyle::Get()->GetMinimumActiveWidth(/*is_split*/ false)); tab_strip_->CloseTab(tab_strip_->tab_at(active_index), CloseTabSource::kFromMouse); CompleteAnimationAndLayout(); @@ -532,7 +534,8 @@ // Create a lot of tabs in order to make inactive tabs smaller than active // tab but not the minimum. const int min_inactive_width = TabStyle::Get()->GetMinimumInactiveWidth(); - const int min_active_width = TabStyle::Get()->GetMinimumActiveWidth(); + const int min_active_width = + TabStyle::Get()->GetMinimumActiveWidth(/*is_split*/ false); while (GetInactiveTabWidth() >= (min_inactive_width + min_active_width) / 2) { controller_->CreateNewTab(); CompleteAnimationAndLayout(); @@ -566,7 +569,8 @@ CompleteAnimationAndLayout(); } - const int min_active_width = TabStyle::Get()->GetMinimumActiveWidth(); + const int min_active_width = + TabStyle::Get()->GetMinimumActiveWidth(/*is_split*/ false); int dragged_tab_index = tab_strip_->GetActiveIndex().value(); ASSERT_GE(tab_strip_->tab_at(dragged_tab_index)->bounds().width(),
diff --git a/chrome/browser/ui/views/tabs/tab_style_views.cc b/chrome/browser/ui/views/tabs/tab_style_views.cc index 7179ba64..3e2e0f0a 100644 --- a/chrome/browser/ui/views/tabs/tab_style_views.cc +++ b/chrome/browser/ui/views/tabs/tab_style_views.cc
@@ -846,7 +846,8 @@ // Opacity boost varies on tab width. The interpolation is nonlinear so // that most tabs will fall on the low end of the opacity range, but very // narrow tabs will still stand out on the high end. - const float range_start = static_cast<float>(tab_style()->GetStandardWidth()); + const float range_start = + static_cast<float>(tab_style()->GetStandardWidth(/*is_split*/ false)); constexpr float kWidthForMaxHoverOpacity = 32.0f; const float value_in_range = static_cast<float>(tab_->width()); const float t = std::clamp(
diff --git a/chrome/browser/ui/views/tabs/tab_unittest.cc b/chrome/browser/ui/views/tabs/tab_unittest.cc index 6cdeb4e..91a4753 100644 --- a/chrome/browser/ui/views/tabs/tab_unittest.cc +++ b/chrome/browser/ui/views/tabs/tab_unittest.cc
@@ -431,12 +431,14 @@ // Test layout for every width from standard to minimum. int width, min_width; if (is_pinned_tab) { - width = min_width = tab->tab_style()->GetPinnedWidth(); + width = min_width = + tab->tab_style()->GetPinnedWidth(/*is_split=*/false); } else { - width = tab->tab_style()->GetStandardWidth(); - min_width = is_active_tab - ? TabStyle::Get()->GetMinimumActiveWidth() - : TabStyle::Get()->GetMinimumInactiveWidth(); + width = tab->tab_style()->GetStandardWidth(/*is_split=*/false); + min_width = + is_active_tab + ? TabStyle::Get()->GetMinimumActiveWidth(/*is_split=*/false) + : TabStyle::Get()->GetMinimumInactiveWidth(); } const int height = GetLayoutConstant(TAB_HEIGHT); for (; width >= min_width; --width) {
diff --git a/chrome/browser/ui/views/toolbar/pinned_toolbar_actions_container_browsertest.cc b/chrome/browser/ui/views/toolbar/pinned_toolbar_actions_container_browsertest.cc index 0d5244f7..451f932 100644 --- a/chrome/browser/ui/views/toolbar/pinned_toolbar_actions_container_browsertest.cc +++ b/chrome/browser/ui/views/toolbar/pinned_toolbar_actions_container_browsertest.cc
@@ -8,6 +8,7 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/profiles/profile_manager.h" #include "chrome/browser/translate/translate_test_utils.h" +#include "chrome/browser/ui/actions/chrome_action_id.h" #include "chrome/browser/ui/browser_window/public/browser_window_features.h" #include "chrome/browser/ui/toolbar/pinned_toolbar/pinned_toolbar_actions_model.h" #include "chrome/browser/ui/views/frame/browser_view.h" @@ -18,6 +19,7 @@ #include "chrome/browser/ui/views/web_apps/frame_toolbar/web_app_frame_toolbar_view.h" #include "chrome/browser/web_applications/test/os_integration_test_override_impl.h" #include "chrome/browser/web_applications/test/web_app_install_test_utils.h" +#include "chrome/common/chrome_features.h" #include "chrome/common/pref_names.h" #include "chrome/test/base/in_process_browser_test.h" #include "components/prefs/pref_service.h" @@ -35,6 +37,9 @@ PinnedToolbarActionsModel* const actions_model = PinnedToolbarActionsModel::Get(browser()->profile()); actions_model->UpdatePinnedState(kActionShowChromeLabs, false); + if (features::HasTabSearchToolbarButton()) { + actions_model->UpdatePinnedState(kActionTabSearch, false); + } views::test::WaitForAnimatingLayoutManager(container()); // OS integration is needed to be able to launch web applications. This // override ensures OS integration doesn't leave any traces.
diff --git a/chrome/browser/ui/views/toolbar/pinned_toolbar_actions_container_unittest.cc b/chrome/browser/ui/views/toolbar/pinned_toolbar_actions_container_unittest.cc index 658a571b3..b8eed8a 100644 --- a/chrome/browser/ui/views/toolbar/pinned_toolbar_actions_container_unittest.cc +++ b/chrome/browser/ui/views/toolbar/pinned_toolbar_actions_container_unittest.cc
@@ -51,6 +51,9 @@ ASSERT_TRUE(model_); model_->UpdatePinnedState(kActionShowChromeLabs, false); + if (features::HasTabSearchToolbarButton()) { + model_->UpdatePinnedState(kActionTabSearch, false); + } WaitForAnimations(); }
diff --git a/chrome/browser/ui/views/toolbar/toolbar_controller.cc b/chrome/browser/ui/views/toolbar/toolbar_controller.cc index b5abc98..9802120 100644 --- a/chrome/browser/ui/views/toolbar/toolbar_controller.cc +++ b/chrome/browser/ui/views/toolbar/toolbar_controller.cc
@@ -342,6 +342,7 @@ {kActionSidePanelShowLensOverlayResults, "PinnedShowLensOverlayResultsSidePanelButton"}, {kActionSendSharedTabGroupFeedback, "SharedTabGroupFeedbackButton"}, + {kActionTabSearch, "PinnedTabSearchButton"}, }); const auto it = identifier_to_action_name_map->find(identifier);
diff --git a/chrome/browser/ui/views/toolbar/toolbar_controller_interactive_uitest.cc b/chrome/browser/ui/views/toolbar/toolbar_controller_interactive_uitest.cc index 4e53986..2e0cce4 100644 --- a/chrome/browser/ui/views/toolbar/toolbar_controller_interactive_uitest.cc +++ b/chrome/browser/ui/views/toolbar/toolbar_controller_interactive_uitest.cc
@@ -26,6 +26,7 @@ #include "chrome/browser/ui/views/toolbar/pinned_toolbar_actions_container.h" #include "chrome/browser/ui/views/toolbar/toolbar_controller.h" #include "chrome/browser/ui/views/toolbar/toolbar_view.h" +#include "chrome/common/chrome_features.h" #include "chrome/grit/generated_resources.h" #include "chrome/test/base/interactive_test_utils.h" #include "chrome/test/base/ui_test_utils.h" @@ -55,7 +56,7 @@ public: ToolbarControllerUiTest() : InteractiveFeaturePromoTest(UseDefaultTrackerAllowingPromos( - {feature_engagement::kIPHTabSearchFeature})) { + {feature_engagement::kIPHMemorySaverModeFeature})) { ToolbarControllerUtil::SetPreventOverflowForTesting(false); } @@ -67,6 +68,9 @@ PinnedToolbarActionsModel* const actions_model = PinnedToolbarActionsModel::Get(browser()->profile()); actions_model->UpdatePinnedState(kActionShowChromeLabs, false); + if (features::HasTabSearchToolbarButton()) { + actions_model->UpdatePinnedState(kActionTabSearch, false); + } views::test::WaitForAnimatingLayoutManager( browser_view_->toolbar()->pinned_toolbar_actions_container()); toolbar_controller_ = const_cast<ToolbarController*>( @@ -680,9 +684,9 @@ MAYBE_DoNotShowIphWhenOverflowed) { RunTestSequence( ResizeRelativeToOverflow(-1), - MaybeShowPromo(feature_engagement::kIPHTabSearchFeature, + MaybeShowPromo(feature_engagement::kIPHMemorySaverModeFeature, user_education::FeaturePromoResult::kWindowTooSmall), ResizeRelativeToOverflow(1), - MaybeShowPromo(feature_engagement::kIPHTabSearchFeature), + MaybeShowPromo(feature_engagement::kIPHMemorySaverModeFeature), PressClosePromoButton()); }
diff --git a/chrome/browser/ui/webui/interstitials/interstitial_ui.cc b/chrome/browser/ui/webui/interstitials/interstitial_ui.cc index dd67d30..cffaa6240 100644 --- a/chrome/browser/ui/webui/interstitials/interstitial_ui.cc +++ b/chrome/browser/ui/webui/interstitials/interstitial_ui.cc
@@ -291,23 +291,13 @@ GURL request_url("http://example.com"); std::string type_param; security_interstitials::https_only_mode::HttpInterstitialState state; - if (net::GetValueForKeyInQuery(web_contents->GetVisibleURL(), "type", - &type_param)) { - if (type_param == "advanced_protection") { - state.enabled_by_advanced_protection = true; - } else if (type_param == "site_engagement") { - state.enabled_by_engagement_heuristic = true; - } else if (type_param == "typically_secure") { - state.enabled_by_typically_secure_browsing = true; - } else if (type_param == "incognito") { - state.enabled_by_incognito = true; - } - } - return std::make_unique<security_interstitials::HttpsOnlyModeBlockingPage>( - web_contents, request_url, - std::make_unique<HttpsOnlyModeControllerClient>(web_contents, - request_url), - state, + net::GetValueForKeyInQuery(web_contents->GetVisibleURL(), "type", + &type_param); + ChromeSecurityBlockingPageFactory blocking_page_factory; + return blocking_page_factory.CreateHttpsOnlyModeBlockingPage( + web_contents, request_url, state, + type_param.empty() ? std::nullopt + : std::make_optional<std::string>(type_param), /*metrics_callback=*/base::DoNothing()); }
diff --git a/chrome/browser/ui/webui/privacy_sandbox/base_dialog_browsertest.cc b/chrome/browser/ui/webui/privacy_sandbox/base_dialog_browsertest.cc index e7e2e473..ed781adf 100644 --- a/chrome/browser/ui/webui/privacy_sandbox/base_dialog_browsertest.cc +++ b/chrome/browser/ui/webui/privacy_sandbox/base_dialog_browsertest.cc
@@ -4,7 +4,7 @@ #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/tabs/tab_strip_model.h" -#include "chrome/browser/ui/views/privacy_sandbox/dialog_origin_marker.h" +#include "chrome/browser/ui/views/privacy_sandbox/dialog_view_context.h" #include "chrome/common/webui_url_constants.h" #include "chrome/grit/generated_resources.h" #include "chrome/test/base/in_process_browser_test.h" @@ -24,7 +24,7 @@ browser()->tab_strip_model()->GetActiveWebContents(); // Verify the marker is absent when the URL is loaded directly in a tab, as // opposed to being instantiated via the dialog view. - EXPECT_EQ(privacy_sandbox::DialogOriginMarker::FromWebContents(web_contents), + EXPECT_EQ(privacy_sandbox::DialogViewContext::FromWebContents(web_contents), nullptr); ASSERT_TRUE(web_contents); EXPECT_EQ(web_contents->GetLastCommittedURL(), kUrl);
diff --git a/chrome/browser/ui/webui/privacy_sandbox/base_dialog_ui.cc b/chrome/browser/ui/webui/privacy_sandbox/base_dialog_ui.cc index 24356b6..7027814 100644 --- a/chrome/browser/ui/webui/privacy_sandbox/base_dialog_ui.cc +++ b/chrome/browser/ui/webui/privacy_sandbox/base_dialog_ui.cc
@@ -5,7 +5,7 @@ #include "chrome/browser/ui/webui/privacy_sandbox/base_dialog_ui.h" #include "chrome/browser/profiles/profile.h" -#include "chrome/browser/ui/views/privacy_sandbox/dialog_origin_marker.h" +#include "chrome/browser/ui/views/privacy_sandbox/dialog_view_context.h" #include "chrome/grit/generated_resources.h" #include "chrome/grit/privacy_sandbox_resources.h" #include "chrome/grit/privacy_sandbox_resources_map.h" @@ -30,11 +30,11 @@ {"adPrivacyPageTitle", IDS_SETTINGS_AD_PRIVACY_PAGE_TITLE}}; source->AddLocalizedStrings(kStrings); - privacy_sandbox::DialogOriginMarker* origin_marker = - privacy_sandbox::DialogOriginMarker::FromWebContents( + privacy_sandbox::DialogViewContext* view_context = + privacy_sandbox::DialogViewContext::FromWebContents( web_ui->GetWebContents()); - if (origin_marker) { - delegate_ = &origin_marker->GetDelegate(); + if (view_context) { + delegate_ = &view_context->GetDelegate(); } }
diff --git a/chrome/browser/ui/webui/settings/appearance_handler_browsertest.cc b/chrome/browser/ui/webui/settings/appearance_handler_browsertest.cc index 19a9567d..1fe8f376 100644 --- a/chrome/browser/ui/webui/settings/appearance_handler_browsertest.cc +++ b/chrome/browser/ui/webui/settings/appearance_handler_browsertest.cc
@@ -11,6 +11,7 @@ #include "chrome/browser/ui/chrome_pages.h" #include "chrome/browser/ui/toolbar/pinned_toolbar/pinned_toolbar_actions_model.h" #include "chrome/browser/ui/views/side_panel/side_panel_ui.h" +#include "chrome/common/chrome_features.h" #include "chrome/common/pref_names.h" #include "chrome/test/base/in_process_browser_test.h" #include "chrome/test/base/ui_test_utils.h" @@ -63,7 +64,11 @@ EXPECT_TRUE(prefs->GetBoolean(prefs::kShowHomeButton)); EXPECT_FALSE(prefs->GetBoolean(prefs::kShowForwardButton)); - EXPECT_EQ(2u, actions_model->PinnedActionIds().size()); + if (features::HasTabSearchToolbarButton()) { + EXPECT_EQ(3u, actions_model->PinnedActionIds().size()); + } else { + EXPECT_EQ(2u, actions_model->PinnedActionIds().size()); + } base::Value::List args; browser() @@ -75,8 +80,14 @@ EXPECT_FALSE(prefs->GetBoolean(prefs::kShowHomeButton)); EXPECT_TRUE(prefs->GetBoolean(prefs::kShowForwardButton)); - ASSERT_EQ(1u, actions_model->PinnedActionIds().size()); - EXPECT_EQ(kActionShowChromeLabs, actions_model->PinnedActionIds()[0]); + if (features::HasTabSearchToolbarButton()) { + ASSERT_EQ(2u, actions_model->PinnedActionIds().size()); + EXPECT_EQ(kActionShowChromeLabs, actions_model->PinnedActionIds()[0]); + EXPECT_EQ(kActionTabSearch, actions_model->PinnedActionIds()[1]); + } else { + ASSERT_EQ(1u, actions_model->PinnedActionIds().size()); + EXPECT_EQ(kActionShowChromeLabs, actions_model->PinnedActionIds()[0]); + } } } // namespace settings
diff --git a/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.cc b/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.cc index c5be0b6..4b0e5c6 100644 --- a/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.cc +++ b/chrome/browser/ui/webui/settings/settings_clear_browsing_data_handler.cc
@@ -61,21 +61,35 @@ const int kMaxTimesHistoryNoticeShown = 1; // TODO(msramek): Get the list of deletion preferences from the JS side. -const char* kCounterPrefsAdvanced[] = { - browsing_data::prefs::kDeleteBrowsingHistory, - browsing_data::prefs::kDeleteCache, - browsing_data::prefs::kDeleteCookies, - browsing_data::prefs::kDeleteDownloadHistory, - browsing_data::prefs::kDeleteFormData, - browsing_data::prefs::kDeleteHostedAppsData, - browsing_data::prefs::kDeletePasswords, - browsing_data::prefs::kDeleteSiteSettings, -}; +// TODO(crbug.com/397187800): Remove basic and password counters when +// kDbdRevampDesktop is launched. +std::vector<std::string> GetAdvancedCounterPrefs() { + std::vector<std::string> counter_prefs_advanced = { + browsing_data::prefs::kDeleteBrowsingHistory, + browsing_data::prefs::kDeleteCache, + browsing_data::prefs::kDeleteCookies, + browsing_data::prefs::kDeleteDownloadHistory, + browsing_data::prefs::kDeleteFormData, + browsing_data::prefs::kDeleteHostedAppsData, + browsing_data::prefs::kDeleteSiteSettings, + }; -// Additional counters for the basic tab of CBD. -const char* kCounterPrefsBasic[] = { - browsing_data::prefs::kDeleteCacheBasic, -}; + if (!base::FeatureList::IsEnabled(features::kDbdRevampDesktop)) { + counter_prefs_advanced.push_back(browsing_data::prefs::kDeletePasswords); + } + + return counter_prefs_advanced; +} + +std::vector<std::string> GetBasicCounterPrefs() { + std::vector<std::string> counter_prefs_basic = {}; + + if (!base::FeatureList::IsEnabled(features::kDbdRevampDesktop)) { + counter_prefs_basic.push_back(browsing_data::prefs::kDeleteCacheBasic); + } + + return counter_prefs_basic; +} } // namespace @@ -121,11 +135,11 @@ DCHECK(counters_basic_.empty()); DCHECK(counters_advanced_.empty()); - for (const std::string& pref : kCounterPrefsBasic) { + for (const std::string& pref : GetBasicCounterPrefs()) { AddCounter(BrowsingDataCounterFactory::GetForProfileAndPref(profile_, pref), browsing_data::ClearBrowsingDataTab::BASIC); } - for (const std::string& pref : kCounterPrefsAdvanced) { + for (const std::string& pref : GetAdvancedCounterPrefs()) { AddCounter(BrowsingDataCounterFactory::GetForProfileAndPref(profile_, pref), browsing_data::ClearBrowsingDataTab::ADVANCED); } @@ -432,7 +446,8 @@ void ClearBrowsingDataHandler::UpdateCounterText( std::unique_ptr<browsing_data::BrowsingDataCounter::Result> result) { FireWebUIListener( - "update-counter-text", base::Value(result->source()->GetPrefName()), + "browsing-data-counter-text-update", + base::Value(result->source()->GetPrefName()), base::Value(browsing_data_counter_utils::GetChromeCounterTextFromResult( result.get(), profile_))); }
diff --git a/chrome/browser/ui/webui/settings/site_settings_helper.cc b/chrome/browser/ui/webui/settings/site_settings_helper.cc index fc8a008..9d5f4069 100644 --- a/chrome/browser/ui/webui/settings/site_settings_helper.cc +++ b/chrome/browser/ui/webui/settings/site_settings_helper.cc
@@ -257,6 +257,7 @@ {ContentSettingsType::REVOKED_DISRUPTIVE_NOTIFICATION_PERMISSIONS, nullptr}, {ContentSettingsType::ON_DEVICE_SPEECH_RECOGNITION_LANGUAGES_DOWNLOADED, nullptr}, + {ContentSettingsType::INITIALIZED_TRANSLATIONS, nullptr}, }); static_assert(
diff --git a/chrome/browser/ui/webui/side_panel/reading_list/reading_list_ui.cc b/chrome/browser/ui/webui/side_panel/reading_list/reading_list_ui.cc index d026cd0..d327bb8 100644 --- a/chrome/browser/ui/webui/side_panel/reading_list/reading_list_ui.cc +++ b/chrome/browser/ui/webui/side_panel/reading_list/reading_list_ui.cc
@@ -45,10 +45,12 @@ profile, chrome::kChromeUIReadLaterHost); static constexpr webui::LocalizedString kLocalizedStrings[] = { {"addCurrentTab", IDS_READ_LATER_ADD_CURRENT_TAB}, + {"collapseButtonAriaLabel", IDS_READ_LATER_COLLAPSE_BUTTON_ARIA_LABEL}, {"emptyStateAddFromDialogSubheader", IDS_READ_LATER_MENU_EMPTY_STATE_ADD_FROM_DIALOG_SUBHEADER}, {"emptyStateHeader", IDS_READ_LATER_MENU_EMPTY_STATE_HEADER}, {"emptyStateSubheader", IDS_READ_LATER_MENU_EMPTY_STATE_SUBHEADER}, + {"expandButtonAriaLabel", IDS_READ_LATER_EXPAND_BUTTON_ARIA_LABEL}, {"markCurrentTabAsRead", IDS_READ_LATER_MARK_CURRENT_TAB_READ}, {"readHeader", IDS_READ_LATER_MENU_READ_HEADER}, {"title", IDS_READ_LATER_TITLE},
diff --git a/chrome/browser/usb/android/java/src/org/chromium/chrome/browser/usb/UsbNotificationManager.java b/chrome/browser/usb/android/java/src/org/chromium/chrome/browser/usb/UsbNotificationManager.java index 8e45d14..5b60d396 100644 --- a/chrome/browser/usb/android/java/src/org/chromium/chrome/browser/usb/UsbNotificationManager.java +++ b/chrome/browser/usb/android/java/src/org/chromium/chrome/browser/usb/UsbNotificationManager.java
@@ -48,9 +48,9 @@ public static final String NOTIFICATION_IS_INCOGNITO = "NotificationIsIncognito"; public static final String NOTIFICATION_URL_EXTRA = "NotificationUrl"; - private UsbNotificationManagerDelegate mDelegate; - private BaseNotificationManagerProxy mNotificationManager; - private SharedPreferencesManager mSharedPreferences; + private final UsbNotificationManagerDelegate mDelegate; + private final BaseNotificationManagerProxy mNotificationManager; + private final SharedPreferencesManager mSharedPreferences; private final List<Integer> mNotificationIds = new ArrayList<Integer>(); public UsbNotificationManager(
diff --git a/chrome/browser/usb/android/junit/src/org/chromium/chrome/browser/usb/UsbNotificationManagerTest.java b/chrome/browser/usb/android/junit/src/org/chromium/chrome/browser/usb/UsbNotificationManagerTest.java index d4a6b2d..bc92e78 100644 --- a/chrome/browser/usb/android/junit/src/org/chromium/chrome/browser/usb/UsbNotificationManagerTest.java +++ b/chrome/browser/usb/android/junit/src/org/chromium/chrome/browser/usb/UsbNotificationManagerTest.java
@@ -37,7 +37,7 @@ UrlFormatter.formatUrlForSecurityDisplay(TEST_URL, SchemeDisplay.OMIT_HTTP_AND_HTTPS); private MockNotificationManagerProxy mMockNotificationManager; - private UsbNotificationManagerDelegate mDelegate = + private final UsbNotificationManagerDelegate mDelegate = new UsbNotificationManagerDelegate() { @Override public Intent createTrustedBringTabToFrontIntent(int tabId) {
diff --git a/chrome/browser/user_education/java/src/org/chromium/chrome/browser/user_education/IphCommand.java b/chrome/browser/user_education/java/src/org/chromium/chrome/browser/user_education/IphCommand.java index bbac6d6..12bb604 100644 --- a/chrome/browser/user_education/java/src/org/chromium/chrome/browser/user_education/IphCommand.java +++ b/chrome/browser/user_education/java/src/org/chromium/chrome/browser/user_education/IphCommand.java
@@ -17,7 +17,7 @@ /** Class encapsulating the data needed to show in-product help (IPH). */ @NullMarked public class IphCommand { - private Resources mResources; + private final Resources mResources; public final String featureName; public final int stringId; public Object @Nullable [] stringArgs;
diff --git a/chrome/browser/user_education/java/src/org/chromium/chrome/browser/user_education/IphCommandBuilder.java b/chrome/browser/user_education/java/src/org/chromium/chrome/browser/user_education/IphCommandBuilder.java index 9132754..7237f46 100644 --- a/chrome/browser/user_education/java/src/org/chromium/chrome/browser/user_education/IphCommandBuilder.java +++ b/chrome/browser/user_education/java/src/org/chromium/chrome/browser/user_education/IphCommandBuilder.java
@@ -25,7 +25,7 @@ private @Nullable String mContentString; private @Nullable String mAccessibilityText; - private Resources mResources; + private final Resources mResources; private final String mFeatureName; private boolean mDismissOnTouch = true; private long mDismissOnTouchTimeout = TextBubble.NO_TIMEOUT;
diff --git a/chrome/browser/util/android/java/src/org/chromium/chrome/browser/util/ChromeFileProvider.java b/chrome/browser/util/android/java/src/org/chromium/chrome/browser/util/ChromeFileProvider.java index 41966d2..0596af4 100644 --- a/chrome/browser/util/android/java/src/org/chromium/chrome/browser/util/ChromeFileProvider.java +++ b/chrome/browser/util/android/java/src/org/chromium/chrome/browser/util/ChromeFileProvider.java
@@ -37,7 +37,7 @@ private static final String BLOCKED_FILE_PREFIX = "BlockedFile_"; // All these static objects must be accesseed in a synchronized block: - private static Object sLock = new Object(); + private static final Object sLock = new Object(); private static boolean sIsFileReady; private static @Nullable Uri sCurrentBlockingUri; private static @Nullable Uri sFileUri;
diff --git a/chrome/browser/webid/android/java/src/org/chromium/chrome/browser/webid/DigitalCredentialsPresentationDelegate.java b/chrome/browser/webid/android/java/src/org/chromium/chrome/browser/webid/DigitalCredentialsPresentationDelegate.java index 719243c..0110ee9 100644 --- a/chrome/browser/webid/android/java/src/org/chromium/chrome/browser/webid/DigitalCredentialsPresentationDelegate.java +++ b/chrome/browser/webid/android/java/src/org/chromium/chrome/browser/webid/DigitalCredentialsPresentationDelegate.java
@@ -16,8 +16,10 @@ import android.os.Looper; import android.os.ResultReceiver; +import androidx.annotation.OptIn; import androidx.annotation.RequiresApi; import androidx.annotation.VisibleForTesting; +import androidx.credentials.GetDigitalCredentialOption; import com.google.android.gms.identitycredentials.CredentialOption; import com.google.android.gms.identitycredentials.GetCredentialException; @@ -66,6 +68,7 @@ public static final String EXTRA_CREDENTIAL_DATA = "androidx.credentials.provider.extra.EXTRA_CREDENTIAL_DATA"; + @OptIn(markerClass = androidx.credentials.ExperimentalDigitalCredentialApi.class) public Promise<DigitalCredential> get(Activity window, String origin, String request) { final IdentityCredentialClient client; try { @@ -104,13 +107,14 @@ } }; + GetDigitalCredentialOption option = new GetDigitalCredentialOption(request); client.getCredential( new GetCredentialRequest( Arrays.asList( new CredentialOption( - "com.credman.IdentityCredential", - new Bundle(), - new Bundle(), + option.getType(), + option.getRequestData(), + option.getCandidateQueryData(), request, "", "")),
diff --git a/chrome/browser/xsurface_provider/android/java/src/org/chromium/chrome/browser/xsurface_provider/ProcessScopeDependencyProviderImplTest.java b/chrome/browser/xsurface_provider/android/java/src/org/chromium/chrome/browser/xsurface_provider/ProcessScopeDependencyProviderImplTest.java index 9d9fee5..19101726 100644 --- a/chrome/browser/xsurface_provider/android/java/src/org/chromium/chrome/browser/xsurface_provider/ProcessScopeDependencyProviderImplTest.java +++ b/chrome/browser/xsurface_provider/android/java/src/org/chromium/chrome/browser/xsurface_provider/ProcessScopeDependencyProviderImplTest.java
@@ -25,7 +25,7 @@ ProcessScopeDependencyProviderImpl mProvider; boolean mMetricsReportingEnabled; - private PrivacyPreferencesManager mStubPrivacyPrefsManager = + private final PrivacyPreferencesManager mStubPrivacyPrefsManager = new PrivacyPreferencesManager() { @Override public boolean isMetricsReportingEnabled() {
diff --git a/chrome/build/android-arm32.pgo.txt b/chrome/build/android-arm32.pgo.txt index f8b0bb21..f5df6dd 100644 --- a/chrome/build/android-arm32.pgo.txt +++ b/chrome/build/android-arm32.pgo.txt
@@ -1 +1 @@ -chrome-android32-main-1746770214-85e3ff20dbe5fbc1fbdcc2f27c5216f1cc36173a-138306eae26b21ffa7139d2f39324827708eee3e.profdata +chrome-android32-main-1746813443-861fd45026df9940ca2609c2cd6eef7ab45dc762-4cac03e32f70f02cbf11d96b5da54e629616b531.profdata
diff --git a/chrome/build/android-arm64.pgo.txt b/chrome/build/android-arm64.pgo.txt index d612fb54..5ad0293 100644 --- a/chrome/build/android-arm64.pgo.txt +++ b/chrome/build/android-arm64.pgo.txt
@@ -1 +1 @@ -chrome-android64-main-1746803104-37944fb84c735c147673767db917bdcd86392021-bd07c116d751ed6557dd1e55f6aa8b0bd4e2fa5a.profdata +chrome-android64-main-1746811595-150b94fdbfd212c2b14f2e8e65a20de7e3e095cd-7fe9a0e968b77a4cd55eecccb9e306b6cf4cce03.profdata
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt index 6d705c4..2ca63eb 100644 --- a/chrome/build/linux.pgo.txt +++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@ -chrome-linux-main-1746791612-916c2539ced7e5dcd9cee6b156101003eadc38d6-4852d4ffeefa31265675175f00edcf84c5e30ecd.profdata +chrome-linux-main-1746813443-bd2bc40ff4ac2cf081e86bacffa605f70c6389f5-4cac03e32f70f02cbf11d96b5da54e629616b531.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt index 5f5a04f3..d92efeec 100644 --- a/chrome/build/mac-arm.pgo.txt +++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@ -chrome-mac-arm-main-1746806395-c902c3f70d0261dbd661234389ff93302a6d22ce-708b418891b191dfc63758b7cc95308d56e1a80a.profdata +chrome-mac-arm-main-1746820698-d8dfff23f0e482dea11e74b214574a058d174d1b-b1f57359eeafa0a25b962e9e274fde4973a17d5e.profdata
diff --git a/chrome/build/win-arm64.pgo.txt b/chrome/build/win-arm64.pgo.txt index 984fa97..f7214d584 100644 --- a/chrome/build/win-arm64.pgo.txt +++ b/chrome/build/win-arm64.pgo.txt
@@ -1 +1 @@ -chrome-win-arm64-main-1746791612-bb69157dd5df12f835e6bc703c2b1fd59abc53eb-4852d4ffeefa31265675175f00edcf84c5e30ecd.profdata +chrome-win-arm64-main-1746813443-6d765e1c4190ba1c54e170988acb74137dc5dc28-4cac03e32f70f02cbf11d96b5da54e629616b531.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index 21d9c68..ffec439e 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-main-1746770214-c605571c18f3b65661db90c2534553db366e79e8-138306eae26b21ffa7139d2f39324827708eee3e.profdata +chrome-win64-main-1746791612-8dda5f0a63e87ebb38f287e78a6ee776d8bb236b-4852d4ffeefa31265675175f00edcf84c5e30ecd.profdata
diff --git a/chrome/common/BUILD.gn b/chrome/common/BUILD.gn index 2ad76b4..d45e0f4 100644 --- a/chrome/common/BUILD.gn +++ b/chrome/common/BUILD.gn
@@ -127,7 +127,6 @@ "//chrome/common/win:eventlog_messages", ] sources = [ - "actor/actor_logging.h", "all_messages.h", "chrome_content_client.cc", "chrome_content_client.h", @@ -443,6 +442,14 @@ if (enable_bound_session_credentials) { sources += [ "bound_session_request_throttled_handler.h" ] } + + if (enable_glic) { + sources += [ + "actor/action_result.cc", + "actor/action_result.h", + "actor/actor_logging.h", + ] + } } process_version("version_header") {
diff --git a/chrome/common/actor.mojom b/chrome/common/actor.mojom index 539e701a..074f7578 100644 --- a/chrome/common/actor.mojom +++ b/chrome/common/actor.mojom
@@ -120,7 +120,92 @@ TypeAction type; }; +// Result codes for outcomes of an action. +// kOk - Action was successful. +// 10-99 - An error occurred that is not specific to the tool. +// X00-X99 - A tool-specific error; each tool gets a reserved range of values. +// +// These codes will be used in UMA histograms and in +// optimization_guide.proto.BrowserActionResult. New Codes may be added to +// unused values, but existing codes should not be removed, reordered, or +// renumbered. +enum ActionResultCode { + kOk = 0, + + // A generic error that does not have a more specific code. Avoid using this. + kError = 10, + + // Actions are not allowed on the current URL. + kUrlBlocked = 11, + + // The task requires opening a new tab, and we were unable to do so. + kNewTabCreationFailed = 12, + + // The tab we were trying to act on no longer exists. + kTabWentAway = 13, + + // The task for the action no longer exists. + kTaskWentAway = 14, + + // The tab we were trying to act on performed a cross-origin navigation and is + // no longer able to be acted upon. + kCrossOriginNavigation = 15, + + // An unknown tool was requested. + kToolUnknown = 16, + + /////////////////////////////////////////////////////////////////////// + // Codes 100-199: Errors for navigation. (Not part of the ToolAction union.) + + // The requested URL was not valid. + kNavigateInvalidUrl = 100, + + /////////////////////////////////////////////////////////////////////// + // Codes 200-299: Errors for ClickAction. + + // Arguments passed to the click tool were invalid. + kClickInvalidArguments = 200, + + // The DOM node targeted for the click is invalid. + kClickInvalidDomNodeId = 201, + + // The form element targeted for the click is disabled. + kClickElementDisabled = 202, + + // The element targeted for the click is offscreen. + kClickElementOffscreen = 203, + + // The frame targeted for the click is invalid. + kClickInvalidFrame = 204, + + // The click point for the element was not valid. + kClickInvalidPoint = 205, + + // The click event was suppressed. + kClickSuppressed = 206, + + /////////////////////////////////////////////////////////////////////// + // Codes 500-599: Errors for ScrollAction. + + // Arguments passed to the scroll tool were invalid. + kScrollInvalidArguments = 500, + + /////////////////////////////////////////////////////////////////////// + // Codes 700-799: Errors for TypeAction. + + // Arguments passed to the type tool were invalid. + kTypeInvalidArguments = 700, +}; + // All information required to invoke a tool in the renderer. struct ToolInvocation { ToolAction action; }; + +struct ActionResult { + // A code with the outcome of the tool invocation. + ActionResultCode code; + + // If the code is not kOk, an English language message describing the error. + string message; +};
diff --git a/chrome/common/actor/action_result.cc b/chrome/common/actor/action_result.cc new file mode 100644 index 0000000..a720473 --- /dev/null +++ b/chrome/common/actor/action_result.cc
@@ -0,0 +1,43 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "chrome/common/actor/action_result.h" + +#include "base/strings/strcat.h" +#include "base/strings/to_string.h" +#include "base/types/cxx23_to_underlying.h" + +namespace actor { + +bool IsOk(const mojom::ActionResult& result) { + return result.code == mojom::ActionResultCode::kOk; +} + +mojom::ActionResultPtr MakeOkResult() { + return MakeResult(mojom::ActionResultCode::kOk); +} + +mojom::ActionResultPtr MakeErrorResult() { + return MakeResult(mojom::ActionResultCode::kError); +} + +mojom::ActionResultPtr MakeResult(mojom::ActionResultCode code, + std::string_view msg) { + return mojom::ActionResult::New(code, std::string(msg)); +} + +std::string ToDebugString(const mojom::ActionResult& result) { + // NOTE: A future improvement is to map codes back to strings. + auto code_value = base::to_underlying(result.code); + if (IsOk(result)) { + return "ActionResult[OK]"; + } else if (result.message.empty()) { + return base::StrCat({"ActionResult[", base::ToString(code_value), "]"}); + } else { + return base::StrCat({"ActionResult[", base::ToString(code_value), ": \"", + result.message, "\"]"}); + } +} + +} // namespace actor
diff --git a/chrome/common/actor/action_result.h b/chrome/common/actor/action_result.h new file mode 100644 index 0000000..b9482e6 --- /dev/null +++ b/chrome/common/actor/action_result.h
@@ -0,0 +1,30 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CHROME_COMMON_ACTOR_ACTION_RESULT_H_ +#define CHROME_COMMON_ACTOR_ACTION_RESULT_H_ + +#include <string> +#include <string_view> + +#include "chrome/common/actor.mojom.h" + +namespace actor { + +bool IsOk(const mojom::ActionResult& result); + +mojom::ActionResultPtr MakeOkResult(); + +// TODO(crbug.com/409558980): Replace generic errors with tool-specific ones, +// and remove this function. +mojom::ActionResultPtr MakeErrorResult(); + +mojom::ActionResultPtr MakeResult(mojom::ActionResultCode code, + std::string_view msg = std::string_view()); + +std::string ToDebugString(const mojom::ActionResult& result); + +} // namespace actor + +#endif // CHROME_COMMON_ACTOR_ACTION_RESULT_H_
diff --git a/chrome/common/chrome_features.cc b/chrome/common/chrome_features.cc index 8dde0f01..7a6daf31 100644 --- a/chrome/common/chrome_features.cc +++ b/chrome/common/chrome_features.cc
@@ -514,9 +514,7 @@ BASE_FEATURE(kGlicTieredRollout, "GlicTieredRollout", - base::FEATURE_DISABLED_BY_DEFAULT); -const base::FeatureParam<std::string> kGlicTieredRolloutAllowedGroup{ - &kGlicTieredRollout, "glic-tiered-rollout-allowed-group", ""}; + base::FEATURE_ENABLED_BY_DEFAULT); BASE_FEATURE(kGlicRollout, "GlicRollout", base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/chrome/common/chrome_features.h b/chrome/common/chrome_features.h index 6a635fc..4d40d861 100644 --- a/chrome/common/chrome_features.h +++ b/chrome/common/chrome_features.h
@@ -296,8 +296,6 @@ COMPONENT_EXPORT(CHROME_FEATURES) BASE_DECLARE_FEATURE(kGlicWarmMultiple); COMPONENT_EXPORT(CHROME_FEATURES) BASE_DECLARE_FEATURE(kGlicTieredRollout); -COMPONENT_EXPORT(CHROME_FEATURES) -extern const base::FeatureParam<std::string> kGlicTieredRolloutAllowedGroup; COMPONENT_EXPORT(CHROME_FEATURES) BASE_DECLARE_FEATURE(kGlicRollout);
diff --git a/chrome/common/chrome_render_frame.mojom b/chrome/common/chrome_render_frame.mojom index 7d3e46d..ed89e0e 100644 --- a/chrome/common/chrome_render_frame.mojom +++ b/chrome/common/chrome_render_frame.mojom
@@ -104,5 +104,6 @@ // Requests invoking of a tool from the actor automation framework. See // chrome/browser/actor [EnableIf=enable_glic] - InvokeTool(actor.mojom.ToolInvocation request) => (bool success); + InvokeTool(actor.mojom.ToolInvocation request) => + (actor.mojom.ActionResult result); };
diff --git a/chrome/common/controlled_frame/api/controlled_frame_internal.json b/chrome/common/controlled_frame/api/controlled_frame_internal.json index 538dd35c6..7d7017d 100644 --- a/chrome/common/controlled_frame/api/controlled_frame_internal.json +++ b/chrome/common/controlled_frame/api/controlled_frame_internal.json
@@ -113,6 +113,91 @@ } }, { + "name": "contextMenusUpdate", + "type": "function", + "description": "Updates a previously created context menu item.", + "parameters": [ + { + "type": "integer", + "name": "instanceId", + "nodoc": true + }, + { + "choices": [ + { "type": "integer" }, + { "type": "string" } + ], + "name": "id", + "description": "The ID of the item to update." + }, + { "type": "object", + "name": "updateProperties", + "description": "The properties to update. Accepts the same values as the create function.", + "properties": { + "type": { + "$ref": "contextMenus.ItemType", + "optional": true + }, + "title": { + "type": "string", + "optional": true + }, + "checked": { + "type": "boolean", + "optional": true + }, + "contexts": { + "type": "array", + "items": { + // |launcher| isn't actually supported, this is listed here so that we can build |contexts| using the same code from chrome.contextMenus API. + "$ref": "contextMenus.ContextType" + }, + "minItems": 1, + "optional": true, + "description": "List of contexts this menu item will appear in. Defaults to ['page'] if not specified." + }, + "visible": { + "type": "boolean", + "optional": true, + "description": "Whether the item is visible in the menu." + }, + "onclick": { + "type": "function", + "optional": true + }, + "parentId": { + "choices": [ + { "type": "integer" }, + { "type": "string" } + ], + "optional": true, + "description": "Note: You cannot change an item to be a child of one of its own descendants." + }, + "documentUrlPatterns": { + "type": "array", + "items": {"type": "string"}, + "optional": true + }, + "targetUrlPatterns": { + "type": "array", + "items": {"type": "string"}, + "optional": true + }, + "enabled": { + "type": "boolean", + "optional": true + } + } + } + ], + "returns_async": { + "name": "callback", + "optional": true, + "parameters": [], + "description": "Called when the context menu has been updated." + } + }, + { "name": "setClientHintsEnabled", "type": "function", "parameters": [
diff --git a/chrome/common/extensions/api/enterprise_reporting_private.idl b/chrome/common/extensions/api/enterprise_reporting_private.idl index 2ea2c52..6d580d2 100644 --- a/chrome/common/extensions/api/enterprise_reporting_private.idl +++ b/chrome/common/extensions/api/enterprise_reporting_private.idl
@@ -80,7 +80,6 @@ boolean builtInDnsClientEnabled; PasswordProtectionTrigger passwordProtectionWarningTrigger; boolean chromeRemoteDesktopAppBlocked; - boolean? thirdPartyBlockingEnabled; SettingValue osFirewall; DOMString[] systemDnsServers; DOMString? enterpriseProfileId;
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h index 3682d550..e027833 100644 --- a/chrome/common/pref_names.h +++ b/chrome/common/pref_names.h
@@ -450,8 +450,7 @@ inline constexpr char kPreinstalledAppsInstallState[] = "default_apps_install_state"; -#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) || \ - BUILDFLAG(IS_LINUX) +#if BUILDFLAG(ENABLE_EXTENSIONS_CORE) // A list of extensions ids that have to be allowed to run in Incognito by the // user in order to use Incognito mode. inline constexpr char kMandatoryExtensionsForIncognitoNavigation[] =
diff --git a/chrome/renderer/accessibility/read_anything/read_anything_app_model.cc b/chrome/renderer/accessibility/read_anything/read_anything_app_model.cc index bc48b3b..4f2b680 100644 --- a/chrome/renderer/accessibility/read_anything/read_anything_app_model.cc +++ b/chrome/renderer/accessibility/read_anything/read_anything_app_model.cc
@@ -468,10 +468,7 @@ void ReadAnythingAppModel::AddPendingUpdates(const ui::AXTreeID& tree_id, Updates& updates) { - Updates& update = pending_updates_[tree_id]; - for (auto& item : updates) { - update.emplace_back(std::move(item)); - } + pending_updates_[tree_id].emplace_back(std::move(updates)); } void ReadAnythingAppModel::ClearPendingUpdates() { @@ -486,9 +483,13 @@ // TODO(crbug.com/40802192): Ensure there are no crashes/unexpected behavior // if an accessibility event is received on the same tree after // unserialization has begun. - Updates update = pending_updates_.extract(tree_id).mapped(); - DCHECK(update.empty() || tree_id == active_tree_id_); - UnserializeUpdates(update, tree_id); + std::vector<Updates> updates = pending_updates_.extract(tree_id).mapped(); + for (Updates update : updates) { + // Unserialize the updates in batches in the groupings in which they were + // received by AccessibilityEventReceived. + DCHECK(update.empty() || tree_id == active_tree_id_); + UnserializeUpdates(update, tree_id); + } } void ReadAnythingAppModel::UnserializeUpdates(Updates& updates, @@ -504,21 +505,12 @@ static_cast<ui::AXSerializableTree*>(it->second->manager->ax_tree()); CHECK(tree); - // Try to merge updates. If the updates are mergeable, MergeAXTreeUpdates will - // return true and merge_updates_out will contain the updates. Otherwise, if - // the updates are not mergeable, merge_updates_out will be empty. - const Updates* merged_updates = &updates; - Updates merge_updates_out; - if (ui::MergeAXTreeUpdates(updates, &merge_updates_out)) { - merged_updates = &merge_updates_out; - } - // Build an event generator prior to any unserializations. ui::AXEventGenerator event_generator(tree); // Unserialize the updates. const size_t prev_tree_size = tree->size(); - for (const ui::AXTreeUpdate& update : *merged_updates) { + for (const ui::AXTreeUpdate& update : updates) { tree->Unserialize(update); }
diff --git a/chrome/renderer/accessibility/read_anything/read_anything_app_model.h b/chrome/renderer/accessibility/read_anything/read_anything_app_model.h index 43d6764..4da0de8 100644 --- a/chrome/renderer/accessibility/read_anything/read_anything_app_model.h +++ b/chrome/renderer/accessibility/read_anything/read_anything_app_model.h
@@ -90,8 +90,17 @@ // is added. }; + // Represents a grouping of AXTreeUpdates received in the same accessibility + // event. using Updates = std::vector<ui::AXTreeUpdate>; - using PendingUpdates = std::map<ui::AXTreeID, Updates>; + + // Updates need to be grouped by the order in which they were received, + // rather than just a single vector containing all updates from multiple + // accessibility events. This is so that Unserialize can be called in + // batches on the group of Updates received from each call to + // AccessibilityEventReceived. Otherwise, intermediary updates might + // cause tree inconsistency issues with the final update. + using PendingUpdates = std::map<ui::AXTreeID, std::vector<Updates>>; static constexpr char kEmptyStateHistogramName[] = "Accessibility.ReadAnything.EmptyState";
diff --git a/chrome/renderer/accessibility/read_anything/read_anything_app_model_browsertest.cc b/chrome/renderer/accessibility/read_anything/read_anything_app_model_browsertest.cc index 3b0b0f5..c615e36 100644 --- a/chrome/renderer/accessibility/read_anything/read_anything_app_model_browsertest.cc +++ b/chrome/renderer/accessibility/read_anything/read_anything_app_model_browsertest.cc
@@ -16,6 +16,7 @@ #include "base/test/scoped_feature_list.h" #include "base/threading/platform_thread.h" #include "chrome/test/base/chrome_render_view_test.h" +#include "read_anything_app_model.h" #include "read_anything_test_utils.h" #include "services/strings/grit/services_strings.h" #include "testing/gmock/include/gmock/gmock.h" @@ -86,9 +87,11 @@ bool AreAllPendingUpdatesEmpty() const { return std::ranges::all_of( - model().pending_updates_for_testing(), - &ReadAnythingAppModel::Updates::empty, - &ReadAnythingAppModel::PendingUpdates::value_type::second); + model().pending_updates_for_testing(), [](const auto& pair) { + const auto& updateList = pair.second; + return std::ranges::all_of(updateList, + &ReadAnythingAppModel::Updates::empty); + }); } void AccessibilityEventReceived(const ReadAnythingAppModel::Updates& updates, @@ -580,8 +583,16 @@ ASSERT_TRUE(AreAllPendingUpdatesEmpty()); model().set_distillation_in_progress(true); AccessibilityEventReceived(std::move(updates)); - EXPECT_EQ(num_pending_updates, - model().pending_updates_for_testing().at(tree_id_).size()); + + size_t actual_pending_updates = 0; + std::vector<ReadAnythingAppModel::Updates> pending_updates_for_testing = + model().pending_updates_for_testing().at(tree_id_); + // Get the sum of the size of all the updates in the list. + for (ReadAnythingAppModel::Updates& pending_update : + pending_updates_for_testing) { + actual_pending_updates += pending_update.size(); + } + EXPECT_EQ(num_pending_updates, actual_pending_updates); // Switch to a new active tree. Should not crash. model().SetActiveTreeId(ui::AXTreeIDUnknown());
diff --git a/chrome/renderer/accessibility/read_anything/read_anything_node_utils.cc b/chrome/renderer/accessibility/read_anything/read_anything_node_utils.cc index 396de915..08372652 100644 --- a/chrome/renderer/accessibility/read_anything/read_anything_node_utils.cc +++ b/chrome/renderer/accessibility/read_anything/read_anything_node_utils.cc
@@ -7,7 +7,6 @@ #include <cinttypes> #include "base/strings/stringprintf.h" -#include "services/strings/grit/services_strings.h" #include "ui/accessibility/ax_enum_util.h" #include "ui/accessibility/ax_role_properties.h" #include "ui/base/l10n/l10n_util.h"
diff --git a/chrome/renderer/accessibility/read_anything/read_anything_node_utils.h b/chrome/renderer/accessibility/read_anything/read_anything_node_utils.h index 16ecb4a..12a918c 100644 --- a/chrome/renderer/accessibility/read_anything/read_anything_node_utils.h +++ b/chrome/renderer/accessibility/read_anything/read_anything_node_utils.h
@@ -5,6 +5,7 @@ #ifndef CHROME_RENDERER_ACCESSIBILITY_READ_ANYTHING_READ_ANYTHING_NODE_UTILS_H_ #define CHROME_RENDERER_ACCESSIBILITY_READ_ANYTHING_READ_ANYTHING_NODE_UTILS_H_ +#include "services/strings/grit/services_strings.h" #include "ui/accessibility/ax_node.h" // Utilities for getting html or text info about ax nodes. These are used by
diff --git a/chrome/renderer/accessibility/read_anything/read_anything_node_utils_unittest.cc b/chrome/renderer/accessibility/read_anything/read_anything_node_utils_unittest.cc index 23138afd..2a2ee1b 100644 --- a/chrome/renderer/accessibility/read_anything/read_anything_node_utils_unittest.cc +++ b/chrome/renderer/accessibility/read_anything/read_anything_node_utils_unittest.cc
@@ -4,6 +4,7 @@ #include "chrome/renderer/accessibility/read_anything/read_anything_node_utils.h" +#include <cinttypes> #include <string> #include "read_anything_test_utils.h" @@ -13,6 +14,7 @@ #include "ui/accessibility/ax_node_data.h" #include "ui/accessibility/ax_node_position.h" #include "ui/accessibility/ax_tree.h" +#include "ui/base/l10n/l10n_util.h" class ReadAnythingNodeUtilsTest : public testing::Test { protected: @@ -269,3 +271,114 @@ node.SetData(std::move(data)); EXPECT_EQ(a11y::GetHtmlTag(&node, false, false), "img"); } + +TEST_F(ReadAnythingNodeUtilsTest, GetHtmlTagForPdf_EmptyTagReturnsSpan) { + ui::AXNodeData data; + data.id = 2; + ui::AXTree tree; + ui::AXNode node(&tree, nullptr, 2, 0); + node.SetData(std::move(data)); + EXPECT_EQ(a11y::GetHtmlTagForPDF(&node, ""), "span"); +} + +TEST_F(ReadAnythingNodeUtilsTest, GetHtmlTagForPdf_SpanTagReturned) { + ui::AXNodeData data = test::TextNode(2); + data.role = ax::mojom::Role::kEmbeddedObject; + + ui::AXTree tree; + ui::AXNode node(&tree, nullptr, 2, 0); + node.SetData(std::move(data)); + EXPECT_EQ(a11y::GetHtmlTagForPDF(&node, "p"), "span"); + + data.role = ax::mojom::Role::kRegion; + node.SetData(std::move(data)); + EXPECT_EQ(a11y::GetHtmlTagForPDF(&node, "p"), "span"); + + data.role = ax::mojom::Role::kPdfRoot; + node.SetData(std::move(data)); + EXPECT_EQ(a11y::GetHtmlTagForPDF(&node, "p"), "span"); + + data.role = ax::mojom::Role::kRootWebArea; + node.SetData(std::move(data)); + EXPECT_EQ(a11y::GetHtmlTagForPDF(&node, "p"), "span"); +} + +TEST_F(ReadAnythingNodeUtilsTest, + GetHtmlTagForPdf_ParagraphRoleReturnsParagraphTag) { + ui::AXNodeData data = test::TextNode(2); + data.role = ax::mojom::Role::kParagraph; + + ui::AXTree tree; + ui::AXNode node(&tree, nullptr, 2, 0); + node.SetData(std::move(data)); + EXPECT_EQ(a11y::GetHtmlTagForPDF(&node, "span"), "p"); +} + +TEST_F(ReadAnythingNodeUtilsTest, GetHtmlTagForPdf_StaticTextReturnsEmptyTag) { + ui::AXNodeData data = test::TextNode(2); + data.role = ax::mojom::Role::kStaticText; + + ui::AXTree tree; + ui::AXNode node(&tree, nullptr, 2, 0); + node.SetData(std::move(data)); + EXPECT_EQ(a11y::GetHtmlTagForPDF(&node, "span"), ""); +} + +TEST_F(ReadAnythingNodeUtilsTest, GetHtmlTagForPdf_ContentInfoReturnsBr) { + const std::u16string ending_text = + l10n_util::GetStringUTF16(IDS_PDF_OCR_RESULT_END); + ui::AXNodeData data = test::TextNode(2, ending_text); + data.role = ax::mojom::Role::kContentInfo; + + ui::AXTree tree; + ui::AXNode node(&tree, nullptr, 2, 0); + node.SetData(std::move(data)); + EXPECT_EQ(a11y::GetHtmlTagForPDF(&node, "span"), "br"); +} + +TEST_F(ReadAnythingNodeUtilsTest, GetHtmlTagForPdf_UsesDefaultHtmlTag) { + ui::AXTree tree; + ui::AXNode node(&tree, nullptr, 2, 0); + EXPECT_EQ(a11y::GetHtmlTagForPDF(&node, "span"), "span"); + EXPECT_EQ(a11y::GetHtmlTagForPDF(&node, "p"), "p"); + EXPECT_EQ(a11y::GetHtmlTagForPDF(&node, "br"), "br"); +} + +TEST_F(ReadAnythingNodeUtilsTest, GetHtmlTagForPdf_LongTextTreatedAsParagraph) { + std::u16string long_text = + u"I have waited five years and today is the day- I have spared no " + u"expense, all that stands in my way is a tiny little cottage with a " + u"tiny little table filld with tiny finger sandwiches... I am not okay."; + ui::AXNodeData data = test::TextNode(2, long_text); + data.role = ax::mojom::Role::kHeading; + + ui::AXTree tree; + ui::AXNode node(&tree, nullptr, 2, 0); + node.SetData(std::move(data)); + EXPECT_EQ(a11y::GetHtmlTagForPDF(&node, "span"), "p"); +} + +TEST_F(ReadAnythingNodeUtilsTest, + GetHeadingHtmlTagForPdf_LongTextTreatedAsParagraph) { + std::u16string long_text = + u"I have waited five years and today is the day- I have spared no " + u"expense, all that stands in my way is a tiny little cottage with a " + u"tiny little table filld with tiny finger sandwiches... I am not okay."; + ui::AXNodeData data = test::TextNode(2, long_text); + + ui::AXTree tree; + ui::AXNode node(&tree, nullptr, 2, 0); + node.SetData(std::move(data)); + EXPECT_EQ(a11y::GetHeadingHtmlTagForPDF(&node, "span"), "p"); +} + +TEST_F(ReadAnythingNodeUtilsTest, GetAltText) { + std::string alt_text = "this is some alt text"; + ui::AXNodeData data = test::TextNode(2); + data.AddStringAttribute(ax::mojom::StringAttribute::kName, alt_text); + + ui::AXTree tree; + ui::AXNode node(&tree, nullptr, 2, 0); + node.SetData(std::move(data)); + EXPECT_EQ(a11y::GetAltText(&node), alt_text); +}
diff --git a/chrome/renderer/actor/click_tool.cc b/chrome/renderer/actor/click_tool.cc index d746fe4..e84c563 100644 --- a/chrome/renderer/actor/click_tool.cc +++ b/chrome/renderer/actor/click_tool.cc
@@ -9,6 +9,7 @@ #include "base/strings/to_string.h" #include "base/time/time.h" +#include "chrome/common/actor/action_result.h" #include "chrome/common/actor/actor_logging.h" #include "chrome/renderer/actor/tool_utils.h" #include "content/public/renderer/render_frame.h" @@ -86,7 +87,8 @@ void ClickTool::Execute(ToolFinishedCallback callback) { std::optional<gfx::PointF> click_point = ValidateAndGetClickPoint(); if (!click_point) { - std::move(callback).Run(false); + std::move(callback).Run( + MakeResult(mojom::ActionResultCode::kClickInvalidPoint)); return; } @@ -100,7 +102,8 @@ WebCoalescedInputEvent(mouse_down, ui::LatencyInfo())); if (result == WebInputEventResult::kHandledSuppressed) { - std::move(callback).Run(false); + std::move(callback).Run( + MakeResult(mojom::ActionResultCode::kClickSuppressed)); return; } @@ -114,11 +117,12 @@ WebCoalescedInputEvent(std::move(mouse_up), ui::LatencyInfo())); if (result == WebInputEventResult::kHandledSuppressed) { - std::move(callback).Run(false); + std::move(callback).Run( + MakeResult(mojom::ActionResultCode::kClickSuppressed)); return; } - std::move(callback).Run(true); + std::move(callback).Run(MakeOkResult()); } std::string ClickTool::DebugString() const {
diff --git a/chrome/renderer/actor/drag_and_release_tool.cc b/chrome/renderer/actor/drag_and_release_tool.cc index 0495746d..6329469 100644 --- a/chrome/renderer/actor/drag_and_release_tool.cc +++ b/chrome/renderer/actor/drag_and_release_tool.cc
@@ -5,6 +5,7 @@ #include "chrome/renderer/actor/drag_and_release_tool.h" #include "base/time/time.h" +#include "chrome/common/actor/action_result.h" #include "chrome/common/actor/actor_logging.h" #include "chrome/renderer/actor/tool_utils.h" #include "content/public/renderer/render_frame.h" @@ -38,7 +39,7 @@ WebLocalFrame* web_frame = frame_->GetWebFrame(); if (!web_frame || !web_frame->FrameWidget()) { ACTOR_LOG() << "RenderFrame or FrameWidget is invalid."; - std::move(callback).Run(false); + std::move(callback).Run(MakeErrorResult()); return; } @@ -48,7 +49,7 @@ if (from_target->is_dom_node_id() || to_target->is_dom_node_id()) { NOTIMPLEMENTED() << "DragAndRelease currently supports only coordinate targets."; - std::move(callback).Run(false); + std::move(callback).Run(MakeErrorResult()); return; } @@ -58,7 +59,7 @@ if (!IsPointWithinViewport(from_point, frame_.get()) || !IsPointWithinViewport(to_point, frame_.get())) { ACTOR_LOG() << "Target point is outside of viewport"; - std::move(callback).Run(false); + std::move(callback).Run(MakeErrorResult()); return; } @@ -67,30 +68,30 @@ // Move and press down the mouse on the from_point. if (!InjectMouseEvent(EventType::kMouseMove, from_point, WebMouseEvent::Button::kNoButton)) { - std::move(callback).Run(false); + std::move(callback).Run(MakeErrorResult()); return; } if (!InjectMouseEvent(EventType::kMouseDown, from_point, WebMouseEvent::Button::kLeft)) { - std::move(callback).Run(false); + std::move(callback).Run(MakeErrorResult()); return; } // Move and release the mouse on the to_point. if (!InjectMouseEvent(EventType::kMouseMove, to_point, WebMouseEvent::Button::kLeft)) { - std::move(callback).Run(false); + std::move(callback).Run(MakeErrorResult()); return; } if (!InjectMouseEvent(EventType::kMouseUp, to_point, WebMouseEvent::Button::kLeft)) { - std::move(callback).Run(false); + std::move(callback).Run(MakeErrorResult()); return; } - std::move(callback).Run(true); + std::move(callback).Run(MakeOkResult()); } std::string DragAndReleaseTool::DebugString() const {
diff --git a/chrome/renderer/actor/mouse_move_tool.cc b/chrome/renderer/actor/mouse_move_tool.cc index ec14905..4494292c 100644 --- a/chrome/renderer/actor/mouse_move_tool.cc +++ b/chrome/renderer/actor/mouse_move_tool.cc
@@ -7,6 +7,7 @@ #include <optional> #include "base/time/time.h" +#include "chrome/common/actor/action_result.h" #include "chrome/common/actor/actor_logging.h" #include "chrome/renderer/actor/tool_utils.h" #include "content/public/renderer/render_frame.h" @@ -46,7 +47,7 @@ blink::WebLocalFrame* web_frame = frame_->GetWebFrame(); if (!web_frame || !web_frame->FrameWidget()) { ACTOR_LOG() << "RenderFrame or FrameWidget is invalid."; - std::move(callback).Run(false); + std::move(callback).Run(MakeErrorResult()); return; } @@ -54,7 +55,7 @@ if (target->is_coordinate()) { NOTIMPLEMENTED() << "Coordinate-based target not yet supported."; - std::move(callback).Run(false); + std::move(callback).Run(MakeErrorResult()); return; } @@ -63,7 +64,7 @@ blink::WebNode node = GetNodeFromId(frame_.get(), dom_node_id); if (node.IsNull()) { ACTOR_LOG() << "Cannot find dom node with id " << dom_node_id; - std::move(callback).Run(false); + std::move(callback).Run(MakeErrorResult()); return; } @@ -72,13 +73,13 @@ if (!center_point.has_value()) { ACTOR_LOG() << "Cannot get center interaction point for node id " << dom_node_id; - std::move(callback).Run(false); + std::move(callback).Run(MakeErrorResult()); return; } if (!IsPointWithinViewport(center_point.value(), frame_.get())) { ACTOR_LOG() << "Target is outside viewport"; - std::move(callback).Run(false); + std::move(callback).Run(MakeErrorResult()); return; } @@ -94,10 +95,10 @@ move_result == blink::WebInputEventResult::kHandledSuppressed) { ACTOR_LOG() << "MouseMove event was not handled or suppressed for node id " << dom_node_id; - std::move(callback).Run(false); + std::move(callback).Run(MakeErrorResult()); return; } - std::move(callback).Run(true); + std::move(callback).Run(MakeOkResult()); } std::string MouseMoveTool::DebugString() const {
diff --git a/chrome/renderer/actor/scroll_tool.cc b/chrome/renderer/actor/scroll_tool.cc index fdb1acb..a51df50 100644 --- a/chrome/renderer/actor/scroll_tool.cc +++ b/chrome/renderer/actor/scroll_tool.cc
@@ -9,6 +9,7 @@ #include "base/notimplemented.h" #include "base/strings/to_string.h" #include "base/time/time.h" +#include "chrome/common/actor/action_result.h" #include "chrome/common/actor/actor_logging.h" #include "chrome/renderer/actor/tool_utils.h" #include "content/public/renderer/render_frame.h" @@ -37,14 +38,14 @@ // The scroll distance should always be positive. if (action_->distance <= 0.0) { ACTOR_LOG() << "Invalid scroll distance: " << action_->distance; - std::move(callback).Run(false); + std::move(callback).Run(MakeErrorResult()); return; } WebLocalFrame* web_frame = frame_->GetWebFrame(); if (!web_frame || !web_frame->FrameWidget()) { ACTOR_LOG() << "WebLocalFrame or FrameWidget is null."; - std::move(callback).Run(false); + std::move(callback).Run(MakeErrorResult()); return; } @@ -55,7 +56,7 @@ } else { if (action_->target->is_coordinate()) { NOTIMPLEMENTED() << "Coordinate-based target not yet supported."; - std::move(callback).Run(false); + std::move(callback).Run(MakeErrorResult()); return; } @@ -66,7 +67,7 @@ if (scrolling_element.IsNull()) { ACTOR_LOG() << "Target element not found."; - std::move(callback).Run(false); + std::move(callback).Run(MakeErrorResult()); return; } @@ -95,7 +96,7 @@ ACTOR_LOG() << "Target " << scrolling_element << " is not user scrollable for scroll offset " << offset_physical.ToString(); - std::move(callback).Run(false); + std::move(callback).Run(MakeErrorResult()); return; } @@ -107,7 +108,7 @@ scrolling_element.SetScrollOffset(start_offset_css + offset_css); bool did_scroll = scrolling_element.GetScrollOffset() != start_offset_css; - std::move(callback).Run(did_scroll); + std::move(callback).Run(did_scroll ? MakeOkResult() : MakeErrorResult()); } std::string ScrollTool::DebugString() const {
diff --git a/chrome/renderer/actor/select_tool.cc b/chrome/renderer/actor/select_tool.cc index f304dc8..55febb30 100644 --- a/chrome/renderer/actor/select_tool.cc +++ b/chrome/renderer/actor/select_tool.cc
@@ -8,6 +8,7 @@ #include <optional> #include "base/check.h" +#include "chrome/common/actor/action_result.h" #include "chrome/common/actor/actor_logging.h" #include "chrome/common/url_constants.h" #include "chrome/renderer/actor/tool_utils.h" @@ -35,7 +36,7 @@ void SelectTool::Execute(ToolFinishedCallback callback) { if (!Validate()) { - std::move(callback).Run(false); + std::move(callback).Run(MakeErrorResult()); return; } @@ -46,11 +47,11 @@ // Check if the set value is now the current value in the <select> if (element.Value() != value) { - std::move(callback).Run(false); + std::move(callback).Run(MakeErrorResult()); return; } - std::move(callback).Run(true); + std::move(callback).Run(MakeOkResult()); } std::string SelectTool::DebugString() const {
diff --git a/chrome/renderer/actor/tool_base.h b/chrome/renderer/actor/tool_base.h index d3348b75..2e6fb4d 100644 --- a/chrome/renderer/actor/tool_base.h +++ b/chrome/renderer/actor/tool_base.h
@@ -9,17 +9,16 @@ #include <string> #include "base/functional/callback_forward.h" +#include "chrome/common/actor.mojom-forward.h" namespace actor { class ToolBase { public: - using ToolFinishedCallback = base::OnceCallback<void(bool)>; + using ToolFinishedCallback = base::OnceCallback<void(mojom::ActionResultPtr)>; virtual ~ToolBase() = default; - // Invokes the tool. The callback is invoked with true if the tool use was - // successful, false otherwise. - // TODO(crbug.com/409558980): Return more detail than true/false. - virtual void Execute(ToolFinishedCallback done_cb) = 0; + // Executes the tool. `callback` is invoked with the tool result. + virtual void Execute(ToolFinishedCallback callback) = 0; // Returns a human readable string representing this tool and its parameters. // Used primarily for logging and debugging.
diff --git a/chrome/renderer/actor/tool_executor.cc b/chrome/renderer/actor/tool_executor.cc index ad2a325a..eac8bda 100644 --- a/chrome/renderer/actor/tool_executor.cc +++ b/chrome/renderer/actor/tool_executor.cc
@@ -86,11 +86,11 @@ } void ToolExecutor::ToolFinished(ToolExecutorCallback callback, - bool tool_status) { + mojom::ActionResultPtr result) { CHECK(tool_); // Release current tool so we can accept a new tool invocation. tool_.reset(); - std::move(callback).Run(tool_status); + std::move(callback).Run(std::move(result)); } } // namespace actor
diff --git a/chrome/renderer/actor/tool_executor.h b/chrome/renderer/actor/tool_executor.h index 7c2658fe..4100a70d 100644 --- a/chrome/renderer/actor/tool_executor.h +++ b/chrome/renderer/actor/tool_executor.h
@@ -8,6 +8,7 @@ #include "base/functional/callback_forward.h" #include "base/memory/raw_ref.h" #include "base/memory/stack_allocated.h" +#include "chrome/common/actor.mojom-forward.h" #include "chrome/common/chrome_render_frame.mojom.h" #include "chrome/renderer/actor/tool_base.h" #include "mojo/public/cpp/bindings/pending_receiver.h" @@ -30,7 +31,7 @@ STACK_ALLOCATED(); public: - using ToolExecutorCallback = base::OnceCallback<void(bool)>; + using ToolExecutorCallback = base::OnceCallback<void(mojom::ActionResultPtr)>; explicit ToolExecutor(content::RenderFrame* frame); ~ToolExecutor(); @@ -41,7 +42,8 @@ ToolExecutorCallback callback); private: - void ToolFinished(ToolExecutorCallback callback, bool tool_status); + void ToolFinished(ToolExecutorCallback callback, + mojom::ActionResultPtr result); // Raw ref since the executor is currently only stack allocated by the // render frame so it must be outlived.
diff --git a/chrome/renderer/actor/tool_utils.cc b/chrome/renderer/actor/tool_utils.cc index e8db2aa..c20f03e 100644 --- a/chrome/renderer/actor/tool_utils.cc +++ b/chrome/renderer/actor/tool_utils.cc
@@ -25,14 +25,11 @@ return std::nullopt; } - gfx::Rect rect = element.BoundsInWidget(); + gfx::Rect rect = element.VisibleBoundsInWidget(); if (rect.IsEmpty()) { return std::nullopt; } - // TODO(crbug.com/389739308): This should clip to the viewport so the center - // point stays within the viewport.. - return gfx::PointF(rect.CenterPoint()); }
diff --git a/chrome/renderer/actor/type_tool.cc b/chrome/renderer/actor/type_tool.cc index fa5dd00..9956f77 100644 --- a/chrome/renderer/actor/type_tool.cc +++ b/chrome/renderer/actor/type_tool.cc
@@ -12,6 +12,7 @@ #include "base/strings/to_string.h" #include "base/time/time.h" #include "chrome/common/actor.mojom-shared.h" +#include "chrome/common/actor/action_result.h" #include "chrome/common/actor/actor_logging.h" #include "chrome/renderer/actor/tool_utils.h" #include "content/public/renderer/render_frame.h" @@ -238,7 +239,7 @@ void TypeTool::Execute(ToolFinishedCallback callback) { if (!frame_->GetWebFrame() || !frame_->GetWebFrame()->FrameWidget()) { ACTOR_LOG() << "RenderFrame or FrameWidget is invalid."; - std::move(callback).Run(false); + std::move(callback).Run(MakeErrorResult()); return; } @@ -247,7 +248,7 @@ if (target->is_coordinate()) { NOTIMPLEMENTED() << "Coordinate-based target not yet supported."; - std::move(callback).Run(false); + std::move(callback).Run(MakeErrorResult()); return; } int32_t dom_node_id = target->get_dom_node_id(); @@ -255,7 +256,7 @@ WebNode node = GetNodeFromId(frame_.get(), dom_node_id); if (node.IsNull()) { ACTOR_LOG() << "Cannot find dom node with id " << dom_node_id; - std::move(callback).Run(false); + std::move(callback).Run(MakeErrorResult()); return; } @@ -263,13 +264,13 @@ // TODO(crbug.com/414398425): This seems too restrictive for non-input cases. if (!node.IsElementNode()) { ACTOR_LOG() << "Target node " << node << " is not an element."; - std::move(callback).Run(false); + std::move(callback).Run(MakeErrorResult()); return; } WebElement element = node.To<WebElement>(); if (!element.IsEditable()) { ACTOR_LOG() << "Target element " << element << " is not editable."; - std::move(callback).Run(false); + std::move(callback).Run(MakeErrorResult()); return; } @@ -280,7 +281,7 @@ } else { ACTOR_LOG() << "Target element " << element << " is not focusable for typing."; - std::move(callback).Run(false); + std::move(callback).Run(MakeErrorResult()); return; } } @@ -288,7 +289,7 @@ if (!PrepareTargetForMode(*frame_->GetWebFrame(), action_->mode)) { ACTOR_LOG() << "Failed to prepare target element based on mode: " << action_->mode; - std::move(callback).Run(false); + std::move(callback).Run(MakeErrorResult()); return; } @@ -301,7 +302,7 @@ if (!base::IsStringASCII(action_->text)) { // TODO(crbug.com/409032824): Add support beyond ASCII. ACTOR_LOG() << "Characters beyond ASCII not supported" << action_->text; - std::move(callback).Run(false); + std::move(callback).Run(MakeErrorResult()); return; } @@ -313,7 +314,7 @@ std::optional<KeyParams> params = GetKeyParamsForChar(c); if (!params.has_value()) { ACTOR_LOG() << "Failed to map char to key " << c; - std::move(callback).Run(false); + std::move(callback).Run(MakeErrorResult()); return; } key_sequence.push_back(params.value()); @@ -325,12 +326,12 @@ for (const auto& param : key_sequence) { if (!SimulateKeyPress(param)) { ACTOR_LOG() << "Failed to simulate key press for " << param.dom_key; - std::move(callback).Run(false); + std::move(callback).Run(MakeErrorResult()); return; } } - std::move(callback).Run(true); + std::move(callback).Run(MakeOkResult()); } std::string TypeTool::DebugString() const {
diff --git a/chrome/renderer/resources/controlled_frame/controlled_frame_impl.js b/chrome/renderer/resources/controlled_frame/controlled_frame_impl.js index a855bee4..c3536ad 100644 --- a/chrome/renderer/resources/controlled_frame/controlled_frame_impl.js +++ b/chrome/renderer/resources/controlled_frame/controlled_frame_impl.js
@@ -53,6 +53,13 @@ ControlledFrameInternal.contextMenusCreate, null, args); } +// Controlled Frame has its own internal definition of Context Menus update(). +ControlledFrameContextMenusImpl.prototype.updateImpl = function() { + var args = $Array.concat([this.viewInstanceId_], $Array.slice(arguments)); + return $Function.apply( + ControlledFrameInternal.contextMenusUpdate, null, args); +} + ControlledFrameContextMenusImpl.prototype.create = ControlledFrameContextMenusImpl.prototype.convertMethodToPromiseBased( ControlledFrameContextMenusImpl.prototype.createImpl, "create"); @@ -68,7 +75,7 @@ ControlledFrameContextMenusImpl.prototype.update = ControlledFrameContextMenusImpl.prototype.convertMethodToPromiseBased( - WebViewContextMenusImpl.prototype.update, "update"); + ControlledFrameContextMenusImpl.prototype.updateImpl, "update"); function ControlledFrameContextMenus() { privates(ControlledFrameContextMenus).constructPrivate(this, arguments);
diff --git a/chrome/renderer/resources/controlled_frame/controlled_frame_internal_custom_bindings.js b/chrome/renderer/resources/controlled_frame/controlled_frame_internal_custom_bindings.js index 60af82a4..9c2e003e 100644 --- a/chrome/renderer/resources/controlled_frame/controlled_frame_internal_custom_bindings.js +++ b/chrome/renderer/resources/controlled_frame/controlled_frame_internal_custom_bindings.js
@@ -12,4 +12,7 @@ apiFunctions.setHandleRequest( 'contextMenusCreate', handlers.requestHandlers.create); + + apiFunctions.setHandleRequest( + 'contextMenusUpdate', handlers.requestHandlers.update); });
diff --git a/chrome/services/sharing/nearby/platform/ble_v2_gatt_server.cc b/chrome/services/sharing/nearby/platform/ble_v2_gatt_server.cc index a6c555a..7353f38 100644 --- a/chrome/services/sharing/nearby/platform/ble_v2_gatt_server.cc +++ b/chrome/services/sharing/nearby/platform/ble_v2_gatt_server.cc
@@ -105,11 +105,6 @@ BleV2GattServer::~BleV2GattServer() = default; -BluetoothAdapter& BleV2GattServer::GetBlePeripheral() { - CHECK(bluetooth_adapter_); - return *bluetooth_adapter_; -} - std::optional<api::ble_v2::GattCharacteristic> BleV2GattServer::CreateCharacteristic( const Uuid& service_uuid,
diff --git a/chrome/services/sharing/nearby/platform/ble_v2_gatt_server.h b/chrome/services/sharing/nearby/platform/ble_v2_gatt_server.h index 578bb34..4e14587 100644 --- a/chrome/services/sharing/nearby/platform/ble_v2_gatt_server.h +++ b/chrome/services/sharing/nearby/platform/ble_v2_gatt_server.h
@@ -54,7 +54,6 @@ BleV2GattServer& operator=(const BleV2GattServer&) = delete; // nearby::api::ble_v2::GattServer: - BluetoothAdapter& GetBlePeripheral() override; std::optional<api::ble_v2::GattCharacteristic> CreateCharacteristic( const Uuid& service_uuid, const Uuid& characteristic_uuid,
diff --git a/chrome/services/sharing/nearby/platform/ble_v2_gatt_server_unittest.cc b/chrome/services/sharing/nearby/platform/ble_v2_gatt_server_unittest.cc index 0420921..1292240 100644 --- a/chrome/services/sharing/nearby/platform/ble_v2_gatt_server_unittest.cc +++ b/chrome/services/sharing/nearby/platform/ble_v2_gatt_server_unittest.cc
@@ -134,11 +134,6 @@ base::HistogramTester histogram_tester_; }; -TEST_F(BleV2GattServerTest, GetBlePeripheral) { - BluetoothAdapter& ble_v2_periphral = ble_v2_gatt_server_->GetBlePeripheral(); - EXPECT_EQ(fake_adapter_->address_, ble_v2_periphral.GetAddress()); -} - TEST_F(BleV2GattServerTest, CreateCharacteristic_CreateGattService_AlreadyExists) { auto fake_gatt_service = std::make_unique<bluetooth::FakeGattService>();
diff --git a/chrome/services/sharing/nearby/platform/ble_v2_medium.cc b/chrome/services/sharing/nearby/platform/ble_v2_medium.cc index 6486a73..b801283a 100644 --- a/chrome/services/sharing/nearby/platform/ble_v2_medium.cc +++ b/chrome/services/sharing/nearby/platform/ble_v2_medium.cc
@@ -580,12 +580,6 @@ return success && info->extended_advertisement_support; } -bool BleV2Medium::GetRemotePeripheral(const std::string& mac_address, - GetRemotePeripheralCallback callback) { - NOTIMPLEMENTED(); - return false; -} - bool BleV2Medium::GetRemotePeripheral(api::ble_v2::BlePeripheral::UniqueId id, GetRemotePeripheralCallback callback) { auto it =
diff --git a/chrome/services/sharing/nearby/platform/ble_v2_medium.h b/chrome/services/sharing/nearby/platform/ble_v2_medium.h index 9d65e32..d244234 100644 --- a/chrome/services/sharing/nearby/platform/ble_v2_medium.h +++ b/chrome/services/sharing/nearby/platform/ble_v2_medium.h
@@ -95,8 +95,6 @@ bool IsExtendedAdvertisementsAvailable() override; - bool GetRemotePeripheral(const std::string& mac_address, - GetRemotePeripheralCallback callback) override; bool GetRemotePeripheral(api::ble_v2::BlePeripheral::UniqueId id, GetRemotePeripheralCallback callback) override;
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index 4dddbff..e62e29e8a 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -2310,6 +2310,7 @@ "//chrome/browser/ui/safety_hub", "//chrome/browser/ui/safety_hub:browser_tests", "//chrome/browser/ui/safety_hub:test_support", + "//chrome/browser/ui/search_engines:browser_tests", "//chrome/browser/ui/signin", "//chrome/browser/ui/signin:browser_tests", "//chrome/browser/ui/startup:startup_tab", @@ -3401,7 +3402,6 @@ "../browser/ui/search/instant_test_base.h", "../browser/ui/search/new_tab_page_navigation_throttle_browsertest.cc", "../browser/ui/search/third_party_ntp_browsertest.cc", - "../browser/ui/search_engines/search_engine_tab_helper_browsertest.cc", "../browser/ui/startup/startup_browser_creator_browsertest.cc", "../browser/ui/sync/one_click_signin_links_delegate_impl_browsertest.cc", "../browser/ui/tab_modal_confirm_dialog_browsertest.cc", @@ -3459,6 +3459,7 @@ "../browser/ui/views/frame/system_menu_model_builder_browsertest.cc", "../browser/ui/views/hats/hats_browsertest.cc", "../browser/ui/views/incognito_clear_browsing_data_dialog_browsertest.cc", + "../browser/ui/views/infobars/confirm_infobar_custom_layout_browsertest.cc", "../browser/ui/views/intent_picker_bubble_view_browsertest.cc", "../browser/ui/views/intent_picker_dialog_browsertest.cc", "../browser/ui/views/location_bar/intent_chip_button_browsertest.cc", @@ -6324,7 +6325,6 @@ "../browser/ui/passwords/display_account_info_unittest.cc", "../browser/ui/passwords/manage_passwords_state_unittest.cc", "../browser/ui/passwords/settings/password_manager_porter_unittest.cc", - "../browser/ui/search_engines/keyword_editor_controller_unittest.cc", "../browser/ui/serial/serial_chooser_controller_unittest.cc", "../browser/ui/sync/tab_contents_synced_tab_delegate_unittest.cc", "../browser/ui/webui/chrome_urls/chrome_urls_handler_unittest.cc", @@ -6676,6 +6676,7 @@ "//chrome/browser/ui/page_info:unit_tests", "//chrome/browser/ui/plus_addresses:unit_tests", "//chrome/browser/ui/safety_hub:test_support", + "//chrome/browser/ui/search_engines:unit_tests", "//chrome/browser/ui/serial:test_support", "//chrome/browser/ui/webui", "//chrome/browser/ui/webui/internal_debug_pages_disabled", @@ -8931,6 +8932,7 @@ "../browser/extensions/api/storage/storage_session_unittest.cc", "../browser/extensions/api/web_request/web_request_api_unittest.cc", "../browser/extensions/api/web_request/web_request_event_details_unittest.cc", + "../browser/extensions/api/web_request/web_request_permissions_unittest.cc", "../browser/extensions/api/webstore_private/extension_install_status_unittest.cc", "../browser/extensions/api/webstore_private/webstore_private_unittest.cc", "../browser/extensions/chrome_content_verifier_unittest.cc", @@ -9098,7 +9100,6 @@ "../browser/extensions/api/tabs/tabs_api_unittest.cc", "../browser/extensions/api/tabs/windows_util_unittest.cc", "../browser/extensions/api/web_navigation/frame_navigation_state_unittest.cc", - "../browser/extensions/api/web_request/web_request_permissions_unittest.cc", "../browser/extensions/blocklist_check_unittest.cc", "../browser/extensions/blocklist_extension_prefs_unittest.cc", "../browser/extensions/blocklist_state_fetcher_unittest.cc",
diff --git a/chrome/test/android/browsertests_apk/src/org/chromium/android_browsertests_apk/ChromeBrowserTestsActivity.java b/chrome/test/android/browsertests_apk/src/org/chromium/android_browsertests_apk/ChromeBrowserTestsActivity.java index cf49ea4..d30d7ea3 100644 --- a/chrome/test/android/browsertests_apk/src/org/chromium/android_browsertests_apk/ChromeBrowserTestsActivity.java +++ b/chrome/test/android/browsertests_apk/src/org/chromium/android_browsertests_apk/ChromeBrowserTestsActivity.java
@@ -18,7 +18,7 @@ public class ChromeBrowserTestsActivity extends ChromeTabbedActivity { private static final String TAG = "browser_test"; - private NativeTest mTest = new NativeTest(); + private final NativeTest mTest = new NativeTest(); @Override public void performPreInflationStartup() {
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/browser/history/StubbedHistoryProvider.java b/chrome/test/android/javatests/src/org/chromium/chrome/browser/history/StubbedHistoryProvider.java index e7928c3..c9502c7b 100644 --- a/chrome/test/android/javatests/src/org/chromium/chrome/browser/history/StubbedHistoryProvider.java +++ b/chrome/test/android/javatests/src/org/chromium/chrome/browser/history/StubbedHistoryProvider.java
@@ -22,9 +22,9 @@ public final CallbackHelper removeItemsCallback = new CallbackHelper(); private BrowsingHistoryObserver mObserver; - private List<HistoryItem> mItems = new ArrayList<>(); - private List<HistoryItem> mSearchItems = new ArrayList<>(); - private List<HistoryItem> mRemovedItems = new ArrayList<>(); + private final List<HistoryItem> mItems = new ArrayList<>(); + private final List<HistoryItem> mSearchItems = new ArrayList<>(); + private final List<HistoryItem> mRemovedItems = new ArrayList<>(); /** The exclusive end position for the last query. */ private int mLastQueryEndPosition;
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/browser/history/TestBrowsingHistoryObserver.java b/chrome/test/android/javatests/src/org/chromium/chrome/browser/history/TestBrowsingHistoryObserver.java index 91d498fd..2d4b9d2 100644 --- a/chrome/test/android/javatests/src/org/chromium/chrome/browser/history/TestBrowsingHistoryObserver.java +++ b/chrome/test/android/javatests/src/org/chromium/chrome/browser/history/TestBrowsingHistoryObserver.java
@@ -15,7 +15,7 @@ */ public class TestBrowsingHistoryObserver implements BrowsingHistoryObserver { private List<HistoryItem> mHistory; - private CallbackHelper mQueryCallback; + private final CallbackHelper mQueryCallback; public TestBrowsingHistoryObserver() { mQueryCallback = new CallbackHelper();
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeActivityTestRule.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeActivityTestRule.java index 1c3fb70..57fbc21 100644 --- a/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeActivityTestRule.java +++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/ChromeActivityTestRule.java
@@ -72,7 +72,7 @@ // The number of ms to wait for the rendering activity to be started. private static final int ACTIVITY_START_TIMEOUT_MS = 1000; - private EmbeddedTestServerRule mTestServerRule = new EmbeddedTestServerRule(); + private final EmbeddedTestServerRule mTestServerRule = new EmbeddedTestServerRule(); protected ChromeActivityTestRule(Class<T> activityClass) { super(activityClass);
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/pagecontroller/utils/UiAutomatorUtils.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/pagecontroller/utils/UiAutomatorUtils.java index b9cc79e2..7762b17 100644 --- a/chrome/test/android/javatests/src/org/chromium/chrome/test/pagecontroller/utils/UiAutomatorUtils.java +++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/pagecontroller/utils/UiAutomatorUtils.java
@@ -54,8 +54,8 @@ // clicking, steps is one of the parameters to drag. public static final int CLICK_STEPS_PER_SECOND = 100; - private UiDevice mDevice; - private UiLocatorHelper mLocatorHelper; + private final UiDevice mDevice; + private final UiLocatorHelper mLocatorHelper; private static class LazyHolder { static final UiAutomatorUtils sInstance = new UiAutomatorUtils();
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/pagecontroller/utils/UiLocatorHelper.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/pagecontroller/utils/UiLocatorHelper.java index 76717a5c..f508f982 100644 --- a/chrome/test/android/javatests/src/org/chromium/chrome/test/pagecontroller/utils/UiLocatorHelper.java +++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/pagecontroller/utils/UiLocatorHelper.java
@@ -50,7 +50,7 @@ }; private final UiDevice mDevice; - private long mTimeout; + private final long mTimeout; /** Create a UiLocatorHelper with default timeout. */ UiLocatorHelper() {
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/hub/HubStationUtils.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/hub/HubStationUtils.java index dd5cea83..f560027 100644 --- a/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/hub/HubStationUtils.java +++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/hub/HubStationUtils.java
@@ -14,7 +14,7 @@ // R.string.accessibility_tab_switcher_standard_stack. // The incognito contentDescription is the actual string found in the resource: // R.string.accessibility_tab_switcher_incognito_stack. - private static Map<Integer, String> sPaneIdToContentDescriptionMap = + private static final Map<Integer, String> sPaneIdToContentDescriptionMap = Map.ofEntries( Map.entry(PaneId.TAB_SWITCHER, "standard tab"), Map.entry(PaneId.INCOGNITO_TAB_SWITCHER, "Incognito tabs"),
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/page/BasePageStation.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/page/BasePageStation.java index b281896..49fde26a 100644 --- a/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/page/BasePageStation.java +++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/page/BasePageStation.java
@@ -305,7 +305,7 @@ private class TabAddedCondition<ActivityT extends ChromeActivity> extends CallbackCondition implements TabModelObserver { private TabModel mTabModel; - private Supplier<ActivityT> mActivitySupplier; + private final Supplier<ActivityT> mActivitySupplier; protected TabAddedCondition(int numTabsBeingOpened, Supplier<ActivityT> activitySupplier) { super("didAddTab", numTabsBeingOpened); @@ -345,7 +345,7 @@ implements TabModelObserver, Supplier<Tab> { private final List<Tab> mTabsSelected = new ArrayList<>(); private TabModel mTabModel; - private Supplier<ActivityT> mActivitySupplier; + private final Supplier<ActivityT> mActivitySupplier; private TabSelectedCondition( int numTabsBeingSelected, Supplier<ActivityT> activitySupplier) {
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/tabmodel/TabCountChangedCondition.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/tabmodel/TabCountChangedCondition.java index bee4e70..32c176d6 100644 --- a/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/tabmodel/TabCountChangedCondition.java +++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/tabmodel/TabCountChangedCondition.java
@@ -10,7 +10,7 @@ /** Condition fulfilled when N number of tabs are opened/closed. */ public class TabCountChangedCondition extends InstrumentationThreadCondition { - private TabModel mTabModel; + private final TabModel mTabModel; private int mStartingTabs = -1; private final int mExpectedChange;
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/tabmodel/TabModelChangedCondition.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/tabmodel/TabModelChangedCondition.java index 3e48019..465ccc0 100644 --- a/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/tabmodel/TabModelChangedCondition.java +++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/tabmodel/TabModelChangedCondition.java
@@ -10,7 +10,7 @@ /** Condition fulfilled when tab model changes from regular to incognito or vice versa. */ public class TabModelChangedCondition extends InstrumentationThreadCondition { - private TabModelSelector mTabModelSelector; + private final TabModelSelector mTabModelSelector; private Boolean mStartingModelIsIncognito; public TabModelChangedCondition(TabModelSelector tabModelSelector) {
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/AdvancedProtectionTestRule.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/AdvancedProtectionTestRule.java index 12c9cefc..60a0c158 100644 --- a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/AdvancedProtectionTestRule.java +++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/AdvancedProtectionTestRule.java
@@ -25,7 +25,7 @@ private static class TestProvider extends OsAdditionalSecurityPermissionProvider { private boolean mIsAdvancedProtectionRequestedByOs; - private ObserverList<OsAdditionalSecurityPermissionProvider.Observer> mObserverList = + private final ObserverList<OsAdditionalSecurityPermissionProvider.Observer> mObserverList = new ObserverList<>(); public void setIsAdvancedProtectionRequestedByOs(boolean isAdvancedProtectionRequested) {
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/ChromeTabUtils.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/ChromeTabUtils.java index 97f0ea6..c2d514b1 100644 --- a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/ChromeTabUtils.java +++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/ChromeTabUtils.java
@@ -90,9 +90,9 @@ * with either scenario #2 *or* #3, so we have to keep watching for a call to onCrash. */ private static class TabPageLoadedObserver extends EmptyTabObserver { - private CallbackHelper mCallback; - private String mExpectedUrl; - private CountDownLatch mLoadStoppedLatch; + private final CallbackHelper mCallback; + private final String mExpectedUrl; + private final CountDownLatch mLoadStoppedLatch; public TabPageLoadedObserver( CallbackHelper loadCompleteCallback, @@ -356,8 +356,8 @@ * or opens a new foreground tab (popup), and may not become interactable. */ private static class TabPageInteractableObserver extends EmptyTabObserver { - private Tab mTab; - private CallbackHelper mCallback; + private final Tab mTab; + private final CallbackHelper mCallback; public TabPageInteractableObserver(Tab tab, CallbackHelper interactableCallback) { mTab = tab;
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/InfoBarUtil.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/InfoBarUtil.java index 43e378d..53643d4 100644 --- a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/InfoBarUtil.java +++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/InfoBarUtil.java
@@ -85,7 +85,7 @@ * simultaneously showing. */ public static class InfoBarMatcher extends BaseMatcher<InfoBar> { - private @InfoBarIdentifier int mId; + private final @InfoBarIdentifier int mId; public InfoBar mLastMatch; public InfoBarMatcher(@InfoBarIdentifier int id) {
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/WaitForFocusHelper.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/WaitForFocusHelper.java index 78b403a..713b98d 100644 --- a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/WaitForFocusHelper.java +++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/WaitForFocusHelper.java
@@ -44,8 +44,8 @@ Assert.assertTrue(view.hasFocus()); } - private CallbackHelper mOnFocusCallbackHelper; - private View.OnFocusChangeListener mExistingListener; + private final CallbackHelper mOnFocusCallbackHelper; + private final View.OnFocusChangeListener mExistingListener; WaitForFocusHelper(View.OnFocusChangeListener existingListener) { mOnFocusCallbackHelper = new CallbackHelper();
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/suggestions/SuggestionsDependenciesRule.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/suggestions/SuggestionsDependenciesRule.java index 385076e..09c7897 100644 --- a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/suggestions/SuggestionsDependenciesRule.java +++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/suggestions/SuggestionsDependenciesRule.java
@@ -23,7 +23,7 @@ * @see SuggestionsDependencyFactory */ public class SuggestionsDependenciesRule extends TestWatcher { - private TestFactory mFactory; + private final TestFactory mFactory; public TestFactory getFactory() { return mFactory;
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/tabmodel/MockTabModel.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/tabmodel/MockTabModel.java index 13efdc5..cfb7258a 100644 --- a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/tabmodel/MockTabModel.java +++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/tabmodel/MockTabModel.java
@@ -50,7 +50,7 @@ * this is either irrelevant to the test or requires customization for different states. */ public static class ComprehensiveTabList extends EmptyTabModel { - private List<Tab> mAllTabs = new ArrayList<>(); + private final List<Tab> mAllTabs = new ArrayList<>(); /** Returns the list of tabs backing the comprehensive model. */ public List<Tab> getTabList() {
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/tabmodel/MockTabModelSelector.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/tabmodel/MockTabModelSelector.java index 7d240d2..d0e4287 100644 --- a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/tabmodel/MockTabModelSelector.java +++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/tabmodel/MockTabModelSelector.java
@@ -28,7 +28,7 @@ public static final int ID_OFFSET = 100000; public static final int INCOGNITO_ID_OFFSET = 200000; private static int sCurTabOffset; - private int mTabCount; + private final int mTabCount; public MockTabModelSelector( Profile profile,
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/webapps/WebApkIntentDataProviderBuilder.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/webapps/WebApkIntentDataProviderBuilder.java index 17cda13..c171bcc2 100644 --- a/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/webapps/WebApkIntentDataProviderBuilder.java +++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/util/browser/webapps/WebApkIntentDataProviderBuilder.java
@@ -23,8 +23,8 @@ /** Builder class for WebAPK {@link BrowserServicesIntentDataProvider} objects. */ public class WebApkIntentDataProviderBuilder { - private String mWebApkPackageName; - private String mUrl; + private final String mWebApkPackageName; + private final String mUrl; private String mScope; private @DisplayMode.EnumType int mDisplayMode = DisplayMode.STANDALONE; private String mManifestUrl;
diff --git a/chrome/test/base/test_browser_window.h b/chrome/test/base/test_browser_window.h index da4c309..e6b79468 100644 --- a/chrome/test/base/test_browser_window.h +++ b/chrome/test/base/test_browser_window.h
@@ -146,6 +146,8 @@ bool PreHandleMouseEvent(const blink::WebMouseEvent& event) override; void PreHandleDragUpdate(const content::DropData& drop_data, const gfx::PointF& point) override {} + + void PreHandleDragExit() override {} content::KeyboardEventProcessingResult PreHandleKeyboardEvent( const input::NativeWebKeyboardEvent& event) override; bool HandleKeyboardEvent(const input::NativeWebKeyboardEvent& event) override;
diff --git a/chrome/test/data/actor/click_with_overflow_clip.html b/chrome/test/data/actor/click_with_overflow_clip.html new file mode 100644 index 0000000..3631529 --- /dev/null +++ b/chrome/test/data/actor/click_with_overflow_clip.html
@@ -0,0 +1,76 @@ +<!DOCTYPE html> +<html> + <head> + <meta name="viewport" content="width=device-width, minimum-scale=1.0"> + <title>Test case for elements that overflow ancestor clipping boxes</title> + <style> + body { + width: 300vw; + height: 300vh; + + } + #offscreenButton { + width: 300px; + height: 300px; + position: fixed; + left: calc(100vw - 40px); + top: calc(100vh - 40px); + } + + .clipRect { + position: absolute; + width: 100px; + height: 100px; + border: 1px solid black; + } + + #overflowHiddenButton { + position: relative; + left: 70px; + top: 70px; + width: 400px; + height: 400px; + } + + #overflowScrollButton { + position: relative; + left: 100px; + top: 100px; + width: 400px; + height: 400px; + } + </style> + <script> + let clicked_button = ''; + + window.onload = () => { + // Scroll the test cases into view. Use a non-0 scroll offset to ensure + // coordinates are correctly transformed (i.e. by adding a scroll, + // document-relative and frame-relative coordinate spaces don't + // coincide). + window.scrollTo(0, window.innerHeight); + + // Partially reveal the button in the bottom right corner. + const scroller = + document.getElementById('overflowScrollButton').parentElement; + scroller.scrollLeft = 30; + scroller.scrollTop = 30; + + for (let button of document.querySelectorAll('button')) { + button.addEventListener('click', e => clicked_button = e.target.id); + } + } + </script> + </head> + <body> + <button id="offscreenButton">Offscreen</button> + + <div class="clipRect" style="overflow: hidden; top: 100vh"> + <button id="overflowHiddenButton">OverflowHidden</button> + </div> + + <div class="clipRect" style="overflow: scroll; top: 100vh; left: 50vh"> + <button id="overflowScrollButton">OverflowScroll</button> + </div> + </body> +</html>
diff --git a/chrome/test/data/webui/glic/api_test.ts b/chrome/test/data/webui/glic/api_test.ts index 78d6148cc..bf95fe2 100644 --- a/chrome/test/data/webui/glic/api_test.ts +++ b/chrome/test/data/webui/glic/api_test.ts
@@ -215,6 +215,15 @@ location.href + '#background', {openInBackground: true}); } + async testCreateTabByClickingOnLink() { + assertTrue(!!this.host.setAudioDucking); + const link = document.createElement('a'); + link.setAttribute('href', 'https://www.chromium.org'); + link.setAttribute('target', '_blank'); + document.body.appendChild(link); + link.click(); + } + async testOpenGlicSettingsPage() { assertTrue(!!this.host.openGlicSettingsPage); this.host.openGlicSettingsPage();
diff --git a/chrome/test/data/webui/history/history_item_test.ts b/chrome/test/data/webui/history/history_item_test.ts index 8cbd65eb..f3e39d04 100644 --- a/chrome/test/data/webui/history/history_item_test.ts +++ b/chrome/test/data/webui/history/history_item_test.ts
@@ -81,6 +81,8 @@ document.body.innerHTML = window.trustedTypes!.emptyHTML; const testService = new TestBrowserService(); BrowserServiceImpl.setInstance(testService); + // Force a super tall body so that cr-lazy-list renders all items. + document.body.style.height = '1000px'; const app = document.createElement('history-app'); document.body.appendChild(app); element = app.$.history;
diff --git a/chrome/test/data/webui/history/history_list_test.ts b/chrome/test/data/webui/history/history_list_test.ts index 8131725..9897077 100644 --- a/chrome/test/data/webui/history/history_list_test.ts +++ b/chrome/test/data/webui/history/history_list_test.ts
@@ -545,9 +545,8 @@ element.shadowRoot! .querySelector<HTMLButtonElement>('#menuRemoveButton')!.disabled); assertEquals(2, toolbar.count); - assertTrue( - toolbar.shadowRoot!.querySelector('cr-toolbar-selection-overlay')! - .querySelector('cr-button')!.disabled); + assertTrue(toolbar.shadowRoot.querySelector('cr-toolbar-selection-overlay')! + .querySelector('cr-button')!.disabled); // Key event should be ignored. assertEquals(1, testService.handler.getCallCount('removeVisits')); @@ -571,7 +570,7 @@ // Check that delete option is re-enabled. assertEquals(2, toolbar.count); assertFalse( - toolbar.shadowRoot!.querySelector('cr-toolbar-selection-overlay')! + toolbar.shadowRoot.querySelector('cr-toolbar-selection-overlay')! .querySelector('cr-button')!.disabled); // Menu button should also be re-enabled.
diff --git a/chrome/test/data/webui/history/history_toolbar_test.ts b/chrome/test/data/webui/history/history_toolbar_test.ts index d6c4fb8a..21e166d 100644 --- a/chrome/test/data/webui/history/history_toolbar_test.ts +++ b/chrome/test/data/webui/history/history_toolbar_test.ts
@@ -12,6 +12,7 @@ import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js'; import {flushTasks} from 'chrome://webui-test/polymer_test_util.js'; import {TestMock} from 'chrome://webui-test/test_mock.js'; +import {microtasksFinished} from 'chrome://webui-test/test_util.js'; import {TestBrowserService} from './test_browser_service.js'; import {createHistoryEntry, createHistoryInfo} from './test_util.js'; @@ -59,9 +60,10 @@ 'query-history', {bubbles: true, composed: true, detail: true})); await testService.handler.whenCalled('queryHistoryContinuation'); await flushTasks(); + const item = app.$.history.shadowRoot!.querySelector('history-item')!; item.$.checkbox.click(); - await item.$.checkbox.updateComplete; + await microtasksFinished(); const toolbar = app.$.toolbar; @@ -72,6 +74,7 @@ item.$.checkbox.click(); await item.$.checkbox.updateComplete; + await flushTasks(); // Ensure that when an item is deselected the count held by the // toolbar decreases. @@ -110,7 +113,7 @@ value: TEST_HISTORY_RESULTS, }, }); - await flushTasks(); + await microtasksFinished(); assertFalse(toolbar.spinnerActive); }); @@ -124,32 +127,34 @@ // Without history embeddings enabled, search icon should always be default. loadTimeData.overrideValues({enableHistoryEmbeddings: false}); let toolbar = createToolbar(); - await flushTasks(); toolbar.selectedPage = 'history'; - assertEquals(undefined, toolbar.$.mainToolbar.searchIconOverride); + await microtasksFinished(); + assertEquals('', toolbar.$.mainToolbar.searchIconOverride); // With history embeddings enabled, search icon should change. loadTimeData.overrideValues({enableHistoryEmbeddings: true}); toolbar = createToolbar(); - await flushTasks(); toolbar.selectedPage = 'history'; + await microtasksFinished(); assertEquals( 'history-embeddings:search', toolbar.$.mainToolbar.searchIconOverride); toolbar.selectedPage = 'grouped'; + await microtasksFinished(); assertEquals( 'history-embeddings:search', toolbar.$.mainToolbar.searchIconOverride); // Synced tabs page should have the default icon. toolbar.selectedPage = 'syncedTabs'; - assertEquals(undefined, toolbar.$.mainToolbar.searchIconOverride); + await microtasksFinished(); + assertEquals('', toolbar.$.mainToolbar.searchIconOverride); }); test('updates search input aria-description', async () => { // Without history embeddings enabled, description should be empty. loadTimeData.overrideValues({enableHistoryEmbeddings: false}); let toolbar = createToolbar(); - await flushTasks(); toolbar.selectedPage = 'history'; + await microtasksFinished(); assertEquals('', toolbar.$.mainToolbar.searchInputAriaDescription); // With history embeddings enabled, description should change. @@ -158,17 +163,19 @@ historyEmbeddingsDisclaimer: 'some disclaimer', }); toolbar = createToolbar(); - await flushTasks(); toolbar.selectedPage = 'history'; + await microtasksFinished(); assertEquals( 'some disclaimer', toolbar.$.mainToolbar.searchInputAriaDescription); toolbar.selectedPage = 'grouped'; + await microtasksFinished(); assertEquals( 'some disclaimer', toolbar.$.mainToolbar.searchInputAriaDescription); // Synced tabs page should have no description. toolbar.selectedPage = 'syncedTabs'; - assertEquals(undefined, toolbar.$.mainToolbar.searchInputAriaDescription); + await microtasksFinished(); + assertEquals('', toolbar.$.mainToolbar.searchInputAriaDescription); }); test('updates search input prompt', async () => { @@ -178,8 +185,8 @@ searchPrompt: 'Search history', }); let toolbar = createToolbar(); - await flushTasks(); toolbar.selectedPage = 'history'; + await microtasksFinished(); assertEquals('Search history', toolbar.$.mainToolbar.searchPrompt); // With history embeddings enabled, prompt should change. @@ -188,12 +195,13 @@ historyEmbeddingsSearchPrompt: 'Describe your search', }); toolbar = createToolbar(); - await flushTasks(); toolbar.selectedPage = 'history'; + await microtasksFinished(); assertEquals('Describe your search', toolbar.$.mainToolbar.searchPrompt); // Synced tabs page should have the default prompt. toolbar.selectedPage = 'syncedTabs'; + await microtasksFinished(); assertEquals('Search history', toolbar.$.mainToolbar.searchPrompt); // With history embeddings' answerer enabled, prompt should change. @@ -210,8 +218,8 @@ }; loadTimeData.overrideValues(possiblePrompts); toolbar = createToolbar(); - await flushTasks(); toolbar.selectedPage = 'history'; + await microtasksFinished(); assertTrue(Object.values(possiblePrompts) .includes(toolbar.$.mainToolbar.searchPrompt)); });
diff --git a/chrome/test/data/webui/settings/clear_browsing_data_dialog_v2_test.ts b/chrome/test/data/webui/settings/clear_browsing_data_dialog_v2_test.ts index 1237017..03109a1 100644 --- a/chrome/test/data/webui/settings/clear_browsing_data_dialog_v2_test.ts +++ b/chrome/test/data/webui/settings/clear_browsing_data_dialog_v2_test.ts
@@ -5,17 +5,21 @@ // clang-format off import 'chrome://settings/lazy_load.js'; +import {webUIListenerCallback} from 'chrome://resources/js/cr.js'; import type {SettingsCheckboxElement, SettingsClearBrowsingDataDialogV2Element} from 'chrome://settings/lazy_load.js'; -import {BrowsingDataType, getDataTypePrefName} from 'chrome://settings/lazy_load.js'; +import {BrowsingDataType, ClearBrowsingDataBrowserProxyImpl, getDataTypePrefName, TimePeriod} from 'chrome://settings/lazy_load.js'; import type {SettingsPrefsElement} from 'chrome://settings/settings.js'; import {CrSettingsPrefs} from 'chrome://settings/settings.js'; import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js'; import {flushTasks} from 'chrome://webui-test/polymer_test_util.js'; import {eventToPromise, isVisible} from 'chrome://webui-test/test_util.js'; +import {TestClearBrowsingDataBrowserProxy} from './test_clear_browsing_data_browser_proxy.js'; + // clang-format on suite('DeleteBrowsingDataDialog', function() { + let testClearBrowsingDataBrowserProxy: TestClearBrowsingDataBrowserProxy; let dialog: SettingsClearBrowsingDataDialogV2Element; let settingsPrefs: SettingsPrefsElement; @@ -25,6 +29,9 @@ }); setup(function() { + testClearBrowsingDataBrowserProxy = new TestClearBrowsingDataBrowserProxy(); + ClearBrowsingDataBrowserProxyImpl.setInstance( + testClearBrowsingDataBrowserProxy); setClearBrowsingDataPrefs(false); return createDialog(); }); @@ -318,4 +325,49 @@ 'browser.clear_data.hosted_apps_data', getDataTypePrefName(BrowsingDataType.HOSTED_APPS_DATA)); }); + + test('TimePeriodChangesRestartCounters', async function() { + // Clear previous restartCounters calls. + testClearBrowsingDataBrowserProxy.reset(); + + // Dispatch a |selected-time-period-change| event to trigger the Counters' + // restart. LAST_HOUR is the default selected time period. + dialog.$.timePicker.dispatchEvent( + new CustomEvent('selected-time-period-change')); + await flushTasks(); + + const args = + await testClearBrowsingDataBrowserProxy.whenCalled('restartCounters'); + assertEquals(args[0], /*isBasic=*/ false); + assertEquals(args[1], TimePeriod.LAST_HOUR); + }); + + test('CountersUpdateCheckboxSubLabel', async function() { + // Case 1, Counter updates a checkbox in the expanded options list. + // Simulate a browsing data counter result for history. The History + // checkbox's subLabel should be updated. + webUIListenerCallback( + 'browsing-data-counter-text-update', + 'browser.clear_data.browsing_history', 'history result'); + await flushTasks(); + + const historyCheckbox = getCheckboxForDataType(BrowsingDataType.HISTORY); + assertTrue(!!historyCheckbox); + assertEquals('history result', historyCheckbox.subLabel); + + // Case 2, Counter updates a checkbox in the more options list. + // Simulate a browsing data counter result for Site settings. The Site + // settings checkbox's subLabel should be updated. + webUIListenerCallback( + 'browsing-data-counter-text-update', 'browser.clear_data.site_settings', + 'site settings result'); + + dialog.$.showMoreButton.click(); + await flushTasks(); + + const siteSettingsCheckbox = + getCheckboxForDataType(BrowsingDataType.SITE_SETTINGS); + assertTrue(!!siteSettingsCheckbox); + assertEquals('site settings result', siteSettingsCheckbox.subLabel); + }); });
diff --git a/chrome/test/data/webui/settings/clear_browsing_data_test.ts b/chrome/test/data/webui/settings/clear_browsing_data_test.ts index 574b268..f71f6cc 100644 --- a/chrome/test/data/webui/settings/clear_browsing_data_test.ts +++ b/chrome/test/data/webui/settings/clear_browsing_data_test.ts
@@ -750,7 +750,8 @@ // Simulate a browsing data counter result for history. This checkbox's // sublabel should be updated. - webUIListenerCallback('update-counter-text', checkbox.pref!.key, 'result'); + webUIListenerCallback( + 'browsing-data-counter-text-update', checkbox.pref!.key, 'result'); assertEquals('result', checkbox.subLabel); });
diff --git a/chrome/test/data/webui/side_panel/read_anything/BUILD.gn b/chrome/test/data/webui/side_panel/read_anything/BUILD.gn index 857e8e3..a8dad42 100644 --- a/chrome/test/data/webui/side_panel/read_anything/BUILD.gn +++ b/chrome/test/data/webui/side_panel/read_anything/BUILD.gn
@@ -15,6 +15,7 @@ "color_menu_test.ts", "common.ts", "common_test.ts", + "download_notification_test.ts", "fake_reading_mode.ts", "fake_tree_builder.ts", "fake_tree_builder_test.ts", @@ -58,7 +59,6 @@ "update_content_selection_test.ts", "update_content_selection_with_highlights_test.ts", "update_content_test.ts", - "update_voice_pack_test.ts", "voice_language_util_test.ts", "voice_notification_manager_test.ts", "voice_pack_controller_test.ts",
diff --git a/chrome/test/data/webui/side_panel/read_anything/app_receives_toolbar_changes_test.ts b/chrome/test/data/webui/side_panel/read_anything/app_receives_toolbar_changes_test.ts index 1d60b6e..6284bd2 100644 --- a/chrome/test/data/webui/side_panel/read_anything/app_receives_toolbar_changes_test.ts +++ b/chrome/test/data/webui/side_panel/read_anything/app_receives_toolbar_changes_test.ts
@@ -5,7 +5,7 @@ import 'chrome-untrusted://read-anything-side-panel.top-chrome/read_anything.js'; import type {AppElement} from 'chrome-untrusted://read-anything-side-panel.top-chrome/read_anything.js'; -import {BrowserProxy, SpeechBrowserProxyImpl, SpeechController, ToolbarEvent, VoiceClientSideStatusCode, VoicePackController, WordBoundaries} from 'chrome-untrusted://read-anything-side-panel.top-chrome/read_anything.js'; +import {BrowserProxy, SpeechBrowserProxyImpl, SpeechController, ToolbarEvent, VoicePackController, WordBoundaries} from 'chrome-untrusted://read-anything-side-panel.top-chrome/read_anything.js'; import {assertArrayEquals, assertEquals, assertFalse, assertNotEquals, assertTrue} from 'chrome-untrusted://webui-test/chai_assert.js'; import {hasStyle, microtasksFinished} from 'chrome-untrusted://webui-test/test_util.js'; @@ -197,51 +197,6 @@ assertFalse(chrome.readingMode.getLanguagesEnabledInPref().includes( firstLanguage)); }); - - suite('with language downloading enabled', () => { - let sentInstallRequestFor: string; - - setup(() => { - sentInstallRequestFor = ''; - // Monkey patch sendInstallVoicePackRequest() to spy on the method - chrome.readingMode.sendInstallVoicePackRequest = (language) => { - sentInstallRequestFor = language; - }; - }); - - test( - 'when previous language install failed, directly installs lang ' + - 'without usual protocol of sending status request first', - () => { - const lang = 'en-us'; - app.updateVoicePackStatus(lang, 'kOther'); - emitLanguageToggle(lang); - - assertEquals(lang, sentInstallRequestFor); - assertEquals( - voicePackController.getLocalStatus(lang), - VoiceClientSideStatusCode.SENT_INSTALL_REQUEST_ERROR_RETRY); - }); - - test( - 'when there is no status for lang, directly sends install request', - () => { - emitLanguageToggle('en-us'); - - assertEquals('en-us', sentInstallRequestFor); - }); - - - test( - 'when language status is uninstalled, does not directly install lang', - () => { - const lang = 'en-us'; - app.updateVoicePackStatus(lang, 'kNotInstalled'); - emitLanguageToggle(lang); - - assertEquals('', sentInstallRequestFor); - }); - }); }); test('on speech rate change speech rate updated', () => {
diff --git a/chrome/test/data/webui/side_panel/read_anything/language_change_test.ts b/chrome/test/data/webui/side_panel/read_anything/language_change_test.ts index 13e8895d..8b2c4558 100644 --- a/chrome/test/data/webui/side_panel/read_anything/language_change_test.ts +++ b/chrome/test/data/webui/side_panel/read_anything/language_change_test.ts
@@ -59,14 +59,8 @@ let speech: TestSpeechBrowserProxy; let voicePackController: VoicePackController; - function enableLangs(...langs: string[]) { - for (const l of langs) { - voicePackController.enableLang(l); - } - } - function setInstalled(lang: string) { - app.updateVoicePackStatus(lang, 'kInstalled'); + voicePackController.updateVoicePackStatus(lang, 'kInstalled'); } setup(async () => { @@ -85,7 +79,7 @@ app = await createApp(); for (const v of voices) { setInstalled(v.lang); - enableLangs(v.lang); + voicePackController.enableLang(v.lang); } return microtasksFinished(); }); @@ -273,7 +267,7 @@ test('to null if no enabled languages', () => { chrome.readingMode.baseLanguageForSpeech = lang2; for (const lang of voicePackController.getEnabledLangs()) { - voicePackController.disableLang(lang); + voicePackController.onLanguageToggle(lang); } app.languageChanged(); @@ -324,7 +318,7 @@ const voicePackLang = convertLangOrLocaleForVoicePackManager(lang); assertTrue(!!voicePackLang); - app.updateVoicePackStatus(lang, 'kInstalling'); + voicePackController.updateVoicePackStatus(lang, 'kInstalling'); app.languageChanged(); assertFalse(sentRequest);
diff --git a/chrome/test/data/webui/side_panel/read_anything/phrase_highlighting_test.ts b/chrome/test/data/webui/side_panel/read_anything/phrase_highlighting_test.ts index c9e294f..91b8ec75 100644 --- a/chrome/test/data/webui/side_panel/read_anything/phrase_highlighting_test.ts +++ b/chrome/test/data/webui/side_panel/read_anything/phrase_highlighting_test.ts
@@ -69,8 +69,8 @@ wordBoundaries = new WordBoundaries(); WordBoundaries.setInstance(wordBoundaries); ReadAloudHighlighter.setInstance(new ReadAloudHighlighter()); - SpeechController.setInstance(new SpeechController()); metrics = mockMetrics(); + SpeechController.setInstance(new SpeechController()); app = await createApp(); // Use a tree with just one sentence. For the actual implementation of
diff --git a/chrome/test/data/webui/side_panel/read_anything/read_anything_browsertest.cc b/chrome/test/data/webui/side_panel/read_anything/read_anything_browsertest.cc index 8aac8c2..aac41f6 100644 --- a/chrome/test/data/webui/side_panel/read_anything/read_anything_browsertest.cc +++ b/chrome/test/data/webui/side_panel/read_anything/read_anything_browsertest.cc
@@ -195,10 +195,12 @@ RunSidePanelTest("side_panel/read_anything/prefs_test.js", "mocha.run()"); } -IN_PROC_BROWSER_TEST_F(ReadAnythingMochaTest, UpdateVoicePack) { - RunSidePanelTest("side_panel/read_anything/update_voice_pack_test.js", +#if BUILDFLAG(IS_CHROMEOS) +IN_PROC_BROWSER_TEST_F(ReadAnythingMochaTest, DownloadNotification) { + RunSidePanelTest("side_panel/read_anything/download_notification_test.js", "mocha.run()"); } +#endif IN_PROC_BROWSER_TEST_F(ReadAnythingMochaTest, ToolbarOverflow) { RunSidePanelTest("side_panel/read_anything/toolbar_overflow_test.js",
diff --git a/chrome/test/data/webui/side_panel/read_anything/speech_controller_test.ts b/chrome/test/data/webui/side_panel/read_anything/speech_controller_test.ts index eafc3a5..b9c686a 100644 --- a/chrome/test/data/webui/side_panel/read_anything/speech_controller_test.ts +++ b/chrome/test/data/webui/side_panel/read_anything/speech_controller_test.ts
@@ -54,6 +54,7 @@ onPreviewVoicePlaying() { onPreviewVoicePlaying = true; }, + onSpeechRateChange() {}, }; const voicePackController = new VoicePackController();
diff --git a/chrome/test/data/webui/side_panel/read_anything/speech_uses_max_text_length_test.ts b/chrome/test/data/webui/side_panel/read_anything/speech_uses_max_text_length_test.ts index d4b52d3..026bab6 100644 --- a/chrome/test/data/webui/side_panel/read_anything/speech_uses_max_text_length_test.ts +++ b/chrome/test/data/webui/side_panel/read_anything/speech_uses_max_text_length_test.ts
@@ -114,7 +114,7 @@ test('highlights full sentence', () => { chrome.readingMode.setContentForTesting(axTree, [2, 3]); app.playSpeech(); - app.highlightAndPlayMessage(); + speechController.highlightAndPlayMessage(); assertEquals( app.$.container.querySelector('.current-read-highlight')!.textContent,
diff --git a/chrome/test/data/webui/side_panel/read_anything/update_voice_pack_test.ts b/chrome/test/data/webui/side_panel/read_anything/update_voice_pack_test.ts deleted file mode 100644 index b3db512..0000000 --- a/chrome/test/data/webui/side_panel/read_anything/update_voice_pack_test.ts +++ /dev/null
@@ -1,416 +0,0 @@ -// Copyright 2024 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. -import 'chrome-untrusted://read-anything-side-panel.top-chrome/read_anything.js'; - -// clang-format off -// <if expr="is_chromeos"> -import type {LanguageToastElement} from 'chrome-untrusted://read-anything-side-panel.top-chrome/read_anything.js'; -import {microtasksFinished} from 'chrome-untrusted://webui-test/test_util.js'; -// </if> -// clang-format on -import {BrowserProxy, SpeechBrowserProxyImpl, ToolbarEvent, VoicePackController} from 'chrome-untrusted://read-anything-side-panel.top-chrome/read_anything.js'; -import type {AppElement} from 'chrome-untrusted://read-anything-side-panel.top-chrome/read_anything.js'; -import {getVoicePackConvertedLangIfExists, VoiceClientSideStatusCode, VoicePackServerStatusErrorCode, VoicePackServerStatusSuccessCode} from 'chrome-untrusted://read-anything-side-panel.top-chrome/read_anything.js'; -import {assertEquals, assertFalse, assertTrue} from 'chrome-untrusted://webui-test/chai_assert.js'; - -import {createAndSetVoices, createApp, createSpeechSynthesisVoice, emitEvent, setVoices} from './common.js'; -import {FakeReadingMode} from './fake_reading_mode.js'; -import {TestColorUpdaterBrowserProxy} from './test_color_updater_browser_proxy.js'; -import {TestSpeechBrowserProxy} from './test_speech_browser_proxy.js'; - -suite('UpdateVoicePack', () => { - let app: AppElement; - let speech: TestSpeechBrowserProxy; - let voicePackController: VoicePackController; - - function setNaturalVoicesForLang(lang: string) { - createAndSetVoices(speech, [ - {lang: lang, name: 'Wall-e (Natural)'}, - {lang: lang, name: 'Andy (Natural)'}, - {lang: lang, name: 'Buzz'}, - ]); - } - - setup(async () => { - // Clearing the DOM should always be done first. - document.body.innerHTML = window.trustedTypes!.emptyHTML; - BrowserProxy.setInstance(new TestColorUpdaterBrowserProxy()); - const readingMode = new FakeReadingMode(); - chrome.readingMode = readingMode as unknown as typeof chrome.readingMode; - speech = new TestSpeechBrowserProxy(); - SpeechBrowserProxyImpl.setInstance(speech); - voicePackController = new VoicePackController(); - VoicePackController.setInstance(voicePackController); - app = await createApp(); - }); - - suite('updateVoicePackStatus', () => { - let sentInstallRequestFor: string = ''; - - suite('voice pack not installed', () => { - setup(() => { - chrome.readingMode.sendInstallVoicePackRequest = (lang) => { - sentInstallRequestFor = lang; - }; - }); - - test('request install if we need to', () => { - const lang = 'it-it'; - chrome.readingMode.baseLanguageForSpeech = lang; - app.$.toolbar.updateFonts = () => {}; - app.languageChanged(); - const voicePackLang = getVoicePackConvertedLangIfExists(lang); - - app.updateVoicePackStatus(voicePackLang, 'kNotInstalled'); - - const serverStatus = voicePackController.getServerStatus(voicePackLang); - assertTrue(!!serverStatus); - assertEquals( - VoicePackServerStatusSuccessCode.NOT_INSTALLED, serverStatus.code); - assertEquals('Successful response', serverStatus.id); - assertEquals(voicePackLang, sentInstallRequestFor); - }); - }); - - suite('with error code', () => { - const lang = 'pt-br'; - - setup(() => { - voicePackController.enableLang(lang); - }); - - test('and no other voices for language, disables language', () => { - createAndSetVoices(speech, []); - app.updateVoicePackStatus(lang, 'kOther'); - - assertFalse(voicePackController.isLangEnabled(lang)); - assertFalse( - chrome.readingMode.getLanguagesEnabledInPref().includes(lang)); - }); - - // <if expr="is_chromeos"> - test( - 'and only eSpeak voices for language, disables language on ChromeOS', - () => { - createAndSetVoices(speech, [ - {lang: lang, name: 'eSpeak Portuguese'}, - ]); - - app.updateVoicePackStatus(lang, 'kOther'); - - assertFalse(voicePackController.isLangEnabled(lang)); - assertFalse( - chrome.readingMode.getLanguagesEnabledInPref().includes(lang)); - }); - // </if> - - // <if expr="not is_chromeos"> - test( - 'and only system voices for language, keeps language for desktop', - () => { - createAndSetVoices(speech, [ - {lang: lang, name: 'System Portuguese'}, - ]); - - app.updateVoicePackStatus(lang, 'kOther'); - - assertTrue(voicePackController.isLangEnabled(lang)); - assertTrue( - chrome.readingMode.getLanguagesEnabledInPref().includes(lang)); - }); - // </if> - - test( - 'and when language-pack lang does not match voice lang, ' + - 'still disables language', - () => { - voicePackController.enableLang('it-it'); - createAndSetVoices(speech, []); - - app.updateVoicePackStatus('it', 'kOther'); - - assertFalse( - voicePackController.isLangEnabled('it-it'), 'controller'); - assertFalse( - chrome.readingMode.getLanguagesEnabledInPref().includes( - 'it-it'), - 'prefs'); - }); - - test( - 'and when language-pack lang does not match voice lang, with ' + - 'e-speak voices, still disables language', - () => { - voicePackController.enableLang('it-it'); - createAndSetVoices(speech, [ - {lang: 'it', name: 'eSpeak Italian '}, - ]); - - app.updateVoicePackStatus('it', 'kOther'); - - assertFalse(voicePackController.isLangEnabled('it-it')); - assertFalse(chrome.readingMode.getLanguagesEnabledInPref().includes( - 'it-it')); - }); - - test( - 'and has other Google voices for language, keeps language enabled', - () => { - createAndSetVoices(speech, [ - {lang: lang, name: 'Google Portuguese 1'}, - {lang: lang, name: 'Google Portuguese 2'}, - ]); - app.updateVoicePackStatus(lang, 'kOther'); - - assertTrue(voicePackController.isLangEnabled(lang)); - assertTrue( - chrome.readingMode.getLanguagesEnabledInPref().includes(lang)); - }); - }); - }); - - // <if expr="is_chromeos"> - suite('download notification', () => { - const lang = 'en-us'; - let toast: LanguageToastElement; - - function installLanguage(): Promise<void> { - setNaturalVoicesForLang(lang); - // existing status - app.updateVoicePackStatus(lang, 'kNotInstalled'); - // then we request install - voicePackController.setLocalStatus( - lang, VoiceClientSideStatusCode.SENT_INSTALL_REQUEST); - app.updateVoicePackStatus(lang, 'kInstalling'); - // install completes - app.updateVoicePackStatus(lang, 'kInstalled'); - return microtasksFinished(); - } - - setup(() => { - toast = app.$.languageToast; - }); - - test('does not show if already installed', async () => { - // The first call to update status should be the existing status from - // the server. - app.updateVoicePackStatus(lang, 'kInstalled'); - await microtasksFinished(); - - assertFalse(toast.$.toast.open); - }); - - test('does not show if still installing', async () => { - // existing status - app.updateVoicePackStatus(lang, 'kNotInstalled'); - // then we request install - app.updateVoicePackStatus(lang, 'kInstalling'); - await microtasksFinished(); - - assertFalse(toast.$.toast.open); - }); - - test('does not show if error while installing', async () => { - // existing status - app.updateVoicePackStatus(lang, 'kNotInstalled'); - // then we request install - app.updateVoicePackStatus(lang, 'kInstalling'); - // install error - app.updateVoicePackStatus(lang, 'kOther'); - await microtasksFinished(); - - assertFalse(toast.$.toast.open); - }); - - test('shows after installed', async () => { - await installLanguage(); - assertTrue(toast.$.toast.open); - }); - - test('does not show with language menu open', async () => { - emitEvent(app, ToolbarEvent.LANGUAGE_MENU_OPEN); - await installLanguage(); - assertFalse(toast.$.toast.open); - }); - - test('shows again after language menu close', async () => { - emitEvent(app, ToolbarEvent.LANGUAGE_MENU_OPEN); - await installLanguage(); - - emitEvent(app, ToolbarEvent.LANGUAGE_MENU_CLOSE); - await installLanguage(); - assertTrue(toast.$.toast.open); - }); - }); - // </if> - - test( - 'unavailable even if natural voices are in the list for a different lang', - () => { - const lang = 'fr'; - setNaturalVoicesForLang('it'); - - app.updateVoicePackStatus(lang, 'kInstalled'); - - const serverStatus = voicePackController.getServerStatus(lang); - assertTrue(!!serverStatus, 'status is: ' + serverStatus?.id); - assertEquals( - VoicePackServerStatusSuccessCode.INSTALLED, serverStatus.code); - assertEquals('Successful response', serverStatus.id); - assertEquals( - VoiceClientSideStatusCode.INSTALLED_AND_UNAVAILABLE, - voicePackController.getLocalStatus(lang)); - }); - - test( - 'unavailable if non-natural voices are in the list for a different lang', - () => { - const lang = 'de'; - - // Installed 'de' language pack, but the fake available voice list - // only has english voices. - app.updateVoicePackStatus(lang, 'kInstalled'); - - const serverStatus = voicePackController.getServerStatus(lang); - assertTrue(!!serverStatus); - assertEquals( - VoicePackServerStatusSuccessCode.INSTALLED, serverStatus.code); - assertEquals('Successful response', serverStatus.id); - assertEquals( - VoiceClientSideStatusCode.INSTALLED_AND_UNAVAILABLE, - voicePackController.getLocalStatus(lang)); - }); - - test( - 'unavailable if only non-natural voices are in the list for this lang', - () => { - const lang = 'en'; - - app.updateVoicePackStatus(lang, 'kInstalled'); - - const serverStatus = voicePackController.getServerStatus(lang); - assertTrue(!!serverStatus); - assertEquals( - VoicePackServerStatusSuccessCode.INSTALLED, serverStatus.code); - assertEquals('Successful response', serverStatus.id); - assertEquals( - VoiceClientSideStatusCode.INSTALLED_AND_UNAVAILABLE, - voicePackController.getLocalStatus(lang)); - }); - - test( - 'available if natural voices are unsupported for this lang and voices' + - ' are available', - () => { - const lang = 'yue'; - createAndSetVoices(speech, [ - {lang: 'yue-hk', name: 'Cantonese'}, - ]); - - app.updateVoicePackStatus(lang, 'kInstalled'); - - const serverStatus = voicePackController.getServerStatus(lang); - assertTrue(!!serverStatus); - assertEquals( - VoicePackServerStatusSuccessCode.INSTALLED, serverStatus.code); - assertEquals('Successful response', serverStatus.id); - assertEquals( - VoiceClientSideStatusCode.AVAILABLE, - voicePackController.getLocalStatus(lang)); - }); - - test( - 'unavailable if natural voices are unsupported for this lang and voices' + - ' unavailable', - () => { - const lang = 'yue'; - - app.updateVoicePackStatus(lang, 'kInstalled'); - - const serverStatus = voicePackController.getServerStatus(lang); - assertTrue(!!serverStatus); - assertEquals( - VoicePackServerStatusSuccessCode.INSTALLED, serverStatus.code); - assertEquals('Successful response', serverStatus.id); - assertEquals( - VoiceClientSideStatusCode.INSTALLED_AND_UNAVAILABLE, - voicePackController.getLocalStatus(lang)); - }); - - test('available if natural voices are installed for this lang', () => { - const lang = 'en-us'; - // set installing status so that the old status is not empty. - app.updateVoicePackStatus(lang, 'kInstalling'); - // set the voices on speech synthesis without triggering on voices - // changed, so we can verify that updateVoicePackStatus calls it. - createAndSetVoices(speech, [ - {lang: lang, name: 'Wall-e (Natural)'}, - {lang: lang, name: 'Andy (Natural)'}, - ]); - app.updateVoicePackStatus(lang, 'kInstalled'); - - const serverStatus = voicePackController.getServerStatus(lang); - assertTrue(!!serverStatus); - assertEquals(VoicePackServerStatusSuccessCode.INSTALLED, serverStatus.code); - assertEquals('Successful response', serverStatus.id); - // This would be INSTALLED_AND_UNAVIALABLE if the voice list wasn't - // refreshed. - assertEquals( - VoiceClientSideStatusCode.AVAILABLE, - voicePackController.getLocalStatus(lang)); - }); - - test( - 'switches to newly available voices if it\'s for the current language', - () => { - const lang = 'en-us'; - chrome.readingMode.baseLanguageForSpeech = lang; - voicePackController.enableLang(lang); - chrome.readingMode.getStoredVoice = () => ''; - setNaturalVoicesForLang(lang); - app.updateVoicePackStatus(lang, 'kInstalled'); - - const selectedVoice = voicePackController.getCurrentVoice(); - assertTrue(!!selectedVoice); - assertEquals(lang, selectedVoice.lang); - assertTrue(selectedVoice.name.includes('Natural')); - }); - - test( - 'does not switch to newly available voices if it\'s not for the ' + - 'current language', - () => { - const installedLang = 'en-us'; - chrome.readingMode.baseLanguageForSpeech = 'pt-br'; - voicePackController.enableLang( - chrome.readingMode.baseLanguageForSpeech); - const currentVoice = createSpeechSynthesisVoice({ - name: 'Portuguese voice 1', - lang: chrome.readingMode.baseLanguageForSpeech, - }); - emitEvent( - app, ToolbarEvent.VOICE, {detail: {selectedVoice: currentVoice}}); - chrome.readingMode.getStoredVoice = () => ''; - setVoices(speech, [currentVoice]); - - app.updateVoicePackStatus(installedLang, 'kInstalled'); - - // The selected voice should stay the same as it was. - assertEquals(currentVoice, voicePackController.getCurrentVoice()); - }); - - test('with error code marks the status', () => { - const lang = 'en-us'; - - app.updateVoicePackStatus(lang, 'kOther'); - - const serverStatus = voicePackController.getServerStatus(lang); - assertTrue(!!serverStatus); - assertEquals(serverStatus.code, VoicePackServerStatusErrorCode.OTHER); - assertEquals('Unsuccessful response', serverStatus.id); - assertEquals( - voicePackController.getLocalStatus(lang), - VoiceClientSideStatusCode.ERROR_INSTALLING); - }); -});
diff --git a/chrome/test/data/webui/side_panel/read_anything/voice_pack_controller_test.ts b/chrome/test/data/webui/side_panel/read_anything/voice_pack_controller_test.ts index 7097f98..33b52db6 100644 --- a/chrome/test/data/webui/side_panel/read_anything/voice_pack_controller_test.ts +++ b/chrome/test/data/webui/side_panel/read_anything/voice_pack_controller_test.ts
@@ -4,12 +4,12 @@ import 'chrome-untrusted://read-anything-side-panel.top-chrome/read_anything.js'; -import {BrowserProxy, EXTENSION_RESPONSE_TIMEOUT_MS, mojoVoicePackStatusToVoicePackStatusEnum, NotificationType, SpeechBrowserProxyImpl, VoiceClientSideStatusCode, VoiceNotificationManager, VoicePackController} from 'chrome-untrusted://read-anything-side-panel.top-chrome/read_anything.js'; +import {BrowserProxy, EXTENSION_RESPONSE_TIMEOUT_MS, mojoVoicePackStatusToVoicePackStatusEnum, NotificationType, SpeechBrowserProxyImpl, VoiceClientSideStatusCode, VoiceNotificationManager, VoicePackController, VoicePackServerStatusErrorCode, VoicePackServerStatusSuccessCode} from 'chrome-untrusted://read-anything-side-panel.top-chrome/read_anything.js'; import type {VoiceLanguageListener, VoiceNotificationListener} from 'chrome-untrusted://read-anything-side-panel.top-chrome/read_anything.js'; import {assertArrayEquals, assertEquals, assertFalse, assertTrue} from 'chrome-untrusted://webui-test/chai_assert.js'; import {MockTimer} from 'chrome-untrusted://webui-test/mock_timer.js'; -import {createSpeechSynthesisVoice} from './common.js'; +import {createAndSetVoices, createSpeechSynthesisVoice, setVoices} from './common.js'; import {FakeReadingMode} from './fake_reading_mode.js'; import {TestColorUpdaterBrowserProxy} from './test_color_updater_browser_proxy.js'; import {TestSpeechBrowserProxy} from './test_speech_browser_proxy.js'; @@ -21,6 +21,10 @@ let onEnabledLangsChange: boolean; let onAvailableVoicesChange: boolean; let onCurrentVoiceChange: boolean; + let installedLangs: string[]; + let uninstalledLangs: string[]; + let requestInfoLangs: string[]; + let notificationType: NotificationType|null; setup(() => { // Clearing the DOM should always be done first. @@ -46,6 +50,24 @@ }, }; voicePackController.addListener(listener); + installedLangs = []; + uninstalledLangs = []; + requestInfoLangs = []; + chrome.readingMode.sendGetVoicePackInfoRequest = (lang) => { + requestInfoLangs.push(lang); + }; + chrome.readingMode.sendInstallVoicePackRequest = (lang) => { + installedLangs.push(lang); + }; + chrome.readingMode.sendUninstallVoiceRequest = (lang) => { + uninstalledLangs.push(lang); + }; + const notificationListener = { + notify(type: NotificationType, _lang?: string): void { + notificationType = type; + }, + }; + VoiceNotificationManager.getInstance().addListener(notificationListener); }); suite('setLocalStatus', () => { @@ -117,21 +139,6 @@ assertEquals(status2, voicePackController.getServerStatus('yue')); }); - test('disableLang', () => { - voicePackController.enableLang('vi'); - onEnabledLangsChange = false; - - voicePackController.disableLang(''); - assertFalse(onEnabledLangsChange); - voicePackController.disableLang('no'); - assertFalse(onEnabledLangsChange); - - voicePackController.disableLang('vi'); - assertTrue(onEnabledLangsChange); - assertFalse(voicePackController.isLangEnabled('vi')); - assertFalse(voicePackController.isLangEnabled('VI')); - }); - test('enableLang', () => { voicePackController.enableLang(''); assertFalse(onEnabledLangsChange); @@ -315,6 +322,91 @@ }); }); + test('onLanguageToggle enabled languages are added', () => { + const firstLanguage = 'en-us'; + voicePackController.onLanguageToggle(firstLanguage); + assertTrue(voicePackController.isLangEnabled(firstLanguage)); + assertTrue( + chrome.readingMode.getLanguagesEnabledInPref().includes(firstLanguage)); + + const secondLanguage = 'fr'; + voicePackController.onLanguageToggle(secondLanguage); + assertTrue(voicePackController.isLangEnabled(secondLanguage)); + assertTrue(chrome.readingMode.getLanguagesEnabledInPref().includes( + secondLanguage)); + }); + + test('onLanguageToggle disabled languages are removed', () => { + const firstLanguage = 'en-us'; + voicePackController.onLanguageToggle(firstLanguage); + assertTrue(voicePackController.isLangEnabled(firstLanguage)); + assertTrue( + chrome.readingMode.getLanguagesEnabledInPref().includes(firstLanguage)); + + voicePackController.onLanguageToggle(firstLanguage); + assertFalse(voicePackController.isLangEnabled(firstLanguage)); + assertFalse( + chrome.readingMode.getLanguagesEnabledInPref().includes(firstLanguage)); + }); + + test('onLanguageToggle with voice pack lang uninstalls it', () => { + const lang = 'km'; + voicePackController.onLanguageToggle(lang); + VoiceNotificationManager.getInstance().onVoiceStatusChange( + lang, VoiceClientSideStatusCode.SENT_INSTALL_REQUEST, []); + + voicePackController.onLanguageToggle(lang); + assertEquals(NotificationType.NONE, notificationType); + assertArrayEquals([lang], uninstalledLangs); + }); + + test('onLanguageToggle with non voice pack lang does not uninstall', () => { + const lang = 'zh'; + voicePackController.onLanguageToggle(lang); + notificationType = null; + + voicePackController.onLanguageToggle(lang); + + assertFalse(!!notificationType); + assertArrayEquals([], requestInfoLangs); + assertArrayEquals([], uninstalledLangs); + assertArrayEquals([], installedLangs); + }); + + test( + 'onLanguageToggle when previous language install failed, directly ' + + 'installs lang without sending status request first', + () => { + const lang = 'en-us'; + voicePackController.updateVoicePackStatus(lang, 'kOther'); + + voicePackController.onLanguageToggle(lang); + + assertArrayEquals([lang], installedLangs); + assertEquals( + voicePackController.getLocalStatus(lang), + VoiceClientSideStatusCode.SENT_INSTALL_REQUEST_ERROR_RETRY); + }); + + test( + 'onLanguageToggle when there is no status for lang, installs lang', + () => { + voicePackController.onLanguageToggle('en-us'); + assertArrayEquals(['en-us'], installedLangs); + }); + + + test( + 'onLanguageToggle when language status is uninstalled, does not install', + () => { + const lang = 'en-us'; + voicePackController.updateVoicePackStatus(lang, 'kNotInstalled'); + + voicePackController.onLanguageToggle(lang); + + assertArrayEquals([], installedLangs); + }); + test( 'onVoicesChanged with auto selected voice, switches to a Natural voice', () => { @@ -381,80 +473,7 @@ assertArrayEquals(newVoices, voicePackController.getAvailableVoices()); }); - // <if expr="is_chromeos"> - test( - 'disableLangIfNoVoices chromeOS should disable if no google voices', - () => { - const lang1 = 'en-US'; - const lang2 = 'fr'; - const lang3 = 'yue'; - voicePackController.enableLang(lang1); - chrome.readingMode.onLanguagePrefChange(lang1.toLowerCase(), true); - voicePackController.enableLang(lang2); - chrome.readingMode.onLanguagePrefChange(lang2, true); - voicePackController.enableLang(lang3); - chrome.readingMode.onLanguagePrefChange(lang3, true); - speech.setVoices([ - createSpeechSynthesisVoice({lang: lang1, name: 'Henry'}), - createSpeechSynthesisVoice({lang: lang2, name: 'Google Thomas'}), - ]); - onEnabledLangsChange = false; - - voicePackController.disableLangIfNoVoices(lang1); - assertTrue(onEnabledLangsChange); - - onEnabledLangsChange = false; - voicePackController.disableLangIfNoVoices(lang2); - assertFalse(onEnabledLangsChange); - - voicePackController.disableLangIfNoVoices(lang3); - assertTrue(onEnabledLangsChange); - - const langsInPrefs = chrome.readingMode.getLanguagesEnabledInPref(); - assertFalse(langsInPrefs.includes(lang1.toLowerCase())); - assertTrue(langsInPrefs.includes(lang2)); - assertFalse(langsInPrefs.includes(lang3)); - assertFalse(voicePackController.isLangEnabled(lang1)); - assertTrue(voicePackController.isLangEnabled(lang2)); - assertFalse(voicePackController.isLangEnabled(lang3)); - }); - // </if> - // <if expr="not is_chromeos"> - test( - 'disableLangIfNoVoices desktop should only disable if no voices at all', - () => { - const lang1 = 'en-US'; - const lang2 = 'fr'; - const lang3 = 'yue'; - voicePackController.enableLang(lang1); - chrome.readingMode.onLanguagePrefChange(lang1.toLowerCase(), true); - voicePackController.enableLang(lang2); - chrome.readingMode.onLanguagePrefChange(lang2, true); - voicePackController.enableLang(lang3); - chrome.readingMode.onLanguagePrefChange(lang3, true); - speech.setVoices([ - createSpeechSynthesisVoice({lang: lang1, name: 'Henry'}), - createSpeechSynthesisVoice({lang: lang2, name: 'Google Thomas'}), - ]); - onEnabledLangsChange = false; - - voicePackController.disableLangIfNoVoices(lang1); - assertFalse(onEnabledLangsChange); - voicePackController.disableLangIfNoVoices(lang2); - assertFalse(onEnabledLangsChange); - voicePackController.disableLangIfNoVoices(lang3); - assertTrue(onEnabledLangsChange); - - const langsInPrefs = chrome.readingMode.getLanguagesEnabledInPref(); - assertTrue(langsInPrefs.includes(lang1.toLowerCase())); - assertTrue(langsInPrefs.includes(lang2)); - assertFalse(langsInPrefs.includes(lang3)); - assertTrue(voicePackController.isLangEnabled(lang1)); - assertTrue(voicePackController.isLangEnabled(lang2)); - assertFalse(voicePackController.isLangEnabled(lang3)); - }); - test('onVoicesChanged enables newly available langs', () => { const lang1 = 'en-gb'; const lang2 = 'fr'; @@ -492,287 +511,508 @@ }); // </if> - suite('installation', () => { - let installedLangs: string[]; - let uninstalledLangs: string[]; - let requestInfoLangs: string[]; - let notificationType: NotificationType|null; + test('onVoicesChanged after new tts engine installs google locales', () => { + const lang1 = 'bn-bd'; + const lang2 = 'hu-hu'; + const lang3 = 'en'; + voicePackController.enableLang(lang1); + voicePackController.enableLang(lang2); + voicePackController.enableLang(lang3); + + voicePackController.onTtsEngineInstalled(); + voicePackController.onVoicesChanged(); + + assertArrayEquals(['bn', 'hu'], installedLangs); + assertFalse(voicePackController.hasAvailableVoices()); + }); + + test('onVoicesChanged restores from prefs on first voices received', () => { + const lang = 'uk'; + const name = 'Google Lemur'; + const voice = createSpeechSynthesisVoice({lang, name}); + speech.setVoices([voice]); + chrome.readingMode.getStoredVoice = () => name; + + voicePackController.onVoicesChanged(); + + assertTrue(voicePackController.isLangEnabled(lang)); + assertArrayEquals([voice], voicePackController.getAvailableVoices()); + }); + + test('onVoicesChanged requests info', () => { + const lang1 = 'fi'; + const lang2 = 'id'; + const lang3 = 'da'; + voicePackController.setServerStatus( + lang1, mojoVoicePackStatusToVoicePackStatusEnum('kInstalled')); + voicePackController.setServerStatus( + lang2, mojoVoicePackStatusToVoicePackStatusEnum('kAllocation')); + voicePackController.setServerStatus( + lang3, mojoVoicePackStatusToVoicePackStatusEnum('kNotInstalled')); + + voicePackController.onVoicesChanged(); + + assertArrayEquals([lang1, lang2, lang3], requestInfoLangs); + }); + + test('onVoicesChanged waits for engine timeout', () => { + const lang = 'fi'; + voicePackController.setServerStatus( + lang, mojoVoicePackStatusToVoicePackStatusEnum('kInstalled')); + const mockTimer = new MockTimer(); + mockTimer.install(); + + voicePackController.onVoicesChanged(); + mockTimer.tick(EXTENSION_RESPONSE_TIMEOUT_MS); + mockTimer.uninstall(); + + assertEquals(NotificationType.GOOGLE_VOICES_UNAVAILABLE, notificationType); + }); + + test( + 'onVoicesChanged does nothing when current voice' + + ' still available', + () => { + const voice = createSpeechSynthesisVoice({lang: 'id', name: 'Dog'}); + speech.setVoices([voice]); + voicePackController.enableLang(voice.lang); + voicePackController.setCurrentVoice(voice); + onCurrentVoiceChange = false; + + voicePackController.onVoicesChanged(); + + assertFalse(onCurrentVoiceChange); + assertEquals(voice, voicePackController.getCurrentVoice()); + }); + + test( + 'onVoicesChanged gets default voice when current' + + ' voice unavailable', + () => { + const voice = + createSpeechSynthesisVoice({lang: 'id', name: 'Google Cat'}); + const defaultVoice = + createSpeechSynthesisVoice({lang: 'id', name: 'Google Komodo'}); + speech.setVoices([defaultVoice]); + voicePackController.enableLang(voice.lang); + voicePackController.setCurrentVoice(voice); + onCurrentVoiceChange = false; + + voicePackController.onVoicesChanged(); + + assertTrue(onCurrentVoiceChange); + assertEquals(defaultVoice, voicePackController.getCurrentVoice()); + }); + + test('stopWaitingForSpeechExtension stops waiting for engine timeout', () => { + const lang = 'fi'; + voicePackController.setServerStatus( + lang, mojoVoicePackStatusToVoicePackStatusEnum('kInstalled')); + let notificationType = null; + const notificationListener = { + notify(type: NotificationType, _lang?: string): void { + notificationType = type; + }, + }; + VoiceNotificationManager.getInstance().addListener(notificationListener); + const mockTimer = new MockTimer(); + mockTimer.install(); + + voicePackController.onVoicesChanged(); + voicePackController.stopWaitingForSpeechExtension(); + mockTimer.tick(EXTENSION_RESPONSE_TIMEOUT_MS); + mockTimer.uninstall(); + + // Now download the voice since the speech engine responded. + assertEquals(NotificationType.DOWNLOADING, notificationType); + }); + + test('onPageLanguageChanged updates current language', () => { + const lang = 'el'; + chrome.readingMode.baseLanguageForSpeech = lang; + + voicePackController.onPageLanguageChanged(); + + assertEquals(lang, voicePackController.getCurrentLanguage()); + }); + + test('onPageLanguageChanged when not installed, requests info', () => { + const lang = 'ja'; + chrome.readingMode.baseLanguageForSpeech = lang; + voicePackController.setServerStatus( + lang, mojoVoicePackStatusToVoicePackStatusEnum('kNotInstalled')); + + + voicePackController.onPageLanguageChanged(); + assertArrayEquals([lang], requestInfoLangs); + + voicePackController.updateVoicePackStatus(lang, 'kNotInstalled'); + assertEquals( + VoiceClientSideStatusCode.SENT_INSTALL_REQUEST, + voicePackController.getLocalStatus(lang)); + assertArrayEquals([lang], installedLangs); + }); + + test('onPageLanguageChanged when previously failed does not install', () => { + const lang = 'ja'; + chrome.readingMode.baseLanguageForSpeech = lang; + voicePackController.setServerStatus( + lang, mojoVoicePackStatusToVoicePackStatusEnum('kOther')); + + voicePackController.onPageLanguageChanged(); + + assertFalse(!!voicePackController.getLocalStatus(lang)); + assertArrayEquals([], requestInfoLangs); + assertArrayEquals([], installedLangs); + }); + + test('onPageLanguageChanged and already installing does not install', () => { + const lang = 'ja'; + chrome.readingMode.baseLanguageForSpeech = lang; + voicePackController.setServerStatus( + lang, mojoVoicePackStatusToVoicePackStatusEnum('kInstalling')); + + voicePackController.onPageLanguageChanged(); + + assertFalse(!!voicePackController.getLocalStatus(lang)); + assertArrayEquals([], requestInfoLangs); + assertArrayEquals([], installedLangs); + }); + + test('onPageLanguageChanged and already installed does not install', () => { + const lang = 'ja'; + chrome.readingMode.baseLanguageForSpeech = lang; + voicePackController.setServerStatus( + lang, mojoVoicePackStatusToVoicePackStatusEnum('kInstalled')); + + voicePackController.onPageLanguageChanged(); + + assertFalse(!!voicePackController.getLocalStatus(lang)); + assertArrayEquals([], requestInfoLangs); + assertArrayEquals([], installedLangs); + }); + + suite('updateVoicePackStatus', () => { + const lang = 'pt-br'; setup(() => { - installedLangs = []; - uninstalledLangs = []; - requestInfoLangs = []; - chrome.readingMode.sendGetVoicePackInfoRequest = (lang) => { - requestInfoLangs.push(lang); - }; - chrome.readingMode.sendInstallVoicePackRequest = (lang) => { - installedLangs.push(lang); - }; - chrome.readingMode.sendUninstallVoiceRequest = (lang) => { - uninstalledLangs.push(lang); - }; - const notificationListener = { - notify(type: NotificationType, _lang?: string): void { - notificationType = type; - }, - }; - VoiceNotificationManager.getInstance().addListener(notificationListener); + voicePackController.enableLang(lang); + chrome.readingMode.onLanguagePrefChange(lang, true); }); - test('onVoicesChanged after new tts engine installs google locales', () => { - const lang1 = 'bn-bd'; - const lang2 = 'hu-hu'; - const lang3 = 'en'; - voicePackController.enableLang(lang1); - voicePackController.enableLang(lang2); - voicePackController.enableLang(lang3); + test('with lang not marked for download does not install', () => { + voicePackController.updateVoicePackStatus(lang, 'kNotInstalled'); - voicePackController.onTtsEngineInstalled(); - voicePackController.onVoicesChanged(); - - assertArrayEquals(['bn', 'hu'], installedLangs); - assertFalse(voicePackController.hasAvailableVoices()); - }); - - test('onVoicesChanged restores from prefs on first voices received', () => { - const lang = 'uk'; - const name = 'Google Lemur'; - const voice = createSpeechSynthesisVoice({lang, name}); - speech.setVoices([voice]); - chrome.readingMode.getStoredVoice = () => name; - - voicePackController.onVoicesChanged(); - - assertTrue(voicePackController.isLangEnabled(lang)); - assertArrayEquals([voice], voicePackController.getAvailableVoices()); - }); - - test('onVoicesChanged requests info', () => { - const lang1 = 'fi'; - const lang2 = 'id'; - const lang3 = 'da'; - voicePackController.setServerStatus( - lang1, mojoVoicePackStatusToVoicePackStatusEnum('kInstalled')); - voicePackController.setServerStatus( - lang2, mojoVoicePackStatusToVoicePackStatusEnum('kAllocation')); - voicePackController.setServerStatus( - lang3, mojoVoicePackStatusToVoicePackStatusEnum('kNotInstalled')); - - voicePackController.onVoicesChanged(); - - assertArrayEquals([lang1, lang2, lang3], requestInfoLangs); - }); - - test('onVoicesChanged waits for engine timeout', () => { - const lang = 'fi'; - voicePackController.setServerStatus( - lang, mojoVoicePackStatusToVoicePackStatusEnum('kInstalled')); - const mockTimer = new MockTimer(); - mockTimer.install(); - - voicePackController.onVoicesChanged(); - mockTimer.tick(EXTENSION_RESPONSE_TIMEOUT_MS); - mockTimer.uninstall(); - - assertEquals( - NotificationType.GOOGLE_VOICES_UNAVAILABLE, notificationType); - }); - - test( - 'onVoicesChanged does nothing when current voice' + - ' still available', - () => { - const voice = createSpeechSynthesisVoice({lang: 'id', name: 'Dog'}); - speech.setVoices([voice]); - voicePackController.enableLang(voice.lang); - voicePackController.setCurrentVoice(voice); - onCurrentVoiceChange = false; - - voicePackController.onVoicesChanged(); - - assertFalse(onCurrentVoiceChange); - assertEquals(voice, voicePackController.getCurrentVoice()); - }); - - test( - 'onVoicesChanged gets default voice when current' + - ' voice unavailable', - () => { - const voice = - createSpeechSynthesisVoice({lang: 'id', name: 'Google Cat'}); - const defaultVoice = - createSpeechSynthesisVoice({lang: 'id', name: 'Google Komodo'}); - speech.setVoices([defaultVoice]); - voicePackController.enableLang(voice.lang); - voicePackController.setCurrentVoice(voice); - onCurrentVoiceChange = false; - - voicePackController.onVoicesChanged(); - - assertTrue(onCurrentVoiceChange); - assertEquals(defaultVoice, voicePackController.getCurrentVoice()); - }); - - test( - 'stopWaitingForSpeechExtension stops waiting for engine timeout', - () => { - const lang = 'fi'; - voicePackController.setServerStatus( - lang, mojoVoicePackStatusToVoicePackStatusEnum('kInstalled')); - let notificationType = null; - const notificationListener = { - notify(type: NotificationType, _lang?: string): void { - notificationType = type; - }, - }; - VoiceNotificationManager.getInstance().addListener( - notificationListener); - const mockTimer = new MockTimer(); - mockTimer.install(); - - voicePackController.onVoicesChanged(); - voicePackController.stopWaitingForSpeechExtension(); - mockTimer.tick(EXTENSION_RESPONSE_TIMEOUT_MS); - mockTimer.uninstall(); - - // Now download the voice since the speech engine responded. - assertEquals(NotificationType.DOWNLOADING, notificationType); - }); - - test( - 'triggerInstall with lang not marked for download does nothing', () => { - const lang = 'es-es'; - - voicePackController.triggerInstall(lang); - - assertEquals( - VoiceClientSideStatusCode.NOT_INSTALLED, - voicePackController.getLocalStatus(lang)); - assertArrayEquals([], installedLangs); - }); - - test( - 'triggerInstall with lang marked for download requests install', () => { - const lang = 'fil'; - - assertTrue(voicePackController.requestInstall(lang, false)); - voicePackController.triggerInstall(lang); - - assertEquals( - VoiceClientSideStatusCode.SENT_INSTALL_REQUEST, - voicePackController.getLocalStatus(lang)); - assertArrayEquals([lang], installedLangs); - }); - - test('requestInstall with no status, requests install on retry', () => { - const lang = 'ja'; - - assertTrue(voicePackController.requestInstall(lang, true)); - - assertEquals( - VoiceClientSideStatusCode.SENT_INSTALL_REQUEST, - voicePackController.getLocalStatus(lang)); - assertArrayEquals([lang], installedLangs); - }); - - test('requestInstall when not installed, requests info', () => { - const lang = 'ja'; - voicePackController.setServerStatus( - lang, mojoVoicePackStatusToVoicePackStatusEnum('kNotInstalled')); - - assertTrue(voicePackController.requestInstall(lang, true)); - assertArrayEquals([lang], requestInfoLangs); - - voicePackController.triggerInstall(lang); - assertEquals( - VoiceClientSideStatusCode.SENT_INSTALL_REQUEST, - voicePackController.getLocalStatus(lang)); - assertArrayEquals([lang], installedLangs); - }); - - test( - 'requestInstall when previously failed and should retry, retries', - () => { - const lang = 'ja'; - voicePackController.setServerStatus( - lang, mojoVoicePackStatusToVoicePackStatusEnum('kOther')); - - assertTrue(voicePackController.requestInstall(lang, true)); - - assertEquals( - VoiceClientSideStatusCode.SENT_INSTALL_REQUEST_ERROR_RETRY, - voicePackController.getLocalStatus(lang)); - assertArrayEquals([lang], installedLangs); - }); - - test( - 'requestInstall when previously failed and should not retry does' + - 'nothing', - () => { - const lang = 'ja'; - voicePackController.setServerStatus( - lang, mojoVoicePackStatusToVoicePackStatusEnum('kOther')); - - assertFalse(voicePackController.requestInstall(lang, false)); - - assertFalse(!!voicePackController.getLocalStatus(lang)); - assertArrayEquals([], requestInfoLangs); - assertArrayEquals([], installedLangs); - }); - - test('requestInstall and already installing does nothing', () => { - const lang = 'ja'; - voicePackController.setServerStatus( - lang, mojoVoicePackStatusToVoicePackStatusEnum('kInstalling')); - - assertFalse(voicePackController.requestInstall(lang, false)); - - assertFalse(!!voicePackController.getLocalStatus(lang)); - assertArrayEquals([], requestInfoLangs); - assertArrayEquals([], installedLangs); - }); - - test('requestInstall and already installed does nothing', () => { - const lang = 'ja'; - voicePackController.setServerStatus( - lang, mojoVoicePackStatusToVoicePackStatusEnum('kInstalled')); - - assertFalse(voicePackController.requestInstall(lang, false)); - - assertFalse(!!voicePackController.getLocalStatus(lang)); - assertArrayEquals([], requestInfoLangs); - assertArrayEquals([], installedLangs); - }); - - test('uninstall with voice pack lang uninstalls', () => { - const lang = 'km'; - voicePackController.requestInstall(lang, false); - VoiceNotificationManager.getInstance().onVoiceStatusChange( - lang, VoiceClientSideStatusCode.SENT_INSTALL_REQUEST, []); - - voicePackController.uninstall(lang); - assertEquals(NotificationType.NONE, notificationType); - assertArrayEquals([lang], requestInfoLangs); - assertArrayEquals([lang], uninstalledLangs); - - voicePackController.triggerInstall(lang); assertEquals( VoiceClientSideStatusCode.NOT_INSTALLED, voicePackController.getLocalStatus(lang)); assertArrayEquals([], installedLangs); }); - test('uninstall with non voice pack lang does nothing', () => { - const lang = 'zh'; - voicePackController.requestInstall(lang, false); - notificationType = null; + test('with lang marked for download requests install', () => { + chrome.readingMode.baseLanguageForSpeech = lang; + voicePackController.onPageLanguageChanged(); - voicePackController.uninstall(lang); + voicePackController.updateVoicePackStatus(lang, 'kNotInstalled'); - assertFalse(!!notificationType); - assertArrayEquals([], requestInfoLangs); - assertArrayEquals([], uninstalledLangs); - assertArrayEquals([], installedLangs); + assertEquals( + VoiceClientSideStatusCode.SENT_INSTALL_REQUEST, + voicePackController.getLocalStatus(lang)); + const serverStatus = voicePackController.getServerStatus(lang); + assertTrue(!!serverStatus); + assertEquals( + VoicePackServerStatusSuccessCode.NOT_INSTALLED, serverStatus.code); + assertEquals('Successful response', serverStatus.id); + assertArrayEquals([lang], installedLangs); + }); + + test('with no other voices for language, disables language', () => { + setVoices(speech, []); + + voicePackController.updateVoicePackStatus(lang, 'kOther'); + + assertFalse(voicePackController.isLangEnabled(lang)); + assertFalse( + chrome.readingMode.getLanguagesEnabledInPref().includes(lang)); + }); + + // <if expr="is_chromeos"> + test('chromeOS should disable if no google voices', () => { + const lang1 = 'en-US'; + const lang2 = 'fr'; + const lang3 = 'yue'; + voicePackController.enableLang(lang1); + chrome.readingMode.onLanguagePrefChange(lang1.toLowerCase(), true); + voicePackController.enableLang(lang2); + chrome.readingMode.onLanguagePrefChange(lang2, true); + voicePackController.enableLang(lang3); + chrome.readingMode.onLanguagePrefChange(lang3, true); + createAndSetVoices(speech, [ + {lang: lang1, name: 'Henry'}, + {lang: lang2, name: 'Google Thomas'}, + ]); + + voicePackController.updateVoicePackStatus(lang1, 'kOther'); + voicePackController.updateVoicePackStatus(lang2, 'kOther'); + voicePackController.updateVoicePackStatus(lang3, 'kOther'); + + const langsInPrefs = chrome.readingMode.getLanguagesEnabledInPref(); + assertFalse(langsInPrefs.includes(lang1.toLowerCase())); + assertTrue(langsInPrefs.includes(lang2)); + assertFalse(langsInPrefs.includes(lang3)); + assertFalse(voicePackController.isLangEnabled(lang1)); + assertTrue(voicePackController.isLangEnabled(lang2)); + assertFalse(voicePackController.isLangEnabled(lang3)); + }); + // </if> + + // <if expr="not is_chromeos"> + test('desktop should only disable if no voices at all', () => { + const lang1 = 'en-US'; + const lang2 = 'fr'; + const lang3 = 'yue'; + voicePackController.enableLang(lang1); + chrome.readingMode.onLanguagePrefChange(lang1.toLowerCase(), true); + voicePackController.enableLang(lang2); + chrome.readingMode.onLanguagePrefChange(lang2, true); + voicePackController.enableLang(lang3); + chrome.readingMode.onLanguagePrefChange(lang3, true); + createAndSetVoices(speech, [ + {lang: lang1, name: 'Henry'}, + {lang: lang2, name: 'Google Thomas'}, + ]); + onEnabledLangsChange = false; + + voicePackController.updateVoicePackStatus(lang1, 'kOther'); + voicePackController.updateVoicePackStatus(lang2, 'kOther'); + voicePackController.updateVoicePackStatus(lang3, 'kOther'); + + const langsInPrefs = chrome.readingMode.getLanguagesEnabledInPref(); + assertTrue(langsInPrefs.includes(lang1.toLowerCase())); + assertTrue(langsInPrefs.includes(lang2)); + assertFalse(langsInPrefs.includes(lang3), 'lang3 prefs'); + assertTrue(voicePackController.isLangEnabled(lang1)); + assertTrue(voicePackController.isLangEnabled(lang2)); + assertFalse(voicePackController.isLangEnabled(lang3), 'lang3'); + }); + // </if> + + test( + 'when language-pack lang does not match voice lang, still disables it', + () => { + voicePackController.enableLang('it-it'); + setVoices(speech, []); + + voicePackController.updateVoicePackStatus('it', 'kOther'); + + assertFalse(voicePackController.isLangEnabled('it-it'), 'controller'); + assertFalse( + chrome.readingMode.getLanguagesEnabledInPref().includes('it-it'), + 'prefs'); + }); + + test( + 'when language-pack lang does not match voice lang, with ' + + 'e-speak voices, still disables language', + () => { + voicePackController.enableLang('it-it'); + createAndSetVoices(speech, [ + {lang: 'it', name: 'eSpeak Italian '}, + ]); + + voicePackController.updateVoicePackStatus('it', 'kOther'); + + assertFalse(voicePackController.isLangEnabled('it-it')); + assertFalse( + chrome.readingMode.getLanguagesEnabledInPref().includes('it-it')); + }); + + test( + 'and has other Google voices for language, keeps language enabled', + () => { + createAndSetVoices(speech, [ + {lang: lang, name: 'Google Portuguese 1'}, + {lang: lang, name: 'Google Portuguese 2'}, + ]); + voicePackController.updateVoicePackStatus(lang, 'kOther'); + + assertTrue(voicePackController.isLangEnabled(lang), 'controller'); + assertTrue( + chrome.readingMode.getLanguagesEnabledInPref().includes(lang), + 'prefs'); + }); + + test( + 'unavailable if natural voices are in the list for a different lang', + () => { + const lang = 'fr'; + createAndSetVoices(speech, [ + {lang: 'it', name: 'Google Chicken (Natural)'}, + ]); + + voicePackController.updateVoicePackStatus(lang, 'kInstalled'); + + const serverStatus = voicePackController.getServerStatus(lang); + assertTrue(!!serverStatus, 'status is: ' + serverStatus?.id); + assertEquals( + VoicePackServerStatusSuccessCode.INSTALLED, serverStatus.code); + assertEquals('Successful response', serverStatus.id); + assertEquals( + VoiceClientSideStatusCode.INSTALLED_AND_UNAVAILABLE, + voicePackController.getLocalStatus(lang)); + }); + + test( + 'unavailable if system voices are in the list for a different lang', + () => { + const lang = 'de'; + + // Installed 'de' language pack, but the fake available voice list + // only has english voices. + voicePackController.updateVoicePackStatus(lang, 'kInstalled'); + + const serverStatus = voicePackController.getServerStatus(lang); + assertTrue(!!serverStatus); + assertEquals( + VoicePackServerStatusSuccessCode.INSTALLED, serverStatus.code); + assertEquals('Successful response', serverStatus.id); + assertEquals( + VoiceClientSideStatusCode.INSTALLED_AND_UNAVAILABLE, + voicePackController.getLocalStatus(lang)); + }); + + test( + 'unavailable if only system voices are in the list for this lang', + () => { + const lang = 'en'; + + voicePackController.updateVoicePackStatus(lang, 'kInstalled'); + + const serverStatus = voicePackController.getServerStatus(lang); + assertTrue(!!serverStatus); + assertEquals( + VoicePackServerStatusSuccessCode.INSTALLED, serverStatus.code); + assertEquals('Successful response', serverStatus.id); + assertEquals( + VoiceClientSideStatusCode.INSTALLED_AND_UNAVAILABLE, + voicePackController.getLocalStatus(lang)); + }); + + test( + 'available if natural voices are unsupported for this lang and voices' + + ' are available', + () => { + const lang = 'yue'; + createAndSetVoices(speech, [ + {lang: 'yue-hk', name: 'Cantonese'}, + ]); + + voicePackController.updateVoicePackStatus(lang, 'kInstalled'); + + const serverStatus = voicePackController.getServerStatus(lang); + assertTrue(!!serverStatus); + assertEquals( + VoicePackServerStatusSuccessCode.INSTALLED, serverStatus.code); + assertEquals('Successful response', serverStatus.id); + assertEquals( + VoiceClientSideStatusCode.AVAILABLE, + voicePackController.getLocalStatus(lang)); + }); + + test( + 'unavailable if natural voices are unsupported for this lang and ' + + 'voices unavailable', + () => { + const lang = 'yue'; + + voicePackController.updateVoicePackStatus(lang, 'kInstalled'); + + const serverStatus = voicePackController.getServerStatus(lang); + assertTrue(!!serverStatus); + assertEquals( + VoicePackServerStatusSuccessCode.INSTALLED, serverStatus.code); + assertEquals('Successful response', serverStatus.id); + assertEquals( + VoiceClientSideStatusCode.INSTALLED_AND_UNAVAILABLE, + voicePackController.getLocalStatus(lang)); + }); + + test('available if natural voices are installed for this lang', () => { + const lang = 'en-us'; + // set installing status so that the old status is not empty. + voicePackController.updateVoicePackStatus(lang, 'kInstalling'); + // set the voices on speech synthesis without triggering on voices + // changed, so we can verify that updateVoicePackStatus calls it. + createAndSetVoices(speech, [ + {lang: lang, name: 'Wall-e (Natural)'}, + {lang: lang, name: 'Andy (Natural)'}, + ]); + voicePackController.updateVoicePackStatus(lang, 'kInstalled'); + + const serverStatus = voicePackController.getServerStatus(lang); + assertTrue(!!serverStatus); + assertEquals( + VoicePackServerStatusSuccessCode.INSTALLED, serverStatus.code); + assertEquals('Successful response', serverStatus.id); + // This would be INSTALLED_AND_UNAVIALABLE if the voice list wasn't + // refreshed. + assertEquals( + VoiceClientSideStatusCode.AVAILABLE, + voicePackController.getLocalStatus(lang)); + }); + + test( + 'switches to newly available voices if it\'s for the current language', + () => { + const lang = 'en-us'; + chrome.readingMode.baseLanguageForSpeech = lang; + voicePackController.enableLang(lang); + chrome.readingMode.getStoredVoice = () => ''; + createAndSetVoices( + speech, [{lang: lang, name: 'Google Cow (Natural)'}]); + voicePackController.updateVoicePackStatus(lang, 'kInstalled'); + + const selectedVoice = voicePackController.getCurrentVoice(); + assertTrue(!!selectedVoice); + assertEquals(lang, selectedVoice.lang); + assertTrue(selectedVoice.name.includes('Natural')); + }); + + test( + 'does not switch to newly available voices if it\'s not for the ' + + 'current language', + () => { + const installedLang = 'en-us'; + chrome.readingMode.baseLanguageForSpeech = 'pt-br'; + voicePackController.enableLang( + chrome.readingMode.baseLanguageForSpeech); + const currentVoice = createSpeechSynthesisVoice({ + name: 'Portuguese voice 1', + lang: chrome.readingMode.baseLanguageForSpeech, + }); + voicePackController.setCurrentVoice(currentVoice); + chrome.readingMode.getStoredVoice = () => ''; + setVoices(speech, [currentVoice]); + + voicePackController.updateVoicePackStatus( + installedLang, 'kInstalled'); + + // The selected voice should stay the same as it was. + assertEquals(currentVoice, voicePackController.getCurrentVoice()); + }); + + test('with error code marks the status', () => { + const lang = 'en-us'; + + voicePackController.updateVoicePackStatus(lang, 'kOther'); + + const serverStatus = voicePackController.getServerStatus(lang); + assertTrue(!!serverStatus); + assertEquals(serverStatus.code, VoicePackServerStatusErrorCode.OTHER); + assertEquals('Unsuccessful response', serverStatus.id); + assertEquals( + voicePackController.getLocalStatus(lang), + VoiceClientSideStatusCode.ERROR_INSTALLING); }); });
diff --git a/chrome/test/enterprise/e2e/policy/extension_allowlist/extension_allowlist.py b/chrome/test/enterprise/e2e/policy/extension_allowlist/extension_allowlist.py index 44a92dd..3be109b 100644 --- a/chrome/test/enterprise/e2e/policy/extension_allowlist/extension_allowlist.py +++ b/chrome/test/enterprise/e2e/policy/extension_allowlist/extension_allowlist.py
@@ -33,7 +33,7 @@ @test def test_ExtensionAllowlist_hangout(self): - extension = 'nckgahadagoaajjgafhacjanaoiihapd' + extension = 'aapbdbdomjkkjkaonfhkkikfgjllcleb' self.SetPolicy(self.win_config['dc'], r'ExtensionInstallBlocklist\1', '*', 'String') self.SetPolicy(self.win_config['dc'], r'ExtensionInstallAllowlist\1', @@ -42,10 +42,10 @@ logging.info('Allowlist extension install for ' + extension + ' while disabling others') - test_url = 'https://chrome.google.com/webstore/detail/google-hangouts/nckgahadagoaajjgafhacjanaoiihapd' + test_url = 'https://chromewebstore.google.com/detail/google-translate/aapbdbdomjkkjkaonfhkkikfgjllcleb' output = self.installExtension(test_url) - self.assertIn('Not blocked', output) + self.assertIn('Ok', output) - negative_test_url = 'https://chrome.google.com/webstore/detail/grammarly-for-chrome/kbfnbcaeplbcioakkpcpgfkobkghlhen' + negative_test_url = 'https://chromewebstore.google.com/detail/grammarly-ai-writing-and/kbfnbcaeplbcioakkpcpgfkobkghlhen' output = self.installExtension(negative_test_url) self.assertIn('blocked', output)
diff --git a/chrome/test/enterprise/e2e/policy/extension_blocklist/extension_blocklist.py b/chrome/test/enterprise/e2e/policy/extension_blocklist/extension_blocklist.py index f6a3c8b..6440359 100644 --- a/chrome/test/enterprise/e2e/policy/extension_blocklist/extension_blocklist.py +++ b/chrome/test/enterprise/e2e/policy/extension_blocklist/extension_blocklist.py
@@ -39,22 +39,22 @@ self.RunCommand(self.win_config['client'], 'gpupdate /force') logging.info('Disabled extension install for ' + extension) - test_url = 'https://chrome.google.com/webstore/detail/google-hangouts/nckgahadagoaajjgafhacjanaoiihapd' + test_url = 'https://chromewebstore.google.com/detail/google-translate/aapbdbdomjkkjkaonfhkkikfgjllcleb' output = self.installExtension(test_url) self.assertIn('blocked', output) @test def test_ExtensionBlocklist_hangout(self): - extension = 'nckgahadagoaajjgafhacjanaoiihapd' + extension = 'aapbdbdomjkkjkaonfhkkikfgjllcleb' self.SetPolicy(self.win_config['dc'], r'ExtensionInstallBlocklist\1', extension, 'String') self.RunCommand(self.win_config['client'], 'gpupdate /force') logging.info('Disabled extension install for ' + extension) - test_url = 'https://chrome.google.com/webstore/detail/google-hangouts/nckgahadagoaajjgafhacjanaoiihapd' + test_url = 'https://chromewebstore.google.com/detail/google-translate/aapbdbdomjkkjkaonfhkkikfgjllcleb' output = self.installExtension(test_url) self.assertIn('blocked', output) - positive_test_url = 'https://chrome.google.com/webstore/detail/grammarly-for-chrome/kbfnbcaeplbcioakkpcpgfkobkghlhen' + positive_test_url = 'https://chromewebstore.google.com/detail/grammarly-ai-writing-and/kbfnbcaeplbcioakkpcpgfkobkghlhen' output = self.installExtension(positive_test_url) - self.assertIn('Not blocked', output) + self.assertIn('Ok', output)
diff --git a/chrome/test/enterprise/e2e/policy/install_extension.py b/chrome/test/enterprise/e2e/policy/install_extension.py index faf85626..a39f950 100644 --- a/chrome/test/enterprise/e2e/policy/install_extension.py +++ b/chrome/test/enterprise/e2e/policy/install_extension.py
@@ -31,16 +31,13 @@ time.sleep(5) try: - driver.find_element(By.XPATH, - "//div[@aria-label='Blocked by admin']").click() - app.top_window() \ - .child_window(title_re='.*Your admin has blocked', - control_type="TitleBar") \ - .print_control_identifiers() + driver.find_element( + By.XPATH, "//div[contains(., 'Your admin has blocked this item')]") + print("blocked") except NoSuchElementException: - print("Not blocked") + print("Ok") except ElementNotFoundError: - print("Not blocked") + print("Ok") finally: driver.quit()
diff --git a/chrome/test/media_router/media_router_integration_ui_browsertest.cc b/chrome/test/media_router/media_router_integration_ui_browsertest.cc index 1d02c82..054d6cec 100644 --- a/chrome/test/media_router/media_router_integration_ui_browsertest.cc +++ b/chrome/test/media_router/media_router_integration_ui_browsertest.cc
@@ -35,39 +35,6 @@ EXPECT_FALSE(test_ui_->IsDialogShown()); test_ui_->ShowDialog(); test_ui_->WaitForSinkAvailable(receiver_); - - // NOTE: There is no status or issue text for the GMC button. - // TODO(issuetracker.google.com/388289776): re-enable once the GMC test - // UI supports stopping a cast session. - // test_ui_->StopCasting(receiver_); - // WaitUntilNoRoutes(GetActiveWebContents()); -} - -IN_PROC_BROWSER_TEST_F(MediaRouterIntegrationBrowserTest, - MANUAL_Dialog_RouteCreationTimedOut) { - const base::TimeDelta route_creation_timeout = - GetRouteRequestTimeout(PRESENTATION); - test_provider_->set_delay(route_creation_timeout); - OpenTestPage(FILE_PATH_LITERAL("basic_test.html")); - - // The video needs to be playing before the GMC button will show up. - content::WebContents* web_contents = GetActiveWebContents(); - ASSERT_TRUE(web_contents); - ExecuteJavaScriptAPI(web_contents, "playVideo();"); - - test_ui_->ShowDialog(); - test_ui_->WaitForSinkAvailable(receiver_); - - const auto start_time = base::TimeTicks::Now(); - test_ui_->StartCasting(receiver_); - - // TODO(issuetracker.google.com/388289776): once we can observe the dialog - // state, we should be able to actually wait for the timeout and then - // ensure it took a reasonable amount of time to fail. - test_ui_->WaitForAnyIssue(); - - const base::TimeDelta elapsed = base::TimeTicks::Now() - start_time; - EXPECT_GT(elapsed, base::TimeDelta::Min()); } } // namespace media_router
diff --git a/chrome/updater/test/integration_test_commands.h b/chrome/updater/test/integration_test_commands.h index b0c66db..5b9bf52 100644 --- a/chrome/updater/test/integration_test_commands.h +++ b/chrome/updater/test/integration_test_commands.h
@@ -217,7 +217,9 @@ virtual void ExpectLastStarted() const = 0; virtual void UninstallApp(const std::string& app_id) const = 0; virtual void RunOfflineInstall(bool is_legacy_install, - bool is_silent_install) = 0; + bool is_silent_install, + int installer_result, + int installer_error) = 0; virtual void RunOfflineInstallOsNotSupported(bool is_legacy_install, bool is_silent_install, const std::string& language) = 0;
diff --git a/chrome/updater/test/integration_test_commands_system.cc b/chrome/updater/test/integration_test_commands_system.cc index 980582e..77c3a43 100644 --- a/chrome/updater/test/integration_test_commands_system.cc +++ b/chrome/updater/test/integration_test_commands_system.cc
@@ -594,10 +594,14 @@ } void RunOfflineInstall(bool is_legacy_install, - bool is_silent_install) override { + bool is_silent_install, + int installer_result, + int installer_error) override { RunCommand("run_offline_install", {Param("legacy_install", BoolToString(is_legacy_install)), - Param("silent", BoolToString(is_silent_install))}); + Param("silent", BoolToString(is_silent_install)), + Param("installer_result", base::ToString(installer_result)), + Param("installer_error", base::ToString(installer_error))}); } void RunOfflineInstallOsNotSupported(bool is_legacy_install,
diff --git a/chrome/updater/test/integration_test_commands_user.cc b/chrome/updater/test/integration_test_commands_user.cc index 3009aaa..13ee78bf 100644 --- a/chrome/updater/test/integration_test_commands_user.cc +++ b/chrome/updater/test/integration_test_commands_user.cc
@@ -488,9 +488,12 @@ } void RunOfflineInstall(bool is_legacy_install, - bool is_silent_install) override { + bool is_silent_install, + int installer_result, + int installer_error) override { updater::test::RunOfflineInstall(updater_scope_, is_legacy_install, - is_silent_install); + is_silent_install, installer_result, + installer_error); } void RunOfflineInstallOsNotSupported(bool is_legacy_install,
diff --git a/chrome/updater/test/integration_tests.cc b/chrome/updater/test/integration_tests.cc index 49635df..436ab35 100644 --- a/chrome/updater/test/integration_tests.cc +++ b/chrome/updater/test/integration_tests.cc
@@ -200,6 +200,20 @@ } #if BUILDFLAG(IS_WIN) +void ExpectAppErrorEvent(ScopedServer& test_server, + const std::string& app_id, + const int error_code, + const int event_type) { + test_server.ExpectOnce({request::GetPathMatcher(test_server.update_path()), + request::GetUpdaterUserAgentMatcher(), + request::GetContentMatcher({base::StringPrintf( + R"(.*"appid":"%s",.*)" + R"(.*"errorcode":%d,)" + R"("eventresult":0,"eventtype":%d,.*)", + app_id, error_code, event_type)})}, + ")]}'\n"); +} + void ExpectUninstallPingPreviousVersion(ScopedServer& test_server, const base::Version& previous_version) { test_server.ExpectOnce( @@ -820,8 +834,12 @@ void ExpectLastStarted() { test_commands_->ExpectLastStarted(); } - void RunOfflineInstall(bool is_legacy_install, bool is_silent_install) { - test_commands_->RunOfflineInstall(is_legacy_install, is_silent_install); + void RunOfflineInstall(bool is_legacy_install, + bool is_silent_install, + int installer_result = 0, + int installer_error = 0) { + test_commands_->RunOfflineInstall(is_legacy_install, is_silent_install, + installer_result, installer_error); } void RunOfflineInstallOsNotSupported(bool is_legacy_install, @@ -5126,6 +5144,26 @@ ASSERT_NO_FATAL_FAILURE(Uninstall()); } +TEST_F(IntegrationTest, OfflineInstallerError) { + ScopedServer test_server(test_commands_); + ExpectInstallEvent(test_server, kUpdaterAppId); + ASSERT_NO_FATAL_FAILURE(Install({kEnableCecaExperimentSwitch})); + ASSERT_NO_FATAL_FAILURE(ExpectInstalled()); + + // The install fails, and an error ping is sent. + ExpectAppErrorEvent(test_server, + /*app_id=*/"{CDABE316-39CD-43BA-8440-6D1E0547AEE6}", + /*error_code=*/99, + /*event_type=*/2); + ASSERT_NO_FATAL_FAILURE(RunOfflineInstall(/*is_legacy_install=*/false, + /*is_silent_install=*/true, + /*installer_result=*/1, + /*installer_error=*/99)); + + ASSERT_NO_FATAL_FAILURE(ExpectUninstallPing(&test_server)); + ASSERT_NO_FATAL_FAILURE(Uninstall()); +} + class IntegrationOfflineInstallOsNotSupportedTest : public ::testing::WithParamInterface<std::string>, public IntegrationTest {
diff --git a/chrome/updater/test/integration_tests_helper.cc b/chrome/updater/test/integration_tests_helper.cc index a552a22..0ad6b111 100644 --- a/chrome/updater/test/integration_tests_helper.cc +++ b/chrome/updater/test/integration_tests_helper.cc
@@ -490,9 +490,13 @@ {"expect_last_checked", WithSystemScope(Wrap(&ExpectLastChecked))}, {"expect_last_started", WithSystemScope(Wrap(&ExpectLastStarted))}, {"run_offline_install", - WithSwitch("silent", - WithSwitch("legacy_install", - WithSystemScope(Wrap(&RunOfflineInstall))))}, + WithSwitch( + "installer_error", + WithSwitch("installer_result", + WithSwitch("silent", + WithSwitch("legacy_install", + WithSystemScope(Wrap( + &RunOfflineInstall))))))}, {"run_offline_install_os_not_supported", WithSwitch( "language",
diff --git a/chrome/updater/test/integration_tests_impl.cc b/chrome/updater/test/integration_tests_impl.cc index 21074cd9..1f34f88 100644 --- a/chrome/updater/test/integration_tests_impl.cc +++ b/chrome/updater/test/integration_tests_impl.cc
@@ -1764,7 +1764,9 @@ #if !BUILDFLAG(IS_WIN) void RunOfflineInstall(UpdaterScope scope, bool is_legacy_install, - bool is_silent_install) { + bool is_silent_install, + int installer_result, + int installer_error) { ADD_FAILURE(); }
diff --git a/chrome/updater/test/integration_tests_impl.h b/chrome/updater/test/integration_tests_impl.h index 200e007..7e87277 100644 --- a/chrome/updater/test/integration_tests_impl.h +++ b/chrome/updater/test/integration_tests_impl.h
@@ -510,7 +510,9 @@ void RunOfflineInstall(UpdaterScope scope, bool is_legacy_install, - bool is_silent_install); + bool is_silent_install, + int installer_result, + int installer_error); void RunOfflineInstallOsNotSupported(UpdaterScope scope, bool is_legacy_install,
diff --git a/chrome/updater/test/integration_tests_win.cc b/chrome/updater/test/integration_tests_win.cc index 82b75a2..42870d7 100644 --- a/chrome/updater/test/integration_tests_win.cc +++ b/chrome/updater/test/integration_tests_win.cc
@@ -41,6 +41,7 @@ #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "base/strings/sys_string_conversions.h" +#include "base/strings/to_string.h" #include "base/strings/utf_string_conversions.h" #include "base/synchronization/waitable_event.h" #include "base/task/task_traits.h" @@ -532,6 +533,8 @@ void RunOfflineInstallWithManifest(UpdaterScope scope, bool is_legacy_install, bool is_silent_install, + int installer_result, + int installer_error, base::cstring_view platform, int string_resource_id_to_find, const std::string& language, @@ -586,23 +589,30 @@ IsElevatedWithUACOn() ? kTestEventToSignalIfMediumIntegrity : kTestEventToSignal, event_holder.name); - std::vector<std::string> commands; - const struct { + + struct RegItems { const std::string subkey; const char* value_name; const char* type; const std::string value; - } reg_items[] = { - {base::WideToUTF8(app_clients_key), "pv", "REG_SZ", - kTestPV.GetString()}, - {app_client_state_key_utf8, "InstallerResult", "REG_DWORD", "0"}, - {app_client_state_key_utf8, "InstallerError", "REG_DWORD", "0"}, + }; + std::vector<RegItems> reg_items = { + {app_client_state_key_utf8, "InstallerResult", "REG_DWORD", + base::ToString(installer_result)}, + {app_client_state_key_utf8, "InstallerError", "REG_DWORD", + base::ToString(installer_error)}, {app_client_state_key_utf8, "InstallerExtraCode1", "REG_DWORD", "0"}, {app_client_state_key_utf8, "InstallerResultUIString", "REG_SZ", "CoolApp"}, {app_client_state_key_utf8, "InstallerSuccessLaunchCmdLine", "REG_SZ", base::WideToUTF8(post_install_cmd.GetCommandLineString())}, }; + if (expect_success) { + reg_items.push_back({base::WideToUTF8(app_clients_key), "pv", "REG_SZ", + kTestPV.GetString()}); + } + + std::vector<std::string> commands; for (const auto& reg_item : reg_items) { commands.push_back(base::StringPrintf( "REG.exe ADD \"%s\\%s\" /v %s /t %s /d %s /f /reg:32", @@ -675,22 +685,19 @@ nullptr) ->GetProductVersion(base::WideToUTF8(kTestAppID)); - base::win::RegKey key; - LONG registry_result = - key.Open(root, app_client_state_key.c_str(), Wow6432(KEY_QUERY_VALUE)); - + EXPECT_EQ(expect_success, pv.IsValid() && pv > base::Version(kNullVersion)); if (!expect_success) { - EXPECT_EQ(registry_result, ERROR_FILE_NOT_FOUND); - EXPECT_FALSE(pv.IsValid()); return; } - EXPECT_EQ(registry_result, ERROR_SUCCESS); - // Updater should have written "pv". - ASSERT_TRUE(pv.IsValid()); EXPECT_EQ(pv, kTestPV); + base::win::RegKey key; + EXPECT_EQ( + key.Open(root, app_client_state_key.c_str(), Wow6432(KEY_QUERY_VALUE)), + ERROR_SUCCESS); + // Check for expected installer result API reg values. base::win::RegKey updater_key(root, UPDATER_KEY, Wow6432(KEY_QUERY_VALUE)); ASSERT_TRUE(updater_key.Valid()); @@ -2065,10 +2072,13 @@ void RunOfflineInstall(UpdaterScope scope, bool is_legacy_install, - bool is_silent_install) { + bool is_silent_install, + int installer_result, + int installer_error) { RunOfflineInstallWithManifest(scope, is_legacy_install, is_silent_install, - "win", IDS_BUNDLE_INSTALLED_SUCCESSFULLY_BASE, - "en", true); + installer_result, installer_error, "win", + IDS_BUNDLE_INSTALLED_SUCCESSFULLY_BASE, "en", + !installer_result); } void RunOfflineInstallOsNotSupported(UpdaterScope scope, @@ -2076,6 +2086,7 @@ bool is_silent_install, const std::string& language) { RunOfflineInstallWithManifest(scope, is_legacy_install, is_silent_install, + /*installer_result=*/0, /*installer_error=*/0, "minix", IDS_UPDATER_OS_NOT_SUPPORTED_BASE, language, false); }
diff --git a/chromecast/app/cast_main_delegate.cc b/chromecast/app/cast_main_delegate.cc index 813a1ab..c40335d 100644 --- a/chromecast/app/cast_main_delegate.cc +++ b/chromecast/app/cast_main_delegate.cc
@@ -41,7 +41,9 @@ #if BUILDFLAG(IS_ANDROID) #include "base/android/apk_assets.h" +#include "base/android/java_exception_reporter.h" #include "chromecast/app/android/cast_crash_reporter_client_android.h" +#include "components/crash/core/app/crashpad.h" #include "ui/base/resource/resource_bundle_android.h" #elif BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) #include "chromecast/app/linux/cast_crash_reporter_client.h" @@ -50,14 +52,6 @@ namespace { -#if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) -chromecast::CastCrashReporterClient* GetCastCrashReporter() { - static base::NoDestructor<chromecast::CastCrashReporterClient> - crash_reporter_client; - return crash_reporter_client.get(); -} -#endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) - #if BUILDFLAG(IS_ANDROID) const int kMaxCrashFiles = 10; #endif // BUILDFLAG(IS_ANDROID) @@ -179,18 +173,27 @@ bool enable_crash_reporter = !command_line->HasSwitch(switches::kDisableCrashReporter); if (enable_crash_reporter) { +#if BUILDFLAG(IS_ANDROID) + static base::NoDestructor<chromecast::CastCrashReporterClientAndroid> + crash_reporter_client(process_type); +#else + static base::NoDestructor<CastCrashReporterClient> crash_reporter_client; +#endif + crash_reporter::SetCrashReporterClient(crash_reporter_client.get()); + // TODO(crbug.com/40188745): Complete crash reporting integration on // Fuchsia. #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) - crash_reporter::SetCrashReporterClient(GetCastCrashReporter()); - if (process_type != switches::kZygoteProcess) { CastCrashReporterClient::InitCrashReporter(process_type); } - crash_reporter::InitializeCrashKeys(); #endif // BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) +#if BUILDFLAG(IS_ANDROID) + crash_reporter::InitializeCrashpad(process_type.empty(), process_type); + base::android::InitJavaExceptionReporter(); +#endif + crash_reporter::InitializeCrashKeys(); } - InitializeResourceBundle(); }
diff --git a/clank b/clank index cd91ca7..af42a48a 160000 --- a/clank +++ b/clank
@@ -1 +1 @@ -Subproject commit cd91ca753ee2e6e286a4af500e3246a02e62fd94 +Subproject commit af42a48a53e7717ae26d7cd6e90195216fb9fe51
diff --git a/components/android_autofill/browser/java/src/org/chromium/components/autofill/AutofillHintsService.java b/components/android_autofill/browser/java/src/org/chromium/components/autofill/AutofillHintsService.java index c052001..5a4e12c 100644 --- a/components/android_autofill/browser/java/src/org/chromium/components/autofill/AutofillHintsService.java +++ b/components/android_autofill/browser/java/src/org/chromium/components/autofill/AutofillHintsService.java
@@ -54,7 +54,7 @@ } } - private IAutofillHintsService.Stub mBinder; + private final IAutofillHintsService.Stub mBinder; private @Nullable IViewTypeCallback mCallback; private @Nullable List<ViewType> mUnsentViewTypes; }
diff --git a/components/android_autofill/browser/java/src/org/chromium/components/autofill/AutofillManagerWrapper.java b/components/android_autofill/browser/java/src/org/chromium/components/autofill/AutofillManagerWrapper.java index c71600f..55e7d30 100644 --- a/components/android_autofill/browser/java/src/org/chromium/components/autofill/AutofillManagerWrapper.java +++ b/components/android_autofill/browser/java/src/org/chromium/components/autofill/AutofillManagerWrapper.java
@@ -46,7 +46,7 @@ } private static class AutofillInputUiMonitor extends AutofillManager.AutofillCallback { - private WeakReference<AutofillManagerWrapper> mManager; + private final WeakReference<AutofillManagerWrapper> mManager; public AutofillInputUiMonitor(AutofillManagerWrapper manager) { mManager = new WeakReference<>(manager);
diff --git a/components/android_autofill/browser/java/src/org/chromium/components/autofill/AutofillRequest.java b/components/android_autofill/browser/java/src/org/chromium/components/autofill/AutofillRequest.java index 72b6dc3a..4c42af3 100644 --- a/components/android_autofill/browser/java/src/org/chromium/components/autofill/AutofillRequest.java +++ b/components/android_autofill/browser/java/src/org/chromium/components/autofill/AutofillRequest.java
@@ -39,7 +39,7 @@ private static final String TAG = "AutofillRequest"; - private FormData mFormData; + private final FormData mFormData; private @Nullable FocusField mFocusField; private @Nullable AutofillHintsService mAutofillHintsService;
diff --git a/components/android_autofill/browser/java/src/org/chromium/components/autofill_public/ViewType.java b/components/android_autofill/browser/java/src/org/chromium/components/autofill_public/ViewType.java index e2ab153..90d2030 100644 --- a/components/android_autofill/browser/java/src/org/chromium/components/autofill_public/ViewType.java +++ b/components/android_autofill/browser/java/src/org/chromium/components/autofill_public/ViewType.java
@@ -31,7 +31,7 @@ /** The type computed overall type. The valid types are the same as for mServerType. */ public final String mComputedType; - private String[] mServerPredictions; + private final String[] mServerPredictions; public static final Parcelable.Creator<ViewType> CREATOR = new Parcelable.Creator<ViewType>() {
diff --git a/components/android_autofill/browser/junit/src/org/chromium/components/autofill/AutofillProviderTest.java b/components/android_autofill/browser/junit/src/org/chromium/components/autofill/AutofillProviderTest.java index 665e2836..13e55c0 100644 --- a/components/android_autofill/browser/junit/src/org/chromium/components/autofill/AutofillProviderTest.java +++ b/components/android_autofill/browser/junit/src/org/chromium/components/autofill/AutofillProviderTest.java
@@ -71,7 +71,7 @@ private ViewGroup mContainerView; private AutofillProvider mAutofillProvider; private DisplayAndroid mDisplayAndroid; - private long mMockedNativeAndroidAutofillProvider = 1; + private final long mMockedNativeAndroidAutofillProvider = 1; // Virtual Id of the field with focus. private int mFocusVirtualId;
diff --git a/components/android_autofill/browser/junit/src/org/chromium/components/autofill/AutofillSessionUMATest.java b/components/android_autofill/browser/junit/src/org/chromium/components/autofill/AutofillSessionUMATest.java index 15ab97e3..27801c66 100644 --- a/components/android_autofill/browser/junit/src/org/chromium/components/autofill/AutofillSessionUMATest.java +++ b/components/android_autofill/browser/junit/src/org/chromium/components/autofill/AutofillSessionUMATest.java
@@ -38,7 +38,7 @@ /** Testing parameters. */ public static class AutofillSessionParams implements ParameterProvider { - private static List<ParameterSet> sParams = + private static final List<ParameterSet> sParams = Arrays.asList( new ParameterSet().value(NO_SUGGESTION).name(NO_SUGGESTION), new ParameterSet()
diff --git a/components/android_autofill/browser/test_support/java/src/org/chromium/components/autofill/AutofillHintsServiceTestHelper.java b/components/android_autofill/browser/test_support/java/src/org/chromium/components/autofill/AutofillHintsServiceTestHelper.java index 281df8a..4220b84 100644 --- a/components/android_autofill/browser/test_support/java/src/org/chromium/components/autofill/AutofillHintsServiceTestHelper.java +++ b/components/android_autofill/browser/test_support/java/src/org/chromium/components/autofill/AutofillHintsServiceTestHelper.java
@@ -19,7 +19,7 @@ IAutofillHintsService.Stub.asInterface(binder).registerViewTypeCallback(getBinder()); } - private IViewTypeCallback.Stub mBinder = + private final IViewTypeCallback.Stub mBinder = new IViewTypeCallback.Stub() { @Override public void onViewTypeAvailable(List<ViewType> viewTypeList) { @@ -36,7 +36,7 @@ private List<ViewType> mViewTypeList; private boolean mQueryFailed; - private CallbackHelper mCallbackHelper = new CallbackHelper(); + private final CallbackHelper mCallbackHelper = new CallbackHelper(); public IViewTypeCallback getBinder() { return mBinder;
diff --git a/components/android_autofill/browser/test_support/java/src/org/chromium/components/autofill/TestViewStructure.java b/components/android_autofill/browser/test_support/java/src/org/chromium/components/autofill/TestViewStructure.java index ad28768..bf84788 100644 --- a/components/android_autofill/browser/test_support/java/src/org/chromium/components/autofill/TestViewStructure.java +++ b/components/android_autofill/browser/test_support/java/src/org/chromium/components/autofill/TestViewStructure.java
@@ -22,8 +22,8 @@ public class TestViewStructure extends ViewStructure { /** Test implementation of {@link HtmlInfo}. */ public static class TestHtmlInfo extends HtmlInfo { - private String mTag; - private List<Pair<String, String>> mAttributes; + private final String mTag; + private final List<Pair<String, String>> mAttributes; public TestHtmlInfo(String tag, List<Pair<String, String>> attributes) { mTag = tag; @@ -52,8 +52,8 @@ /** Test implementation of {@link HtmlInfo.Builder}. */ public static class TestBuilder extends HtmlInfo.Builder { - private String mTag; - private ArrayList<Pair<String, String>> mAttributes; + private final String mTag; + private final ArrayList<Pair<String, String>> mAttributes; public TestBuilder(String tag) { mTag = tag; @@ -379,7 +379,7 @@ private String mClassName; private String mWebDomain; private int mChildCount; - private ArrayList<TestViewStructure> mChildren; + private final ArrayList<TestViewStructure> mChildren; private CharSequence[] mAutofillOptions; private AutofillValue mAutofillValue; private boolean mDataIsSensitive;
diff --git a/components/autofill/android/java/src/org/chromium/components/autofill/AutofillAddressEditorUiInfo.java b/components/autofill/android/java/src/org/chromium/components/autofill/AutofillAddressEditorUiInfo.java index 0912ffe..7d42e170f 100644 --- a/components/autofill/android/java/src/org/chromium/components/autofill/AutofillAddressEditorUiInfo.java +++ b/components/autofill/android/java/src/org/chromium/components/autofill/AutofillAddressEditorUiInfo.java
@@ -16,8 +16,8 @@ @NullMarked public class AutofillAddressEditorUiInfo { - private String mBestLanguageTag; - private List<AutofillAddressUiComponent> mComponents; + private final String mBestLanguageTag; + private final List<AutofillAddressUiComponent> mComponents; @CalledByNative public AutofillAddressEditorUiInfo(
diff --git a/components/autofill/android/java/src/org/chromium/components/autofill/AutofillProfile.java b/components/autofill/android/java/src/org/chromium/components/autofill/AutofillProfile.java index 707d23c..1e587f2 100644 --- a/components/autofill/android/java/src/org/chromium/components/autofill/AutofillProfile.java +++ b/components/autofill/android/java/src/org/chromium/components/autofill/AutofillProfile.java
@@ -29,7 +29,7 @@ public class AutofillProfile { private String mGUID; private @RecordType int mRecordType; - private Map<Integer, ValueWithStatus> mFields; + private final Map<Integer, ValueWithStatus> mFields; private @Nullable String mLabel; private String mLanguageCode;
diff --git a/components/autofill/android/java/src/org/chromium/components/autofill/EditableOption.java b/components/autofill/android/java/src/org/chromium/components/autofill/EditableOption.java index 90014c1..29e9f78 100644 --- a/components/autofill/android/java/src/org/chromium/components/autofill/EditableOption.java +++ b/components/autofill/android/java/src/org/chromium/components/autofill/EditableOption.java
@@ -27,7 +27,7 @@ protected @Nullable String mPromoMessage; private @Nullable String mId; private @Nullable Drawable mIcon; - private @Nullable String[] mLabels = {null, null, null}; + private final @Nullable String[] mLabels = {null, null, null}; private boolean mIsValid = true; /** See {@link #EditableOption(String, String, String, String, int)}. */
diff --git a/components/autofill/android/java/src/org/chromium/components/autofill/LoyaltyCard.java b/components/autofill/android/java/src/org/chromium/components/autofill/LoyaltyCard.java index e6a0901b..b31cafc 100644 --- a/components/autofill/android/java/src/org/chromium/components/autofill/LoyaltyCard.java +++ b/components/autofill/android/java/src/org/chromium/components/autofill/LoyaltyCard.java
@@ -17,12 +17,12 @@ @JNINamespace("autofill") @NullMarked public class LoyaltyCard { - private String mLoyaltyCardId; - private String mMerchantName; - private String mProgramName; - private GURL mProgramLogo; - private String mLoyaltyCardNumber; - private List<GURL> mMerchantDomains; + private final String mLoyaltyCardId; + private final String mMerchantName; + private final String mProgramName; + private final GURL mProgramLogo; + private final String mLoyaltyCardNumber; + private final List<GURL> mMerchantDomains; @CalledByNative public LoyaltyCard(
diff --git a/components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler/TaskInfo.java b/components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler/TaskInfo.java index 25f7b02..0f4fd8d 100644 --- a/components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler/TaskInfo.java +++ b/components/background_task_scheduler/android/java/src/org/chromium/components/background_task_scheduler/TaskInfo.java
@@ -576,7 +576,7 @@ private boolean mUserInitiated; private boolean mIsPersisted; private boolean mUpdateCurrent; - private TimingInfo mTimingInfo; + private final TimingInfo mTimingInfo; Builder(int taskId, TimingInfo timingInfo) { mTaskId = taskId;
diff --git a/components/background_task_scheduler/internal/android/java/src/org/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerImpl.java b/components/background_task_scheduler/internal/android/java/src/org/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerImpl.java index 862964a..8408d82 100644 --- a/components/background_task_scheduler/internal/android/java/src/org/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerImpl.java +++ b/components/background_task_scheduler/internal/android/java/src/org/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerImpl.java
@@ -59,8 +59,8 @@ } private class SchedulingVisitor implements TaskInfo.TimingInfoVisitor { - private Context mContext; - private TaskInfo mTaskInfo; + private final Context mContext; + private final TaskInfo mTaskInfo; private boolean mSuccess; SchedulingVisitor(Context context, TaskInfo taskInfo) {
diff --git a/components/background_task_scheduler/internal/android/java/src/org/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerJobServiceTest.java b/components/background_task_scheduler/internal/android/java/src/org/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerJobServiceTest.java index 8e92ed66..d0e70d3 100644 --- a/components/background_task_scheduler/internal/android/java/src/org/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerJobServiceTest.java +++ b/components/background_task_scheduler/internal/android/java/src/org/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerJobServiceTest.java
@@ -31,7 +31,7 @@ private static final long END_TIME_WITH_DEADLINE_MS = TIME_200_MIN_TO_MS + BackgroundTaskSchedulerJobService.DEADLINE_DELTA_MS; - private BackgroundTaskSchedulerJobService.Clock mClock = () -> CLOCK_TIME_MS; + private final BackgroundTaskSchedulerJobService.Clock mClock = () -> CLOCK_TIME_MS; @Before public void setUp() {
diff --git a/components/background_task_scheduler/internal/android/java/src/org/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerUma.java b/components/background_task_scheduler/internal/android/java/src/org/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerUma.java index 2ebb490..c17a6bb 100644 --- a/components/background_task_scheduler/internal/android/java/src/org/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerUma.java +++ b/components/background_task_scheduler/internal/android/java/src/org/chromium/components/background_task_scheduler/internal/BackgroundTaskSchedulerUma.java
@@ -30,8 +30,8 @@ private static class CachedUmaEntry { private static final String SEPARATOR = ":"; - private String mEvent; - private int mValue; + private final String mEvent; + private final int mValue; private int mCount; /**
diff --git a/components/background_task_scheduler/internal/android/junit/src/org/chromium/components/background_task_scheduler/internal/BackgroundTaskJobServiceTest.java b/components/background_task_scheduler/internal/android/junit/src/org/chromium/components/background_task_scheduler/internal/BackgroundTaskJobServiceTest.java index 95101f83..417c733 100644 --- a/components/background_task_scheduler/internal/android/junit/src/org/chromium/components/background_task_scheduler/internal/BackgroundTaskJobServiceTest.java +++ b/components/background_task_scheduler/internal/android/junit/src/org/chromium/components/background_task_scheduler/internal/BackgroundTaskJobServiceTest.java
@@ -39,8 +39,8 @@ @RunWith(BaseRobolectricTestRunner.class) @Config(manifest = Config.NONE, sdk = Build.VERSION_CODES.S) public class BackgroundTaskJobServiceTest { - private static BackgroundTaskSchedulerJobService.Clock sClock = () -> 1415926535000L; - private static BackgroundTaskSchedulerJobService.Clock sZeroClock = () -> 0L; + private static final BackgroundTaskSchedulerJobService.Clock sClock = () -> 1415926535000L; + private static final BackgroundTaskSchedulerJobService.Clock sZeroClock = () -> 0L; @Mock private BackgroundTaskSchedulerDelegate mDelegate; @Mock private BackgroundTaskSchedulerUma mBackgroundTaskSchedulerUma; @Mock private BackgroundTaskSchedulerImpl mBackgroundTaskSchedulerImpl; @@ -262,7 +262,7 @@ } public static class FakeBackgroundTaskFactory implements BackgroundTaskFactory { - private BackgroundTask mFakeBackgroundTask; + private final BackgroundTask mFakeBackgroundTask; FakeBackgroundTaskFactory(BackgroundTask fakeBackgroundTask) { mFakeBackgroundTask = fakeBackgroundTask;
diff --git a/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/PageZoomCoordinator.java b/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/PageZoomCoordinator.java index d4cb5f0..ca8a3d7 100644 --- a/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/PageZoomCoordinator.java +++ b/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/PageZoomCoordinator.java
@@ -37,7 +37,7 @@ private @Nullable WebContentsObserver mWebContentsObserver; private int mBottomControlsOffset; - private Runnable mDismissalCallback; + private final Runnable mDismissalCallback; private @Nullable View mView; private @Nullable BrowserContextHandle mBrowserContextHandle;
diff --git a/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/PageZoomUma.java b/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/PageZoomUma.java index c86ce54..7ea2e65 100644 --- a/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/PageZoomUma.java +++ b/components/browser_ui/accessibility/android/java/src/org/chromium/components/browser_ui/accessibility/PageZoomUma.java
@@ -13,9 +13,12 @@ /** Centralizes UMA data collection for Page Zoom. */ @NullMarked public class PageZoomUma { - private static int sMinZoomValue = (int) (PageZoomUtils.PAGE_ZOOM_MINIMUM_ZOOM_LEVEL * 100); - private static int sMaxZoomValue = (int) (PageZoomUtils.PAGE_ZOOM_MAXIMUM_ZOOM_LEVEL * 100); - private static int sZoomValueBucketCount = (int) ((sMaxZoomValue - sMinZoomValue) / 5) + 2; + private static final int sMinZoomValue = + (int) (PageZoomUtils.PAGE_ZOOM_MINIMUM_ZOOM_LEVEL * 100); + private static final int sMaxZoomValue = + (int) (PageZoomUtils.PAGE_ZOOM_MAXIMUM_ZOOM_LEVEL * 100); + private static final int sZoomValueBucketCount = + (int) ((sMaxZoomValue - sMinZoomValue) / 5) + 2; // AccessibilityPageZoomAppMenuEnabledState defined in // tools/metrics/histograms/metadata/accessibility/enums.xml.
diff --git a/components/browser_ui/bottomsheet/android/internal/java/src/org/chromium/components/browser_ui/bottomsheet/BottomSheet.java b/components/browser_ui/bottomsheet/android/internal/java/src/org/chromium/components/browser_ui/bottomsheet/BottomSheet.java index a588378..7ffc2af 100644 --- a/components/browser_ui/bottomsheet/android/internal/java/src/org/chromium/components/browser_ui/bottomsheet/BottomSheet.java +++ b/components/browser_ui/bottomsheet/android/internal/java/src/org/chromium/components/browser_ui/bottomsheet/BottomSheet.java
@@ -101,7 +101,7 @@ private ViewGroup mSheetContainer; /** For detecting scroll and fling events on the bottom sheet. */ - private BottomSheetSwipeDetector mGestureDetector; + private final BottomSheetSwipeDetector mGestureDetector; /** The animator used to move the sheet to a fixed state when released by the user. */ private @Nullable ValueAnimator mSettleAnimator; @@ -175,7 +175,7 @@ */ public static class ShadowLayerView extends View { /** The length of the shadow in any direction. */ - private int mShadowLength; + private final int mShadowLength; /** Constructor to inflate from XML. */ public ShadowLayerView(Context context, AttributeSet atts) {
diff --git a/components/browser_ui/bottomsheet/android/internal/java/src/org/chromium/components/browser_ui/bottomsheet/BottomSheetSwipeDetector.java b/components/browser_ui/bottomsheet/android/internal/java/src/org/chromium/components/browser_ui/bottomsheet/BottomSheetSwipeDetector.java index cd4a482..6f7ebc8 100644 --- a/components/browser_ui/bottomsheet/android/internal/java/src/org/chromium/components/browser_ui/bottomsheet/BottomSheetSwipeDetector.java +++ b/components/browser_ui/bottomsheet/android/internal/java/src/org/chromium/components/browser_ui/bottomsheet/BottomSheetSwipeDetector.java
@@ -41,7 +41,7 @@ private final SwipeableBottomSheet mSheetDelegate; /** Track the velocity of the user's scrolls to determine up or down direction. */ - private VelocityTracker mVelocityTracker; + private final VelocityTracker mVelocityTracker; /** Whether or not the user is scrolling the bottom sheet. */ private boolean mIsScrolling;
diff --git a/components/browser_ui/bottomsheet/android/test/java/src/org/chromium/components/browser_ui/bottomsheet/TestBottomSheetContent.java b/components/browser_ui/bottomsheet/android/test/java/src/org/chromium/components/browser_ui/bottomsheet/TestBottomSheetContent.java index a23b165..ed8bdc41 100644 --- a/components/browser_ui/bottomsheet/android/test/java/src/org/chromium/components/browser_ui/bottomsheet/TestBottomSheetContent.java +++ b/components/browser_ui/bottomsheet/android/test/java/src/org/chromium/components/browser_ui/bottomsheet/TestBottomSheetContent.java
@@ -33,10 +33,10 @@ private View mContentView; /** This content's priority. */ - private @ContentPriority int mPriority; + private final @ContentPriority int mPriority; /** Whether this content is browser specific. */ - private boolean mHasCustomLifecycle; + private final boolean mHasCustomLifecycle; /** Whether this content has a custom scrim lifecycle. */ private boolean mHasCustomScrimLifecycle;
diff --git a/components/browser_ui/contacts_picker/android/java/src/org/chromium/components/browser_ui/contacts_picker/CompressContactIconsWorkerTask.java b/components/browser_ui/contacts_picker/android/java/src/org/chromium/components/browser_ui/contacts_picker/CompressContactIconsWorkerTask.java index aa5b17f..3e90cc2 100644 --- a/components/browser_ui/contacts_picker/android/java/src/org/chromium/components/browser_ui/contacts_picker/CompressContactIconsWorkerTask.java +++ b/components/browser_ui/contacts_picker/android/java/src/org/chromium/components/browser_ui/contacts_picker/CompressContactIconsWorkerTask.java
@@ -24,11 +24,11 @@ /** A worker task to retrieve images for contacts. */ @NullMarked public class CompressContactIconsWorkerTask extends AsyncTask<Void> { - private ContentResolver mContentResolver; - private Set<String> mNoIconIds; - private HashMap<String, Bitmap> mBitmaps; - private List<ContactDetails> mSelectedContacts; - private CompressContactIconsCallback mCallback; + private final ContentResolver mContentResolver; + private final Set<String> mNoIconIds; + private final HashMap<String, Bitmap> mBitmaps; + private final List<ContactDetails> mSelectedContacts; + private final CompressContactIconsCallback mCallback; public static boolean sDisableForTesting;
diff --git a/components/browser_ui/contacts_picker/android/java/src/org/chromium/components/browser_ui/contacts_picker/ContactView.java b/components/browser_ui/contacts_picker/android/java/src/org/chromium/components/browser_ui/contacts_picker/ContactView.java index 2d106f1..0382f43 100644 --- a/components/browser_ui/contacts_picker/android/java/src/org/chromium/components/browser_ui/contacts_picker/ContactView.java +++ b/components/browser_ui/contacts_picker/android/java/src/org/chromium/components/browser_ui/contacts_picker/ContactView.java
@@ -36,7 +36,7 @@ @NullMarked public class ContactView extends SelectableItemView<ContactDetails> { // Our context. - private Context mContext; + private final Context mContext; // Our parent category. private PickerCategoryView mCategoryView;
diff --git a/components/browser_ui/contacts_picker/android/java/src/org/chromium/components/browser_ui/contacts_picker/ContactsFetcherWorkerTask.java b/components/browser_ui/contacts_picker/android/java/src/org/chromium/components/browser_ui/contacts_picker/ContactsFetcherWorkerTask.java index 02e3143..ddd90c4 100644 --- a/components/browser_ui/contacts_picker/android/java/src/org/chromium/components/browser_ui/contacts_picker/ContactsFetcherWorkerTask.java +++ b/components/browser_ui/contacts_picker/android/java/src/org/chromium/components/browser_ui/contacts_picker/ContactsFetcherWorkerTask.java
@@ -43,10 +43,10 @@ } // The content resolver to use for looking up contacts. - private ContentResolver mContentResolver; + private final ContentResolver mContentResolver; // The callback to use to communicate the results. - private ContactsRetrievedCallback mCallback; + private final ContactsRetrievedCallback mCallback; // Whether names were requested by the website. private final boolean mIncludeNames;
diff --git a/components/browser_ui/contacts_picker/android/java/src/org/chromium/components/browser_ui/contacts_picker/ContactsPickerDialog.java b/components/browser_ui/contacts_picker/android/java/src/org/chromium/components/browser_ui/contacts_picker/ContactsPickerDialog.java index e49ff7f..091f5a2 100644 --- a/components/browser_ui/contacts_picker/android/java/src/org/chromium/components/browser_ui/contacts_picker/ContactsPickerDialog.java +++ b/components/browser_ui/contacts_picker/android/java/src/org/chromium/components/browser_ui/contacts_picker/ContactsPickerDialog.java
@@ -19,7 +19,7 @@ public class ContactsPickerDialog extends FullscreenAlertDialog implements ContactsPickerToolbar.ContactsToolbarDelegate { // The category we're showing contacts for. - private PickerCategoryView mCategoryView; + private final PickerCategoryView mCategoryView; /** * The ContactsPickerDialog constructor.
diff --git a/components/browser_ui/contacts_picker/android/java/src/org/chromium/components/browser_ui/contacts_picker/FetchIconWorkerTask.java b/components/browser_ui/contacts_picker/android/java/src/org/chromium/components/browser_ui/contacts_picker/FetchIconWorkerTask.java index 8c75529..a9c4de0 100644 --- a/components/browser_ui/contacts_picker/android/java/src/org/chromium/components/browser_ui/contacts_picker/FetchIconWorkerTask.java +++ b/components/browser_ui/contacts_picker/android/java/src/org/chromium/components/browser_ui/contacts_picker/FetchIconWorkerTask.java
@@ -34,17 +34,17 @@ } // The ID of the contact to look up. - private String mContactId; + private final String mContactId; // If positive, the returned icon will be scaled to this size, measured along one side of a // square, in pixels. Otherwise, the returned image will be returned as-is. private int mDesiredIconSize; // The content resolver to use for looking up - private ContentResolver mContentResolver; + private final ContentResolver mContentResolver; // The callback to use to communicate the results. - private IconRetrievedCallback mCallback; + private final IconRetrievedCallback mCallback; /** * A FetchIconWorkerTask constructor.
diff --git a/components/browser_ui/contacts_picker/android/java/src/org/chromium/components/browser_ui/contacts_picker/PickerCategoryView.java b/components/browser_ui/contacts_picker/android/java/src/org/chromium/components/browser_ui/contacts_picker/PickerCategoryView.java index cb83a992..f3a7644 100644 --- a/components/browser_ui/contacts_picker/android/java/src/org/chromium/components/browser_ui/contacts_picker/PickerCategoryView.java +++ b/components/browser_ui/contacts_picker/android/java/src/org/chromium/components/browser_ui/contacts_picker/PickerCategoryView.java
@@ -71,49 +71,49 @@ private ContactsPickerDialog mDialog; // The view containing the RecyclerView and the toolbar, etc. - private SelectableListLayout<ContactDetails> mSelectableListLayout; + private final SelectableListLayout<ContactDetails> mSelectableListLayout; // The window for the main Activity. - private WindowAndroid mWindowAndroid; + private final WindowAndroid mWindowAndroid; // The callback to notify the listener of decisions reached in the picker. private ContactsPickerListener mListener; // The toolbar located at the top of the dialog. - private ContactsPickerToolbar mToolbar; + private final ContactsPickerToolbar mToolbar; // The RecyclerView showing the images. - private RecyclerView mRecyclerView; + private final RecyclerView mRecyclerView; // The view at the top (showing the explanation and Select All checkbox). private @Nullable TopView mTopView; // The {@link PickerAdapter} for the RecyclerView. - private PickerAdapter mPickerAdapter; + private final PickerAdapter mPickerAdapter; // The layout manager for the RecyclerView. - private LinearLayoutManager mLayoutManager; + private final LinearLayoutManager mLayoutManager; // A helper class to draw the icon for each contact. - private RoundedIconGenerator mIconGenerator; + private final RoundedIconGenerator mIconGenerator; // The {@link SelectionDelegate} keeping track of which contacts are selected. - private SelectionDelegate<ContactDetails> mSelectionDelegate; + private final SelectionDelegate<ContactDetails> mSelectionDelegate; // A cache for contact images, lazily created. - private ContactsBitmapCache mBitmapCache; + private final ContactsBitmapCache mBitmapCache; // The search icon. - private ImageView mSearchButton; + private final ImageView mSearchButton; // Keeps track of the set of last selected contacts in the UI. @Nullable Set<ContactDetails> mPreviousSelection; // The Done text button that confirms the selection choice. - private Button mDoneButton; + private final Button mDoneButton; // Whether the picker is in multi-selection mode. - private boolean mMultiSelectionAllowed; + private final boolean mMultiSelectionAllowed; // Whether the site is requesting names. private final boolean mSiteWantsNames;
diff --git a/components/browser_ui/edge_to_edge/android/java/src/org/chromium/components/browser_ui/edge_to_edge/EdgeToEdgeSystemBarColorHelperUnitTest.java b/components/browser_ui/edge_to_edge/android/java/src/org/chromium/components/browser_ui/edge_to_edge/EdgeToEdgeSystemBarColorHelperUnitTest.java index 172d19d..cf13c0f 100644 --- a/components/browser_ui/edge_to_edge/android/java/src/org/chromium/components/browser_ui/edge_to_edge/EdgeToEdgeSystemBarColorHelperUnitTest.java +++ b/components/browser_ui/edge_to_edge/android/java/src/org/chromium/components/browser_ui/edge_to_edge/EdgeToEdgeSystemBarColorHelperUnitTest.java
@@ -53,9 +53,9 @@ private EdgeToEdgeSystemBarColorHelper mEdgeToEdgeColorHelper; private WindowSystemBarColorHelper mWindowHelper; - private ObservableSupplierImpl<Boolean> mShouldContentFitsWindowInsetsSupplier = + private final ObservableSupplierImpl<Boolean> mShouldContentFitsWindowInsetsSupplier = new ObservableSupplierImpl<>(); - private OneshotSupplierImpl<SystemBarColorHelper> mDelegateHelperSupplier = + private final OneshotSupplierImpl<SystemBarColorHelper> mDelegateHelperSupplier = new OneshotSupplierImpl<>(); @Before
diff --git a/components/browser_ui/edge_to_edge/android/java/src/org/chromium/components/browser_ui/edge_to_edge/TabbedSystemBarColorHelperUnitTest.java b/components/browser_ui/edge_to_edge/android/java/src/org/chromium/components/browser_ui/edge_to_edge/TabbedSystemBarColorHelperUnitTest.java index 4ed1a763..3853cbf 100644 --- a/components/browser_ui/edge_to_edge/android/java/src/org/chromium/components/browser_ui/edge_to_edge/TabbedSystemBarColorHelperUnitTest.java +++ b/components/browser_ui/edge_to_edge/android/java/src/org/chromium/components/browser_ui/edge_to_edge/TabbedSystemBarColorHelperUnitTest.java
@@ -35,8 +35,8 @@ @Mock private SystemBarColorHelper mEdgeToEdgeBottomChinCoordinator; private TabbedSystemBarColorHelper mTabbedSystemBarColorHelper; - private OneshotSupplierImpl<SystemBarColorHelper> mEdgeToEdgeBottomChinCoordinatorSupplier = - new OneshotSupplierImpl<>(); + private final OneshotSupplierImpl<SystemBarColorHelper> + mEdgeToEdgeBottomChinCoordinatorSupplier = new OneshotSupplierImpl<>(); @Before public void setup() {
diff --git a/components/browser_ui/media/android/java/src/org/chromium/components/browser_ui/media/MediaNotificationController.java b/components/browser_ui/media/android/java/src/org/chromium/components/browser_ui/media/MediaNotificationController.java index 55b5a55..51eefa85 100644 --- a/components/browser_ui/media/android/java/src/org/chromium/components/browser_ui/media/MediaNotificationController.java +++ b/components/browser_ui/media/android/java/src/org/chromium/components/browser_ui/media/MediaNotificationController.java
@@ -100,7 +100,7 @@ @VisibleForTesting public Delegate mDelegate; - private SparseArray<MediaButtonInfo> mActionToButtonInfo; + private final SparseArray<MediaButtonInfo> mActionToButtonInfo; @VisibleForTesting public @Nullable NotificationWrapperBuilder mNotificationBuilder; @@ -411,16 +411,16 @@ */ private static final class MediaButtonInfo { /** The resource ID of this media button icon. */ - public int iconResId; + public final int iconResId; /** The resource ID of this media button description. */ - public int descriptionResId; + public final int descriptionResId; /** The intent string to be fired when this media button is clicked. */ - public String intentString; + public final String intentString; /** The ID to identify the notification button. */ - public int buttonId; + public final int buttonId; public MediaButtonInfo( int buttonResId, int descriptionResId, String intentString, int buttonId) {
diff --git a/components/browser_ui/media/android/java/src/org/chromium/components/browser_ui/media/MediaNotificationManager.java b/components/browser_ui/media/android/java/src/org/chromium/components/browser_ui/media/MediaNotificationManager.java index 552dc128..fc2cbd9 100644 --- a/components/browser_ui/media/android/java/src/org/chromium/components/browser_ui/media/MediaNotificationManager.java +++ b/components/browser_ui/media/android/java/src/org/chromium/components/browser_ui/media/MediaNotificationManager.java
@@ -17,7 +17,7 @@ @NullMarked public class MediaNotificationManager { // Maps the notification ids to their corresponding notification managers. - private static SparseArray<MediaNotificationController> sControllers; + private static final SparseArray<MediaNotificationController> sControllers; static { sControllers = new SparseArray<MediaNotificationController>();
diff --git a/components/browser_ui/media/android/java/src/org/chromium/components/browser_ui/media/MediaSessionHelper.java b/components/browser_ui/media/android/java/src/org/chromium/components/browser_ui/media/MediaSessionHelper.java index ccdb654..8209b12 100644 --- a/components/browser_ui/media/android/java/src/org/chromium/components/browser_ui/media/MediaSessionHelper.java +++ b/components/browser_ui/media/android/java/src/org/chromium/components/browser_ui/media/MediaSessionHelper.java
@@ -51,11 +51,11 @@ private static final String UNICODE_PLAY_CHARACTER = "\u25B6"; @VisibleForTesting public static final int HIDE_NOTIFICATION_DELAY_MILLIS = 2500; - private Delegate mDelegate; + private final Delegate mDelegate; private @Nullable WebContents mWebContents; @VisibleForTesting public @Nullable WebContentsObserver mWebContentsObserver; @VisibleForTesting public @Nullable MediaSessionObserver mMediaSessionObserver; - private MediaImageManager mMediaImageManager; + private final MediaImageManager mMediaImageManager; private @Nullable Bitmap mPageMediaImage; @VisibleForTesting public @Nullable Bitmap mFavicon; private @Nullable Bitmap mCurrentMediaImage; @@ -72,7 +72,7 @@ private @Nullable MediaMetadata mCurrentMetadata; private Set<Integer> mMediaSessionActions = Collections.emptySet(); private @Nullable MediaPosition mMediaPosition; - private Handler mHandler; + private final Handler mHandler; // The delayed task to hide notification. Hiding notification can be immediate or delayed. // Delayed hiding will schedule this delayed task to |mHandler|. The task will be canceled when // showing or immediate hiding. @@ -83,7 +83,7 @@ // static getter {@link MediaSession#fromWebContents()}. @VisibleForTesting public static @Nullable MediaSession sOverriddenMediaSession; - private MediaNotificationListener mControlsListener = + private final MediaNotificationListener mControlsListener = new MediaNotificationListener() { @Override public void onPlay(int actionSource) {
diff --git a/components/browser_ui/notifications/android/java/src/org/chromium/components/browser_ui/notifications/MockNotificationManagerProxy.java b/components/browser_ui/notifications/android/java/src/org/chromium/components/browser_ui/notifications/MockNotificationManagerProxy.java index 0399506..33e26bb 100644 --- a/components/browser_ui/notifications/android/java/src/org/chromium/components/browser_ui/notifications/MockNotificationManagerProxy.java +++ b/components/browser_ui/notifications/android/java/src/org/chromium/components/browser_ui/notifications/MockNotificationManagerProxy.java
@@ -61,7 +61,7 @@ private int mMutationCount; - private boolean mNotificationsEnabled = true; + private final boolean mNotificationsEnabled = true; public MockNotificationManagerProxy() { mNotifications = new LinkedHashMap<>();
diff --git a/components/browser_ui/notifications/android/java/src/org/chromium/components/browser_ui/notifications/PendingIntentProvider.java b/components/browser_ui/notifications/android/java/src/org/chromium/components/browser_ui/notifications/PendingIntentProvider.java index 6833c94..4cc8c14 100644 --- a/components/browser_ui/notifications/android/java/src/org/chromium/components/browser_ui/notifications/PendingIntentProvider.java +++ b/components/browser_ui/notifications/android/java/src/org/chromium/components/browser_ui/notifications/PendingIntentProvider.java
@@ -16,7 +16,7 @@ /** Provides {@link PendingIntent} and the flags used to build the PendingIntent. */ @NullMarked public class PendingIntentProvider { - private PendingIntent mPendingIntent; + private final PendingIntent mPendingIntent; @Flags private final int mFlags; private final int mRequestCode;
diff --git a/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/DecodeVideoTask.java b/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/DecodeVideoTask.java index 1b65e0f77..0bc42348 100644 --- a/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/DecodeVideoTask.java +++ b/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/DecodeVideoTask.java
@@ -66,10 +66,10 @@ } // The callback to use to communicate the results. - private VideoDecodingCallback mCallback; + private final VideoDecodingCallback mCallback; // The URI of the video to decode. - private Uri mUri; + private final Uri mUri; // The desired width and height (in pixels) of the returned thumbnail from the video. int mSize; @@ -84,7 +84,7 @@ long mIntervalMs; // The ContentResolver to use to retrieve image metadata from disk. - private ContentResolver mContentResolver; + private final ContentResolver mContentResolver; // Keeps track of errors during decoding. private @DecodingResult int mDecodingResult;
diff --git a/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/DecoderServiceHost.java b/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/DecoderServiceHost.java index 37bc042..f9949303 100644 --- a/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/DecoderServiceHost.java +++ b/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/DecoderServiceHost.java
@@ -52,7 +52,7 @@ private final Context mContext; // A content resolver for providing file descriptors for the images. - private ContentResolver mContentResolver; + private final ContentResolver mContentResolver; // The number of successful image decodes (not video), per batch. private int mSuccessfulImageDecodes; @@ -111,7 +111,7 @@ // indicates that {@link unbindService()} should be called. private boolean mBindServiceCalled; @Nullable IDecoderService mIRemoteService; - private ServiceConnection mConnection = + private final ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName className, IBinder service) { @@ -178,7 +178,7 @@ // An ordinal used to enforce FIFO decoding, in the case where all other things are equal // (when it comes to determining which record to decode first). - private int mRequestOrdinal; + private final int mRequestOrdinal; // The callback to use to communicate the results of the decoding. final ImagesDecodedCallback mCallback;
diff --git a/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/FileEnumWorkerTask.java b/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/FileEnumWorkerTask.java index bc278a2..56a88f9 100644 --- a/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/FileEnumWorkerTask.java +++ b/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/FileEnumWorkerTask.java
@@ -46,10 +46,10 @@ private final WindowAndroid mWindowAndroid; // The callback to use to communicate the results. - private FilesEnumeratedCallback mCallback; + private final FilesEnumeratedCallback mCallback; // The filter to apply to the list. - private MimeTypeFilter mFilter; + private final MimeTypeFilter mFilter; // Whether any image MIME types were requested. private boolean mIncludeImages; @@ -58,7 +58,7 @@ private boolean mIncludeVideos; // The ContentResolver to use to retrieve image metadata from disk. - private ContentResolver mContentResolver; + private final ContentResolver mContentResolver; // The camera directory under DCIM. private static final String SAMPLE_DCIM_SOURCE_SUB_DIRECTORY = "Camera";
diff --git a/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/FileEnumWorkerTaskTest.java b/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/FileEnumWorkerTaskTest.java index f60fb46..6e3b699 100644 --- a/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/FileEnumWorkerTaskTest.java +++ b/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/FileEnumWorkerTaskTest.java
@@ -104,9 +104,9 @@ } private static class TestData { - public Uri mUri; - public String mMimeType; - public long mDateAdded; + public final Uri mUri; + public final String mMimeType; + public final long mDateAdded; public TestData(String uri, String mimeType, long dateAdded) { mUri = Uri.parse(uri); @@ -116,7 +116,7 @@ } private static class FileCursor extends BaseCursor { - private List<TestData> mData; + private final List<TestData> mData; private int mIndex;
diff --git a/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/ImageDecoderTest.java b/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/ImageDecoderTest.java index e659947..308e602 100644 --- a/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/ImageDecoderTest.java +++ b/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/ImageDecoderTest.java
@@ -63,7 +63,7 @@ } IDecoderService mIRemoteService; - private ServiceConnection mConnection = + private final ServiceConnection mConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName className, IBinder service) {
diff --git a/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/PhotoPickerDialog.java b/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/PhotoPickerDialog.java index 329a2dc..6b93c31 100644 --- a/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/PhotoPickerDialog.java +++ b/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/PhotoPickerDialog.java
@@ -29,10 +29,10 @@ implements PhotoPickerToolbar.PhotoPickerToolbarDelegate, PhotoPicker { // The category we're showing photos for. - private PickerCategoryView mCategoryView; + private final PickerCategoryView mCategoryView; // A wrapper around the listener object, watching to see if an external intent is launched. - private PhotoPickerListenerWrapper mListenerWrapper; + private final PhotoPickerListenerWrapper mListenerWrapper; // Whether the wait for an external intent launch is over. private boolean mDoneWaitingForExternalIntent; @@ -43,7 +43,7 @@ */ private static class PhotoPickerListenerWrapper implements PhotoPickerListener { // The {@link PhotoPickerListener} to forward the events to. - PhotoPickerListener mListener; + final PhotoPickerListener mListener; // Whether the user selected to launch an external intent. private boolean mExternalIntentSelected;
diff --git a/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/PhotoPickerDialogTest.java b/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/PhotoPickerDialogTest.java index 31bc5c21..02dadca 100644 --- a/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/PhotoPickerDialogTest.java +++ b/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/PhotoPickerDialogTest.java
@@ -99,11 +99,11 @@ private Uri[] mLastSelectedPhotos; // A list of view IDs we receive from an animating event in the order the events occurred. - private List<Long> mLastViewAnimatingIds = new ArrayList(); + private final List<Long> mLastViewAnimatingIds = new ArrayList(); // A list of view alpha values we receive from an animating event in the order the events // occurred. - private List<Float> mLastViewAnimatingAlphas = new ArrayList(); + private final List<Float> mLastViewAnimatingAlphas = new ArrayList(); // The list of currently selected photos (built piecemeal). private List<PickerBitmap> mCurrentPhotoSelection;
diff --git a/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/PickerAdapter.java b/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/PickerAdapter.java index 02c24c1..0ee9608e 100644 --- a/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/PickerAdapter.java +++ b/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/PickerAdapter.java
@@ -32,7 +32,7 @@ } // The category view to use to show the images. - private PickerCategoryView mCategoryView; + private final PickerCategoryView mCategoryView; // How many times the (high-res) cache was useful. @DecodeActions private int mCacheHits;
diff --git a/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/PickerBitmap.java b/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/PickerBitmap.java index 453beb8..e35ab1ad 100644 --- a/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/PickerBitmap.java +++ b/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/PickerBitmap.java
@@ -34,13 +34,13 @@ } // The URI of the bitmap to show. - private @Nullable Uri mUri; + private final @Nullable Uri mUri; // When the bitmap was last modified on disk. - private long mLastModified; + private final long mLastModified; // The type of tile involved. - @TileTypes private int mType; + @TileTypes private final int mType; /** * The PickerBitmap constructor.
diff --git a/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/PickerBitmapView.java b/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/PickerBitmapView.java index 545b52bd..a1ddf98 100644 --- a/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/PickerBitmapView.java +++ b/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/PickerBitmapView.java
@@ -55,7 +55,7 @@ private static @Nullable AnimationListener sAnimationListenerForTest; // Our context. - private Context mContext; + private final Context mContext; // Our parent category. private PickerCategoryView mCategoryView;
diff --git a/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/PickerCategoryView.java b/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/PickerCategoryView.java index b7473acc..24592923 100644 --- a/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/PickerCategoryView.java +++ b/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/PickerCategoryView.java
@@ -99,19 +99,19 @@ private @Nullable PhotoPickerDialog mDialog; // The view containing the RecyclerView and the toolbar, etc. - private SelectableListLayout<PickerBitmap> mSelectableListLayout; + private final SelectableListLayout<PickerBitmap> mSelectableListLayout; // The {@link WindowAndroid} for the hosting WebContents. - private WindowAndroid mWindowAndroid; + private final WindowAndroid mWindowAndroid; // The ContentResolver to use to retrieve image metadata from disk. - private ContentResolver mContentResolver; + private final ContentResolver mContentResolver; // The list of images on disk, sorted by last-modified first. private @Nullable List<PickerBitmap> mPickerBitmaps; // True if multi-selection is allowed in the picker. - private boolean mMultiSelectionAllowed; + private final boolean mMultiSelectionAllowed; // The callback to notify the listener of decisions reached in the picker. private PhotoPickerListener mListener; @@ -120,19 +120,19 @@ private @Nullable DecoderServiceHost mDecoderServiceHost; // The RecyclerView showing the images. - private RecyclerView mRecyclerView; + private final RecyclerView mRecyclerView; // The {@link PickerAdapter} for the RecyclerView. - private PickerAdapter mPickerAdapter; + private final PickerAdapter mPickerAdapter; // The layout manager for the RecyclerView. - private GridLayoutManager mLayoutManager; + private final GridLayoutManager mLayoutManager; // The decoration to use for the RecyclerView. private GridSpacingItemDecoration mSpacingDecoration; // The {@link SelectionDelegate} keeping track of which images are selected. - private SelectionDelegate<PickerBitmap> mSelectionDelegate; + private final SelectionDelegate<PickerBitmap> mSelectionDelegate; // A low-resolution cache for thumbnails, lazily created. Helpful for cache misses from the // high-resolution cache to avoid showing gray squares (we show pixelated versions instead until @@ -146,13 +146,13 @@ private @Nullable DiscardableReference<LruCache<String, Thumbnail>> mFullScreenBitmaps; // The size of the low-res cache. - private int mCacheSizeLarge; + private final int mCacheSizeLarge; // The size of the high-res cache. - private int mCacheSizeSmall; + private final int mCacheSizeSmall; // The size of the full-screen cache. - private int mCacheSizeFullScreen; + private final int mCacheSizeFullScreen; // Whether we are in magnifying mode (one image per column). private boolean mMagnifyingMode; @@ -195,7 +195,7 @@ private final PickerVideoPlayer mVideoPlayer; // The Zoom (floating action) button. - private ImageView mZoom; + private final ImageView mZoom; /** * @param windowAndroid The window of the {@link WebContents} that requested the photo @@ -623,10 +623,10 @@ /** A class for implementing grid spacing between items. */ private class GridSpacingItemDecoration extends RecyclerView.ItemDecoration { // The number of spans to account for. - private int mSpanCount; + private final int mSpanCount; // The amount of spacing to use. - private int mSpacing; + private final int mSpacing; public GridSpacingItemDecoration(int spanCount, int spacing) { mSpanCount = spanCount;
diff --git a/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/PickerVideoPlayer.java b/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/PickerVideoPlayer.java index d5e7282..437d83f 100644 --- a/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/PickerVideoPlayer.java +++ b/components/browser_ui/photo_picker/android/java/src/org/chromium/components/browser_ui/photo_picker/PickerVideoPlayer.java
@@ -127,7 +127,7 @@ private @Nullable Window mWindow; // The Context to use. - private Context mContext; + private final Context mContext; // The Back button in the top corner. private final ImageView mBackButton; @@ -201,7 +201,7 @@ private boolean mPreviousNavBarColorsSaved; // The object to convert touch events into gestures. - private GestureDetectorCompat mGestureDetector; + private final GestureDetectorCompat mGestureDetector; // An OnGestureListener class for handling double tap. private class DoubleTapGestureListener extends GestureDetector.SimpleOnGestureListener {
diff --git a/components/browser_ui/settings/android/widget/java/src/org/chromium/components/browser_ui/settings/ChromeBasePreference.java b/components/browser_ui/settings/android/widget/java/src/org/chromium/components/browser_ui/settings/ChromeBasePreference.java index b31b5bdb..ba2bfbc 100644 --- a/components/browser_ui/settings/android/widget/java/src/org/chromium/components/browser_ui/settings/ChromeBasePreference.java +++ b/components/browser_ui/settings/android/widget/java/src/org/chromium/components/browser_ui/settings/ChromeBasePreference.java
@@ -32,7 +32,7 @@ */ @NullMarked public class ChromeBasePreference extends Preference { - private @Nullable ColorStateList mIconTint; + private final @Nullable ColorStateList mIconTint; private @Nullable ManagedPreferenceDelegate mManagedPrefDelegate; /** Indicates if the preference uses a custom layout. */ @@ -42,7 +42,7 @@ private @Nullable Boolean mDividerAllowedAbove; private @Nullable Boolean mDividerAllowedBelow; - private @Nullable String mUserAction; + private final @Nullable String mUserAction; /** Constructor for use in Java. */ public ChromeBasePreference(Context context) {
diff --git a/components/browser_ui/settings/android/widget/java/src/org/chromium/components/browser_ui/settings/PaddedItemDecorationWithDivider.java b/components/browser_ui/settings/android/widget/java/src/org/chromium/components/browser_ui/settings/PaddedItemDecorationWithDivider.java index 037b753..b11d9bc 100644 --- a/components/browser_ui/settings/android/widget/java/src/org/chromium/components/browser_ui/settings/PaddedItemDecorationWithDivider.java +++ b/components/browser_ui/settings/android/widget/java/src/org/chromium/components/browser_ui/settings/PaddedItemDecorationWithDivider.java
@@ -36,7 +36,7 @@ private boolean mAllowDividerAfterLastItem; private Supplier<Integer> mDividerPaddingStartSupplier; private Supplier<Integer> mDividerPaddingEndSupplier; - private Supplier<Integer> mItemOffsetSupplier; + private final Supplier<Integer> mItemOffsetSupplier; /** * Create the item decoration with padding.
diff --git a/components/browser_ui/share/android/java/src/org/chromium/components/browser_ui/share/ShareImageFileUtils.java b/components/browser_ui/share/android/java/src/org/chromium/components/browser_ui/share/ShareImageFileUtils.java index 38e39e6..7acc6e74 100644 --- a/components/browser_ui/share/android/java/src/org/chromium/components/browser_ui/share/ShareImageFileUtils.java +++ b/components/browser_ui/share/android/java/src/org/chromium/components/browser_ui/share/ShareImageFileUtils.java
@@ -575,7 +575,7 @@ } private static class ExternallyVisibleUriCallback implements Callback<String> { - private Callback<@Nullable Uri> mComposedCallback; + private final Callback<@Nullable Uri> mComposedCallback; ExternallyVisibleUriCallback(Callback<@Nullable Uri> cb) { mComposedCallback = cb;
diff --git a/components/browser_ui/share/android/java/src/org/chromium/components/browser_ui/share/ShareParams.java b/components/browser_ui/share/android/java/src/org/chromium/components/browser_ui/share/ShareParams.java index 572b573..edeffed 100644 --- a/components/browser_ui/share/android/java/src/org/chromium/components/browser_ui/share/ShareParams.java +++ b/components/browser_ui/share/android/java/src/org/chromium/components/browser_ui/share/ShareParams.java
@@ -245,8 +245,8 @@ /** The builder for {@link ShareParams} objects. */ public static class Builder { - private WindowAndroid mWindow; - private String mTitle; + private final WindowAndroid mWindow; + private final String mTitle; private @Nullable String mText; private @Nullable String mTextFormat; private String mUrl;
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/AddExceptionPreference.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/AddExceptionPreference.java index 869ea49..cdbe31d 100644 --- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/AddExceptionPreference.java +++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/AddExceptionPreference.java
@@ -37,20 +37,20 @@ public class AddExceptionPreference extends Preference implements Preference.OnPreferenceClickListener { // The callback to notify when the user adds a site. - private SiteAddedCallback mSiteAddedCallback; + private final SiteAddedCallback mSiteAddedCallback; // The accent color to use for the icon and title view. - private int mPrefAccentColor; + private final int mPrefAccentColor; // The custom message to show in the dialog. - private String mDialogMessage; + private final String mDialogMessage; // The Site Settings Category of the exception we are adding. private final SiteSettingsCategory mCategory; // The colors for the site URL EditText - private int mErrorColor; - private int mDefaultColor; + private final int mErrorColor; + private final int mDefaultColor; /** An interface to implement to get a callback when a site exception needs to be added. */ public interface SiteAddedCallback {
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/JavascriptOptimizerCategory.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/JavascriptOptimizerCategory.java index 1e7c41e4..b00bdcd 100644 --- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/JavascriptOptimizerCategory.java +++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/JavascriptOptimizerCategory.java
@@ -15,7 +15,7 @@ /** {@link SiteSettingsCategory} for dealing with Javascript-optimizer category. */ @NullMarked public class JavascriptOptimizerCategory extends SiteSettingsCategory { - private boolean mBlockedByOs; + private final boolean mBlockedByOs; public JavascriptOptimizerCategory(BrowserContextHandle browserContextHandle) { super(browserContextHandle, Type.JAVASCRIPT_OPTIMIZER, /* androidPermission= */ "");
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SiteSettingsCategory.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SiteSettingsCategory.java index 7c0a65ac..e40cc5e5 100644 --- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SiteSettingsCategory.java +++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/SiteSettingsCategory.java
@@ -127,11 +127,11 @@ private final BrowserContextHandle mBrowserContextHandle; // The id of this category. - private @Type int mCategory; + private final @Type int mCategory; // The id of a permission in Android M that governs this category. Can be blank if Android has // no equivalent permission for the category. - private String mAndroidPermission; + private final String mAndroidPermission; /** * Construct a SiteSettingsCategory.
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/Website.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/Website.java index 126b65a..097ba38 100644 --- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/Website.java +++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/Website.java
@@ -33,16 +33,17 @@ private final @Nullable WebsiteAddress mEmbedder; /** Indexed by ContentSettingsType. */ - private Map<Integer, ContentSettingException> mContentSettingExceptions = new HashMap<>(); + private final Map<Integer, ContentSettingException> mContentSettingExceptions = new HashMap<>(); /** Indexed by ContentSettingsType. */ - private Map<Integer, PermissionInfo> mPermissionInfos = new HashMap<>(); + private final Map<Integer, PermissionInfo> mPermissionInfos = new HashMap<>(); /** * Indexed by ContentSettingsType. For Permissions like the StorageAccess API that are keyed by * requesting and embedding site. */ - private Map<Integer, List<ContentSettingException>> mEmbeddedPermissionInfos = new HashMap<>(); + private final Map<Integer, List<ContentSettingException>> mEmbeddedPermissionInfos = + new HashMap<>(); private @Nullable LocalStorageInfo mLocalStorageInfo; private @Nullable RwsCookieInfo mRwsCookieInfo;
diff --git a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/WebsiteRowPreference.java b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/WebsiteRowPreference.java index 9cfe4ce..12cbf25 100644 --- a/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/WebsiteRowPreference.java +++ b/components/browser_ui/site_settings/android/java/src/org/chromium/components/browser_ui/site_settings/WebsiteRowPreference.java
@@ -40,13 +40,13 @@ private @Nullable Dialog mConfirmationDialog; - private LayoutInflater mLayoutInflater; + private final LayoutInflater mLayoutInflater; private Runnable mOnDeleteCallback; - private boolean mShowRwsMembershipLabels; + private final boolean mShowRwsMembershipLabels; - private boolean mIsClickable; + private final boolean mIsClickable; WebsiteRowPreference( Context context,
diff --git a/components/browser_ui/sms/android/java/src/org/chromium/components/browser_ui/sms/WebOTPServiceInfoBar.java b/components/browser_ui/sms/android/java/src/org/chromium/components/browser_ui/sms/WebOTPServiceInfoBar.java index acf067f..93364ca 100644 --- a/components/browser_ui/sms/android/java/src/org/chromium/components/browser_ui/sms/WebOTPServiceInfoBar.java +++ b/components/browser_ui/sms/android/java/src/org/chromium/components/browser_ui/sms/WebOTPServiceInfoBar.java
@@ -26,8 +26,8 @@ public class WebOTPServiceInfoBar extends ConfirmInfoBar { private static final String TAG = "WebOTPServiceInfoBar"; private static final boolean DEBUG = false; - private String mMessage; - private WindowAndroid mWindowAndroid; + private final String mMessage; + private final WindowAndroid mWindowAndroid; private @Nullable Long mKeyboardDismissedTime; @VisibleForTesting
diff --git a/components/browser_ui/util/android/java/src/org/chromium/components/browser_ui/util/AutomotiveUtils.java b/components/browser_ui/util/android/java/src/org/chromium/components/browser_ui/util/AutomotiveUtils.java index 60c6c8a..0cce1a5 100644 --- a/components/browser_ui/util/android/java/src/org/chromium/components/browser_ui/util/AutomotiveUtils.java +++ b/components/browser_ui/util/android/java/src/org/chromium/components/browser_ui/util/AutomotiveUtils.java
@@ -22,7 +22,7 @@ public class AutomotiveUtils { private static boolean sForceHorizontalAutomotiveTesting; private static @Nullable Boolean sCarmaPhase2ComplianceForTesting; - private static String sCarmaPhase2Compliance = + private static final String sCarmaPhase2Compliance = "com.google.android.automotive.software.car_ready_mobile_apps.phase2"; /** Returns true if the automotive device supports the OS share sheet, false otherwise. */
diff --git a/components/browser_ui/util/android/java/src/org/chromium/components/browser_ui/util/BitmapCache.java b/components/browser_ui/util/android/java/src/org/chromium/components/browser_ui/util/BitmapCache.java index 42fce4dc..fddb5eb 100644 --- a/components/browser_ui/util/android/java/src/org/chromium/components/browser_ui/util/BitmapCache.java +++ b/components/browser_ui/util/android/java/src/org/chromium/components/browser_ui/util/BitmapCache.java
@@ -76,7 +76,7 @@ * Static cache used for deduplicating bitmaps. The key is a pair of file name and thumbnail * size (as for the {@link #mBitmapCache}. */ - private static Map<String, WeakReference<Bitmap>> sDeduplicationCache = new HashMap<>(); + private static final Map<String, WeakReference<Bitmap>> sDeduplicationCache = new HashMap<>(); private static int sUsageCount;
diff --git a/components/browser_ui/util/android/java/src/org/chromium/components/browser_ui/util/date/CalendarUtils.java b/components/browser_ui/util/android/java/src/org/chromium/components/browser_ui/util/date/CalendarUtils.java index e342ae00..89270d1 100644 --- a/components/browser_ui/util/android/java/src/org/chromium/components/browser_ui/util/date/CalendarUtils.java +++ b/components/browser_ui/util/android/java/src/org/chromium/components/browser_ui/util/date/CalendarUtils.java
@@ -12,8 +12,8 @@ @NullMarked public final class CalendarUtils { private static final class LazyHolder { - private static Calendar sCalendar1 = CalendarFactory.get(); - private static Calendar sCalendar2 = CalendarFactory.get(); + private static final Calendar sCalendar1 = CalendarFactory.get(); + private static final Calendar sCalendar2 = CalendarFactory.get(); } private CalendarUtils() {}
diff --git a/components/browser_ui/util/android/java/src/org/chromium/components/browser_ui/util/date/StringUtils.java b/components/browser_ui/util/android/java/src/org/chromium/components/browser_ui/util/date/StringUtils.java index 3fdfb8b..ee272d8 100644 --- a/components/browser_ui/util/android/java/src/org/chromium/components/browser_ui/util/date/StringUtils.java +++ b/components/browser_ui/util/android/java/src/org/chromium/components/browser_ui/util/date/StringUtils.java
@@ -18,8 +18,8 @@ @NullMarked public class StringUtils { private static final class LazyHolder { - private static Calendar sCalendar1 = CalendarFactory.get(); - private static Calendar sCalendar2 = CalendarFactory.get(); + private static final Calendar sCalendar1 = CalendarFactory.get(); + private static final Calendar sCalendar2 = CalendarFactory.get(); } private StringUtils() {}
diff --git a/components/browser_ui/webshare/android/java/src/org/chromium/components/browser_ui/webshare/BlobReceiver.java b/components/browser_ui/webshare/android/java/src/org/chromium/components/browser_ui/webshare/BlobReceiver.java index 9676620..d69f103 100644 --- a/components/browser_ui/webshare/android/java/src/org/chromium/components/browser_ui/webshare/BlobReceiver.java +++ b/components/browser_ui/webshare/android/java/src/org/chromium/components/browser_ui/webshare/BlobReceiver.java
@@ -35,7 +35,7 @@ private final ByteBuffer mBuffer; private final OutputStream mOutputStream; - private long mMaximumContentSize; + private final long mMaximumContentSize; private long mExpectedContentSize; private long mReceivedContentSize; private DataPipe.@Nullable ConsumerHandle mConsumerHandle;
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/BoundedLinearLayout.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/BoundedLinearLayout.java index 4e34b94..1f40fa2 100644 --- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/BoundedLinearLayout.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/BoundedLinearLayout.java
@@ -29,8 +29,8 @@ public class BoundedLinearLayout extends LinearLayout { private static final int NOT_SPECIFIED = -1; - private TypedValue mMaxWidthLandscape = new TypedValue(); - private TypedValue mMaxWidthPortrait = new TypedValue(); + private final TypedValue mMaxWidthLandscape = new TypedValue(); + private final TypedValue mMaxWidthPortrait = new TypedValue(); private final int mMaxHeight;
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/ChromeDialog.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/ChromeDialog.java index db60549..fd1958f 100644 --- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/ChromeDialog.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/ChromeDialog.java
@@ -39,11 +39,11 @@ */ @NullMarked public class ChromeDialog extends ComponentDialog { - private boolean mIsFullScreen; - private Activity mActivity; + private final boolean mIsFullScreen; + private final Activity mActivity; @Nullable private InsetObserver mInsetObserver; @Nullable private EdgeToEdgeLayoutCoordinator mEdgeToEdgeLayoutCoordinator; - private boolean mShouldPadForWindowInsets; + private final boolean mShouldPadForWindowInsets; /** * Constructs the dialog class in Chrome.
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/ContextMenuDialog.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/ContextMenuDialog.java index 97f3cdb0..c02d3ce 100644 --- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/ContextMenuDialog.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/ContextMenuDialog.java
@@ -58,22 +58,22 @@ private float mContextMenuSourceYPx; private int mContextMenuFirstLocationYPx; private @Nullable AnchoredPopupWindow mPopupWindow; - private View mLayout; + private final View mLayout; private @Nullable OnLayoutChangeListener mOnLayoutChangeListener; private @Nullable DragEventDispatchHelper mDragEventDispatchHelper; - private Rect mRect; + private final Rect mRect; - private int mTopMarginPx; - private int mBottomMarginPx; + private final int mTopMarginPx; + private final int mBottomMarginPx; - private @Nullable Integer mPopupMargin; - private @Nullable Integer mDesiredPopupContentWidth; + private final @Nullable Integer mPopupMargin; + private final @Nullable Integer mDesiredPopupContentWidth; /** * View that is showing behind the context menu. If menu is shown as a popup without scrim, this * view will be used to dispatch touch events other than ACTION_DOWN. */ - private @Nullable View mTouchEventDelegateView; + private final @Nullable View mTouchEventDelegateView; /** * Creates an instance of the ContextMenuDialog.
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/DateDividedAdapter.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/DateDividedAdapter.java index ce66a48..2830a0c 100644 --- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/DateDividedAdapter.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/DateDividedAdapter.java
@@ -176,7 +176,7 @@ /** An item representing a date header. */ static class DateHeaderTimedItem extends TimedItem { - private long mTimestamp; + private final long mTimestamp; public DateHeaderTimedItem(long timestamp) { mTimestamp = getDateAtMidnight(timestamp).getTime(); @@ -218,7 +218,7 @@ } protected static class SubsectionHeaderViewHolder extends RecyclerView.ViewHolder { - private View mView; + private final View mView; public SubsectionHeaderViewHolder(View itemView) { super(itemView);
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/FadingShadow.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/FadingShadow.java index a75fee2..054731f 100644 --- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/FadingShadow.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/FadingShadow.java
@@ -26,9 +26,9 @@ private static final int SMOOTH_ALGORITHM_INTERPOLATION_POINTS_NUM = 8; - private Paint mShadowPaint = new Paint(); - private Matrix mShadowMatrix = new Matrix(); - private Shader mShadowShader; + private final Paint mShadowPaint = new Paint(); + private final Matrix mShadowMatrix = new Matrix(); + private final Shader mShadowShader; /** @param shadowColor The color of the shadow, e.g. 0x11000000. */ FadingShadow(int shadowColor) {
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/PromoDialog.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/PromoDialog.java index 4bf6607..79bdab4 100644 --- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/PromoDialog.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/PromoDialog.java
@@ -88,7 +88,7 @@ private static final int[] CLICKABLE_BUTTON_IDS = {R.id.button_primary, R.id.button_secondary}; private final FrameLayout mScrimView; - private PromoDialogLayout mDialogLayout; + private final PromoDialogLayout mDialogLayout; protected PromoDialog(Activity activity, boolean shouldPadForWindowInsets) { super(activity, R.style.PromoDialog, shouldPadForWindowInsets);
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/PromoDialogRenderTest.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/PromoDialogRenderTest.java index b875bf15..f5bfe68 100644 --- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/PromoDialogRenderTest.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/PromoDialogRenderTest.java
@@ -42,7 +42,7 @@ @Batch(Batch.UNIT_TESTS) public class PromoDialogRenderTest { @ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = new NightModeTestUtils.NightModeParams().getParameters(); @ClassRule
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/RadioButtonRenderTest.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/RadioButtonRenderTest.java index fb168f32..bbd88cf 100644 --- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/RadioButtonRenderTest.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/RadioButtonRenderTest.java
@@ -45,7 +45,7 @@ @Batch(Batch.PER_CLASS) public class RadioButtonRenderTest { @ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = new NightModeTestUtils.NightModeParams().getParameters(); private static final int REVISION = 3;
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/RadioButtonWithDescriptionAndAuxButtonTest.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/RadioButtonWithDescriptionAndAuxButtonTest.java index 6dbe228..7d38e85 100644 --- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/RadioButtonWithDescriptionAndAuxButtonTest.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/RadioButtonWithDescriptionAndAuxButtonTest.java
@@ -39,7 +39,7 @@ private static class AuxButtonClickedListener implements RadioButtonWithDescriptionAndAuxButton.OnAuxButtonClickedListener { - private CallbackHelper mCallbackHelper = new CallbackHelper(); + private final CallbackHelper mCallbackHelper = new CallbackHelper(); private int mClickedId; AuxButtonClickedListener() {}
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/RadioButtonWithEditText.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/RadioButtonWithEditText.java index 71c4bc2..a4d8f5d6 100644 --- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/RadioButtonWithEditText.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/RadioButtonWithEditText.java
@@ -75,7 +75,7 @@ @SuppressWarnings("NullAway.Init") private EditText mEditText; - private List<OnTextChangeListener> mListeners; + private final List<OnTextChangeListener> mListeners; public RadioButtonWithEditText(Context context, AttributeSet attrs) { super(context, attrs);
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/RadioButtonWithIconRenderTest.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/RadioButtonWithIconRenderTest.java index 82266a3a..f7c7cde 100644 --- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/RadioButtonWithIconRenderTest.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/RadioButtonWithIconRenderTest.java
@@ -42,7 +42,7 @@ @Batch(Batch.UNIT_TESTS) public class RadioButtonWithIconRenderTest { @ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = new NightModeTestUtils.NightModeParams().getParameters(); @ClassRule
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/WrappingLayout.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/WrappingLayout.java index 3741e11..c92dfc1f 100644 --- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/WrappingLayout.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/WrappingLayout.java
@@ -42,7 +42,7 @@ // The indices of visible child views of this layout. Allocated as a member class to avoid // allocations while drawing. - private ArrayList<Integer> mVisibleChildren = new ArrayList<Integer>(); + private final ArrayList<Integer> mVisibleChildren = new ArrayList<Integer>(); public WrappingLayout(Context context) { this(context, null);
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/WrappingLayoutTest.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/WrappingLayoutTest.java index 963373c..6d443b9eb3 100644 --- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/WrappingLayoutTest.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/WrappingLayoutTest.java
@@ -122,7 +122,7 @@ } private static class WrappingLayoutSubclass extends WrappingLayout { - Context mContext; + final Context mContext; int mRequestedWidth; int mRequestedHeight; View mViewA; @@ -346,10 +346,10 @@ } private static class ViewExpectation { - private int mExpectedLeft; - private int mExpectedTop; - private int mExpectedWidth; - private int mExpectedHeight; + private final int mExpectedLeft; + private final int mExpectedTop; + private final int mExpectedWidth; + private final int mExpectedHeight; public ViewExpectation( int expectedLeft, int expectedTop, int expectedWidth, int expectedHeight) {
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/dragreorder/DragReorderableListAdapter.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/dragreorder/DragReorderableListAdapter.java index 034c045..548f167 100644 --- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/dragreorder/DragReorderableListAdapter.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/dragreorder/DragReorderableListAdapter.java
@@ -50,7 +50,7 @@ protected DragStateDelegate mDragStateDelegate; private int mStart; - private ObserverList<DragListener> mListeners = new ObserverList<>(); + private final ObserverList<DragListener> mListeners = new ObserverList<>(); /** A callback for touch actions on drag-reorderable lists. */ private class DragTouchCallback extends ItemTouchHelper.Callback {
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/listmenu/BrowserUiListMenuRenderTest.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/listmenu/BrowserUiListMenuRenderTest.java index f567f2b..428a74d0 100644 --- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/listmenu/BrowserUiListMenuRenderTest.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/listmenu/BrowserUiListMenuRenderTest.java
@@ -52,7 +52,7 @@ /** Used to run a test only with night mode. */ public static class NightModeOnlyParameterProvider implements ParameterProvider { - private static List<ParameterSet> sNightModeOnly = + private static final List<ParameterSet> sNightModeOnly = Collections.singletonList(new ParameterSet().value(true).name("NightModeEnabled")); @Override
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/loading/LoadingFullscreenCoordinator.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/loading/LoadingFullscreenCoordinator.java index 367d3e86..b1ab046 100644 --- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/loading/LoadingFullscreenCoordinator.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/loading/LoadingFullscreenCoordinator.java
@@ -66,10 +66,7 @@ .with(ScrimProperties.BACKGROUND_COLOR, backgroundColor) .build(); - mScrimManager.showScrim(mPropertyModel); - if (!animate) { - mScrimManager.forceAnimationToFinish(mPropertyModel); - } + mScrimManager.showScrim(mPropertyModel, animate); mContainer.setVisibility(View.VISIBLE); }
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/loading/LoadingFullscreenCoordinatorUnitTest.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/loading/LoadingFullscreenCoordinatorUnitTest.java index 0d72248..51b32ab 100644 --- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/loading/LoadingFullscreenCoordinatorUnitTest.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/loading/LoadingFullscreenCoordinatorUnitTest.java
@@ -5,7 +5,6 @@ package org.chromium.components.browser_ui.widget.loading; import static org.junit.Assert.assertNotNull; -import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.eq; import static org.mockito.Mockito.verify; @@ -58,13 +57,13 @@ LoadingFullscreenCoordinator loadingCoordinator = new LoadingFullscreenCoordinator(mActivity, mScrimManager, layout); + boolean animate = false; loadingCoordinator.startLoading( () -> { loadingCoordinator.closeLoadingScreen(); }, - /* animate= */ false); - verify(mScrimManager).showScrim(mPropertyModelArgumentCaptor.capture()); - verify(mScrimManager).forceAnimationToFinish(any()); + animate); + verify(mScrimManager).showScrim(mPropertyModelArgumentCaptor.capture(), eq(animate)); PropertyModel propertyModel = mPropertyModelArgumentCaptor.getValue(); cancelButton.performClick();
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/promo/PromoCardCoordinator.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/promo/PromoCardCoordinator.java index 25df401..694ef06 100644 --- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/promo/PromoCardCoordinator.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/promo/PromoCardCoordinator.java
@@ -39,9 +39,9 @@ private static final double IMPRESSION_THRESHOLD_RATIO = 0.75; - private PromoCardView mPromoCardView; - private PropertyModelChangeProcessor mModelChangeProcessor; - private String mFeatureName; + private final PromoCardView mPromoCardView; + private final PropertyModelChangeProcessor mModelChangeProcessor; + private final String mFeatureName; private @Nullable ImpressionTracker mImpressionTracker;
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/promo/PromoCardViewRenderTest.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/promo/PromoCardViewRenderTest.java index e8d4e708..a6349d1 100644 --- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/promo/PromoCardViewRenderTest.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/promo/PromoCardViewRenderTest.java
@@ -49,7 +49,7 @@ @Batch(Batch.UNIT_TESTS) public class PromoCardViewRenderTest { @ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = new NightModeTestUtils.NightModeParams().getParameters(); @ClassRule
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/scrim/ScrimCoordinator.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/scrim/ScrimCoordinator.java index 8956fe0..0b957f0 100644 --- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/scrim/ScrimCoordinator.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/scrim/ScrimCoordinator.java
@@ -119,8 +119,18 @@ * Show the scrim. * * @param model The property model of {@link ScrimProperties} that define the scrim behavior. + * @param animate Whether the scrim should animate. */ public void showScrim(PropertyModel model) { + showScrim(model, true); + } + + /** + * Show the scrim. + * + * @param model The property model of {@link ScrimProperties} that define the scrim behavior. + */ + public void showScrim(PropertyModel model, boolean animate) { assert model != null : "Showing the scrim requires a model."; boolean isShowingScrim = isShowingScrim(); @@ -133,7 +143,7 @@ mView = mScrimViewBuilder.get(); mChangeProcessor = PropertyModelChangeProcessor.create(model, mView, ScrimViewBinder::bind); - mMediator.showScrim(model, ANIM_DURATION_MS); + mMediator.showScrim(model, animate, ANIM_DURATION_MS); if (isShowingScrim != isShowingScrim()) { notifyVisibilityObservers(); }
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/scrim/ScrimManager.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/scrim/ScrimManager.java index 70df800..df16b266 100644 --- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/scrim/ScrimManager.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/scrim/ScrimManager.java
@@ -120,10 +120,21 @@ * to this to subsequently interact with the resulting scrim. */ public void showScrim(PropertyModel model) { + showScrim(model, true); + } + + /** + * Shows a new scrim. + * + * @param model Contains information about the scrim to show. Callers should retain a reference + * to this to subsequently interact with the resulting scrim. + * @param animate Whether the scrim should animate. + */ + public void showScrim(PropertyModel model, boolean animate) { ScrimCoordinator coordinator = new ScrimCoordinator(mContext, mParent); mModelToScrim.put(model, coordinator); mScrimVisibilitySupplier.set(true); - coordinator.showScrim(model); + coordinator.showScrim(model, animate); coordinator.addObserver(mOnScrimVisibilityChanged); coordinator.getStatusBarColorSupplier().addObserver(mOnStatusBarColorChanged);
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/scrim/ScrimMediator.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/scrim/ScrimMediator.java index f6fed5a..afbfd1b 100644 --- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/scrim/ScrimMediator.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/scrim/ScrimMediator.java
@@ -120,7 +120,7 @@ } /** Triggers a fade in of the scrim creating a new animation if necessary. */ - void showScrim(PropertyModel model, int animDurationMs) { + void showScrim(PropertyModel model, boolean animate, int animDurationMs) { // ALPHA is a protected property for this component that will only get added to the model // if ScrimProperties is used to build it. assert model.getAllProperties().contains(ScrimProperties.ALPHA) @@ -173,6 +173,7 @@ mIsNewEventFilter = model.get(ScrimProperties.GESTURE_DETECTOR) != null; mOverlayFadeInAnimator.setFloatValues(mModel.get(ScrimProperties.ALPHA), 1f); runFadeAnimation(mOverlayFadeInAnimator); + if (!animate) mOverlayFadeInAnimator.end(); } private int getAnimationDuration(int animDurationMs) {
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/selectable_list/CheckableSelectableItemView.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/selectable_list/CheckableSelectableItemView.java index 05408da97..970d744 100644 --- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/selectable_list/CheckableSelectableItemView.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/selectable_list/CheckableSelectableItemView.java
@@ -34,7 +34,7 @@ private final AnimatedVectorDrawableCompat mCheckDrawable; /** The color state list for the start icon view when the item is selected. */ - private ColorStateList mIconSelectedColorList; + private final ColorStateList mIconSelectedColorList; /** Drawable for the start icon */ private @Nullable Drawable mIconDrawable;
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/selectable_list/SelectableItemView.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/selectable_list/SelectableItemView.java index ee4b01c..6c33247 100644 --- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/selectable_list/SelectableItemView.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/selectable_list/SelectableItemView.java
@@ -44,7 +44,7 @@ protected TextView mDescriptionView; /** Layout res to be used when inflating the view, used to swap in the visual refresh. */ - private int mLayoutRes; + private final int mLayoutRes; /** Levels for the background. */ private final int mDefaultLevel; @@ -52,7 +52,7 @@ private final int mSelectedLevel; /** The resource for the start icon background. */ - private int mStartIconBackgroundRes; + private final int mStartIconBackgroundRes; /** Constructor for inflating from XML. */ public SelectableItemView(Context context, AttributeSet attrs) {
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/selectable_list/SelectableItemViewHolder.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/selectable_list/SelectableItemViewHolder.java index 3e8dc73b..b1d47cd 100644 --- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/selectable_list/SelectableItemViewHolder.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/selectable_list/SelectableItemViewHolder.java
@@ -16,7 +16,7 @@ */ @NullMarked public class SelectableItemViewHolder<E> extends ViewHolder { - private SelectableItemView<E> mItemView; + private final SelectableItemView<E> mItemView; /** * @param itemView The {@link SelectableItemView} to be held by this ViewHolder.
diff --git a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/selectable_list/SelectionDelegate.java b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/selectable_list/SelectionDelegate.java index 6dae32d..a65fa0f 100644 --- a/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/selectable_list/SelectionDelegate.java +++ b/components/browser_ui/widget/android/java/src/org/chromium/components/browser_ui/widget/selectable_list/SelectionDelegate.java
@@ -54,7 +54,7 @@ } private Set<E> mSelectedItems = new LinkedHashSet<>(); - private ObserverList<SelectionObserver<E>> mObservers = new ObserverList<>(); + private final ObserverList<SelectionObserver<E>> mObservers = new ObserverList<>(); /** Sets the mode of this SelectionDelegate to single-selection. */ public void setSingleSelectionMode() {
diff --git a/components/browsing_data/content/android/java/src/org/chromium/components/browsing_data/content/BrowsingDataModel.java b/components/browsing_data/content/android/java/src/org/chromium/components/browsing_data/content/BrowsingDataModel.java index c194159f9..9acdd32b 100644 --- a/components/browsing_data/content/android/java/src/org/chromium/components/browsing_data/content/BrowsingDataModel.java +++ b/components/browsing_data/content/android/java/src/org/chromium/components/browsing_data/content/BrowsingDataModel.java
@@ -18,7 +18,7 @@ public class BrowsingDataModel { // A pointer to the C++ object for this model. - private long mNativeBrowsingDataModel; + private final long mNativeBrowsingDataModel; /** * Creates a `BrowsingDataModel` object.
diff --git a/components/browsing_data/content/browsing_data_helper.cc b/components/browsing_data/content/browsing_data_helper.cc index 62c1c87..ac900bfe 100644 --- a/components/browsing_data/content/browsing_data_helper.cc +++ b/components/browsing_data/content/browsing_data_helper.cc
@@ -173,6 +173,10 @@ HostContentSettingsMap::PatternSourcePredicate()); host_content_settings_map->ClearSettingsForOneTypeWithPredicate( + ContentSettingsType::INITIALIZED_TRANSLATIONS, delete_begin, delete_end, + HostContentSettingsMap::PatternSourcePredicate()); + + host_content_settings_map->ClearSettingsForOneTypeWithPredicate( ContentSettingsType::FILE_SYSTEM_ACCESS_CHOOSER_DATA, delete_begin, delete_end, HostContentSettingsMap::PatternSourcePredicate());
diff --git a/components/collaboration/internal/android/java/src/org/chromium/components/collaboration/messaging/MessagingBackendServiceBridgeUnitTestCompanion.java b/components/collaboration/internal/android/java/src/org/chromium/components/collaboration/messaging/MessagingBackendServiceBridgeUnitTestCompanion.java index 6fc394c6..572f1ed 100644 --- a/components/collaboration/internal/android/java/src/org/chromium/components/collaboration/messaging/MessagingBackendServiceBridgeUnitTestCompanion.java +++ b/components/collaboration/internal/android/java/src/org/chromium/components/collaboration/messaging/MessagingBackendServiceBridgeUnitTestCompanion.java
@@ -32,16 +32,16 @@ @JNINamespace("collaboration::messaging") public class MessagingBackendServiceBridgeUnitTestCompanion { // The service instance we're testing. - private MessagingBackendService mService; + private final MessagingBackendService mService; - private MessagingBackendService.PersistentMessageObserver mObserver = + private final MessagingBackendService.PersistentMessageObserver mObserver = mock(MessagingBackendService.PersistentMessageObserver.class); - private MessagingBackendService.InstantMessageDelegate mInstantMessageDelegate = + private final MessagingBackendService.InstantMessageDelegate mInstantMessageDelegate = mock(MessagingBackendService.InstantMessageDelegate.class); - private ArgumentCaptor<InstantMessage> mInstantMessageCaptor = + private final ArgumentCaptor<InstantMessage> mInstantMessageCaptor = ArgumentCaptor.forClass(InstantMessage.class); - private ArgumentCaptor<Callback> mInstantMessageCallbackCaptor = + private final ArgumentCaptor<Callback> mInstantMessageCallbackCaptor = ArgumentCaptor.forClass(Callback.class); @CalledByNative
diff --git a/components/content_capture/android/java/src/org/chromium/components/content_capture/ContentCaptureData.java b/components/content_capture/android/java/src/org/chromium/components/content_capture/ContentCaptureData.java index e8f9558..66a1895a 100644 --- a/components/content_capture/android/java/src/org/chromium/components/content_capture/ContentCaptureData.java +++ b/components/content_capture/android/java/src/org/chromium/components/content_capture/ContentCaptureData.java
@@ -15,7 +15,7 @@ /** The class is Java's representative of components/content_capture/common/content_capture_data.h */ @NullMarked public class ContentCaptureData extends ContentCaptureDataBase { - private String mValue; + private final String mValue; @CalledByNative @VisibleForTesting
diff --git a/components/content_capture/android/java/src/org/chromium/components/content_capture/ContentCaptureDataBase.java b/components/content_capture/android/java/src/org/chromium/components/content_capture/ContentCaptureDataBase.java index 662c050a..0c388a4 100644 --- a/components/content_capture/android/java/src/org/chromium/components/content_capture/ContentCaptureDataBase.java +++ b/components/content_capture/android/java/src/org/chromium/components/content_capture/ContentCaptureDataBase.java
@@ -17,7 +17,7 @@ @NullMarked public abstract class ContentCaptureDataBase { private final long mId; - private Rect mBounds; + private final Rect mBounds; private @Nullable ArrayList<ContentCaptureDataBase> mChildren; public ContentCaptureDataBase(long id, Rect bounds) {
diff --git a/components/content_capture/android/java/src/org/chromium/components/content_capture/OnscreenContentProvider.java b/components/content_capture/android/java/src/org/chromium/components/content_capture/OnscreenContentProvider.java index 8dca8c6..b6e6c1b0 100644 --- a/components/content_capture/android/java/src/org/chromium/components/content_capture/OnscreenContentProvider.java +++ b/components/content_capture/android/java/src/org/chromium/components/content_capture/OnscreenContentProvider.java
@@ -34,7 +34,7 @@ private static final String TAG = "ContentCapture"; private long mNativeOnscreenContentProviderAndroid; - private ArrayList<ContentCaptureConsumer> mContentCaptureConsumers = new ArrayList<>(); + private final ArrayList<ContentCaptureConsumer> mContentCaptureConsumers = new ArrayList<>(); private WeakReference<WebContents> mWebContents;
diff --git a/components/content_capture/android/java/src/org/chromium/components/content_capture/PlatformContentCaptureController.java b/components/content_capture/android/java/src/org/chromium/components/content_capture/PlatformContentCaptureController.java index f964135..b8ec10c 100644 --- a/components/content_capture/android/java/src/org/chromium/components/content_capture/PlatformContentCaptureController.java +++ b/components/content_capture/android/java/src/org/chromium/components/content_capture/PlatformContentCaptureController.java
@@ -43,7 +43,7 @@ private boolean mShouldStartCapture; private boolean mIsAiai; private @Nullable UrlAllowlist mAllowlist; - private ContentCaptureManager mContentCaptureManager; + private final ContentCaptureManager mContentCaptureManager; public static PlatformContentCaptureController lazyInit() { if (sContentCaptureController == null) {
diff --git a/components/content_capture/android/java/src/org/chromium/components/content_capture/PlatformSession.java b/components/content_capture/android/java/src/org/chromium/components/content_capture/PlatformSession.java index 345e43e8..948c66c 100644 --- a/components/content_capture/android/java/src/org/chromium/components/content_capture/PlatformSession.java +++ b/components/content_capture/android/java/src/org/chromium/components/content_capture/PlatformSession.java
@@ -38,7 +38,7 @@ } } - private PlatformSessionData mRootPlatformSessionData; + private final PlatformSessionData mRootPlatformSessionData; private @Nullable HashMap<Long, PlatformSessionData> mFrameIdToPlatformSessionData; public static @Nullable PlatformSession fromView(View view) {
diff --git a/components/content_capture/android/java/src/org/chromium/components/content_capture/TitleUpdateTask.java b/components/content_capture/android/java/src/org/chromium/components/content_capture/TitleUpdateTask.java index 890e3d0e..fcbd690 100644 --- a/components/content_capture/android/java/src/org/chromium/components/content_capture/TitleUpdateTask.java +++ b/components/content_capture/android/java/src/org/chromium/components/content_capture/TitleUpdateTask.java
@@ -14,7 +14,7 @@ /** The task to update the title change to plateform */ @NullMarked public class TitleUpdateTask extends NotificationTask { - private ContentCaptureFrame mMainFrame; + private final ContentCaptureFrame mMainFrame; public TitleUpdateTask(ContentCaptureFrame mainFrame, PlatformSession platformSession) { super(null, platformSession);
diff --git a/components/content_capture/android/java/src/org/chromium/components/content_capture/UrlAllowlist.java b/components/content_capture/android/java/src/org/chromium/components/content_capture/UrlAllowlist.java index 66b876a..c462734 100644 --- a/components/content_capture/android/java/src/org/chromium/components/content_capture/UrlAllowlist.java +++ b/components/content_capture/android/java/src/org/chromium/components/content_capture/UrlAllowlist.java
@@ -20,8 +20,8 @@ */ @NullMarked public class UrlAllowlist { - private @Nullable HashSet<String> mAllowedUrls; - private @Nullable List<Pattern> mAllowedRe; + private final @Nullable HashSet<String> mAllowedUrls; + private final @Nullable List<Pattern> mAllowedRe; /** Nothing is allowed if both allowedUrls and allowedRes is null or empty. */ public UrlAllowlist(@Nullable HashSet<String> allowedUrls, @Nullable List<Pattern> allowedRe) {
diff --git a/components/content_relationship_verification/android/java/src/org/chromium/components/content_relationship_verification/OriginVerificationScheduler.java b/components/content_relationship_verification/android/java/src/org/chromium/components/content_relationship_verification/OriginVerificationScheduler.java index 804c91b..e54367a 100644 --- a/components/content_relationship_verification/android/java/src/org/chromium/components/content_relationship_verification/OriginVerificationScheduler.java +++ b/components/content_relationship_verification/android/java/src/org/chromium/components/content_relationship_verification/OriginVerificationScheduler.java
@@ -27,7 +27,7 @@ private static final String HTTP_SCHEME = "http"; private static final String HTTPS_SCHEME = "https"; - private OriginVerifier mOriginVerifier; + private final OriginVerifier mOriginVerifier; /** Origins that we have yet to call OriginVerifier#start or whose validatin is not yet finished. */ private Set<Origin> mPendingOrigins = Collections.synchronizedSet(new HashSet<>());
diff --git a/components/content_settings/android/java/src/org/chromium/components/content_settings/CookieControlsBridge.java b/components/content_settings/android/java/src/org/chromium/components/content_settings/CookieControlsBridge.java index 1728b3b..8229ea61 100644 --- a/components/content_settings/android/java/src/org/chromium/components/content_settings/CookieControlsBridge.java +++ b/components/content_settings/android/java/src/org/chromium/components/content_settings/CookieControlsBridge.java
@@ -18,7 +18,7 @@ @NullMarked public class CookieControlsBridge { private long mNativeCookieControlsBridge; - private CookieControlsObserver mObserver; + private final CookieControlsObserver mObserver; /** * Initializes a CookieControlsBridge instance.
diff --git a/components/content_settings/core/browser/content_settings_uma_util.cc b/components/content_settings/core/browser/content_settings_uma_util.cc index dc321ef..8e8b31c 100644 --- a/components/content_settings/core/browser/content_settings_uma_util.cc +++ b/components/content_settings/core/browser/content_settings_uma_util.cc
@@ -157,6 +157,7 @@ {ContentSettingsType::LOCAL_NETWORK_ACCESS, 135}, {ContentSettingsType::ON_DEVICE_SPEECH_RECOGNITION_LANGUAGES_DOWNLOADED, 136}, + {ContentSettingsType::INITIALIZED_TRANSLATIONS, 137}, // As mentioned at the top, please don't forget to update ContentType in // enums.xml when you add entries here!
diff --git a/components/content_settings/core/browser/website_settings_registry.cc b/components/content_settings/core/browser/website_settings_registry.cc index cd0e187..fe0b044 100644 --- a/components/content_settings/core/browser/website_settings_registry.cc +++ b/components/content_settings/core/browser/website_settings_registry.cc
@@ -338,6 +338,11 @@ WebsiteSettingsInfo::UNSYNCABLE, WebsiteSettingsInfo::NOT_LOSSY, WebsiteSettingsInfo::TOP_ORIGIN_ONLY_SCOPE, DESKTOP | PLATFORM_ANDROID, WebsiteSettingsInfo::DONT_INHERIT_IN_INCOGNITO); + Register(ContentSettingsType::INITIALIZED_TRANSLATIONS, + "initialized-translations", base::Value(), + WebsiteSettingsInfo::UNSYNCABLE, WebsiteSettingsInfo::NOT_LOSSY, + WebsiteSettingsInfo::TOP_ORIGIN_ONLY_SCOPE, DESKTOP, + WebsiteSettingsInfo::DONT_INHERIT_IN_INCOGNITO); } } // namespace content_settings
diff --git a/components/content_settings/core/common/content_settings_types.mojom b/components/content_settings/core/common/content_settings_types.mojom index ebfcd32d..b62c892 100644 --- a/components/content_settings/core/common/content_settings_types.mojom +++ b/components/content_settings/core/common/content_settings_types.mojom
@@ -482,5 +482,8 @@ // Stores information on-device language packs for which a site has // installed using the Web Speech API. ON_DEVICE_SPEECH_RECOGNITION_LANGUAGES_DOWNLOADED, + + // Stores which Translator API language packs the site has initialized. + INITIALIZED_TRANSLATIONS, }; // LINT.ThenChange(//components/content_settings/core/browser/content_settings_uma_util.cc:kHistogramValue)
diff --git a/components/crash/android/BUILD.gn b/components/crash/android/BUILD.gn index bb8cf1842..6aca19fc 100644 --- a/components/crash/android/BUILD.gn +++ b/components/crash/android/BUILD.gn
@@ -63,6 +63,7 @@ "//base:base_java_test_support", "//base:base_junit_test_support", "//base:tasks_java", + "//base/version_info/android:version_constants_java", "//components/minidump_uploader:minidump_uploader_java_test_support", "//content/public/test/android:content_java_test_support", "//third_party/androidx:androidx_test_runner_java", @@ -70,17 +71,22 @@ ] } -source_set("crash_android") { +source_set("anr_build_id_provider") { sources = [ "anr_build_id_provider.cc", "anr_build_id_provider.h", + ] + deps = [ "//base" ] +} + +source_set("crash_android") { + sources = [ "crash_keys_android.cc", "crash_keys_android.h", "pure_java_exception_handler.cc", "pure_java_exception_handler.h", ] deps = [ - ":anr_collector_jni_headers", ":jni_headers", "//base", "//components/crash/core/common:crash_key", @@ -147,6 +153,7 @@ deps = [ ":anr_data_proto_java", "//base:base_java", + "//base/version_info/android:version_constants_java", "//build/android:build_java", "//third_party/android_deps:protobuf_lite_runtime_java", "//third_party/androidx:androidx_annotation_annotation_java",
diff --git a/components/crash/android/anr_build_id_provider.cc b/components/crash/android/anr_build_id_provider.cc index 9bfde61d..b56a511 100644 --- a/components/crash/android/anr_build_id_provider.cc +++ b/components/crash/android/anr_build_id_provider.cc
@@ -2,16 +2,11 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#include <string> - #include "components/crash/android/anr_build_id_provider.h" -#include "base/android/jni_android.h" -#include "base/android/jni_string.h" -#include "base/debug/elf_reader.h" +#include <string> -// Must come after all headers that specialize FromJniType() / ToJniType(). -#include "components/crash/android/anr_collector_jni_headers/AnrCollector_jni.h" +#include "base/debug/elf_reader.h" extern char __executable_start; @@ -23,9 +18,3 @@ } } // namespace crash_reporter - -base::android::ScopedJavaLocalRef<jstring> -JNI_AnrCollector_GetSharedLibraryBuildId(JNIEnv* env) { - return base::android::ConvertUTF8ToJavaString( - env, crash_reporter::GetElfBuildId()); -}
diff --git a/components/crash/android/java/src/org/chromium/components/crash/PureJavaExceptionHandler.java b/components/crash/android/java/src/org/chromium/components/crash/PureJavaExceptionHandler.java index 77dc8ee..8255ed1c 100644 --- a/components/crash/android/java/src/org/chromium/components/crash/PureJavaExceptionHandler.java +++ b/components/crash/android/java/src/org/chromium/components/crash/PureJavaExceptionHandler.java
@@ -21,7 +21,7 @@ private final Thread.UncaughtExceptionHandler mParent; private boolean mHandlingException; private static boolean sIsEnabled = true; - private JavaExceptionReporterFactory mReporterFactory; + private final JavaExceptionReporterFactory mReporterFactory; /** Interface to allow uploading reports. */ public interface JavaExceptionReporter {
diff --git a/components/crash/android/java/src/org/chromium/components/crash/PureJavaExceptionReporter.java b/components/crash/android/java/src/org/chromium/components/crash/PureJavaExceptionReporter.java index 7adc244..cdbdc24 100644 --- a/components/crash/android/java/src/org/chromium/components/crash/PureJavaExceptionReporter.java +++ b/components/crash/android/java/src/org/chromium/components/crash/PureJavaExceptionReporter.java
@@ -76,7 +76,7 @@ private final String mLocalId = UUID.randomUUID().toString().replace("-", "").substring(0, 16); private final String mBoundary = "------------" + UUID.randomUUID() + RN; - private boolean mAttachLogcat; + private final boolean mAttachLogcat; public PureJavaExceptionReporter(boolean attachLogcat) { mAttachLogcat = attachLogcat;
diff --git a/components/crash/android/java/src/org/chromium/components/crash/anr/AnrCollector.java b/components/crash/android/java/src/org/chromium/components/crash/anr/AnrCollector.java index 396bab4c..d6b392e 100644 --- a/components/crash/android/java/src/org/chromium/components/crash/anr/AnrCollector.java +++ b/components/crash/android/java/src/org/chromium/components/crash/anr/AnrCollector.java
@@ -14,11 +14,14 @@ import androidx.annotation.RequiresApi; import androidx.annotation.VisibleForTesting; -import org.jni_zero.NativeMethods; +import org.jni_zero.CalledByNative; +import org.jni_zero.JNINamespace; +import org.jni_zero.JniType; import org.chromium.base.ContextUtils; import org.chromium.base.Log; import org.chromium.base.metrics.RecordHistogram; +import org.chromium.base.version_info.VersionInfo; import org.chromium.build.annotations.NullMarked; import org.chromium.build.annotations.Nullable; import org.chromium.components.crash.anr.AnrDataOuterClass.AnrData; @@ -30,8 +33,14 @@ import java.io.InputStream; import java.io.InputStreamReader; import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.StandardOpenOption; +import java.security.MessageDigest; +import java.security.NoSuchAlgorithmException; import java.util.ArrayList; +import java.util.Arrays; import java.util.Collections; +import java.util.Comparator; import java.util.List; import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -42,6 +51,7 @@ * <p>We also grab the version number associated with the ANR and pair that with the ANR so we have * confidence knowing which version of Chrome actually caused this ANR. */ +@JNINamespace("anr_collector") @RequiresApi(Build.VERSION_CODES.R) @NullMarked public class AnrCollector { @@ -52,8 +62,34 @@ private static final String ANR_SKIPPED_UMA = "Crashpad.AnrUpload.Skipped"; + // We convert strings to bytes using the UTF-8 encoding, and then pass the bytes to + // setProcessStateSummary(). Since the UTF-8 encoding never uses the byte 0xFF, + // we can safely use 0xFF as a delimiter between different strings. + private static final byte PROCESS_STATE_SUMMARY_DELIMITER = (byte) 0xFF; + + private static final File CACHE_DIR = ContextUtils.getApplicationContext().getCacheDir(); + + private static final File CRASH_DIR = new File(CACHE_DIR, "Crash Reports"); + + private static final File ANR_VARIATIONS_DIR = new File(CRASH_DIR, "ANR Variations"); + + private static final int MAX_NUM_OF_ANR_VARIATIONS_FILES = 5; + + private static @Nullable File sPreviousAnrVariationsFile; + + // Convert a byte array to a string containing its hexadecimal representation. + // TODO(martinkong): We should use java.util.HexFormat when our min-sdk is at least 34. + @VisibleForTesting + static String byteArrayToHexString(byte[] input) { + StringBuilder sb = new StringBuilder(input.length * 2); + for (byte b : input) { + sb.append(String.format("%02x", b)); + } + return sb.toString(); + } + /** - * Grabs ANR reports from Android and writes them as 3-tuples as 3 entries in a string list. + * Grabs ANR reports from Android and writes them as 4-tuples as 4 entries in a string list. * This writes to disk synchronously, so should be called on a background thread. */ public static List<String> collectAndWriteAnrs(File outDir) { @@ -63,10 +99,6 @@ return writeAnrs(collectAnrs(), outDir); } - public static String getSharedLibraryBuildId() { - return AnrCollectorJni.get().getSharedLibraryBuildId(); - } - @VisibleForTesting static AnrData parseAnrFromReport(BufferedReader reader) throws IOException { // For each thread, the header line always looks the same - example: @@ -106,7 +138,7 @@ return anrData; } - private static @Nullable Pair<AnrData, String> getAnrPair(ApplicationExitInfo reason) { + private static @Nullable Pair<AnrData, byte[]> getAnrPair(ApplicationExitInfo reason) { AnrData anr = null; try (InputStream is = reason.getTraceInputStream()) { // This can be null - this was causing crashes in crbug.com/1298852. @@ -135,11 +167,10 @@ ANR_SKIPPED_UMA, AnrSkippedReason.MISSING_VERSION, AnrSkippedReason.MAX_VALUE); return null; } - String processStateSummary = new String(processStateSummaryBytes, StandardCharsets.UTF_8); - return new Pair<>(anr, processStateSummary); + return new Pair<>(anr, processStateSummaryBytes); } - private static List<Pair<AnrData, String>> collectAnrs() { + private static List<Pair<AnrData, byte[]>> collectAnrs() { ActivityManager am = (ActivityManager) ContextUtils.getApplicationContext() @@ -152,11 +183,11 @@ long maxHandledTime = lastHandledTime; List<ApplicationExitInfo> reasons = am.getHistoricalProcessExitReasons(null, 0, 0); - List<Pair<AnrData, String>> anrs = new ArrayList<>(); + List<Pair<AnrData, byte[]>> anrs = new ArrayList<>(); for (ApplicationExitInfo reason : reasons) { long time = reason.getTimestamp(); if (reason.getReason() == ApplicationExitInfo.REASON_ANR && time > lastHandledTime) { - Pair<AnrData, String> pair = getAnrPair(reason); + Pair<AnrData, byte[]> pair = getAnrPair(reason); if (pair != null) { anrs.add(pair); if (time > maxHandledTime) { @@ -171,35 +202,104 @@ return anrs; } - private static List<String> writeAnrs(List<Pair<AnrData, String>> anrs, File outDir) { + private static List<String> writeAnrs(List<Pair<AnrData, byte[]>> anrs, File outDir) { List<String> anrFiles = new ArrayList<>(); - for (Pair<AnrData, String> pair : anrs) { + for (Pair<AnrData, byte[]> pair : anrs) { AnrData anr = pair.first; - String[] splitStateSummary = pair.second.split(","); - String version = splitStateSummary[0]; - // There will always be a version number, but there's a chance that there won't be a - // buildId. - String buildId = ""; - if (splitStateSummary.length > 1) { - buildId = splitStateSummary[1]; - RecordHistogram.recordEnumeratedHistogram( - ANR_SKIPPED_UMA, AnrSkippedReason.NOT_SKIPPED, AnrSkippedReason.MAX_VALUE); - } else { - RecordHistogram.recordEnumeratedHistogram( - ANR_SKIPPED_UMA, - AnrSkippedReason.ONLY_MISSING_NATIVE, - AnrSkippedReason.MAX_VALUE); - } + byte[] processStateSummary = pair.second; + List<String> parsedProcessStateSummary = handleProcessStateSummary(processStateSummary); + assert parsedProcessStateSummary.size() == 3; + String version = parsedProcessStateSummary.get(0); + String buildId = parsedProcessStateSummary.get(1); + String variationsString = parsedProcessStateSummary.get(2); + String anrFileName = writeAnr(anr, outDir); if (anrFileName != null) { anrFiles.add(anrFileName); anrFiles.add(version); anrFiles.add(buildId); + anrFiles.add(variationsString); + RecordHistogram.recordEnumeratedHistogram( + ANR_SKIPPED_UMA, AnrSkippedReason.NOT_SKIPPED, AnrSkippedReason.MAX_VALUE); } } return anrFiles; } + // Parse the process state summary and return a 3-tuple containing the version number, build id, + // and variations string. The process state summary should always contain the version number. + // If it does not contain the build id or variations string, an empty string will be returned. + @VisibleForTesting + static List<String> handleProcessStateSummary(byte[] processStateSummary) { + List<byte[]> splitProcessStateSummary = new ArrayList<>(); + int delimiterIndex = -1; + for (int i = 0; i < processStateSummary.length; i++) { + if (processStateSummary[i] == PROCESS_STATE_SUMMARY_DELIMITER) { + byte[] entry = Arrays.copyOfRange(processStateSummary, delimiterIndex + 1, i); + splitProcessStateSummary.add(entry); + delimiterIndex = i; + if (splitProcessStateSummary.size() == 2) { + break; + } + } + } + byte[] finalEntry = + Arrays.copyOfRange( + processStateSummary, delimiterIndex + 1, processStateSummary.length); + splitProcessStateSummary.add(finalEntry); + + // There will always be a version number, but there's a chance that there won't be a + // build id or variations hash. + String version = new String(splitProcessStateSummary.get(0), StandardCharsets.UTF_8); + String buildId = ""; + String variationsString = ""; + if (splitProcessStateSummary.size() > 1) { + buildId = new String(splitProcessStateSummary.get(1), StandardCharsets.UTF_8); + if (splitProcessStateSummary.size() > 2) { + variationsString = getVariationsMatchingHash(splitProcessStateSummary.get(2)); + } + } + return List.of(version, buildId, variationsString); + } + + // Given an MD5 hash of the variations string, iterate over all the ANR variations files, + // find the file that matches the hash, and return the variations string in that file. + // If there is no file matching the hash, or if there is any other error, return empty string. + private static String getVariationsMatchingHash(byte[] variationsHash) { + if (variationsHash.length == 0) { + // This should never happen in theory. + Log.e( + TAG, + "A previous run that encountered ANR has set an empty variations hash. This" + + " means it was unable to find digest algorithm MD5."); + return ""; + } + + File[] variationsFiles = ANR_VARIATIONS_DIR.listFiles(); + if (variationsFiles == null || variationsFiles.length == 0) { + return ""; + } + String expectedFileName = byteArrayToHexString(variationsHash); + for (File curVariationsFile : variationsFiles) { + String curVariationsFileName = curVariationsFile.getName(); + if (expectedFileName.equals(curVariationsFileName)) { + List<String> curFileLines; + try { + curFileLines = Files.readAllLines(curVariationsFile.toPath()); + } catch (IOException e) { + Log.e( + TAG, + "Unable to read the ANR variations file at %s: %s", + curVariationsFile.toString(), + e.toString()); + continue; + } + return String.join("\n", curFileLines); + } + } + return ""; + } + private static @Nullable String writeAnr(AnrData data, File outDir) { try { // Writing with .tmp suffix to enable cleanup later - CrashFileManager looks for @@ -219,11 +319,131 @@ } } + @CalledByNative + public static void saveVariations( + @JniType("std::string") String variationsString, + @JniType("std::string") String buildIdString) { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + byte[] variationsHash = computeMD5Hash(variationsString); + if (variationsHash != null) { + saveVariationsHashToProcessStateSummary(variationsHash, buildIdString); + saveVariationsToFile(variationsHash, variationsString, true); + } else { + saveVariationsHashToProcessStateSummary(new byte[0], buildIdString); + } + } + } + + // Compute the hash of the given string using the MD5 hashing algorithm. Return a byte array of + // length 16 on success. Return null on failure. + @VisibleForTesting + static byte @Nullable [] computeMD5Hash(String hashInput) { + try { + byte[] hashOutput = + MessageDigest.getInstance("MD5") + .digest(hashInput.getBytes(StandardCharsets.UTF_8)); + assert hashOutput.length == 16 : "MD5 produced a hash that is not 16 bytes in size"; + return hashOutput; + } catch (NoSuchAlgorithmException e) { + // This should never happen in theory. + Log.e( + TAG, + "Unable to find digest algorithm MD5. If an ANR happens, the ANR report will" + + " not have the list of Finch experiments."); + return null; + } + } + + // Save the version number, build id, and the MD5 hash of the variations string to the + // process state summary. This way, after an ANR happens, we can retrieve these information + // from the process state summary and add them to the ANR report. + private static void saveVariationsHashToProcessStateSummary( + byte[] variationsHash, String buildIdString) { + ActivityManager am = + (ActivityManager) + ContextUtils.getApplicationContext() + .getSystemService(Context.ACTIVITY_SERVICE); + byte[] summary = getProcessStateSummaryToSave(variationsHash, buildIdString); + am.setProcessStateSummary(summary); + } + + @VisibleForTesting + static byte[] getProcessStateSummaryToSave(byte[] variationsHash, String buildIdString) { + byte[] version = VersionInfo.getProductVersion().getBytes(StandardCharsets.UTF_8); + byte[] buildId = buildIdString.getBytes(StandardCharsets.UTF_8); + int summaryLength = version.length + buildId.length + variationsHash.length + 2; + assert summaryLength <= 128 : "The process state summary we want to save is over 128 bytes"; + byte[] summary = new byte[summaryLength]; + System.arraycopy(version, 0, summary, 0, version.length); + summary[version.length] = PROCESS_STATE_SUMMARY_DELIMITER; + System.arraycopy(buildId, 0, summary, version.length + 1, buildId.length); + summary[version.length + buildId.length + 1] = PROCESS_STATE_SUMMARY_DELIMITER; + System.arraycopy( + variationsHash, + 0, + summary, + version.length + buildId.length + 2, + variationsHash.length); + return summary; + } + + // Save the raw variations string to the ANR variations file, whose file name is the + // hexadecimal representation of the variations hash. + @VisibleForTesting + static void saveVariationsToFile( + byte[] variationsHash, String variationsString, boolean shouldCleanup) { + CRASH_DIR.mkdir(); + ANR_VARIATIONS_DIR.mkdir(); + String curAnrVariationsFileName = byteArrayToHexString(variationsHash); + File curAnrVariationsFile = new File(ANR_VARIATIONS_DIR, curAnrVariationsFileName); + try { + Files.write( + curAnrVariationsFile.toPath(), + List.of(variationsString), + StandardOpenOption.WRITE, + StandardOpenOption.CREATE, + StandardOpenOption.TRUNCATE_EXISTING); + } catch (IOException e) { + Log.e(TAG, "Unable to write to the ANR variations file: %s", e.toString()); + return; + } + + if (shouldCleanup) { + if (sPreviousAnrVariationsFile == null) { + // We are adding a new ANR variations file to the ANR variations directory, + // so we should make sure that the total number of files does not exceed the cap. + removeOldAnrVariationsFiles(curAnrVariationsFile); + } else { + // We are replacing the previous ANR variations file of the current run with a new + // file, so the total number of files will not change. + sPreviousAnrVariationsFile.delete(); + } + } + sPreviousAnrVariationsFile = curAnrVariationsFile; + } + + // To make sure that we are not using too much disk space, we need to make sure that the + // total number of ANR variations files is no more than MAX_NUM_OF_ANR_VARIATIONS_FILES. + private static void removeOldAnrVariationsFiles(File curAnrVariationsFile) { + File[] variationsFiles = ANR_VARIATIONS_DIR.listFiles(); + if (variationsFiles == null || variationsFiles.length <= MAX_NUM_OF_ANR_VARIATIONS_FILES) { + return; + } + // Sort the ANR variations files by their last modified time. The files at the beginning of + // the array have smaller unix time which means they are older. + Arrays.sort(variationsFiles, Comparator.comparing(File::lastModified)); + int remainingFilesCount = variationsFiles.length; + for (File variationsFile : variationsFiles) { + if (!variationsFile.equals(curAnrVariationsFile)) { + variationsFile.delete(); + remainingFilesCount -= 1; + if (remainingFilesCount <= MAX_NUM_OF_ANR_VARIATIONS_FILES) { + break; + } + } + } + } + // Pure static class. private AnrCollector() {} - - @NativeMethods - interface Natives { - String getSharedLibraryBuildId(); - } }
diff --git a/components/crash/android/junit/src/org/chromium/components/crash/anr/AnrCollectorTest.java b/components/crash/android/junit/src/org/chromium/components/crash/anr/AnrCollectorTest.java index 4ef0b3e..748f4cc 100644 --- a/components/crash/android/junit/src/org/chromium/components/crash/anr/AnrCollectorTest.java +++ b/components/crash/android/junit/src/org/chromium/components/crash/anr/AnrCollectorTest.java
@@ -5,16 +5,19 @@ package org.chromium.components.crash.anr; import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertNotNull; import org.junit.Test; import org.junit.runner.RunWith; import org.chromium.base.test.BaseRobolectricTestRunner; +import org.chromium.base.version_info.VersionInfo; import org.chromium.components.crash.anr.AnrDataOuterClass.AnrData; import java.io.BufferedReader; import java.io.IOException; import java.io.StringReader; +import java.util.List; /** Unit tests for AnrCollector. */ @RunWith(BaseRobolectricTestRunner.class) @@ -1459,4 +1462,77 @@ assertEquals(MAIN_THREAD_STACK_TRACE, anrData.getMainThreadStackTrace()); assertEquals(OTHER_STACK_TRACES, anrData.getStackTraces()); } + + @Test + public void testByteArrayToHexString() { + byte[] byteArray = { + Byte.MIN_VALUE, Byte.MAX_VALUE, (byte) 0, (byte) -1, (byte) 1, (byte) 0xFF + }; + String hexString = AnrCollector.byteArrayToHexString(byteArray); + String expectedHexString = "807f00ff01ff"; + assertEquals(expectedHexString, hexString); + } + + @Test + public void testHandleProcessStateSummary_NoFileSaved() { + String buildIdString = "fakebuildid"; + String variationsString = "fakevariations"; + byte[] variationsHash = AnrCollector.computeMD5Hash(variationsString); + assertNotNull(variationsHash); + byte[] summary = AnrCollector.getProcessStateSummaryToSave(variationsHash, buildIdString); + List<String> parsedSummary = AnrCollector.handleProcessStateSummary(summary); + assertEquals(3, parsedSummary.size()); + assertEquals(VersionInfo.getProductVersion(), parsedSummary.get(0)); + assertEquals(buildIdString, parsedSummary.get(1)); + // handleProcessStateSummary() returns an empty variations string, because we did not save + // the variations string to a file, so it could not find a file matching the variations hash + assertEquals("", parsedSummary.get(2)); + } + + @Test + public void testHandleProcessStateSummary_OneFileSaved() { + String buildIdString = "fakebuildid"; + String variationsString = "fakevariations"; + byte[] variationsHash = AnrCollector.computeMD5Hash(variationsString); + assertNotNull(variationsHash); + AnrCollector.saveVariationsToFile(variationsHash, variationsString, false); + byte[] summary = AnrCollector.getProcessStateSummaryToSave(variationsHash, buildIdString); + List<String> parsedSummary = AnrCollector.handleProcessStateSummary(summary); + assertEquals(3, parsedSummary.size()); + assertEquals(VersionInfo.getProductVersion(), parsedSummary.get(0)); + assertEquals(buildIdString, parsedSummary.get(1)); + // handleProcessStateSummary() returns the correct variations string this time, because we + // have saved the variations string to a file via saveVariationsToFile() + assertEquals(variationsString, parsedSummary.get(2)); + } + + @Test + public void testHandleProcessStateSummary_MultipleFilesSaved() { + String buildIdString = "de46dd9da11415e70fc13e95e6bb0ee0e48b2489"; + String wrongVariationsString1 = "wrongvariations1"; + byte[] wrongVariationsHash1 = AnrCollector.computeMD5Hash(wrongVariationsString1); + assertNotNull(wrongVariationsHash1); + AnrCollector.saveVariationsToFile(wrongVariationsHash1, wrongVariationsString1, false); + String wrongVariationsString2 = "wrongvariations2"; + byte[] wrongVariationsHash2 = AnrCollector.computeMD5Hash(wrongVariationsString2); + assertNotNull(wrongVariationsHash2); + AnrCollector.saveVariationsToFile(wrongVariationsHash2, wrongVariationsString2, false); + String correctVariationsString = "2\n5e3a236d-59e286d0,3ac60855-486e2a9c,"; + byte[] correctVariationsHash = AnrCollector.computeMD5Hash(correctVariationsString); + assertNotNull(correctVariationsHash); + AnrCollector.saveVariationsToFile(correctVariationsHash, correctVariationsString, false); + String wrongVariationsString3 = "wrongvariations3"; + byte[] wrongVariationsHash3 = AnrCollector.computeMD5Hash(wrongVariationsString3); + assertNotNull(wrongVariationsHash3); + AnrCollector.saveVariationsToFile(wrongVariationsHash3, wrongVariationsString3, false); + byte[] summary = + AnrCollector.getProcessStateSummaryToSave(correctVariationsHash, buildIdString); + List<String> parsedSummary = AnrCollector.handleProcessStateSummary(summary); + assertEquals(3, parsedSummary.size()); + assertEquals(VersionInfo.getProductVersion(), parsedSummary.get(0)); + assertEquals(buildIdString, parsedSummary.get(1)); + // handleProcessStateSummary() iterates over the list of files in the ANR variations + // directory and finds and returns the correct variations string + assertEquals(correctVariationsString, parsedSummary.get(2)); + } }
diff --git a/components/credential_management/android/java/src/org/chromium/components/credential_management/PasswordCredentialResponse.java b/components/credential_management/android/java/src/org/chromium/components/credential_management/PasswordCredentialResponse.java index 9507def..f0a2578e 100644 --- a/components/credential_management/android/java/src/org/chromium/components/credential_management/PasswordCredentialResponse.java +++ b/components/credential_management/android/java/src/org/chromium/components/credential_management/PasswordCredentialResponse.java
@@ -17,9 +17,9 @@ @NullMarked @JNINamespace("credential_management") public class PasswordCredentialResponse { - private boolean mSuccess; - private String mUsername; - private String mPassword; + private final boolean mSuccess; + private final String mUsername; + private final String mPassword; @CalledByNative public PasswordCredentialResponse(
diff --git a/components/data_sharing/public/android/java/src/org/chromium/components/data_sharing/configs/DataSharingCreateUiConfig.java b/components/data_sharing/public/android/java/src/org/chromium/components/data_sharing/configs/DataSharingCreateUiConfig.java index b5076bb7..8a4049c 100644 --- a/components/data_sharing/public/android/java/src/org/chromium/components/data_sharing/configs/DataSharingCreateUiConfig.java +++ b/components/data_sharing/public/android/java/src/org/chromium/components/data_sharing/configs/DataSharingCreateUiConfig.java
@@ -10,18 +10,18 @@ import org.chromium.build.annotations.NullMarked; import org.chromium.build.annotations.Nullable; import org.chromium.components.data_sharing.GroupToken; -import org.chromium.components.sync.protocol.GroupData; import org.chromium.components.sync.protocol.CollaborationGroupMetadata; +import org.chromium.components.sync.protocol.GroupData; /** Config class for the Data Sharing Create UI. */ @NullMarked public class DataSharingCreateUiConfig { // --- Create Usage Config --- - private @Nullable Bitmap mPreviewImage; - private @Nullable CollaborationGroupMetadata mCollaborationGroupMetadata; - private @Nullable CreateCallback mCreateCallback; - private @Nullable DataSharingUiConfig mCommonConfig; + private final @Nullable Bitmap mPreviewImage; + private final @Nullable CollaborationGroupMetadata mCollaborationGroupMetadata; + private final @Nullable CreateCallback mCreateCallback; + private final @Nullable DataSharingUiConfig mCommonConfig; /** Callback interface for data sharing create UI events. */ public interface CreateCallback {
diff --git a/components/data_sharing/public/android/java/src/org/chromium/components/data_sharing/configs/DataSharingJoinUiConfig.java b/components/data_sharing/public/android/java/src/org/chromium/components/data_sharing/configs/DataSharingJoinUiConfig.java index 0f2a82b..508b0d3 100644 --- a/components/data_sharing/public/android/java/src/org/chromium/components/data_sharing/configs/DataSharingJoinUiConfig.java +++ b/components/data_sharing/public/android/java/src/org/chromium/components/data_sharing/configs/DataSharingJoinUiConfig.java
@@ -18,15 +18,15 @@ public class DataSharingJoinUiConfig { // --- Group related Info --- - private @Nullable GroupToken mGroupToken; + private final @Nullable GroupToken mGroupToken; // --- Tab Group Details --- - private @Nullable Bitmap mPreviewImage; - private @Nullable SharedDataPreview mSharedDataPreview; + private final @Nullable Bitmap mPreviewImage; + private final @Nullable SharedDataPreview mSharedDataPreview; // --- Join Usage Config --- - private @Nullable JoinCallback mJoinCallback; - private @Nullable DataSharingUiConfig mCommonConfig; + private final @Nullable JoinCallback mJoinCallback; + private final @Nullable DataSharingUiConfig mCommonConfig; /** Callback interface for data sharing join UI events. */ public interface JoinCallback {
diff --git a/components/data_sharing/public/android/java/src/org/chromium/components/data_sharing/configs/DataSharingManageUiConfig.java b/components/data_sharing/public/android/java/src/org/chromium/components/data_sharing/configs/DataSharingManageUiConfig.java index 8bb0dcc..670981e 100644 --- a/components/data_sharing/public/android/java/src/org/chromium/components/data_sharing/configs/DataSharingManageUiConfig.java +++ b/components/data_sharing/public/android/java/src/org/chromium/components/data_sharing/configs/DataSharingManageUiConfig.java
@@ -17,13 +17,13 @@ public class DataSharingManageUiConfig { // --- Group related Info --- - private @Nullable GroupToken mGroupToken; + private final @Nullable GroupToken mGroupToken; // --- Manage Usage Config --- - private @Nullable ManageCallback mManageCallback; - private @Nullable GURL mLearnAboutBlockedAccounts; - private @Nullable GURL mActivityLogsUrl; - private @Nullable DataSharingUiConfig mCommonConfig; + private final @Nullable ManageCallback mManageCallback; + private final @Nullable GURL mLearnAboutBlockedAccounts; + private final @Nullable GURL mActivityLogsUrl; + private final @Nullable DataSharingUiConfig mCommonConfig; /** Callback interface for data sharing Manage UI events. */ public interface ManageCallback {
diff --git a/components/data_sharing/public/android/java/src/org/chromium/components/data_sharing/configs/DataSharingStringConfig.java b/components/data_sharing/public/android/java/src/org/chromium/components/data_sharing/configs/DataSharingStringConfig.java index 3fa21b5..c86442a 100644 --- a/components/data_sharing/public/android/java/src/org/chromium/components/data_sharing/configs/DataSharingStringConfig.java +++ b/components/data_sharing/public/android/java/src/org/chromium/components/data_sharing/configs/DataSharingStringConfig.java
@@ -18,7 +18,7 @@ @NullMarked public class DataSharingStringConfig { - private Map<Integer, Integer> mResourceIds; + private final Map<Integer, Integer> mResourceIds; public DataSharingStringConfig() { mResourceIds = new HashMap<>(); @@ -38,7 +38,7 @@ // Builder class public static class Builder { - private Map<Integer, Integer> mResourceIds = new HashMap<>(); + private final Map<Integer, Integer> mResourceIds = new HashMap<>(); /** * Sets the resource ID for the given key.
diff --git a/components/data_sharing/public/android/java/src/org/chromium/components/data_sharing/configs/DataSharingUiConfig.java b/components/data_sharing/public/android/java/src/org/chromium/components/data_sharing/configs/DataSharingUiConfig.java index 405bcdc..216459b 100644 --- a/components/data_sharing/public/android/java/src/org/chromium/components/data_sharing/configs/DataSharingUiConfig.java +++ b/components/data_sharing/public/android/java/src/org/chromium/components/data_sharing/configs/DataSharingUiConfig.java
@@ -59,17 +59,17 @@ // LINT.ThenChange(//tools/metrics/histograms/metadata/data_sharing/enums.xml:DataSharingUserAction) // --- Form Factor Config --- - private boolean mIsTablet; + private final boolean mIsTablet; // --- Tab Group Details --- - private @Nullable String mTabGroupName; + private final @Nullable String mTabGroupName; // --- Usage Config --- - private @Nullable Context mContext; - private @Nullable Activity mActivity; - private @Nullable GURL mLearnMoreHyperLink; - private @Nullable DataSharingStringConfig mDataSharingStringConfig; - private @Nullable DataSharingCallback mDataSharingCallback; + private final @Nullable Context mContext; + private final @Nullable Activity mActivity; + private final @Nullable GURL mLearnMoreHyperLink; + private final @Nullable DataSharingStringConfig mDataSharingStringConfig; + private final @Nullable DataSharingCallback mDataSharingCallback; /** Callback interface for common data sharing UI events. */ public interface DataSharingCallback {
diff --git a/components/dom_distiller/core/android/java/src/org/chromium/components/dom_distiller/core/DistilledPagePrefs.java b/components/dom_distiller/core/android/java/src/org/chromium/components/dom_distiller/core/DistilledPagePrefs.java index 4b0f08d..8b9be5f 100644 --- a/components/dom_distiller/core/android/java/src/org/chromium/components/dom_distiller/core/DistilledPagePrefs.java +++ b/components/dom_distiller/core/android/java/src/org/chromium/components/dom_distiller/core/DistilledPagePrefs.java
@@ -21,7 +21,7 @@ public final class DistilledPagePrefs { private final long mDistilledPagePrefsAndroid; - private Map<Observer, DistilledPagePrefsObserverWrapper> mObserverMap; + private final Map<Observer, DistilledPagePrefsObserverWrapper> mObserverMap; /** Observer interface for observing DistilledPagePrefs changes. */ public interface Observer {
diff --git a/components/download/internal/common/android/java/src/org/chromium/components/download/InMemoryDownloadFile.java b/components/download/internal/common/android/java/src/org/chromium/components/download/InMemoryDownloadFile.java index 5496d2c..2a740d3 100644 --- a/components/download/internal/common/android/java/src/org/chromium/components/download/InMemoryDownloadFile.java +++ b/components/download/internal/common/android/java/src/org/chromium/components/download/InMemoryDownloadFile.java
@@ -28,7 +28,7 @@ public class InMemoryDownloadFile { private static final String TAG = "InMemoryDownload"; private @Nullable FileOutputStream mFos; - private ParcelFileDescriptor mPfd; + private final ParcelFileDescriptor mPfd; @CalledByNative @RequiresApi(Build.VERSION_CODES.R)
diff --git a/components/download/network/android/java/src/org/chromium/components/download/BackgroundNetworkStatusListener.java b/components/download/network/android/java/src/org/chromium/components/download/BackgroundNetworkStatusListener.java index def3651e..90321cd7b 100644 --- a/components/download/network/android/java/src/org/chromium/components/download/BackgroundNetworkStatusListener.java +++ b/components/download/network/android/java/src/org/chromium/components/download/BackgroundNetworkStatusListener.java
@@ -26,7 +26,7 @@ // An observer to receive network events on main thread. private final Observer mObserver; - private Handler mMainThreadHandler = new Handler(ThreadUtils.getUiThreadLooper()); + private final Handler mMainThreadHandler = new Handler(ThreadUtils.getUiThreadLooper()); /** Observer interface to receive network change events on the main thread. */ interface Observer {
diff --git a/components/download/network/android/java/src/org/chromium/components/download/NetworkStatusListenerAndroid.java b/components/download/network/android/java/src/org/chromium/components/download/NetworkStatusListenerAndroid.java index eb47e4b5..fe3601b 100644 --- a/components/download/network/android/java/src/org/chromium/components/download/NetworkStatusListenerAndroid.java +++ b/components/download/network/android/java/src/org/chromium/components/download/NetworkStatusListenerAndroid.java
@@ -41,14 +41,14 @@ static class Helper implements BackgroundNetworkStatusListener.Observer { // A thread handler that |mBackgroundNetworkStatusListener| lives on, which performs actual // network queries. Use a background thread to avoid jank on main thread. - private Handler mNetworkThreadHandler; + private final Handler mNetworkThreadHandler; // The object that performs actual network queries on a background thread. private BackgroundNetworkStatusListener mBackgroundNetworkStatusListener; private boolean mReady; private @ConnectionType int mConnectionType = ConnectionType.CONNECTION_UNKNOWN; - private ObserverList<BackgroundNetworkStatusListener.Observer> mObservers = + private final ObserverList<BackgroundNetworkStatusListener.Observer> mObservers = new ObserverList<>(); Helper() {
diff --git a/components/download/network/android/junit/src/org/chromium/components/download/NetworkStatusListenerAndroidTest.java b/components/download/network/android/junit/src/org/chromium/components/download/NetworkStatusListenerAndroidTest.java index e0cc4b44..c41d9f08 100644 --- a/components/download/network/android/junit/src/org/chromium/components/download/NetworkStatusListenerAndroidTest.java +++ b/components/download/network/android/junit/src/org/chromium/components/download/NetworkStatusListenerAndroidTest.java
@@ -38,7 +38,7 @@ private static class TestAutoDetectFactory extends BackgroundNetworkStatusListener.AutoDetectFactory { - private NetworkChangeNotifierAutoDetect mAutoDetect; + private final NetworkChangeNotifierAutoDetect mAutoDetect; TestAutoDetectFactory(NetworkChangeNotifierAutoDetect autoDetect) { mAutoDetect = autoDetect;
diff --git a/components/embedder_support/android/java/src/org/chromium/components/embedder_support/application/FontPreloadingWorkaround.java b/components/embedder_support/android/java/src/org/chromium/components/embedder_support/application/FontPreloadingWorkaround.java index c4572a0..5224c89 100644 --- a/components/embedder_support/android/java/src/org/chromium/components/embedder_support/application/FontPreloadingWorkaround.java +++ b/components/embedder_support/android/java/src/org/chromium/components/embedder_support/application/FontPreloadingWorkaround.java
@@ -94,7 +94,7 @@ } private static class PackageManagerWrapper implements InvocationHandler { - Object mRealPackageManager; + final Object mRealPackageManager; public PackageManagerWrapper(Object realPackageManager) { mRealPackageManager = realPackageManager;
diff --git a/components/embedder_support/android/java/src/org/chromium/components/embedder_support/delegate/ColorPickerAdvancedComponent.java b/components/embedder_support/android/java/src/org/chromium/components/embedder_support/delegate/ColorPickerAdvancedComponent.java index 09399b1b..c0bbf1e 100644 --- a/components/embedder_support/android/java/src/org/chromium/components/embedder_support/delegate/ColorPickerAdvancedComponent.java +++ b/components/embedder_support/android/java/src/org/chromium/components/embedder_support/delegate/ColorPickerAdvancedComponent.java
@@ -30,7 +30,7 @@ // The set of colors to interpolate the gradient through. private int @Nullable [] mGradientColors; // The Drawable that represents the gradient. - private GradientDrawable mGradientDrawable; + private final GradientDrawable mGradientDrawable; // The text label for the component. private final TextView mText;
diff --git a/components/embedder_support/android/java/src/org/chromium/components/embedder_support/delegate/ColorPickerBridge.java b/components/embedder_support/android/java/src/org/chromium/components/embedder_support/delegate/ColorPickerBridge.java index 0baba8b7dd..c8a4ce85 100644 --- a/components/embedder_support/android/java/src/org/chromium/components/embedder_support/delegate/ColorPickerBridge.java +++ b/components/embedder_support/android/java/src/org/chromium/components/embedder_support/delegate/ColorPickerBridge.java
@@ -26,7 +26,7 @@ @JNINamespace("web_contents_delegate_android") @NullMarked public class ColorPickerBridge { - private long mNativeDialog; + private final long mNativeDialog; private final ColorPickerCoordinator mColorPickerCoordinator; @CalledByNative
diff --git a/components/embedder_support/android/java/src/org/chromium/components/embedder_support/delegate/ColorPickerCoordinator.java b/components/embedder_support/android/java/src/org/chromium/components/embedder_support/delegate/ColorPickerCoordinator.java index 12995637..295bbb93 100644 --- a/components/embedder_support/android/java/src/org/chromium/components/embedder_support/delegate/ColorPickerCoordinator.java +++ b/components/embedder_support/android/java/src/org/chromium/components/embedder_support/delegate/ColorPickerCoordinator.java
@@ -66,7 +66,7 @@ private final Context mContext; private final Callback<Integer> mDialogDismissedCallback; private final ColorPickerDialogView mColorPickerDialogView; - private List<ColorSuggestion> mSuggestions; + private final List<ColorSuggestion> mSuggestions; private PropertyModel mModel; private MVCListAdapter.ModelList mSuggestionsModelList; private ModelListAdapter mSuggestionsAdapter;
diff --git a/components/embedder_support/android/java/src/org/chromium/components/embedder_support/delegate/ColorPickerDialogView.java b/components/embedder_support/android/java/src/org/chromium/components/embedder_support/delegate/ColorPickerDialogView.java index f127493..46f87f1c 100644 --- a/components/embedder_support/android/java/src/org/chromium/components/embedder_support/delegate/ColorPickerDialogView.java +++ b/components/embedder_support/android/java/src/org/chromium/components/embedder_support/delegate/ColorPickerDialogView.java
@@ -39,14 +39,14 @@ @Nullable private Callback<Integer> mDialogDismissedCallback; // GridView of the suggested colors from the web dev (or the default list if empty). - private ColorPickerSuggestionsView mSuggestionsView; + private final ColorPickerSuggestionsView mSuggestionsView; // View elements. - private View mDialogContent; - private View mChosenColor; - private LinearLayout mChosenColorContainer; - private ButtonCompat mViewSwitcher; - private ColorPickerAdvanced mCustomView; + private final View mDialogContent; + private final View mChosenColor; + private final LinearLayout mChosenColorContainer; + private final ButtonCompat mViewSwitcher; + private final ColorPickerAdvanced mCustomView; public ColorPickerDialogView(Context context) { super(context);
diff --git a/components/embedder_support/android/java/src/org/chromium/components/embedder_support/util/UrlConstants.java b/components/embedder_support/android/java/src/org/chromium/components/embedder_support/util/UrlConstants.java index 4603a5b..deb55c23 100644 --- a/components/embedder_support/android/java/src/org/chromium/components/embedder_support/util/UrlConstants.java +++ b/components/embedder_support/android/java/src/org/chromium/components/embedder_support/util/UrlConstants.java
@@ -146,7 +146,7 @@ private static class Holder { private static final String SERIALIZED_NTP_URL = "73,1,true,0,6,0,-1,0,-1,9,6,0,-1,15,1,0,-1,0,-1,false,false,chrome://newtab/"; - private static GURL sNtpGurl = + private static final GURL sNtpGurl = GURL.deserializeLatestVersionOnly(SERIALIZED_NTP_URL.replace(',', '\0')); }
diff --git a/components/embedder_support/android/javatests/src/org/chromium/components/embedder_support/delegate/ColorPickerDialogRenderTest.java b/components/embedder_support/android/javatests/src/org/chromium/components/embedder_support/delegate/ColorPickerDialogRenderTest.java index d9b93ca..e0d248a 100644 --- a/components/embedder_support/android/javatests/src/org/chromium/components/embedder_support/delegate/ColorPickerDialogRenderTest.java +++ b/components/embedder_support/android/javatests/src/org/chromium/components/embedder_support/delegate/ColorPickerDialogRenderTest.java
@@ -38,7 +38,7 @@ // TODO(crbug.com/344923212): Failing when batched, batch this again. public class ColorPickerDialogRenderTest { @ParameterAnnotations.ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = new NightModeTestUtils.NightModeParams().getParameters(); @Rule
diff --git a/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalNavigationParams.java b/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalNavigationParams.java index 8b8dcc2..b1852b2 100644 --- a/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalNavigationParams.java +++ b/components/external_intents/android/java/src/org/chromium/components/external_intents/ExternalNavigationParams.java
@@ -96,8 +96,8 @@ private final boolean mIsHiddenCrossFrameNavigation; private final boolean mIsSandboxedMainFrame; private final @Nullable Callback<AsyncActionTakenParams> mAsyncActionTakenCallback; - private boolean mIsRendererInitiated; - private @Nullable Origin mInitiatorOrigin; + private final boolean mIsRendererInitiated; + private final @Nullable Origin mInitiatorOrigin; private final long mNavigationId; private final boolean mIsCustomTab; @@ -273,8 +273,8 @@ /** The builder for {@link ExternalNavigationParams} objects. */ public static class Builder { - private GURL mUrl; - private boolean mIsIncognito; + private final GURL mUrl; + private final boolean mIsIncognito; private @Nullable GURL mReferrerUrl; private int mPageTransition; private boolean mIsRedirect;
diff --git a/components/external_intents/android/java/src/org/chromium/components/external_intents/InterceptNavigationDelegateImpl.java b/components/external_intents/android/java/src/org/chromium/components/external_intents/InterceptNavigationDelegateImpl.java index 1951ede..aac07830 100644 --- a/components/external_intents/android/java/src/org/chromium/components/external_intents/InterceptNavigationDelegateImpl.java +++ b/components/external_intents/android/java/src/org/chromium/components/external_intents/InterceptNavigationDelegateImpl.java
@@ -126,7 +126,7 @@ private static final long DEFER_NAVIGATION_TIMEOUT_MILLIS = 5000; - private InterceptNavigationDelegateClient mClient; + private final InterceptNavigationDelegateClient mClient; private static @Nullable Callback<Pair<GURL, OverrideUrlLoadingResult>> sResultCallbackForTesting;
diff --git a/components/external_intents/android/java/src/org/chromium/components/external_intents/RedirectHandler.java b/components/external_intents/android/java/src/org/chromium/components/external_intents/RedirectHandler.java index 548bcf4..e17dc74 100644 --- a/components/external_intents/android/java/src/org/chromium/components/external_intents/RedirectHandler.java +++ b/components/external_intents/android/java/src/org/chromium/components/external_intents/RedirectHandler.java
@@ -53,7 +53,7 @@ final boolean mExternalIntentStartedTask; // A resolver list which includes all resolvers of |mInitialIntent|. - HashSet<ComponentName> mCachedResolvers = new HashSet<ComponentName>(); + final HashSet<ComponentName> mCachedResolvers = new HashSet<ComponentName>(); IntentState( Intent initialIntent,
diff --git a/components/external_intents/android/javatests/src/org/chromium/components/external_intents/ExternalNavigationHandlerTest.java b/components/external_intents/android/javatests/src/org/chromium/components/external_intents/ExternalNavigationHandlerTest.java index f6f2e9a..8d0ed56 100644 --- a/components/external_intents/android/javatests/src/org/chromium/components/external_intents/ExternalNavigationHandlerTest.java +++ b/components/external_intents/android/javatests/src/org/chromium/components/external_intents/ExternalNavigationHandlerTest.java
@@ -2962,9 +2962,9 @@ } private static class IntentActivity { - private String mUrlPrefix; - private String mPackageName; - private boolean mIsExported; + private final String mUrlPrefix; + private final String mPackageName; + private final boolean mIsExported; private boolean mIsNotSpecialized; public IntentActivity(String urlPrefix, String packageName) { @@ -3425,7 +3425,7 @@ private String mReferrerWebappPackageName; - private ArrayList<IntentActivity> mIntentActivities = new ArrayList<IntentActivity>(); + private final ArrayList<IntentActivity> mIntentActivities = new ArrayList<IntentActivity>(); private boolean mCanResolveActivityForExternalSchemes = true; private boolean mCanResolveActivityForMarket = true; public boolean mIsChromeAppInForeground = true; @@ -3468,7 +3468,7 @@ private boolean mChromeAppInForegroundRequired = true; private boolean mIsBackgroundTabNavigation; private boolean mHasUserGesture; - private RedirectHandler mRedirectHandler; + private final RedirectHandler mRedirectHandler; private boolean mIsRendererInitiated = true; private boolean mIsMainFrame = true; private boolean mIsInitialNavigationInFrame; @@ -3632,7 +3632,7 @@ } private static class TestPackageManager extends MockPackageManager { - private TestExternalNavigationDelegate mDelegate; + private final TestExternalNavigationDelegate mDelegate; public TestPackageManager(TestExternalNavigationDelegate delegate) { mDelegate = delegate; @@ -3651,7 +3651,7 @@ } private static class TestContext extends ContextWrapper { - private PackageManager mPackageManager; + private final PackageManager mPackageManager; public TestContext(Context baseContext, TestExternalNavigationDelegate delegate) { super(baseContext);
diff --git a/components/external_intents/android/javatests/src/org/chromium/components/external_intents/RedirectHandlerTest.java b/components/external_intents/android/javatests/src/org/chromium/components/external_intents/RedirectHandlerTest.java index 4e10173..65e4d42 100644 --- a/components/external_intents/android/javatests/src/org/chromium/components/external_intents/RedirectHandlerTest.java +++ b/components/external_intents/android/javatests/src/org/chromium/components/external_intents/RedirectHandlerTest.java
@@ -44,7 +44,7 @@ private static Intent sMoblieYtIntent; private static Intent sFooIntent; - private Function<Intent, List<ResolveInfo>> mQueryIntentFunction = + private final Function<Intent, List<ResolveInfo>> mQueryIntentFunction = (Intent intent) -> queryIntentActivities(intent); private Context mContextToRestore;
diff --git a/components/favicon/android/java/src/org/chromium/components/favicon/LargeIconBridge.java b/components/favicon/android/java/src/org/chromium/components/favicon/LargeIconBridge.java index ecc597e..9cad6fb 100644 --- a/components/favicon/android/java/src/org/chromium/components/favicon/LargeIconBridge.java +++ b/components/favicon/android/java/src/org/chromium/components/favicon/LargeIconBridge.java
@@ -36,10 +36,10 @@ private @Nullable LruCache<GURL, CachedFavicon> mFaviconCache; private static class CachedFavicon { - public @Nullable Bitmap icon; - public int fallbackColor; - public boolean isFallbackColorDefault; - public @IconType int iconType; + public final @Nullable Bitmap icon; + public final int fallbackColor; + public final boolean isFallbackColorDefault; + public final @IconType int iconType; CachedFavicon( @Nullable Bitmap newIcon,
diff --git a/components/feature_engagement/public/android/java/src/org/chromium/components/feature_engagement/CppWrappedTestTracker.java b/components/feature_engagement/public/android/java/src/org/chromium/components/feature_engagement/CppWrappedTestTracker.java index a69ca6a..7b9aed8 100644 --- a/components/feature_engagement/public/android/java/src/org/chromium/components/feature_engagement/CppWrappedTestTracker.java +++ b/components/feature_engagement/public/android/java/src/org/chromium/components/feature_engagement/CppWrappedTestTracker.java
@@ -41,7 +41,7 @@ // }; // TrackerFactory.getTrackerForProfile(profile).injectTracker(mTracker); - private String mOurFeature; + private final String mOurFeature; private boolean mWasDismissed; private @Nullable String mLastEvent;
diff --git a/components/find_in_page/android/java/src/org/chromium/components/find_in_page/FindResultBar.java b/components/find_in_page/android/java/src/org/chromium/components/find_in_page/FindResultBar.java index 22d9efc0..0d5658c 100644 --- a/components/find_in_page/android/java/src/org/chromium/components/find_in_page/FindResultBar.java +++ b/components/find_in_page/android/java/src/org/chromium/components/find_in_page/FindResultBar.java
@@ -75,7 +75,7 @@ private boolean mWaitingForActivateAck; - private static Comparator<RectF> sComparator = + private static final Comparator<RectF> sComparator = new Comparator<RectF>() { @Override public int compare(RectF a, RectF b) {
diff --git a/components/gcm_driver/instance_id/android/javatests/src/org/chromium/components/gcm_driver/instance_id/FakeInstanceIDWithSubtype.java b/components/gcm_driver/instance_id/android/javatests/src/org/chromium/components/gcm_driver/instance_id/FakeInstanceIDWithSubtype.java index d88c1c80..6d66be9 100644 --- a/components/gcm_driver/instance_id/android/javatests/src/org/chromium/components/gcm_driver/instance_id/FakeInstanceIDWithSubtype.java +++ b/components/gcm_driver/instance_id/android/javatests/src/org/chromium/components/gcm_driver/instance_id/FakeInstanceIDWithSubtype.java
@@ -20,12 +20,12 @@ */ @JNINamespace("instance_id") public class FakeInstanceIDWithSubtype extends InstanceIDWithSubtype { - private String mSubtype; + private final String mSubtype; private String mId; private long mCreationTime; /** Map from (subtype + ',' + authorizedEntity + ',' + scope) to token. */ - private Map<String, String> mTokens = new HashMap<>(); + private final Map<String, String> mTokens = new HashMap<>(); /** * Enable this in all InstanceID tests to use this fake instead of hitting the network/disk.
diff --git a/components/image_fetcher/android/java/src/org/chromium/components/image_fetcher/CachedImageFetcher.java b/components/image_fetcher/android/java/src/org/chromium/components/image_fetcher/CachedImageFetcher.java index 79dcc53..7745ac61 100644 --- a/components/image_fetcher/android/java/src/org/chromium/components/image_fetcher/CachedImageFetcher.java +++ b/components/image_fetcher/android/java/src/org/chromium/components/image_fetcher/CachedImageFetcher.java
@@ -72,7 +72,7 @@ } } - private ImageLoader mImageLoader; + private final ImageLoader mImageLoader; /** * Creates a CachedImageFetcher with the given bridge.
diff --git a/components/image_fetcher/android/java/src/org/chromium/components/image_fetcher/InMemoryCachedImageFetcher.java b/components/image_fetcher/android/java/src/org/chromium/components/image_fetcher/InMemoryCachedImageFetcher.java index c165cdc6..1636620 100644 --- a/components/image_fetcher/android/java/src/org/chromium/components/image_fetcher/InMemoryCachedImageFetcher.java +++ b/components/image_fetcher/android/java/src/org/chromium/components/image_fetcher/InMemoryCachedImageFetcher.java
@@ -26,7 +26,7 @@ // Will do the work if the image isn't cached in memory. private @Nullable ImageFetcher mImageFetcher; private @Nullable BitmapCache mBitmapCache; - private @ImageFetcherConfig int mConfig; + private final @ImageFetcherConfig int mConfig; /** * Create an instance with a custom max cache size.
diff --git a/components/infobars/android/java/src/org/chromium/components/infobars/InfoBarContainerLayout.java b/components/infobars/android/java/src/org/chromium/components/infobars/InfoBarContainerLayout.java index 4fba2d00..e4ba62c 100644 --- a/components/infobars/android/java/src/org/chromium/components/infobars/InfoBarContainerLayout.java +++ b/components/infobars/android/java/src/org/chromium/components/infobars/InfoBarContainerLayout.java
@@ -217,7 +217,7 @@ * content fades in. */ private class FirstInfoBarAppearingAnimation extends InfoBarAnimation { - private InfoBarUiItem mFrontItem; + private final InfoBarUiItem mFrontItem; private InfoBarWrapper mFrontWrapper; @@ -265,7 +265,7 @@ * will be resized simulatenously to the new desired size. */ private class FrontInfoBarAppearingAnimation extends InfoBarAnimation { - private InfoBarUiItem mFrontItem; + private final InfoBarUiItem mFrontItem; private InfoBarWrapper mFrontWrapper; private InfoBarWrapper mOldFrontWrapper; private View mFrontContents; @@ -363,7 +363,7 @@ * its top edge peeks out just a bit. */ private class BackInfoBarAppearingAnimation extends InfoBarAnimation { - private InfoBarWrapper mAppearingWrapper; + private final InfoBarWrapper mAppearingWrapper; BackInfoBarAppearingAnimation(InfoBarUiItem appearingItem) { mAppearingWrapper = new InfoBarWrapper(getContext(), appearingItem); @@ -556,7 +556,7 @@ */ private static class FloatingBehavior { /** The InfoBarContainerLayout. */ - private FrameLayout mLayout; + private final FrameLayout mLayout; /** * The max width of the infobars. If the available space is wider than this, the infobars @@ -684,10 +684,10 @@ /** The current animation, or null if no animation is happening currently. */ private @Nullable InfoBarAnimation mAnimation; - private FloatingBehavior mFloatingBehavior; + private final FloatingBehavior mFloatingBehavior; /** The runnable to make infobar container fully visible. */ - private Runnable mMakeContainerVisibleRunnable; + private final Runnable mMakeContainerVisibleRunnable; /** * Determines whether any animations need to run in order to make the visible views match the
diff --git a/components/infobars/android/java/src/org/chromium/components/infobars/InfoBarLayout.java b/components/infobars/android/java/src/org/chromium/components/infobars/InfoBarLayout.java index 5173895c..3756641 100644 --- a/components/infobars/android/java/src/org/chromium/components/infobars/InfoBarLayout.java +++ b/components/infobars/android/java/src/org/chromium/components/infobars/InfoBarLayout.java
@@ -57,10 +57,10 @@ public final class InfoBarLayout extends ViewGroup implements View.OnClickListener { /** Parameters used for laying out children. */ private static class LayoutParams extends ViewGroup.LayoutParams { - public int startMargin; - public int endMargin; - public int topMargin; - public int bottomMargin; + public final int startMargin; + public final int endMargin; + public final int topMargin; + public final int bottomMargin; // Where this view will be laid out. Calculated in onMeasure() and used in onLayout(). public int start; @@ -88,8 +88,8 @@ private final List<InfoBarControlLayout> mControlLayouts; private @Nullable ViewGroup mFooterViewGroup; - private TextView mMessageTextView; - private @Nullable ImageView mIconView; + private final TextView mMessageTextView; + private final @Nullable ImageView mIconView; private @Nullable DualControlLayout mButtonRowLayout; private CharSequence mMessageMainText;
diff --git a/components/infobars/core/confirm_infobar_delegate.cc b/components/infobars/core/confirm_infobar_delegate.cc index 948b824..f8bd3e0 100644 --- a/components/infobars/core/confirm_infobar_delegate.cc +++ b/components/infobars/core/confirm_infobar_delegate.cc
@@ -62,6 +62,14 @@ return std::u16string(); } +bool ConfirmInfoBarDelegate::ShouldShowLinkBeforeButton() const { + return false; +} + +int ConfirmInfoBarDelegate::GetLinkSpacingWhenPositionedBeforeButton() const { + return 0; +} + #if BUILDFLAG(IS_IOS) bool ConfirmInfoBarDelegate::UseIconBackgroundTint() const { return true;
diff --git a/components/infobars/core/confirm_infobar_delegate.h b/components/infobars/core/confirm_infobar_delegate.h index 86263b0b..9db2fdf4 100644 --- a/components/infobars/core/confirm_infobar_delegate.h +++ b/components/infobars/core/confirm_infobar_delegate.h
@@ -77,6 +77,14 @@ // returns an empty tooltip. virtual std::u16string GetButtonTooltip(InfoBarButton button) const; + // Returns true if this specific infobar instance should use the + // custom layout to show the link text before the button. + virtual bool ShouldShowLinkBeforeButton() const; + + // Returns spacing which is to be used when the link shows before the button + // on the infobar. + virtual int GetLinkSpacingWhenPositionedBeforeButton() const; + #if BUILDFLAG(IS_IOS) // Returns whether or not a tint should be applied to the icon background. // Defaults to true.
diff --git a/components/installedapp/android/java/src/org/chromium/components/installedapp/InstalledAppProviderImpl.java b/components/installedapp/android/java/src/org/chromium/components/installedapp/InstalledAppProviderImpl.java index 76222ad..a19cc02 100644 --- a/components/installedapp/android/java/src/org/chromium/components/installedapp/InstalledAppProviderImpl.java +++ b/components/installedapp/android/java/src/org/chromium/components/installedapp/InstalledAppProviderImpl.java
@@ -121,8 +121,8 @@ @UiThread private class ResultHolder { private int mNumTasks; - private FilterInstalledApps_Response mCallback; - private ArrayList<RelatedApplication> mInstalledApps; + private final FilterInstalledApps_Response mCallback; + private final ArrayList<RelatedApplication> mInstalledApps; private int mDelayMs; /**
diff --git a/components/installedapp/android/java/src/org/chromium/components/installedapp/InstalledAppProviderTest.java b/components/installedapp/android/java/src/org/chromium/components/installedapp/InstalledAppProviderTest.java index 8b0239e..57cf8c4 100644 --- a/components/installedapp/android/java/src/org/chromium/components/installedapp/InstalledAppProviderTest.java +++ b/components/installedapp/android/java/src/org/chromium/components/installedapp/InstalledAppProviderTest.java
@@ -87,11 +87,11 @@ private TestInstalledAppProviderImplJni mTestInstalledAppProviderImplJni; private static class FakePackageManager extends PackageManagerDelegate { - private Map<String, PackageInfo> mPackageInfo = new HashMap<>(); - private Map<String, Resources> mResources = new HashMap<>(); + private final Map<String, PackageInfo> mPackageInfo = new HashMap<>(); + private final Map<String, Resources> mResources = new HashMap<>(); // The set of installed WebAPKs identified by their manifest URL. - private Set<String> mInstalledWebApks = new HashSet<>(); + private final Set<String> mInstalledWebApks = new HashSet<>(); public void addPackageInfo(PackageInfo packageInfo) { mPackageInfo.put(packageInfo.packageName, packageInfo); @@ -214,7 +214,7 @@ * for these tests). */ private static class FakeResources extends Resources { - private static AssetManager sAssetManager = createAssetManager(); + private static final AssetManager sAssetManager = createAssetManager(); private final int mId; private final String mValue;
diff --git a/components/media_router/browser/android/java/src/org/chromium/components/media_router/BrowserMediaRouterDialogController.java b/components/media_router/browser/android/java/src/org/chromium/components/media_router/BrowserMediaRouterDialogController.java index f9da70f..02b1bb7 100644 --- a/components/media_router/browser/android/java/src/org/chromium/components/media_router/BrowserMediaRouterDialogController.java +++ b/components/media_router/browser/android/java/src/org/chromium/components/media_router/BrowserMediaRouterDialogController.java
@@ -30,7 +30,7 @@ private final long mNativeDialogController; private @Nullable BaseMediaRouteDialogManager mDialogManager; - private WebContents mWebContents; + private final WebContents mWebContents; /** * Returns a new initialized {@link BrowserMediaRouterDialogController}.
diff --git a/components/media_router/browser/android/java/src/org/chromium/components/media_router/DiscoveryCallback.java b/components/media_router/browser/android/java/src/org/chromium/components/media_router/DiscoveryCallback.java index c519d41..4938a7b 100644 --- a/components/media_router/browser/android/java/src/org/chromium/components/media_router/DiscoveryCallback.java +++ b/components/media_router/browser/android/java/src/org/chromium/components/media_router/DiscoveryCallback.java
@@ -23,7 +23,7 @@ public class DiscoveryCallback extends MediaRouter.Callback { private final DiscoveryDelegate mDiscoveryDelegate; private final MediaRouteSelector mRouteSelector; - private Set<String> mSourceUrns = new HashSet<String>(); + private final Set<String> mSourceUrns = new HashSet<String>(); private List<MediaSink> mSinks = new ArrayList<MediaSink>(); public DiscoveryCallback(
diff --git a/components/media_router/browser/android/java/src/org/chromium/components/media_router/MediaStatusBridge.java b/components/media_router/browser/android/java/src/org/chromium/components/media_router/MediaStatusBridge.java index 031496a..e0f600d6 100644 --- a/components/media_router/browser/android/java/src/org/chromium/components/media_router/MediaStatusBridge.java +++ b/components/media_router/browser/android/java/src/org/chromium/components/media_router/MediaStatusBridge.java
@@ -21,7 +21,7 @@ @JNINamespace("media_router") @NullMarked public class MediaStatusBridge { - private MediaStatus mStatus; + private final MediaStatus mStatus; public MediaStatusBridge(MediaStatus status) { mStatus = status;
diff --git a/components/media_router/browser/android/java/src/org/chromium/components/media_router/caf/CafMessageHandler.java b/components/media_router/browser/android/java/src/org/chromium/components/media_router/caf/CafMessageHandler.java index 0d5ca51..c74a9999 100644 --- a/components/media_router/browser/android/java/src/org/chromium/components/media_router/caf/CafMessageHandler.java +++ b/components/media_router/browser/android/java/src/org/chromium/components/media_router/caf/CafMessageHandler.java
@@ -82,13 +82,13 @@ "MEDIA_SET_VOLUME", "SET_VOLUME", // "MEDIA_GET_STATUS", "GET_STATUS"); - private SparseArray<RequestRecord> mRequests; - private ArrayMap<String, Queue<Integer>> mStopRequests; - private Queue<RequestRecord> mVolumeRequests; + private final SparseArray<RequestRecord> mRequests; + private final ArrayMap<String, Queue<Integer>> mStopRequests; + private final Queue<RequestRecord> mVolumeRequests; private final CastSessionController mSessionController; private final CafMediaRouteProvider mRouteProvider; - private Handler mHandler; + private final Handler mHandler; /** * The record for client requests. {@link CafMessageHandler} uses this class to manage the
diff --git a/components/media_router/browser/android/java/src/org/chromium/components/media_router/caf/CastSessionController.java b/components/media_router/browser/android/java/src/org/chromium/components/media_router/caf/CastSessionController.java index 762bc02..58e6087 100644 --- a/components/media_router/browser/android/java/src/org/chromium/components/media_router/caf/CastSessionController.java +++ b/components/media_router/browser/android/java/src/org/chromium/components/media_router/caf/CastSessionController.java
@@ -27,9 +27,9 @@ public class CastSessionController extends BaseSessionController { private static final String TAG = "CafSessionCtrl"; - private List<String> mNamespaces = new ArrayList<String>(); + private final List<String> mNamespaces = new ArrayList<String>(); private CastListener mCastListener; - private CafNotificationController mNotificationController; + private final CafNotificationController mNotificationController; public CastSessionController(CafBaseMediaRouteProvider provider) { super(provider);
diff --git a/components/media_router/browser/android/java/src/org/chromium/components/media_router/caf/remoting/CafExpandedControllerActivity.java b/components/media_router/browser/android/java/src/org/chromium/components/media_router/caf/remoting/CafExpandedControllerActivity.java index 0348023..c983fbc 100644 --- a/components/media_router/browser/android/java/src/org/chromium/components/media_router/caf/remoting/CafExpandedControllerActivity.java +++ b/components/media_router/browser/android/java/src/org/chromium/components/media_router/caf/remoting/CafExpandedControllerActivity.java
@@ -51,7 +51,7 @@ } /** Handle actions from on-screen media controls. */ - private MediaController.Delegate mControllerDelegate = + private final MediaController.Delegate mControllerDelegate = new MediaController.Delegate() { @Override public void play() {
diff --git a/components/media_router/browser/android/java/src/org/chromium/components/media_router/caf/remoting/RemotingSessionController.java b/components/media_router/browser/android/java/src/org/chromium/components/media_router/caf/remoting/RemotingSessionController.java index 47f72ee..ab5ac20 100644 --- a/components/media_router/browser/android/java/src/org/chromium/components/media_router/caf/remoting/RemotingSessionController.java +++ b/components/media_router/browser/android/java/src/org/chromium/components/media_router/caf/remoting/RemotingSessionController.java
@@ -31,7 +31,7 @@ } private @Nullable FlingingControllerAdapter mFlingingControllerAdapter; - private RemotingNotificationController mNotificationController; + private final RemotingNotificationController mNotificationController; RemotingSessionController(CafBaseMediaRouteProvider provider) { super(provider);
diff --git a/components/media_router/browser/android/junit/src/org/chromium/components/media_router/JSONTestUtils.java b/components/media_router/browser/android/junit/src/org/chromium/components/media_router/JSONTestUtils.java index b82c954..d8c1e16 100644 --- a/components/media_router/browser/android/junit/src/org/chromium/components/media_router/JSONTestUtils.java +++ b/components/media_router/browser/android/junit/src/org/chromium/components/media_router/JSONTestUtils.java
@@ -93,7 +93,7 @@ /** Matcher to determine whether a JSON string is equal to the expected one. */ public static class JSONStringLike implements ArgumentMatcher<String> { - private JSONObject mExpected; + private final JSONObject mExpected; public JSONStringLike(JSONObject expected) { mExpected = expected;
diff --git a/components/media_router/browser/android/junit/src/org/chromium/components/media_router/caf/BaseSessionControllerTest.java b/components/media_router/browser/android/junit/src/org/chromium/components/media_router/caf/BaseSessionControllerTest.java index 7b221a8..3417a5c3 100644 --- a/components/media_router/browser/android/junit/src/org/chromium/components/media_router/caf/BaseSessionControllerTest.java +++ b/components/media_router/browser/android/junit/src/org/chromium/components/media_router/caf/BaseSessionControllerTest.java
@@ -234,7 +234,7 @@ } private static class TestSessionController extends BaseSessionController { - public BaseNotificationController mNotificationController; + public final BaseNotificationController mNotificationController; public TestSessionController( CafBaseMediaRouteProvider provider,
diff --git a/components/media_router/test/android/cast_emulator/src/org/chromium/components/media_router/cast_emulator/TestMediaRouteProvider.java b/components/media_router/test/android/cast_emulator/src/org/chromium/components/media_router/cast_emulator/TestMediaRouteProvider.java index 6bade7e9..13d724d 100644 --- a/components/media_router/test/android/cast_emulator/src/org/chromium/components/media_router/cast_emulator/TestMediaRouteProvider.java +++ b/components/media_router/test/android/cast_emulator/src/org/chromium/components/media_router/cast_emulator/TestMediaRouteProvider.java
@@ -26,7 +26,7 @@ final class TestMediaRouteProvider extends MediaRouteProvider { private static final String TAG = "TestMRP"; - private List<RoutePublisher> mRoutePublishers = new ArrayList<RoutePublisher>(); + private final List<RoutePublisher> mRoutePublishers = new ArrayList<RoutePublisher>(); public TestMediaRouteProvider(Context context) { super(context);
diff --git a/components/media_router/test/android/cast_emulator/src/org/chromium/components/media_router/cast_emulator/remote/RemoteSessionManager.java b/components/media_router/test/android/cast_emulator/src/org/chromium/components/media_router/cast_emulator/remote/RemoteSessionManager.java index 6acc4fa..687b1c52 100644 --- a/components/media_router/test/android/cast_emulator/src/org/chromium/components/media_router/cast_emulator/remote/RemoteSessionManager.java +++ b/components/media_router/test/android/cast_emulator/src/org/chromium/components/media_router/cast_emulator/remote/RemoteSessionManager.java
@@ -40,7 +40,7 @@ return sInstance; } - private String mName; + private final String mName; private int mSessionId; private int mItemId; private boolean mPaused; @@ -52,7 +52,7 @@ private static RemoteSessionManager sInstance; private LocalSessionManager mLocalSessionManager; - private Context mContext; + private final Context mContext; private RemoteSessionManager(String name, Context context) { mName = name;
diff --git a/components/messages/android/internal/java/src/org/chromium/components/messages/MessageAnimationCoordinatorUnitTest.java b/components/messages/android/internal/java/src/org/chromium/components/messages/MessageAnimationCoordinatorUnitTest.java index 151d470..86dfc29 100644 --- a/components/messages/android/internal/java/src/org/chromium/components/messages/MessageAnimationCoordinatorUnitTest.java +++ b/components/messages/android/internal/java/src/org/chromium/components/messages/MessageAnimationCoordinatorUnitTest.java
@@ -53,7 +53,7 @@ @RunWith(BaseRobolectricTestRunner.class) @LooperMode(PAUSED) public class MessageAnimationCoordinatorUnitTest { - private MessageQueueDelegate mQueueDelegate = + private final MessageQueueDelegate mQueueDelegate = Mockito.spy( new MessageQueueDelegate() { @Override
diff --git a/components/messages/android/internal/java/src/org/chromium/components/messages/MessageBannerRenderTest.java b/components/messages/android/internal/java/src/org/chromium/components/messages/MessageBannerRenderTest.java index 582a012..d0e99eb 100644 --- a/components/messages/android/internal/java/src/org/chromium/components/messages/MessageBannerRenderTest.java +++ b/components/messages/android/internal/java/src/org/chromium/components/messages/MessageBannerRenderTest.java
@@ -59,7 +59,7 @@ @Batch(Batch.UNIT_TESTS) public class MessageBannerRenderTest { @ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = new NightModeTestUtils.NightModeParams().getParameters(); @ClassRule
diff --git a/components/messages/android/internal/java/src/org/chromium/components/messages/MessageQueueManagerTest.java b/components/messages/android/internal/java/src/org/chromium/components/messages/MessageQueueManagerTest.java index 68697b6..097b7ca 100644 --- a/components/messages/android/internal/java/src/org/chromium/components/messages/MessageQueueManagerTest.java +++ b/components/messages/android/internal/java/src/org/chromium/components/messages/MessageQueueManagerTest.java
@@ -47,7 +47,7 @@ @EnableFeatures({MessageFeatureList.MESSAGES_ANDROID_EXTRA_HISTOGRAMS}) public class MessageQueueManagerTest { - private MessageQueueDelegate mEmptyDelegate = + private final MessageQueueDelegate mEmptyDelegate = new MessageQueueDelegate() { boolean mIsReadyForShowing;
diff --git a/components/messages/android/internal/java/src/org/chromium/components/messages/SingleActionMessage.java b/components/messages/android/internal/java/src/org/chromium/components/messages/SingleActionMessage.java index edfd7ec..c61629e1 100644 --- a/components/messages/android/internal/java/src/org/chromium/components/messages/SingleActionMessage.java +++ b/components/messages/android/internal/java/src/org/chromium/components/messages/SingleActionMessage.java
@@ -46,7 +46,7 @@ private boolean mFullyVisibleBefore; private final boolean mAreExtraHistogramsEnabled; - private long mMessageEnqueuedTime; + private final long mMessageEnqueuedTime; // The timestamp when the message was shown. Used for reproting visible duration. private long mMessageShownTime;
diff --git a/components/messages/android/internal/java/src/org/chromium/components/messages/SingleActionMessageTest.java b/components/messages/android/internal/java/src/org/chromium/components/messages/SingleActionMessageTest.java index a0a91ba..ab34062 100644 --- a/components/messages/android/internal/java/src/org/chromium/components/messages/SingleActionMessageTest.java +++ b/components/messages/android/internal/java/src/org/chromium/components/messages/SingleActionMessageTest.java
@@ -57,7 +57,7 @@ private static Activity sActivity; private static class MockDurationProvider implements MessageAutodismissDurationProvider { - private long mDuration; + private final long mDuration; public MockDurationProvider(long duration) { mDuration = duration; @@ -77,7 +77,7 @@ private CallbackHelper mPrimaryActionCallback; private CallbackHelper mSecondaryActionCallback; private CallbackHelper mDismissCallback; - private SingleActionMessage.DismissCallback mEmptyDismissCallback = + private final SingleActionMessage.DismissCallback mEmptyDismissCallback = (model, dismissReason) -> {}; @BeforeClass
diff --git a/components/minidump_uploader/BUILD.gn b/components/minidump_uploader/BUILD.gn index f90e617..dc243320 100644 --- a/components/minidump_uploader/BUILD.gn +++ b/components/minidump_uploader/BUILD.gn
@@ -20,6 +20,7 @@ ":minidump_uploader_jni_headers", "//base", "//components/crash/android:anr_skipped_reason", + "//components/crash/android:anr_build_id_provider", "//components/crash/android:crash_android", "//components/version_info", "//components/version_info/android:channel_getter", @@ -39,6 +40,7 @@ "//base/test:run_all_unittests", "//base/test:test_support", "//base/version_info/android:version_constants_java", + "//components/crash/android:anr_build_id_provider", "//components/crash/android:crash_android", "//components/version_info", "//testing/gtest",
diff --git a/components/minidump_uploader/android/javatests/src/org/chromium/components/minidump_uploader/MinidumpUploadCallableTest.java b/components/minidump_uploader/android/javatests/src/org/chromium/components/minidump_uploader/MinidumpUploadCallableTest.java index 3ca0a11..d02185d 100644 --- a/components/minidump_uploader/android/javatests/src/org/chromium/components/minidump_uploader/MinidumpUploadCallableTest.java +++ b/components/minidump_uploader/android/javatests/src/org/chromium/components/minidump_uploader/MinidumpUploadCallableTest.java
@@ -38,7 +38,7 @@ private File mExpectedFileAfterUpload; private static class MockMinidumpUploader extends MinidumpUploader { - private Result mMockResult; + private final Result mMockResult; public static MinidumpUploader returnsSuccess() { return new MockMinidumpUploader(
diff --git a/components/minidump_uploader/android/javatests/src/org/chromium/components/minidump_uploader/TestMinidumpUploaderDelegate.java b/components/minidump_uploader/android/javatests/src/org/chromium/components/minidump_uploader/TestMinidumpUploaderDelegate.java index 0f36696..553f2ab 100644 --- a/components/minidump_uploader/android/javatests/src/org/chromium/components/minidump_uploader/TestMinidumpUploaderDelegate.java +++ b/components/minidump_uploader/android/javatests/src/org/chromium/components/minidump_uploader/TestMinidumpUploaderDelegate.java
@@ -10,8 +10,8 @@ /** Test-implementation of MinidumpUploaderDelegate. */ class TestMinidumpUploaderDelegate implements MinidumpUploaderDelegate { - private CrashReportingPermissionManager mPermissionManager; - private File mCacheDir; + private final CrashReportingPermissionManager mPermissionManager; + private final File mCacheDir; public TestMinidumpUploaderDelegate( File cacheDir, CrashReportingPermissionManager permissionManager) {
diff --git a/components/minidump_uploader/rewrite_minidumps_as_mimes.cc b/components/minidump_uploader/rewrite_minidumps_as_mimes.cc index 2c24b9d..304365b 100644 --- a/components/minidump_uploader/rewrite_minidumps_as_mimes.cc +++ b/components/minidump_uploader/rewrite_minidumps_as_mimes.cc
@@ -12,6 +12,7 @@ #include "base/logging.h" #include "base/metrics/histogram_macros.h" #include "base/notreached.h" +#include "base/strings/string_number_conversions.h" #include "base/strings/stringprintf.h" #include "build/build_config.h" #include "components/crash/android/anr_build_id_provider.h" @@ -222,6 +223,7 @@ crashpad::FileWriterInterface* writer, const std::string& version_number, const std::string& build_id, + const std::string& variations_string, const std::string& anr_file_name) { crashpad::HTTPMultipartBuilder builder; builder.SetFormData("version", version_number); @@ -260,6 +262,19 @@ builder.SetFormData("resources_version", info->resources_version()); builder.SetFormData("gms_core_version", info->gms_version_code()); + if (!variations_string.empty()) { + size_t delimiter_pos = variations_string.find('\n'); + if (delimiter_pos != std::string::npos) { + std::string num_experiments = variations_string.substr(0, delimiter_pos); + std::string experiment_list = variations_string.substr(delimiter_pos + 1); + builder.SetFormData("num-experiments", num_experiments); + builder.SetFormData("variations", experiment_list); + } else { + LOG(ERROR) << "Found a malformed variations string: " + << variations_string; + } + } + // The package name and version are used for deobfuscation, but will // only be accurate for the same version of chrome. if (version_number == version_info::GetVersionNumber()) { @@ -286,10 +301,11 @@ std::string dest_dir; base::android::ConvertJavaStringToUTF8(env, j_dest_dir, &dest_dir); - for (size_t i = 0; i < anr_strings.size(); i += 3) { + for (size_t i = 0; i < anr_strings.size(); i += 4) { std::string anr_proto_file_path = anr_strings.at(i); std::string chrome_version = anr_strings.at(i + 1); std::string build_id = anr_strings.at(i + 2); + std::string variations_string = anr_strings.at(i + 3); crashpad::FileWriter writer; crashpad::FileReader reader; crashpad::UUID uuid; @@ -306,7 +322,8 @@ continue; } - WriteAnrAsMime(&reader, &writer, chrome_version, build_id, anr_file_name); + WriteAnrAsMime(&reader, &writer, chrome_version, build_id, + variations_string, anr_file_name); } }
diff --git a/components/minidump_uploader/rewrite_minidumps_as_mimes.h b/components/minidump_uploader/rewrite_minidumps_as_mimes.h index 7606471c..fdb583e 100644 --- a/components/minidump_uploader/rewrite_minidumps_as_mimes.h +++ b/components/minidump_uploader/rewrite_minidumps_as_mimes.h
@@ -33,6 +33,7 @@ crashpad::FileWriterInterface* writer, const std::string& version_number, const std::string& build_id, + const std::string& variations_string, const std::string& anr_file_name); } // namespace minidump_uploader
diff --git a/components/minidump_uploader/rewrite_minidumps_as_mimes_unittest.cc b/components/minidump_uploader/rewrite_minidumps_as_mimes_unittest.cc index 725bec2..86b375b 100644 --- a/components/minidump_uploader/rewrite_minidumps_as_mimes_unittest.cc +++ b/components/minidump_uploader/rewrite_minidumps_as_mimes_unittest.cc
@@ -13,7 +13,7 @@ TEST(RewriteMinidumpsAsMimesTest, FakeVersionAndBuildIdProvided) { crashpad::StringFile writer; std::string fake_build_id = "fakebuildid"; - WriteAnrAsMime(nullptr, &writer, "111.0.fake.123", fake_build_id, ""); + WriteAnrAsMime(nullptr, &writer, "111.0.fake.123", fake_build_id, "", ""); EXPECT_NE(writer.string().find("elf_build_id"), std::string::npos); EXPECT_NE(writer.string().find("fakebuildid"), std::string::npos); } @@ -23,7 +23,7 @@ std::string fake_build_id = "fakebuildid"; WriteAnrAsMime(nullptr, &writer, std::string(version_info::GetVersionNumber()), fake_build_id, - ""); + "", ""); EXPECT_NE(writer.string().find("elf_build_id"), std::string::npos); EXPECT_NE(writer.string().find("fakebuildid"), std::string::npos); } @@ -31,7 +31,7 @@ TEST(RewriteMinidumpsAsMimesTest, FakeVersionNoBuildIdProvided) { crashpad::StringFile writer; std::string real_build_id = crash_reporter::GetElfBuildId(); - WriteAnrAsMime(nullptr, &writer, "111.0.fake.123", "", ""); + WriteAnrAsMime(nullptr, &writer, "111.0.fake.123", "", "", ""); EXPECT_EQ(writer.string().find("elf_build_id"), std::string::npos); } @@ -39,8 +39,34 @@ crashpad::StringFile writer; std::string real_build_id = crash_reporter::GetElfBuildId(); WriteAnrAsMime(nullptr, &writer, - std::string(version_info::GetVersionNumber()), "", ""); + std::string(version_info::GetVersionNumber()), "", "", ""); EXPECT_NE(writer.string().find("elf_build_id"), std::string::npos); EXPECT_NE(writer.string().find(real_build_id), std::string::npos); } + +TEST(RewriteMinidumpsAsMimesTest, MalformedVariationsString) { + crashpad::StringFile writer; + std::string num_experiments = "2"; + std::string variations_list = "5e3a236d-59e286d0,3ac60855-486e2a9c,"; + std::string malformed_variations_string_without_newline = + num_experiments + variations_list; + WriteAnrAsMime(nullptr, &writer, "111.0.fake.123", "fakebuildid", + malformed_variations_string_without_newline, ""); + EXPECT_EQ(writer.string().find("num-experiments"), std::string::npos); + EXPECT_EQ(writer.string().find("variations"), std::string::npos); + EXPECT_EQ(writer.string().find(variations_list), std::string::npos); +} + +TEST(RewriteMinidumpsAsMimesTest, CorrectVariationsString) { + crashpad::StringFile writer; + std::string num_experiments = "2"; + std::string variations_list = "5e3a236d-59e286d0,3ac60855-486e2a9c,"; + std::string correct_variations_string_with_newline = + num_experiments + "\n" + variations_list; + WriteAnrAsMime(nullptr, &writer, "111.0.fake.123", "fakebuildid", + correct_variations_string_with_newline, ""); + EXPECT_NE(writer.string().find("num-experiments"), std::string::npos); + EXPECT_NE(writer.string().find("variations"), std::string::npos); + EXPECT_NE(writer.string().find(variations_list), std::string::npos); +} } // namespace minidump_uploader
diff --git a/components/module_installer/android/java/src/org/chromium/components/module_installer/builder/ModuleEngine.java b/components/module_installer/android/java/src/org/chromium/components/module_installer/builder/ModuleEngine.java index 1926ba0..ce172832 100644 --- a/components/module_installer/android/java/src/org/chromium/components/module_installer/builder/ModuleEngine.java +++ b/components/module_installer/android/java/src/org/chromium/components/module_installer/builder/ModuleEngine.java
@@ -23,7 +23,7 @@ @NullMarked class ModuleEngine implements InstallEngine { private @Nullable InstallEngine mInstallEngine; - private EngineFactory mEngineFactory; + private final EngineFactory mEngineFactory; private final String mImplClassName;
diff --git a/components/module_installer/android/java/src/org/chromium/components/module_installer/observer/ActivityObserver.java b/components/module_installer/android/java/src/org/chromium/components/module_installer/observer/ActivityObserver.java index db145015..19f0c33 100644 --- a/components/module_installer/android/java/src/org/chromium/components/module_installer/observer/ActivityObserver.java +++ b/components/module_installer/android/java/src/org/chromium/components/module_installer/observer/ActivityObserver.java
@@ -22,7 +22,7 @@ @NullMarked public class ActivityObserver implements InstallerObserver, ApplicationStatus.ActivityStateListener { - private static HashSet<Integer> sActivityIds = new HashSet<Integer>(); + private static final HashSet<Integer> sActivityIds = new HashSet<Integer>(); private final ActivityObserverFacade mFacade; private final InstallEngine mInstallEngine;
diff --git a/components/module_installer/android/junit/src/org/chromium/components/module_installer/builder/ModuleTest.java b/components/module_installer/android/junit/src/org/chromium/components/module_installer/builder/ModuleTest.java index 12132b9..30179f7 100644 --- a/components/module_installer/android/junit/src/org/chromium/components/module_installer/builder/ModuleTest.java +++ b/components/module_installer/android/junit/src/org/chromium/components/module_installer/builder/ModuleTest.java
@@ -25,8 +25,8 @@ public class ModuleTest { @Mock private InstallEngine mInstallEngineMock; - private final String mModuleName = "module_stub"; - private final Class mInterface = ModuleTestStubInterface.class; + private static final String MODULE_NAME = "module_stub"; + private static final Class INTERFACE = ModuleTestStubInterface.class; private final String mImplName = ModuleTestStub.class.getName(); private Module<ModuleTestStub> mModule; @@ -43,7 +43,7 @@ public void setUp() { MockitoAnnotations.initMocks(this); - mModule = new Module<ModuleTestStub>(mModuleName, mInterface, mImplName); + mModule = new Module<ModuleTestStub>(MODULE_NAME, INTERFACE, mImplName); mModule.setInstallEngine(mInstallEngineMock); } @@ -56,7 +56,7 @@ mModule.isInstalled(); // Assert. - inOrder.verify(mInstallEngineMock).isInstalled(mModuleName); + inOrder.verify(mInstallEngineMock).isInstalled(MODULE_NAME); inOrder.verifyNoMoreInteractions(); } @@ -70,7 +70,7 @@ mModule.install(listenerMock); // Assert. - inOrder.verify(mInstallEngineMock).install(mModuleName, listenerMock); + inOrder.verify(mInstallEngineMock).install(MODULE_NAME, listenerMock); inOrder.verifyNoMoreInteractions(); } @@ -83,7 +83,7 @@ mModule.installDeferred(); // Assert. - inOrder.verify(mInstallEngineMock).installDeferred(mModuleName); + inOrder.verify(mInstallEngineMock).installDeferred(MODULE_NAME); inOrder.verifyNoMoreInteractions(); } @@ -91,7 +91,7 @@ public void whenGetImpl_VerifyCorrectInstance() { // Arrange. Class expectedType = ModuleTestStub.class; - doReturn(true).when(mInstallEngineMock).isInstalled(mModuleName); + doReturn(true).when(mInstallEngineMock).isInstalled(MODULE_NAME); // Act. ModuleTestStub impl = mModule.getImpl(); @@ -104,8 +104,9 @@ public void whenGettingUnknownImpl_VerifyError() { // Arrange. String impl = "some unknown type"; - Module<ModuleTestStub> module = new Module<ModuleTestStub>(mModuleName, mInterface, impl); - doReturn(true).when(mInstallEngineMock).isInstalled(mModuleName); + Module<ModuleTestStub> module = + new Module<ModuleTestStub>(MODULE_NAME, INTERFACE, impl); + doReturn(true).when(mInstallEngineMock).isInstalled(MODULE_NAME); module.setInstallEngine(mInstallEngineMock); // Act & Assert.
diff --git a/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineContentAggregatorBridge.java b/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineContentAggregatorBridge.java index 757f3730..b3dc516 100644 --- a/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineContentAggregatorBridge.java +++ b/components/offline_items_collection/core/android/java/src/org/chromium/components/offline_items_collection/OfflineContentAggregatorBridge.java
@@ -25,7 +25,7 @@ @NullMarked public class OfflineContentAggregatorBridge implements OfflineContentProvider { private long mNativeOfflineContentAggregatorBridge; - private ObserverList<OfflineContentProvider.Observer> mObservers; + private final ObserverList<OfflineContentProvider.Observer> mObservers; /** * A private constructor meant to be called by the C++ OfflineContentAggregatorBridge.
diff --git a/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/AutocompleteInputUnitTest.java b/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/AutocompleteInputUnitTest.java index 71814b2..7d454b4 100644 --- a/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/AutocompleteInputUnitTest.java +++ b/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/AutocompleteInputUnitTest.java
@@ -20,7 +20,7 @@ /** Tests for {@link AutocompleteMediator}. */ @RunWith(BaseRobolectricTestRunner.class) public class AutocompleteInputUnitTest { - private AutocompleteInput mInput = new AutocompleteInput(); + private final AutocompleteInput mInput = new AutocompleteInput(); private void verifyCacheablePageClasses(Set<Integer> allowedPageClasses) { for (var pageClass : PageClassification.values()) {
diff --git a/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/AutocompleteMatch.java b/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/AutocompleteMatch.java index fa7dd21..48e6f429 100644 --- a/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/AutocompleteMatch.java +++ b/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/AutocompleteMatch.java
@@ -72,7 +72,7 @@ private String mDisplayText; private final List<MatchClassification> mDisplayTextClassifications; private String mDescription; - private List<MatchClassification> mDescriptionClassifications; + private final List<MatchClassification> mDescriptionClassifications; private @Nullable RichAnswerTemplate mAnswerTemplate; private AnswerType mAnswerType; private final String mFillIntoEdit; @@ -91,7 +91,7 @@ private final boolean mAllowedToBeDefaultMatch; private final String mInlineAutocompletion; private final String mAdditionalText; - private @Nullable String mTabGroupUuid; + private final @Nullable String mTabGroupUuid; public AutocompleteMatch( int nativeType,
diff --git a/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/AutocompleteSchemeClassifier.java b/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/AutocompleteSchemeClassifier.java index 073e631..ff30e3404 100644 --- a/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/AutocompleteSchemeClassifier.java +++ b/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/AutocompleteSchemeClassifier.java
@@ -11,7 +11,7 @@ /** Dumb wrapper around the pointer to the C++ class AutocompleteSchemeClassifier. */ @NullMarked public class AutocompleteSchemeClassifier { - private long mNativePtr; + private final long mNativePtr; protected AutocompleteSchemeClassifier(long nativePtr) { this.mNativePtr = nativePtr;
diff --git a/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/OmniboxUrlEmphasizer.java b/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/OmniboxUrlEmphasizer.java index ad9051031..5830fa911 100644 --- a/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/OmniboxUrlEmphasizer.java +++ b/components/omnibox/browser/android/java/src/org/chromium/components/omnibox/OmniboxUrlEmphasizer.java
@@ -99,7 +99,7 @@ @VisibleForTesting public static class UrlEmphasisColorSpan extends ForegroundColorSpan implements UrlEmphasisSpan { - private int mEmphasisColor; + private final int mEmphasisColor; /** @param color The color to set the text. */ public UrlEmphasisColorSpan(int color) {
diff --git a/components/optimization_guide/proto/BUILD.gn b/components/optimization_guide/proto/BUILD.gn index b94f651..0e1b6c7a 100644 --- a/components/optimization_guide/proto/BUILD.gn +++ b/components/optimization_guide/proto/BUILD.gn
@@ -36,7 +36,6 @@ "features/notification_content_detection.proto", "features/password_change_submission.proto", "features/permissions_ai.proto", - "features/preferences_generation.proto", "features/product_specifications.proto", "features/prompt_api.proto", "features/scam_detection.proto",
diff --git a/components/optimization_guide/proto/features/preferences_generation.proto b/components/optimization_guide/proto/features/preferences_generation.proto deleted file mode 100644 index 47b24550..0000000 --- a/components/optimization_guide/proto/features/preferences_generation.proto +++ /dev/null
@@ -1,98 +0,0 @@ -// Copyright 2025 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -syntax = "proto3"; - -package optimization_guide.proto; - -import "components/optimization_guide/proto/model_quality_metadata.proto"; - -option optimize_for = LITE_RUNTIME; -option java_package = "org.chromium.components.optimization_guide.features.proto"; - -option java_outer_classname = "PreferencesGenerationProto"; - -// DO NOT EDIT THIS FILE DIRECTLY! -// -// This file is generated in g3 and then synced to Chrome. Instead, please -// refer to http://go/chrome-intelligence-feature-protos (Google-internal link), -// and then changes will be synced with Chrome automatically. - -message PreferencesGenerationLoggingData { - PreferenceRequest request = 1; - - PreferenceResponse response = 2; - - ModelExecutionInfo model_execution_info = 3; -} - -message PreferenceRequest { - repeated RequestVisit visits = 1; - - PreferenceType request_type = 2; -} - -// Data from ChromeHistoryProto. -message RequestVisit { - // The URL of the visited page. - string url = 1; - - // The title of the visited page. - string title = 2; - - // ID of the visit on the originator client. - // Maps to ChromeHistoryProto.originator_visit_id. - int64 visit_id = 4; - - // The ID of the visit, on the originator client, that was a referrer for - // this one, or 0 if no referrer exists. - // Maps to ChromeHistoryProto.originator_referring_visit_id. - int64 referring_visit_id = 5; - - // The ID of the visit, on the originator client, that opened this one, or 0 - // if no opener exists. - // Maps to ChromeHistoryProto.originator_opener_visit_id. - int64 opener_visit_id = 6; - - reserved 3, 7; -} - -message PreferenceResponse { - repeated CUJPreference cuj_preferences = 1; -} - -message CUJPreference { - string task_category = 1; // e.g. Grocery Shopping, Electronic Shopping - - repeated Preference preferences = 2; -} - -message Preference { - string value = 1; - - Attribution attribution = 2; - - ConfidenceLevel confidence = 3; -} - -message Attribution { - // The visits for later history delete related tracking - repeated int64 visit_ids = 1; -} - -enum PreferenceType { - PREFERENCE_TYPE_UNSPECIFIED = 0; - - PREFERENCE_TYPE_SITE = 1; -} - -enum ConfidenceLevel { - CONFIDENCE_LEVEL_UNSPECIFIED = 0; - - CONFIDENCE_LEVEL_LOW = 1; - - CONFIDENCE_LEVEL_MEDIUM = 2; - - CONFIDENCE_LEVEL_HIGH = 3; -}
diff --git a/components/optimization_guide/proto/model_quality_service.proto b/components/optimization_guide/proto/model_quality_service.proto index 9831deb..0c184f1 100644 --- a/components/optimization_guide/proto/model_quality_service.proto +++ b/components/optimization_guide/proto/model_quality_service.proto
@@ -20,7 +20,6 @@ import "components/optimization_guide/proto/features/notification_content_detection.proto"; import "components/optimization_guide/proto/features/password_change_submission.proto"; import "components/optimization_guide/proto/features/permissions_ai.proto"; -import "components/optimization_guide/proto/features/preferences_generation.proto"; import "components/optimization_guide/proto/features/product_specifications.proto"; import "components/optimization_guide/proto/features/scam_detection.proto"; import "components/optimization_guide/proto/features/tab_organization.proto"; @@ -82,8 +81,6 @@ WritingAssistanceApiLoggingData writing_assistance_api = 23; - PreferencesGenerationLoggingData preferences_generation = 24; - DefaultLoggingData default = 1000; } }
diff --git a/components/optimization_guide/proto/on_device_model_execution_config.proto b/components/optimization_guide/proto/on_device_model_execution_config.proto index 9a5a1e9d..24e89d38 100644 --- a/components/optimization_guide/proto/on_device_model_execution_config.proto +++ b/components/optimization_guide/proto/on_device_model_execution_config.proto
@@ -128,6 +128,8 @@ // Which output parsing implementation to use. optional ParserKind parser_kind = 4; + reserved 8; // FieldWiseParserConfig + // Whether to suppress parsing incomplete output. optional bool suppress_parsing_incomplete_output = 5; @@ -135,7 +137,7 @@ optional uint32 max_output_tokens = 6; // The response constraint to use when generating output. - optional ResponseConstraint response_constraint = 8; + optional ResponseConstraint response_constraint = 9; } message TextSafetyFallbackConfig {
diff --git a/components/page_info/android/java/src/org/chromium/components/page_info/ConnectionInfoView.java b/components/page_info/android/java/src/org/chromium/components/page_info/ConnectionInfoView.java index 00fc0e06..d63d854a 100644 --- a/components/page_info/android/java/src/org/chromium/components/page_info/ConnectionInfoView.java +++ b/components/page_info/android/java/src/org/chromium/components/page_info/ConnectionInfoView.java
@@ -48,7 +48,7 @@ "https://support.google.com/chrome?p=android_connection_info"; private final Context mContext; - private ConnectionInfoDelegate mDelegate; + private final ConnectionInfoDelegate mDelegate; private final LinearLayout mContainer; private final WebContents mWebContents; private final int mPaddingSides; @@ -236,7 +236,7 @@ private @Nullable ConnectionInfoView mPopup; private @Nullable PropertyModel mDialogModel; private final ModalDialogManager mModalDialogManager; - private WebContents mWebContents; + private final WebContents mWebContents; private final WebContentsObserver mWebContentsObserver; ConnectionInfoDialogDelegate(
diff --git a/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoConnectionController.java b/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoConnectionController.java index be7d6cd..2db3024c 100644 --- a/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoConnectionController.java +++ b/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoConnectionController.java
@@ -28,7 +28,7 @@ @NullMarked public class PageInfoConnectionController implements PageInfoSubpageController, ConnectionInfoView.ConnectionInfoDelegate { - private PageInfoMainController mMainController; + private final PageInfoMainController mMainController; private final WebContents mWebContents; private final PageInfoRowView mRowView; private final PageInfoControllerDelegate mDelegate;
diff --git a/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoController.java b/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoController.java index b874353..cbf7d1af 100644 --- a/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoController.java +++ b/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoController.java
@@ -86,7 +86,7 @@ @ContentSettingsType.EnumType public static final int NO_HIGHLIGHTED_PERMISSION = ContentSettingsType.DEFAULT; - private Context mContext; + private final Context mContext; private final WindowAndroid mWindowAndroid; private final WebContents mWebContents; private final PageInfoControllerDelegate mDelegate; @@ -95,27 +95,27 @@ private long mNativePageInfoController; // The main PageInfo view. - private PageInfoView mView; + private final PageInfoView mView; // The view inside the popup. - private PageInfoContainer mContainer; + private final PageInfoContainer mContainer; // The dialog the view is placed in. private @Nullable PageInfoDialog mDialog; // The full URL from the URL bar, which is copied to the user's clipboard when they select 'Copy // URL'. - private GURL mFullUrl; + private final GURL mFullUrl; // Whether or not this page is an internal chrome page (e.g. the // chrome://settings page). - private boolean mIsInternalPage; + private final boolean mIsInternalPage; // The security level of the page (a valid ConnectionSecurityLevel). - private @ConnectionSecurityLevel int mSecurityLevel; + private final @ConnectionSecurityLevel int mSecurityLevel; // Observer for dismissing dialog if web contents get destroyed, navigate etc. - private WebContentsObserver mWebContentsObserver; + private final WebContentsObserver mWebContentsObserver; // A task that should be run once the page info popup is animated out and dismissed. Null if no // task is pending. @@ -131,16 +131,16 @@ private @Nullable PageInfoSubpageController mCurrentSubpageController; // The controller for the connection section of the page info. - private PageInfoConnectionController mConnectionController; + private final PageInfoConnectionController mConnectionController; // The controller for the permissions section of the page info. - private PageInfoPermissionsController mPermissionsController; + private final PageInfoPermissionsController mPermissionsController; // The controller for the cookies section of the page info. - private @Nullable PageInfoCookiesController mCookiesController; + private final @Nullable PageInfoCookiesController mCookiesController; // All subpage controllers. - private Collection<PageInfoSubpageController> mSubpageControllers; + private final Collection<PageInfoSubpageController> mSubpageControllers; /** * Creates the PageInfoController, but does not display it. Also initializes the corresponding
diff --git a/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoCookiesController.java b/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoCookiesController.java index 10e546d..0213b81 100644 --- a/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoCookiesController.java +++ b/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoCookiesController.java
@@ -48,7 +48,7 @@ private long mExpiration; private boolean mShouldDisplaySiteBreakageString; private @Nullable Website mWebsite; - private boolean mBlockAll3pc; + private final boolean mBlockAll3pc; private boolean mIsIncognito; private boolean mIsModeBUi; private int mDaysUntilExpirationForTesting;
diff --git a/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoDialog.java b/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoDialog.java index ba9f02e..6ae6475 100644 --- a/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoDialog.java +++ b/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoDialog.java
@@ -55,7 +55,7 @@ private @Nullable Animator mCurrentAnimation; private boolean mDismissWithoutAnimation; - private @GravityInt int mDialogPosition; + private final @GravityInt int mDialogPosition; /** * Creates a new page info dialog. The dialog can appear as a sheet (using Android dialogs) or a
diff --git a/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoPermissionsController.java b/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoPermissionsController.java index 9215d49..75488d6 100644 --- a/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoPermissionsController.java +++ b/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoPermissionsController.java
@@ -63,8 +63,8 @@ private boolean mHasSoundPermission; private boolean mDataIsStale; private @Nullable SingleWebsiteSettings mSubPage; - @ContentSettingsType.EnumType private int mHighlightedPermission; - @ColorRes private int mHighlightColor; + @ContentSettingsType.EnumType private final int mHighlightedPermission; + @ColorRes private final int mHighlightColor; public PageInfoPermissionsController( PageInfoMainController mainController,
diff --git a/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoView.java b/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoView.java index a8934a8..9e421bbf 100644 --- a/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoView.java +++ b/components/page_info/android/java/src/org/chromium/components/page_info/PageInfoView.java
@@ -22,13 +22,13 @@ public class PageInfoView extends FrameLayout implements OnClickListener { private static final int COOKIES_ROW_POSITION = 1; - private LinearLayout mRowWrapper; - private PageInfoRowView mConnectionRow; - private PageInfoRowView mPermissionsRow; - private PageInfoRowView mCookiesRow; - private Button mForgetSiteButton; - private TextView mHttpsImageCompressionMessage; - private Button mOpenOnlineButton; + private final LinearLayout mRowWrapper; + private final PageInfoRowView mConnectionRow; + private final PageInfoRowView mPermissionsRow; + private final PageInfoRowView mCookiesRow; + private final Button mForgetSiteButton; + private final TextView mHttpsImageCompressionMessage; + private final Button mOpenOnlineButton; /** Parameters to configure the view of the page info popup. */ public static class Params {
diff --git a/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/PaintPreviewFrame.java b/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/PaintPreviewFrame.java index f22a9ca..9b5a0476 100644 --- a/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/PaintPreviewFrame.java +++ b/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/PaintPreviewFrame.java
@@ -20,10 +20,10 @@ */ @NullMarked class PaintPreviewFrame { - private UnguessableToken mGuid; + private final UnguessableToken mGuid; // The content size of this frame. In native, this is represented as 'scroll extent'. - private int mContentWidth; - private int mContentHeight; + private final int mContentWidth; + private final int mContentHeight; // Other frames that this frame embeds, its sub-frames. private PaintPreviewFrame[] mSubFrames; @@ -32,8 +32,8 @@ private Rect[] mSubFrameClips; // The initial scroll position of this frame. - private int mInitialScrollX; - private int mInitialScrollY; + private final int mInitialScrollX; + private final int mInitialScrollY; PaintPreviewFrame( UnguessableToken guid,
diff --git a/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/PlayerCompositorDelegateImpl.java b/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/PlayerCompositorDelegateImpl.java index e7ffbe7..f06f0f2 100644 --- a/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/PlayerCompositorDelegateImpl.java +++ b/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/PlayerCompositorDelegateImpl.java
@@ -35,9 +35,9 @@ public class PlayerCompositorDelegateImpl implements PlayerCompositorDelegate { private static final int LOW_MEMORY_THRESHOLD_KB = 2048; - private CompositorListener mCompositorListener; + private final CompositorListener mCompositorListener; private long mNativePlayerCompositorDelegate; - private List<Runnable> mMemoryPressureListeners = new ArrayList<>(); + private final List<Runnable> mMemoryPressureListeners = new ArrayList<>(); public PlayerCompositorDelegateImpl( NativePaintPreviewServiceProvider service,
diff --git a/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/PlayerGestureListener.java b/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/PlayerGestureListener.java index c4d24bb5..410bca7 100644 --- a/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/PlayerGestureListener.java +++ b/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/PlayerGestureListener.java
@@ -15,8 +15,8 @@ */ @NullMarked public class PlayerGestureListener { - private Runnable mUserInteractionCallback; - private LinkClickHandler mLinkClickHandler; + private final Runnable mUserInteractionCallback; + private final LinkClickHandler mLinkClickHandler; private @Nullable PlayerUserFrustrationDetector mUserFrustrationDetector; public PlayerGestureListener(
diff --git a/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/PlayerManager.java b/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/PlayerManager.java index cd7eb102..420cea5 100644 --- a/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/PlayerManager.java +++ b/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/PlayerManager.java
@@ -78,19 +78,19 @@ private static PlayerCompositorDelegate.Factory sCompositorDelegateFactory = new CompositorDelegateFactory(); - private Context mContext; + private final Context mContext; private PlayerCompositorDelegate mDelegate; private @Nullable PaintPreviewFrame mRootFrameData; private @Nullable PlayerFrameCoordinator mRootFrameCoordinator; - private FrameLayout mHostView; + private final FrameLayout mHostView; private static final String sInitEvent = "paint_preview PlayerManager init"; - private PlayerSwipeRefreshHandler mPlayerSwipeRefreshHandler; - private PlayerGestureListener mPlayerGestureListener; - private boolean mIgnoreInitialScrollOffset; - private Listener mListener; + private final PlayerSwipeRefreshHandler mPlayerSwipeRefreshHandler; + private final PlayerGestureListener mPlayerGestureListener; + private final boolean mIgnoreInitialScrollOffset; + private final Listener mListener; private long mNativeAxTree; private @Nullable PlayerAccessibilityDelegate mAccessibilityDelegate; private @Nullable WebContentsAccessibilityImpl mWebContentsAccessibility;
diff --git a/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/PlayerSwipeRefreshHandler.java b/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/PlayerSwipeRefreshHandler.java index 6feabcfc..caa5842 100644 --- a/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/PlayerSwipeRefreshHandler.java +++ b/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/PlayerSwipeRefreshHandler.java
@@ -24,10 +24,10 @@ private static final int STOP_REFRESH_ANIMATION_DELAY_MS = 500; // The modified AppCompat version of the refresh effect. - private SwipeRefreshLayout mSwipeRefreshLayout; + private final SwipeRefreshLayout mSwipeRefreshLayout; // A handler to delegate refreshes event to. - private Runnable mRefreshCallback; + private final Runnable mRefreshCallback; /* * Constructs a new instance of the handler.
diff --git a/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/PlayerUserActionRecorder.java b/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/PlayerUserActionRecorder.java index 1123695..a028ce1c 100644 --- a/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/PlayerUserActionRecorder.java +++ b/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/PlayerUserActionRecorder.java
@@ -21,7 +21,7 @@ private static final String ACTION_LONG_PRESS = "PaintPreview.Player.LongPress"; private static final long NO_RECORD_WINDOW_MS = (long) (.5 * 1000); - private static Map<String, Long> sLastRecordMap = new HashMap<>(); + private static final Map<String, Long> sLastRecordMap = new HashMap<>(); private static boolean shouldNotRecord(String action) { long nowMs = System.currentTimeMillis();
diff --git a/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/PlayerUserFrustrationDetector.java b/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/PlayerUserFrustrationDetector.java index a3144073..ba9ce82d 100644 --- a/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/PlayerUserFrustrationDetector.java +++ b/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/PlayerUserFrustrationDetector.java
@@ -14,8 +14,8 @@ /** Uses touch gesture-based heuristics to detect use frustration. */ @NullMarked public class PlayerUserFrustrationDetector { - private Runnable mFrustrationDetectionCallback; - private List<Long> mTapsTimeMs = new ArrayList<>(); + private final Runnable mFrustrationDetectionCallback; + private final List<Long> mTapsTimeMs = new ArrayList<>(); static final int CONSECUTIVE_SINGLE_TAP_WINDOW_MS = 2 * 1000; static final int CONSECUTIVE_SINGLE_TAP_COUNT = 3;
diff --git a/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/frame/PlayerFrameBitmapPainter.java b/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/frame/PlayerFrameBitmapPainter.java index 0a5d1299..4acaefb8 100644 --- a/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/frame/PlayerFrameBitmapPainter.java +++ b/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/frame/PlayerFrameBitmapPainter.java
@@ -23,10 +23,10 @@ class PlayerFrameBitmapPainter { private @Nullable Size mTileSize; private Bitmap @Nullable [][] mBitmapMatrix; - private Rect mViewPort = new Rect(); - private Rect mDrawBitmapSrc = new Rect(); - private Rect mDrawBitmapDst = new Rect(); - private Runnable mInvalidateCallback; + private final Rect mViewPort = new Rect(); + private final Rect mDrawBitmapSrc = new Rect(); + private final Rect mDrawBitmapDst = new Rect(); + private final Runnable mInvalidateCallback; private @Nullable Runnable mFirstPaintListener; private boolean mDestroyed;
diff --git a/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/frame/PlayerFrameBitmapState.java b/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/frame/PlayerFrameBitmapState.java index bc075d0..81d3658f 100644 --- a/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/frame/PlayerFrameBitmapState.java +++ b/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/frame/PlayerFrameBitmapState.java
@@ -31,7 +31,7 @@ private final Size mTileSize; /** The scale factor of bitmaps. */ - private float mScaleFactor; + private final float mScaleFactor; /** * Bitmaps that make up the contents. @@ -50,7 +50,7 @@ private boolean @Nullable [][] mRequiredBitmaps; /** Whether a bitmap is visible for a given request. */ - private boolean[][] mVisibleBitmaps; + private final boolean[][] mVisibleBitmaps; /** Delegate for accessing native to request bitmaps. */ private final PlayerCompositorDelegate mCompositorDelegate; @@ -342,8 +342,8 @@ /** Used as the callback for bitmap requests from the Paint Preview compositor. */ private class BitmapRequestHandler implements Callback<Bitmap> { - int mRequestRow; - int mRequestCol; + final int mRequestRow; + final int mRequestCol; int mRequestId; private BitmapRequestHandler(int requestRow, int requestCol) {
diff --git a/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/frame/PlayerFrameCoordinator.java b/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/frame/PlayerFrameCoordinator.java index fac60a0..026083c 100644 --- a/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/frame/PlayerFrameCoordinator.java +++ b/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/frame/PlayerFrameCoordinator.java
@@ -31,11 +31,11 @@ /** Sets up the view and the logic behind it for a Paint Preview frame. */ @NullMarked public class PlayerFrameCoordinator { - private PlayerFrameMediator mMediator; + private final PlayerFrameMediator mMediator; private @Nullable PlayerFrameScaleController mScaleController; - private PlayerFrameScrollController mScrollController; - private PlayerFrameView mView; - private List<PlayerFrameCoordinator> mSubFrames = new ArrayList<>(); + private final PlayerFrameScrollController mScrollController; + private final PlayerFrameView mView; + private final List<PlayerFrameCoordinator> mSubFrames = new ArrayList<>(); /** * Creates a {@link PlayerFrameMediator} and {@link PlayerFrameView} for this component and
diff --git a/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/frame/PlayerFrameGestureDetector.java b/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/frame/PlayerFrameGestureDetector.java index c4f91d23..be6ad203 100644 --- a/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/frame/PlayerFrameGestureDetector.java +++ b/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/frame/PlayerFrameGestureDetector.java
@@ -20,10 +20,10 @@ @NullMarked class PlayerFrameGestureDetector implements GestureDetector.OnGestureListener, ScaleGestureDetector.OnScaleGestureListener { - private GestureDetector mGestureDetector; - private ScaleGestureDetector mScaleGestureDetector; - private boolean mCanDetectZoom; - private PlayerFrameGestureDetectorDelegate mDelegate; + private final GestureDetector mGestureDetector; + private final ScaleGestureDetector mScaleGestureDetector; + private final boolean mCanDetectZoom; + private final PlayerFrameGestureDetectorDelegate mDelegate; private @Nullable PlayerFrameGestureDetector mParentGestureDetector; /**
diff --git a/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/frame/PlayerFrameMediator.java b/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/frame/PlayerFrameMediator.java index 0b5d73c..9fa9d1e 100644 --- a/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/frame/PlayerFrameMediator.java +++ b/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/frame/PlayerFrameMediator.java
@@ -67,7 +67,7 @@ private boolean mIsSubframe; /** Transient object to avoid allocation. */ - private Rect mScaledRectIntersection = new Rect(); + private final Rect mScaledRectIntersection = new Rect(); private float mInitialScaleFactor; private float mMinScaleFactor; @@ -79,7 +79,7 @@ private final PlayerFrameBitmapStateController mBitmapStateController; - private PlayerGestureListener mGestureListener; + private final PlayerGestureListener mGestureListener; private @Nullable Runnable mInitialViewportSizeAvailable; PlayerFrameMediator(
diff --git a/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/frame/PlayerFrameScaleController.java b/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/frame/PlayerFrameScaleController.java index 9ed1e67..fc285f98 100644 --- a/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/frame/PlayerFrameScaleController.java +++ b/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/frame/PlayerFrameScaleController.java
@@ -28,7 +28,7 @@ /** Interface for calling shared methods on the mediator. */ private final PlayerFrameMediatorDelegate mMediatorDelegate; - private @Nullable Supplier<Boolean> mIsAccessibilityEnabled; + private final @Nullable Supplier<Boolean> mIsAccessibilityEnabled; private final @Nullable Callback<Boolean> mOnScaleListener; private boolean mAcceptUserInput;
diff --git a/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/frame/PlayerFrameView.java b/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/frame/PlayerFrameView.java index 2daef7f..7010747 100644 --- a/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/frame/PlayerFrameView.java +++ b/components/paint_preview/player/android/java/src/org/chromium/components/paintpreview/player/frame/PlayerFrameView.java
@@ -31,13 +31,13 @@ */ @NullMarked public class PlayerFrameView extends FrameLayout { - private PlayerFrameBitmapPainter mBitmapPainter; - private PlayerFrameGestureDetector mGestureDetector; - private PlayerFrameViewDelegate mDelegate; + private final PlayerFrameBitmapPainter mBitmapPainter; + private final PlayerFrameGestureDetector mGestureDetector; + private final PlayerFrameViewDelegate mDelegate; private @Nullable List<View> mSubFrameViews; private @Nullable List<Rect> mSubFrameRects; private @Nullable Matrix mScaleMatrix; - private Matrix mOffset = new Matrix(); + private final Matrix mOffset = new Matrix(); protected @Nullable WebContentsAccessibility mWebContentsAccessibility; /**
diff --git a/components/paint_preview/player/android/javatests/src/org/chromium/components/paintpreview/player/PaintPreviewTestService.java b/components/paint_preview/player/android/javatests/src/org/chromium/components/paintpreview/player/PaintPreviewTestService.java index 344d915..18f8fda 100644 --- a/components/paint_preview/player/android/javatests/src/org/chromium/components/paintpreview/player/PaintPreviewTestService.java +++ b/components/paint_preview/player/android/javatests/src/org/chromium/components/paintpreview/player/PaintPreviewTestService.java
@@ -14,8 +14,8 @@ @JNINamespace("paint_preview") public class PaintPreviewTestService implements NativePaintPreviewServiceProvider { private static final String TAG = "PPTestService"; - private long mNativePaintPreviewBaseService; - private long mNativePaintPreviewTestService; + private final long mNativePaintPreviewBaseService; + private final long mNativePaintPreviewTestService; public PaintPreviewTestService(String path) { mNativePaintPreviewTestService = PaintPreviewTestServiceJni.get().getInstance(path);
diff --git a/components/paint_preview/player/android/junit/src/org/chromium/components/paintpreview/player/frame/PlayerFrameBitmapPainterTest.java b/components/paint_preview/player/android/junit/src/org/chromium/components/paintpreview/player/frame/PlayerFrameBitmapPainterTest.java index 82f76efc4..9082c80 100644 --- a/components/paint_preview/player/android/junit/src/org/chromium/components/paintpreview/player/frame/PlayerFrameBitmapPainterTest.java +++ b/components/paint_preview/player/android/junit/src/org/chromium/components/paintpreview/player/frame/PlayerFrameBitmapPainterTest.java
@@ -70,7 +70,7 @@ * Paint)}. */ private class MockCanvas extends Canvas { - private List<DrawnBitmap> mDrawnBitmaps = new ArrayList<>(); + private final List<DrawnBitmap> mDrawnBitmaps = new ArrayList<>(); private static class DrawnBitmap { private final Bitmap mBitmap;
diff --git a/components/paint_preview/player/android/junit/src/org/chromium/components/paintpreview/player/frame/PlayerFrameMediatorTest.java b/components/paint_preview/player/android/junit/src/org/chromium/components/paintpreview/player/frame/PlayerFrameMediatorTest.java index 14543ea..eb022a14 100644 --- a/components/paint_preview/player/android/junit/src/org/chromium/components/paintpreview/player/frame/PlayerFrameMediatorTest.java +++ b/components/paint_preview/player/android/junit/src/org/chromium/components/paintpreview/player/frame/PlayerFrameMediatorTest.java
@@ -86,9 +86,9 @@ /** Used for keeping track of all bitmap requests that {@link PlayerFrameMediator} makes. */ private static class RequestedBitmap { - UnguessableToken mFrameGuid; - Rect mClipRect; - float mScaleFactor; + final UnguessableToken mFrameGuid; + final Rect mClipRect; + final float mScaleFactor; Callback<Bitmap> mBitmapCallback; Runnable mErrorCallback; @@ -137,9 +137,9 @@ * PlayerCompositorDelegate}. */ private static class ClickedPoint { - UnguessableToken mFrameGuid; - int mX; - int mY; + final UnguessableToken mFrameGuid; + final int mX; + final int mY; public ClickedPoint(UnguessableToken frameGuid, int x, int y) { mFrameGuid = frameGuid; @@ -177,8 +177,8 @@ * RequestedBitmap}s. */ private static class TestPlayerCompositorDelegate implements PlayerCompositorDelegate { - List<RequestedBitmap> mRequestedBitmap = new ArrayList<>(); - List<ClickedPoint> mClickedPoints = new ArrayList<>(); + final List<RequestedBitmap> mRequestedBitmap = new ArrayList<>(); + final List<ClickedPoint> mClickedPoints = new ArrayList<>(); Runnable mOnMemoryPressureRunnable; private int mNextRequestId; @@ -239,7 +239,7 @@ } private static class MatrixMatcher implements ArgumentMatcher<Matrix> { - private Matrix mLeft; + private final Matrix mLeft; MatrixMatcher(Matrix left) { mLeft = left;
diff --git a/components/paint_preview/player/android/junit/src/org/chromium/components/paintpreview/player/frame/PlayerFrameScaleControllerTest.java b/components/paint_preview/player/android/junit/src/org/chromium/components/paintpreview/player/frame/PlayerFrameScaleControllerTest.java index 90e66e39c..ef5cc9c 100644 --- a/components/paint_preview/player/android/junit/src/org/chromium/components/paintpreview/player/frame/PlayerFrameScaleControllerTest.java +++ b/components/paint_preview/player/android/junit/src/org/chromium/components/paintpreview/player/frame/PlayerFrameScaleControllerTest.java
@@ -38,7 +38,7 @@ private boolean mDidScale; private static class MatrixMatcher implements ArgumentMatcher<Matrix> { - private Matrix mLeft; + private final Matrix mLeft; MatrixMatcher(Matrix left) { mLeft = left;
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 12c5756..5213b3482 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
@@ -61,7 +61,7 @@ private @Nullable InstrumentDetailsCallback mInstrumentDetailsCallback; private @Nullable IsReadyToPayServiceHelper mIsReadyToPayServiceHelper; private @Nullable PaymentDetailsUpdateConnection mPaymentDetailsUpdateConnection; - private @Nullable String mApplicationIdentifierToHide; + private final @Nullable String mApplicationIdentifierToHide; private boolean mBypassIsReadyToPayServiceInTest; private boolean mIsPreferred;
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 dd65d0c3..4597085 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
@@ -37,9 +37,9 @@ private boolean mIsServiceBindingInitiated; private boolean mIsServiceConnected; - private Handler mHandler; - private Intent mIsReadyToPayIntent; - private String mServiceName; + private final Handler mHandler; + private final Intent mIsReadyToPayIntent; + private final String mServiceName; /** The callback that returns the result (success or error) to the helper's caller. */ public interface ResultHandler {
diff --git a/components/payments/content/android/javatests/src/org/chromium/components/payments/MockPackageManagerDelegate.java b/components/payments/content/android/javatests/src/org/chromium/components/payments/MockPackageManagerDelegate.java index c4b4be1..e5b9c09 100644 --- a/components/payments/content/android/javatests/src/org/chromium/components/payments/MockPackageManagerDelegate.java +++ b/components/payments/content/android/javatests/src/org/chromium/components/payments/MockPackageManagerDelegate.java
@@ -39,7 +39,7 @@ private String mInvokedAppPackageName; // A map of a package name to its installer's package name. - private Map<String, String> mMockInstallerPackageMap = new HashMap<>(); + private final Map<String, String> mMockInstallerPackageMap = new HashMap<>(); /** * An enum that can be used to configure the mock package manager for whether it should return
diff --git a/components/payments/content/android/junit/src/org/chromium/components/payments/DeduplicatePaymentAppsUnitTest.java b/components/payments/content/android/junit/src/org/chromium/components/payments/DeduplicatePaymentAppsUnitTest.java index db23fed7..eebe4f1 100644 --- a/components/payments/content/android/junit/src/org/chromium/components/payments/DeduplicatePaymentAppsUnitTest.java +++ b/components/payments/content/android/junit/src/org/chromium/components/payments/DeduplicatePaymentAppsUnitTest.java
@@ -219,7 +219,7 @@ /** A payment app for testing deduplication. */ private static final class TestApp extends PaymentApp { - private Set<String> mMethods = new HashSet<>(); + private final Set<String> mMethods = new HashSet<>(); private Set<String> mIdsThatHideThisApp; private String mIdToHide; private boolean mIsPreferred;
diff --git a/components/payments/content/android/junit/src/org/chromium/components/payments/test_support/PaymentRequestServiceBuilder.java b/components/payments/content/android/junit/src/org/chromium/components/payments/test_support/PaymentRequestServiceBuilder.java index af150ea..c022c7d 100644 --- a/components/payments/content/android/junit/src/org/chromium/components/payments/test_support/PaymentRequestServiceBuilder.java +++ b/components/payments/content/android/junit/src/org/chromium/components/payments/test_support/PaymentRequestServiceBuilder.java
@@ -54,7 +54,7 @@ private boolean mIsOriginAllowedToUseWebPaymentApis = true; private boolean mIsPaymentDetailsValid = true; private PaymentRequestSpec mSpec; - private SecurePaymentConfirmationRequest mSecurePaymentConfirmationRequest; + private final SecurePaymentConfirmationRequest mSecurePaymentConfirmationRequest; public static PaymentRequestServiceBuilder defaultBuilder( Runnable onClosedListener,
diff --git a/components/payments/content/android/spc/junit/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationAuthnTest.java b/components/payments/content/android/spc/junit/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationAuthnTest.java index b864892..f59db55 100644 --- a/components/payments/content/android/spc/junit/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationAuthnTest.java +++ b/components/payments/content/android/spc/junit/src/org/chromium/components/payments/secure_payment_confirmation/SecurePaymentConfirmationAuthnTest.java
@@ -86,7 +86,7 @@ private Drawable mIssuerIcon; private Drawable mNetworkIcon; private SecurePaymentConfirmationAuthnController mAuthnController; - private FakeClock mClock = new FakeClock(); + private final FakeClock mClock = new FakeClock(); private @SpcResponseStatus int mResponseStatus = SpcResponseStatus.UNKNOWN; /** The shadow of BottomSheetControllerProvider. Not to use outside the test. */
diff --git a/components/payments/content/android/ui/java/src/org/chromium/components/payments/ui/InputProtector.java b/components/payments/content/android/ui/java/src/org/chromium/components/payments/ui/InputProtector.java index 71b9b0e..e6ffac8 100644 --- a/components/payments/content/android/ui/java/src/org/chromium/components/payments/ui/InputProtector.java +++ b/components/payments/content/android/ui/java/src/org/chromium/components/payments/ui/InputProtector.java
@@ -21,7 +21,7 @@ long currentTimeMillis(); } - private Clock mClock; + private final Clock mClock; private long mShowTime; public InputProtector() {
diff --git a/components/payments/content/payment_request_dialog.h b/components/payments/content/payment_request_dialog.h index dd81970..deb33f65 100644 --- a/components/payments/content/payment_request_dialog.h +++ b/components/payments/content/payment_request_dialog.h
@@ -5,9 +5,10 @@ #ifndef COMPONENTS_PAYMENTS_CONTENT_PAYMENT_REQUEST_DIALOG_H_ #define COMPONENTS_PAYMENTS_CONTENT_PAYMENT_REQUEST_DIALOG_H_ -#include "components/autofill/core/browser/payments/full_card_request.h" #include "components/payments/content/payment_request_display_manager.h" +class GURL; + namespace payments { // Used to interact with a cross-platform Payment Request dialog.
diff --git a/components/permissions/android/java/src/org/chromium/components/permissions/DeviceItemAdapter.java b/components/permissions/android/java/src/org/chromium/components/permissions/DeviceItemAdapter.java index ee91108..0be4695 100644 --- a/components/permissions/android/java/src/org/chromium/components/permissions/DeviceItemAdapter.java +++ b/components/permissions/android/java/src/org/chromium/components/permissions/DeviceItemAdapter.java
@@ -34,8 +34,8 @@ implements AdapterView.OnItemClickListener { /** Item holder for performance boost. */ private static class ViewHolder { - private TextView mTextView; - private @Nullable ImageView mImageView; + private final TextView mTextView; + private final @Nullable ImageView mImageView; public ViewHolder(View view) { mImageView = (ImageView) view.findViewById(R.id.icon); @@ -67,10 +67,10 @@ private int mSelectedItem = ListView.INVALID_POSITION; // Item descriptions are counted in a map. - private Map<String, Integer> mItemDescriptionMap = new HashMap<>(); + private final Map<String, Integer> mItemDescriptionMap = new HashMap<>(); // Map of keys to items so that we can access the items in O(1). - private Map<String, DeviceItemRow> mKeyToItemMap = new HashMap<>(); + private final Map<String, DeviceItemRow> mKeyToItemMap = new HashMap<>(); // True when there is at least one row with an icon. private boolean mHasIcon;
diff --git a/components/permissions/android/java/src/org/chromium/components/permissions/ItemChooserDialog.java b/components/permissions/android/java/src/org/chromium/components/permissions/ItemChooserDialog.java index 25088cb..56f6f3e1 100644 --- a/components/permissions/android/java/src/org/chromium/components/permissions/ItemChooserDialog.java +++ b/components/permissions/android/java/src/org/chromium/components/permissions/ItemChooserDialog.java
@@ -108,28 +108,28 @@ int DISCOVERY_IDLE = 3; } - private Context mContext; - private Window mWindow; + private final Context mContext; + private final Window mWindow; // The dialog this class encapsulates. private Dialog mDialog; // The callback to notify when the user selected an item. - private ItemSelectedCallback mItemSelectedCallback; + private final ItemSelectedCallback mItemSelectedCallback; // Individual UI elements. - private TextViewWithClickableSpans mTitle; - private TextViewWithClickableSpans mEmptyMessage; - private ProgressBar mProgressBar; - private ListView mListView; - private TextView mStatus; - private Button mConfirmButton; + private final TextViewWithClickableSpans mTitle; + private final TextViewWithClickableSpans mEmptyMessage; + private final ProgressBar mProgressBar; + private final ListView mListView; + private final TextView mStatus; + private final Button mConfirmButton; // The labels to display in the dialog. - private ItemChooserLabels mLabels; + private final ItemChooserLabels mLabels; // The adapter containing the items to show in the dialog. - private DeviceItemAdapter mItemAdapter; + private final DeviceItemAdapter mItemAdapter; // How much of the height of the screen should be taken up by the listview. private static final float LISTVIEW_HEIGHT_PERCENT = 0.30f;
diff --git a/components/permissions/android/java/src/org/chromium/components/permissions/PermissionDialogController.java b/components/permissions/android/java/src/org/chromium/components/permissions/PermissionDialogController.java index 9fa2f5c..1b993b49 100644 --- a/components/permissions/android/java/src/org/chromium/components/permissions/PermissionDialogController.java +++ b/components/permissions/android/java/src/org/chromium/components/permissions/PermissionDialogController.java
@@ -78,7 +78,7 @@ // 1) Multiple open windows request permissions due to Android split-screen // 2) A tab navigates or is closed while the Android permission request is open, and the // subsequent page requests a permission - private List<PermissionDialogDelegate> mRequestQueue; + private final List<PermissionDialogDelegate> mRequestQueue; // Static holder to ensure safe initialization of the singleton instance. private static class Holder {
diff --git a/components/permissions/android/java/src/org/chromium/components/permissions/PermissionDialogDelegate.java b/components/permissions/android/java/src/org/chromium/components/permissions/PermissionDialogDelegate.java index 3214700..80cd5a2 100644 --- a/components/permissions/android/java/src/org/chromium/components/permissions/PermissionDialogDelegate.java +++ b/components/permissions/android/java/src/org/chromium/components/permissions/PermissionDialogDelegate.java
@@ -37,7 +37,7 @@ private @Nullable PermissionDialogController mDialogController; /** The window for which to create the dialog. */ - private WindowAndroid mWindow; + private final WindowAndroid mWindow; /** The icon to display in the dialog. */ private int mDrawableId; @@ -70,7 +70,7 @@ * Defines a (potentially empty) list of ranges represented as pairs of <startIndex, endIndex>, * which shall be used by the UI to format the specified ranges as bold text. */ - private List<Pair<Integer, Integer>> mBoldedRanges = new ArrayList<>(); + private final List<Pair<Integer, Integer>> mBoldedRanges = new ArrayList<>(); public WindowAndroid getWindow() { return mWindow;
diff --git a/components/permissions/android/junit/src/org/chromium/components/permissions/nfc/NfcSystemLevelPromptTest.java b/components/permissions/android/junit/src/org/chromium/components/permissions/nfc/NfcSystemLevelPromptTest.java index f233497..dffa337 100644 --- a/components/permissions/android/junit/src/org/chromium/components/permissions/nfc/NfcSystemLevelPromptTest.java +++ b/components/permissions/android/junit/src/org/chromium/components/permissions/nfc/NfcSystemLevelPromptTest.java
@@ -40,9 +40,9 @@ private Activity mActivity; @Mock private WindowAndroid mWindowAndroid; @Mock private WindowAndroid.IntentCallback mWindowAndroidIntentCallback; - private CallbackHelper mDialogCallback = new CallbackHelper(); - private CallbackHelper mIntentCallback = new CallbackHelper(); - private MockModalDialogManager mModalDialogManager = new MockModalDialogManager(); + private final CallbackHelper mDialogCallback = new CallbackHelper(); + private final CallbackHelper mIntentCallback = new CallbackHelper(); + private final MockModalDialogManager mModalDialogManager = new MockModalDialogManager(); private static class MockModalDialogManager extends ModalDialogManager { private PropertyModel mShownDialogModel;
diff --git a/components/policy/android/java/src/org/chromium/components/policy/PolicyCache.java b/components/policy/android/java/src/org/chromium/components/policy/PolicyCache.java index b0f26b9..aa04614 100644 --- a/components/policy/android/java/src/org/chromium/components/policy/PolicyCache.java +++ b/components/policy/android/java/src/org/chromium/components/policy/PolicyCache.java
@@ -48,7 +48,7 @@ private @Nullable SharedPreferences mSharedPreferences; - private ThreadUtils.ThreadChecker mThreadChecker = new ThreadUtils.ThreadChecker(); + private final ThreadUtils.ThreadChecker mThreadChecker = new ThreadUtils.ThreadChecker(); /** * Creates and returns SharedPreferences instance that is used to cache policy
diff --git a/components/policy/android/java/src/org/chromium/components/policy/PolicyMap.java b/components/policy/android/java/src/org/chromium/components/policy/PolicyMap.java index 5493d65..d89ce519 100644 --- a/components/policy/android/java/src/org/chromium/components/policy/PolicyMap.java +++ b/components/policy/android/java/src/org/chromium/components/policy/PolicyMap.java
@@ -16,7 +16,7 @@ @JNINamespace("policy::android") @NullMarked public class PolicyMap { - private long mNativePolicyMap; + private final long mNativePolicyMap; /** * Returns the value of integer policy.
diff --git a/components/policy/android/java/src/org/chromium/components/policy/PolicyService.java b/components/policy/android/java/src/org/chromium/components/policy/PolicyService.java index a4d755b..bce55ca4 100644 --- a/components/policy/android/java/src/org/chromium/components/policy/PolicyService.java +++ b/components/policy/android/java/src/org/chromium/components/policy/PolicyService.java
@@ -30,7 +30,7 @@ public class PolicyService { private static final String TAG = "PolicyService"; - private long mNativePolicyService; + private final long mNativePolicyService; private final ObserverList<Observer> mObservers = new ObserverList<Observer>(); /**
diff --git a/components/policy/android/javatests/src/org/chromium/components/policy/test/PolicyServiceTestSupporter.java b/components/policy/android/javatests/src/org/chromium/components/policy/test/PolicyServiceTestSupporter.java index 008542a..274c7cf 100644 --- a/components/policy/android/javatests/src/org/chromium/components/policy/test/PolicyServiceTestSupporter.java +++ b/components/policy/android/javatests/src/org/chromium/components/policy/test/PolicyServiceTestSupporter.java
@@ -27,8 +27,8 @@ */ @JNINamespace("policy::android") public class PolicyServiceTestSupporter { - private List<PolicyService.Observer> mObservers = new ArrayList<>(); - private List<Boolean> mPolicyUpdated = new ArrayList<>(); + private final List<PolicyService.Observer> mObservers = new ArrayList<>(); + private final List<Boolean> mPolicyUpdated = new ArrayList<>(); PolicyService mPolicyService;
diff --git a/components/policy/android/junit/src/org/chromium/components/policy/AbstractAppRestrictionsProviderTest.java b/components/policy/android/junit/src/org/chromium/components/policy/AbstractAppRestrictionsProviderTest.java index 9e8e871..d62c84f1 100644 --- a/components/policy/android/junit/src/org/chromium/components/policy/AbstractAppRestrictionsProviderTest.java +++ b/components/policy/android/junit/src/org/chromium/components/policy/AbstractAppRestrictionsProviderTest.java
@@ -122,8 +122,8 @@ return mLastRegisteredReceiverFlags.get(); } - private AtomicInteger mReceiverCount; - private AtomicInteger mLastRegisteredReceiverFlags; + private final AtomicInteger mReceiverCount; + private final AtomicInteger mLastRegisteredReceiverFlags; } /** Test method for {@link AbstractAppRestrictionsProvider#refresh()}. */
diff --git a/components/policy/resources/templates/policy_definitions/Extensions/MandatoryExtensionsForIncognitoNavigation.yaml b/components/policy/resources/templates/policy_definitions/Extensions/MandatoryExtensionsForIncognitoNavigation.yaml index 9f0cecc..8dd7ffd 100644 --- a/components/policy/resources/templates/policy_definitions/Extensions/MandatoryExtensionsForIncognitoNavigation.yaml +++ b/components/policy/resources/templates/policy_definitions/Extensions/MandatoryExtensionsForIncognitoNavigation.yaml
@@ -13,6 +13,7 @@ dynamic_refresh: true per_profile: true future_on: +- android - fuchsia - chrome.* supported_on: @@ -25,4 +26,4 @@ type: string type: array tags: [] -type: list \ No newline at end of file +type: list
diff --git a/components/policy/test/data/pref_mapping/MandatoryExtensionsForIncognitoNavigation.json b/components/policy/test/data/pref_mapping/MandatoryExtensionsForIncognitoNavigation.json index 0625b97..d03db12 100644 --- a/components/policy/test/data/pref_mapping/MandatoryExtensionsForIncognitoNavigation.json +++ b/components/policy/test/data/pref_mapping/MandatoryExtensionsForIncognitoNavigation.json
@@ -4,6 +4,7 @@ "chromeos", "linux", "mac", + "desktop_android", "win" ], "policy_pref_mapping_tests": [
diff --git a/components/privacy_sandbox/android/java/src/org/chromium/components/privacy_sandbox/WebsiteExceptionRowPreference.java b/components/privacy_sandbox/android/java/src/org/chromium/components/privacy_sandbox/WebsiteExceptionRowPreference.java index 0b27076..01aee8da 100644 --- a/components/privacy_sandbox/android/java/src/org/chromium/components/privacy_sandbox/WebsiteExceptionRowPreference.java +++ b/components/privacy_sandbox/android/java/src/org/chromium/components/privacy_sandbox/WebsiteExceptionRowPreference.java
@@ -33,13 +33,13 @@ // Whether the favicon has been fetched already. private boolean mFaviconFetchInProgress; - private Website mSite; + private final Website mSite; - private TrackingProtectionDelegate mDelegate; + private final TrackingProtectionDelegate mDelegate; - private Context mContext; + private final Context mContext; - private WebsiteExceptionDeletedCallback mCallback; + private final WebsiteExceptionDeletedCallback mCallback; private static final String ANY_SUBDOMAIN_PATTERN = "[*.]";
diff --git a/components/reporting/proto/synced/record_constants.proto b/components/reporting/proto/synced/record_constants.proto index c911baf6..a0a104c 100644 --- a/components/reporting/proto/synced/record_constants.proto +++ b/components/reporting/proto/synced/record_constants.proto
@@ -139,6 +139,10 @@ // devices. DESKTOP_USAGE_LOGS = 36; + // |DESKTOP_INTERMEDIATE_STATUS_REPORT| is for holding a intermediate state of + // the desktop status report. + DESKTOP_INTERMEDIATE_STATUS_REPORT = 37; + reserved 8; }
diff --git a/components/safe_browsing/content/browser/client_report_util.cc b/components/safe_browsing/content/browser/client_report_util.cc index 567f27d..cd15ead 100644 --- a/components/safe_browsing/content/browser/client_report_util.cc +++ b/components/safe_browsing/content/browser/client_report_util.cc
@@ -160,6 +160,7 @@ case security_interstitials::CMD_TEXT_NOT_FOUND: case security_interstitials::CMD_ERROR: case security_interstitials::CMD_REQUEST_SITE_ACCESS_PERMISSION: + case security_interstitials::CMD_OPEN_ANDROID_ADVANCED_PROTECTION_SETTINGS: break; } return CSBRR::InterstitialInteraction::UNSPECIFIED;
diff --git a/components/safe_browsing/content/browser/password_protection/password_protection_request_content.cc b/components/safe_browsing/content/browser/password_protection/password_protection_request_content.cc index fea5aca..a585aac5 100644 --- a/components/safe_browsing/content/browser/password_protection/password_protection_request_content.cc +++ b/components/safe_browsing/content/browser/password_protection/password_protection_request_content.cc
@@ -221,8 +221,8 @@ LogCSDCacheContainsImages( verdict->mutable_visual_features()->has_image()); - base::UmaHistogramCounts100( - "PasswordProtection.CSDCacheSizeAtHit", + base::UmaHistogramCounts100000( + "PasswordProtection.CSDCacheSizeAtHit2", feature_cache_map->GetTotalVerdictEntriesSize()); ExtractClientPhishingRequestFeatures(*verdict);
diff --git a/components/safe_browsing/core/browser/realtime/url_lookup_service_base.cc b/components/safe_browsing/core/browser/realtime/url_lookup_service_base.cc index 3f71041..86bdc70 100644 --- a/components/safe_browsing/core/browser/realtime/url_lookup_service_base.cc +++ b/components/safe_browsing/core/browser/realtime/url_lookup_service_base.cc
@@ -139,8 +139,7 @@ } // namespace RealTimeUrlLookupServiceBase::PendingRTLookupRequestData:: - PendingRTLookupRequestData(std::unique_ptr<network::SimpleURLLoader> loader) - : loader_(std::move(loader)) {} + PendingRTLookupRequestData() = default; RealTimeUrlLookupServiceBase::PendingRTLookupRequestData:: PendingRTLookupRequestData(PendingRTLookupRequestData&&) = default; RealTimeUrlLookupServiceBase::PendingRTLookupRequestData& @@ -156,6 +155,12 @@ } } +void RealTimeUrlLookupServiceBase::PendingRTLookupRequestData::SetLoader( + std::unique_ptr<network::SimpleURLLoader> loader) { + CHECK(!loader_); + loader_ = std::move(loader); +} + RealTimeUrlLookupServiceBase::RealTimeUrlLookupServiceBase( scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, VerdictCacheManager* cache_manager, @@ -408,11 +413,17 @@ return; } + // Add request data with the associated callback early to avoid + // race conditions from multiple requests being sent at the same time. + CHECK_EQ(pending_requests_.count(sanitized_url), 0u); + PendingRTLookupRequestData request_data; + request_data.AddCallback(std::move(response_callback)); + pending_requests_.emplace(sanitized_url, std::move(request_data)); + StartFillingRequestProto( sanitized_url, is_sampled_report, tab_id, std::move(referring_app_info), base::BindOnce(&RealTimeUrlLookupServiceBase::OnRequestProtoFilled, GetWeakPtr(), sanitized_url, access_token_string, - std::move(response_callback), std::move(callback_task_runner), is_sampled_report)); } @@ -421,7 +432,6 @@ std::unique_ptr<network::ResourceRequest> resource_request, const std::string& req_data, std::optional<std::string> access_token_string, - RTLookupResponseCallback response_callback, scoped_refptr<base::SequencedTaskRunner> callback_task_runner, ChromeUserPopulation::UserPopulation user_population, bool is_sampled_report, @@ -444,10 +454,8 @@ start_time, is_sampled_report, std::move(callback_task_runner), webui_token)); - DCHECK_EQ(pending_requests_.count(url), 0u); - PendingRTLookupRequestData data(std::move(loader)); - data.AddCallback(std::move(response_callback)); - pending_requests_.emplace(url, std::move(data)); + CHECK_EQ(pending_requests_.count(url), 1u); + pending_requests_.at(url).SetLoader(std::move(loader)); } void RealTimeUrlLookupServiceBase::OnURLLoaderComplete( @@ -685,7 +693,6 @@ void RealTimeUrlLookupServiceBase::OnRequestProtoFilled( const GURL& sanitized_url, const std::string& access_token_string, - RTLookupResponseCallback response_callback, scoped_refptr<base::SequencedTaskRunner> callback_task_runner, bool is_sampled_report, std::unique_ptr<RTLookupRequest> request) { @@ -720,10 +727,10 @@ // NOTE: Pass |callback_task_runner| by copying it here as it's also needed // just below. - SendRequestInternal( - sanitized_url, std::move(resource_request), req_data, access_token_string, - std::move(response_callback), callback_task_runner, - request->population().user_population(), is_sampled_report, webui_token); + SendRequestInternal(sanitized_url, std::move(resource_request), req_data, + access_token_string, callback_task_runner, + request->population().user_population(), + is_sampled_report, webui_token); } std::optional<int> RealTimeUrlLookupServiceBase::LogLookupRequest(
diff --git a/components/safe_browsing/core/browser/realtime/url_lookup_service_base.h b/components/safe_browsing/core/browser/realtime/url_lookup_service_base.h index e8c5ef1..632d44d 100644 --- a/components/safe_browsing/core/browser/realtime/url_lookup_service_base.h +++ b/components/safe_browsing/core/browser/realtime/url_lookup_service_base.h
@@ -194,8 +194,7 @@ private: class PendingRTLookupRequestData { public: - explicit PendingRTLookupRequestData( - std::unique_ptr<network::SimpleURLLoader> loader); + PendingRTLookupRequestData(); PendingRTLookupRequestData(const PendingRTLookupRequestData&) = delete; PendingRTLookupRequestData(PendingRTLookupRequestData&&); PendingRTLookupRequestData& operator=(const PendingRTLookupRequestData&) = @@ -206,6 +205,8 @@ // Adds the callback to the internal list if it is not null. void AddCallback(RTLookupResponseCallback callback); + void SetLoader(std::unique_ptr<network::SimpleURLLoader> loader); + network::SimpleURLLoader* loader() { return loader_.get(); } bool has_callbacks() { return !callbacks_.empty(); } std::vector<RTLookupResponseCallback> take_callbacks() { @@ -308,7 +309,6 @@ std::unique_ptr<network::ResourceRequest> resource_request, const std::string& req_data, std::optional<std::string> access_token_string, - RTLookupResponseCallback response_callback, scoped_refptr<base::SequencedTaskRunner> callback_task_runner, ChromeUserPopulation::UserPopulation user_population, bool is_sampled_report, @@ -349,7 +349,6 @@ void OnRequestProtoFilled( const GURL& sanitized_url, const std::string& access_token_string, - RTLookupResponseCallback response_callback, scoped_refptr<base::SequencedTaskRunner> callback_task_runner, bool is_sampled_report, std::unique_ptr<RTLookupRequest> request);
diff --git a/components/safe_browsing/core/common/proto/csd.proto b/components/safe_browsing/core/common/proto/csd.proto index 1faf952..5188ef8 100644 --- a/components/safe_browsing/core/common/proto/csd.proto +++ b/components/safe_browsing/core/common/proto/csd.proto
@@ -1622,6 +1622,7 @@ // clients to send "stripped down" versions of the message in the // future, if we want to. + // LINT.IfChange(ClientSafeBrowsingReportType) enum ReportType { UNKNOWN = 0; URL_PHISHING = 1; @@ -1657,6 +1658,7 @@ // external protocol scheme (e.g. mailto://) or an Intent. EXTERNAL_APP_REDIRECT = 28; } + // LINT.ThenChange(//tools/metrics/histograms/metadata/safe_browsing/enums.xml:ClientSafeBrowsingReportType) message HTTPHeader { required bytes name = 1;
diff --git a/components/saved_tab_groups/internal/android/java/src/org/chromium/components/tab_group_sync/TabGroupSyncServiceAndroidUnitTest.java b/components/saved_tab_groups/internal/android/java/src/org/chromium/components/tab_group_sync/TabGroupSyncServiceAndroidUnitTest.java index 381f3ad..53cf8b92 100644 --- a/components/saved_tab_groups/internal/android/java/src/org/chromium/components/tab_group_sync/TabGroupSyncServiceAndroidUnitTest.java +++ b/components/saved_tab_groups/internal/android/java/src/org/chromium/components/tab_group_sync/TabGroupSyncServiceAndroidUnitTest.java
@@ -44,7 +44,7 @@ private TabGroupSyncService mService; private TabGroupSyncService.Observer mObserver; - private ArgumentCaptor<SavedTabGroup> mTabGroupCaptor = + private final ArgumentCaptor<SavedTabGroup> mTabGroupCaptor = ArgumentCaptor.forClass(SavedTabGroup.class); @CalledByNative
diff --git a/components/security_interstitials/content/https_only_mode_blocking_page.cc b/components/security_interstitials/content/https_only_mode_blocking_page.cc index e44f7bd..4b1dd45 100644 --- a/components/security_interstitials/content/https_only_mode_blocking_page.cc +++ b/components/security_interstitials/content/https_only_mode_blocking_page.cc
@@ -105,6 +105,14 @@ controller()->OpenUrlInNewForegroundTab(GURL(kLearnMoreLink)); break; } + case security_interstitials::CMD_OPEN_ANDROID_ADVANCED_PROTECTION_SETTINGS: +#if BUILDFLAG(IS_ANDROID) + controller()->metrics_helper()->RecordUserInteraction( + security_interstitials::MetricsHelper:: + OPEN_ADVANCED_PROTECTION_SETTINGS); + controller()->OpenAdvancedProtectionSettings(); +#endif // BUILDFLAG(IS_ANDROID) + break; case security_interstitials::CMD_DO_REPORT: case security_interstitials::CMD_DONT_REPORT: case security_interstitials::CMD_SHOW_MORE_SECTION:
diff --git a/components/security_interstitials/content/renderer/security_interstitial_page_controller.cc b/components/security_interstitials/content/renderer/security_interstitial_page_controller.cc index 9298df2d..53b8962 100644 --- a/components/security_interstitials/content/renderer/security_interstitial_page_controller.cc +++ b/components/security_interstitials/content/renderer/security_interstitial_page_controller.cc
@@ -10,6 +10,7 @@ #include "gin/converter.h" #include "gin/handle.h" #include "gin/object_template_builder.h" +#include "security_interstitial_page_controller.h" #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" #include "third_party/blink/public/platform/scheduler/web_agent_group_scheduler.h" #include "third_party/blink/public/web/web_local_frame.h" @@ -27,8 +28,9 @@ v8::Isolate* isolate = web_frame->GetAgentGroupScheduler()->Isolate(); v8::HandleScope handle_scope(isolate); v8::Local<v8::Context> context = web_frame->MainWorldScriptContext(); - if (context.IsEmpty()) + if (context.IsEmpty()) { return; + } v8::MicrotasksScope microtasks_scope( isolate, context->GetMicrotaskQueue(), @@ -38,8 +40,9 @@ gin::Handle<SecurityInterstitialPageController> controller = gin::CreateHandle(isolate, new SecurityInterstitialPageController(render_frame)); - if (controller.IsEmpty()) + if (controller.IsEmpty()) { return; + } v8::Local<v8::Object> global = context->Global(); global @@ -123,10 +126,18 @@ CMD_OPEN_ENHANCED_PROTECTION_SETTINGS); } +#if BUILDFLAG(IS_ANDROID) +void SecurityInterstitialPageController::OpenAdvancedProtectionSettings() { + SendCommand(security_interstitials::SecurityInterstitialCommand:: + CMD_OPEN_ANDROID_ADVANCED_PROTECTION_SETTINGS); +} +#endif // BUILDFLAG(IS_ANDROID) + void SecurityInterstitialPageController::SendCommand( security_interstitials::SecurityInterstitialCommand command) { - if (!render_frame() || !active_) + if (!render_frame() || !active_) { return; + } mojo::AssociatedRemote<security_interstitials::mojom::InterstitialCommands> interface; @@ -175,6 +186,11 @@ case security_interstitials::CMD_OPEN_ENHANCED_PROTECTION_SETTINGS: interface->OpenEnhancedProtectionSettings(); break; + case security_interstitials::CMD_OPEN_ANDROID_ADVANCED_PROTECTION_SETTINGS: +#if BUILDFLAG(IS_ANDROID) + interface->OpenAndroidAdvancedProtectionSettings(); +#endif // BUILDFLAG(IS_ANDROID) + break; default: // Other values in the enum are only used by tests so this // method should not be called with them. @@ -212,7 +228,13 @@ &SecurityInterstitialPageController::ReportPhishingError) .SetMethod("openEnhancedProtectionSettings", &SecurityInterstitialPageController:: - OpenEnhancedProtectionSettings); + OpenEnhancedProtectionSettings) +#if BUILDFLAG(IS_ANDROID) + .SetMethod("openAndroidAdvancedProtectionSettings", + &SecurityInterstitialPageController:: + OpenAdvancedProtectionSettings) +#endif // BUILDFLAG(IS_ANDROID) + ; } void SecurityInterstitialPageController::OnDestruct() {}
diff --git a/components/security_interstitials/content/renderer/security_interstitial_page_controller.h b/components/security_interstitials/content/renderer/security_interstitial_page_controller.h index d1824e9..97640d2 100644 --- a/components/security_interstitials/content/renderer/security_interstitial_page_controller.h +++ b/components/security_interstitials/content/renderer/security_interstitial_page_controller.h
@@ -52,6 +52,9 @@ void OpenWhitepaper(); void ReportPhishingError(); void OpenEnhancedProtectionSettings(); +#if BUILDFLAG(IS_ANDROID) + void OpenAdvancedProtectionSettings(); +#endif // BUILDFLAG(IS_ANDROID) void SendCommand(security_interstitials::SecurityInterstitialCommand command);
diff --git a/components/security_interstitials/content/security_blocking_page_factory.h b/components/security_interstitials/content/security_blocking_page_factory.h index 5127c68a..a479163 100644 --- a/components/security_interstitials/content/security_blocking_page_factory.h +++ b/components/security_interstitials/content/security_blocking_page_factory.h
@@ -43,12 +43,11 @@ // Creates a captive portal blocking page. virtual std::unique_ptr<CaptivePortalBlockingPage> - CreateCaptivePortalBlockingPage( - content::WebContents* web_contents, - const GURL& request_url, - const GURL& login_url, - const net::SSLInfo& ssl_info, - int cert_error) = 0; + CreateCaptivePortalBlockingPage(content::WebContents* web_contents, + const GURL& request_url, + const GURL& login_url, + const net::SSLInfo& ssl_info, + int cert_error) = 0; // Creates a bad clock blocking page. virtual std::unique_ptr<BadClockBlockingPage> CreateBadClockBlockingPage( @@ -61,20 +60,18 @@ // Creates a man-in-the-middle software blocking page. virtual std::unique_ptr<MITMSoftwareBlockingPage> - CreateMITMSoftwareBlockingPage( - content::WebContents* web_contents, - int cert_error, - const GURL& request_url, - const net::SSLInfo& ssl_info, - const std::string& mitm_software_name) = 0; + CreateMITMSoftwareBlockingPage(content::WebContents* web_contents, + int cert_error, + const GURL& request_url, + const net::SSLInfo& ssl_info, + const std::string& mitm_software_name) = 0; // Creates a blocked interception blocking page. virtual std::unique_ptr<BlockedInterceptionBlockingPage> - CreateBlockedInterceptionBlockingPage( - content::WebContents* web_contents, - int cert_error, - const GURL& request_url, - const net::SSLInfo& ssl_info) = 0; + CreateBlockedInterceptionBlockingPage(content::WebContents* web_contents, + int cert_error, + const GURL& request_url, + const net::SSLInfo& ssl_info) = 0; virtual std::unique_ptr<security_interstitials::InsecureFormBlockingPage> CreateInsecureFormBlockingPage(content::WebContents* web_contents, @@ -86,6 +83,7 @@ const GURL& request_url, security_interstitials::https_only_mode::HttpInterstitialState interstitial_state, + std::optional<std::string> url_type_param, security_interstitials::HttpsOnlyModeBlockingPage::MetricsCallback metrics_callback) = 0; };
diff --git a/components/security_interstitials/content/security_interstitial_controller_client.cc b/components/security_interstitials/content/security_interstitial_controller_client.cc index 610b742..3b1161d2 100644 --- a/components/security_interstitials/content/security_interstitial_controller_client.cc +++ b/components/security_interstitials/content/security_interstitial_controller_client.cc
@@ -147,13 +147,18 @@ #endif } -const std::string& -SecurityInterstitialControllerClient::GetApplicationLocale() const { +#if BUILDFLAG(IS_ANDROID) +void SecurityInterstitialControllerClient::OpenAdvancedProtectionSettings() { + settings_page_helper_->OpenAdvancedProtectionSettings(*web_contents_); +} +#endif + +const std::string& SecurityInterstitialControllerClient::GetApplicationLocale() + const { return app_locale_; } -PrefService* -SecurityInterstitialControllerClient::GetPrefService() { +PrefService* SecurityInterstitialControllerClient::GetPrefService() { return prefs_; }
diff --git a/components/security_interstitials/content/security_interstitial_controller_client.h b/components/security_interstitials/content/security_interstitial_controller_client.h index cef0f3a..8af946a 100644 --- a/components/security_interstitials/content/security_interstitial_controller_client.h +++ b/components/security_interstitials/content/security_interstitial_controller_client.h
@@ -13,7 +13,7 @@ namespace content { class RenderFrameHost; class WebContents; -} +} // namespace content namespace security_interstitials { @@ -49,6 +49,9 @@ void OpenUrlInCurrentTab(const GURL& url) override; void OpenUrlInNewForegroundTab(const GURL& url) override; void OpenEnhancedProtectionSettings() override; +#if BUILDFLAG(IS_ANDROID) + void OpenAdvancedProtectionSettings() override; +#endif PrefService* GetPrefService() override; const std::string& GetApplicationLocale() const override; bool CanLaunchDateAndTimeSettings() override;
diff --git a/components/security_interstitials/content/security_interstitial_tab_helper.cc b/components/security_interstitials/content/security_interstitial_tab_helper.cc index b38992f..fa3aed6 100644 --- a/components/security_interstitials/content/security_interstitial_tab_helper.cc +++ b/components/security_interstitials/content/security_interstitial_tab_helper.cc
@@ -130,12 +130,14 @@ security_interstitials::mojom::InterstitialCommands> receiver, content::RenderFrameHost* rfh) { auto* web_contents = content::WebContents::FromRenderFrameHost(rfh); - if (!web_contents) + if (!web_contents) { return; + } auto* tab_helper = SecurityInterstitialTabHelper::FromWebContents(web_contents); - if (!tab_helper) + if (!tab_helper) { return; + } tab_helper->receivers_.Bind(rfh, std::move(receiver)); } @@ -319,6 +321,13 @@ CMD_OPEN_ENHANCED_PROTECTION_SETTINGS); } +#if BUILDFLAG(IS_ANDROID) +void SecurityInterstitialTabHelper::OpenAndroidAdvancedProtectionSettings() { + HandleCommand(security_interstitials::SecurityInterstitialCommand:: + CMD_OPEN_ANDROID_ADVANCED_PROTECTION_SETTINGS); +} +#endif // BUILDFLAG(IS_ANDROID) + WEB_CONTENTS_USER_DATA_KEY_IMPL(SecurityInterstitialTabHelper); } // namespace security_interstitials
diff --git a/components/security_interstitials/content/security_interstitial_tab_helper.h b/components/security_interstitials/content/security_interstitial_tab_helper.h index 3458edb..771e270 100644 --- a/components/security_interstitials/content/security_interstitial_tab_helper.h +++ b/components/security_interstitials/content/security_interstitial_tab_helper.h
@@ -141,6 +141,10 @@ void ReportPhishingError() override; void OpenEnhancedProtectionSettings() override; +#if BUILDFLAG(IS_ANDROID) + void OpenAndroidAdvancedProtectionSettings() override; +#endif // BUILDFLAG(IS_ANDROID) + // Keeps track of blocking documents for pending navigations that have // encountered certificate errors in this WebContents. This map is keyed by // navigation ID rather than FrameTreeNodeId because there may be multiple
diff --git a/components/security_interstitials/content/settings_page_helper.h b/components/security_interstitials/content/settings_page_helper.h index 3fe790c..2e56b9f 100644 --- a/components/security_interstitials/content/settings_page_helper.h +++ b/components/security_interstitials/content/settings_page_helper.h
@@ -5,6 +5,7 @@ #ifndef COMPONENTS_SECURITY_INTERSTITIALS_CONTENT_SETTINGS_PAGE_HELPER_H_ #define COMPONENTS_SECURITY_INTERSTITIALS_CONTENT_SETTINGS_PAGE_HELPER_H_ +#include "build/build_config.h" #include "components/safe_browsing/core/common/safebrowsing_referral_methods.h" namespace content { @@ -32,6 +33,11 @@ content::WebContents* web_contents, safe_browsing::SafeBrowsingSettingReferralMethod referral_method) const = 0; + +#if BUILDFLAG(IS_ANDROID) + // Opens Android-OS advanced protection settings page. + virtual void OpenAdvancedProtectionSettings(content::WebContents&) = 0; +#endif // BUILDFLAG_IS_ANDROID) }; } // namespace security_interstitials
diff --git a/components/security_interstitials/core/bad_clock_ui.cc b/components/security_interstitials/core/bad_clock_ui.cc index 80fbc5fc..1fed400 100644 --- a/components/security_interstitials/core/bad_clock_ui.cc +++ b/components/security_interstitials/core/bad_clock_ui.cc
@@ -119,6 +119,7 @@ case CMD_REPORT_PHISHING_ERROR: case CMD_CLOSE_INTERSTITIAL_WITHOUT_UI: case CMD_REQUEST_SITE_ACCESS_PERMISSION: + case CMD_OPEN_ANDROID_ADVANCED_PROTECTION_SETTINGS: // Not supported by the bad clock error page. NOTREACHED() << "Unsupported command: " << command; case CMD_ERROR: @@ -129,4 +130,4 @@ } } -} // security_interstitials +} // namespace security_interstitials
diff --git a/components/security_interstitials/core/blocked_interception_ui.cc b/components/security_interstitials/core/blocked_interception_ui.cc index 1d1173d..fe70a17 100644 --- a/components/security_interstitials/core/blocked_interception_ui.cc +++ b/components/security_interstitials/core/blocked_interception_ui.cc
@@ -108,6 +108,7 @@ security_interstitials::MetricsHelper::OPEN_ENHANCED_PROTECTION); controller_->OpenEnhancedProtectionSettings(); break; + case CMD_OPEN_ANDROID_ADVANCED_PROTECTION_SETTINGS: case CMD_OPEN_HELP_CENTER: case CMD_DONT_PROCEED: case CMD_RELOAD:
diff --git a/components/security_interstitials/core/browser/resources/interstitial_large.js b/components/security_interstitials/core/browser/resources/interstitial_large.js index 90eea52..2d453fe 100644 --- a/components/security_interstitials/core/browser/resources/interstitial_large.js +++ b/components/security_interstitials/core/browser/resources/interstitial_large.js
@@ -236,6 +236,15 @@ }); } + const androidAdvancedProtectionLink = + document.querySelector('#android-advanced-protection-settings-link'); + if (androidAdvancedProtectionLink) { + androidAdvancedProtectionLink.addEventListener('click', function(event) { + sendCommand(SecurityInterstitialCommandId + .CMD_OPEN_ANDROID_ADVANCED_PROTECTION_SETTINGS); + }); + } + const detailsButton = document.querySelector('#details-button'); if (captivePortal || billing || lookalike || insecureForm || httpsOnly || enterpriseWarn || enterpriseBlock || supervisedUserVerify ||
diff --git a/components/security_interstitials/core/common/mojom/interstitial_commands.mojom b/components/security_interstitials/core/common/mojom/interstitial_commands.mojom index 8b17379..cf8d86b0 100644 --- a/components/security_interstitials/core/common/mojom/interstitial_commands.mojom +++ b/components/security_interstitials/core/common/mojom/interstitial_commands.mojom
@@ -20,4 +20,8 @@ ReportPhishingError(); // Opens the enhanced protection settings in a new tab. OpenEnhancedProtectionSettings(); + + // Opens advanced protection settings native-UI. + [EnableIf=is_android] + OpenAndroidAdvancedProtectionSettings(); };
diff --git a/components/security_interstitials/core/common/resources/interstitial_common.js b/components/security_interstitials/core/common/resources/interstitial_common.js index b7d87b9..a314d80 100644 --- a/components/security_interstitials/core/common/resources/interstitial_common.js +++ b/components/security_interstitials/core/common/resources/interstitial_common.js
@@ -20,6 +20,7 @@ * openReportingPrivacy: function(), * openWhitepaper: function(), * reportPhishingError: function(), + * openAndroidAdvancedProtectionSettings: function(), * }} */ // eslint-disable-next-line no-var @@ -47,6 +48,7 @@ CMD_REPORT_PHISHING_ERROR: 12, // Open enhanced protection settings. CMD_OPEN_ENHANCED_PROTECTION_SETTINGS: 13, + CMD_OPEN_ANDROID_ADVANCED_PROTECTION_SETTINGS: 16, }; export const HIDDEN_CLASS = 'hidden'; @@ -100,6 +102,10 @@ case SecurityInterstitialCommandId.CMD_OPEN_ENHANCED_PROTECTION_SETTINGS: certificateErrorPageController.openEnhancedProtectionSettings(); break; + case SecurityInterstitialCommandId + .CMD_OPEN_ANDROID_ADVANCED_PROTECTION_SETTINGS: + certificateErrorPageController.openAndroidAdvancedProtectionSettings(); + break; } return; }
diff --git a/components/security_interstitials/core/controller_client.h b/components/security_interstitials/core/controller_client.h index 40cc66e3..e50543c 100644 --- a/components/security_interstitials/core/controller_client.h +++ b/components/security_interstitials/core/controller_client.h
@@ -56,6 +56,7 @@ CMD_CLOSE_INTERSTITIAL_WITHOUT_UI = 14, // Request permission to blocked website. CMD_REQUEST_SITE_ACCESS_PERMISSION = 15, + CMD_OPEN_ANDROID_ADVANCED_PROTECTION_SETTINGS = 16, }; // Provides methods for handling commands from the user, which requires some @@ -113,6 +114,10 @@ virtual void OpenEnhancedProtectionSettings() = 0; +#if BUILDFLAG(IS_ANDROID) + virtual void OpenAdvancedProtectionSettings() = 0; +#endif // BUILDFLAG(IS_ANDROID) + virtual PrefService* GetPrefService() = 0; virtual const std::string& GetApplicationLocale() const = 0;
diff --git a/components/security_interstitials/core/metrics_helper.cc b/components/security_interstitials/core/metrics_helper.cc index 468f6e3c..9d1173e 100644 --- a/components/security_interstitials/core/metrics_helper.cc +++ b/components/security_interstitials/core/metrics_helper.cc
@@ -38,51 +38,63 @@ void MaybeRecordDecisionAsAction(MetricsHelper::Decision decision, const std::string& metric_name) { if (decision == MetricsHelper::PROCEED) { - if (metric_name == "malware" || metric_name == "malware_subresource") + if (metric_name == "malware" || metric_name == "malware_subresource") { RecordAction(UserMetricsAction("MalwareInterstitial.Proceed")); - else if (metric_name == "harmful" || metric_name == "harmful_subresource") + } else if (metric_name == "harmful" || + metric_name == "harmful_subresource") { RecordAction(UserMetricsAction("HarmfulInterstitial.Proceed")); - else if (metric_name == "ssl_overridable") + } else if (metric_name == "ssl_overridable") { RecordAction(UserMetricsAction("SSLOverridableInterstitial.Proceed")); - else if (metric_name == "phishing" || metric_name == "phishing_subresource") + } else if (metric_name == "phishing" || + metric_name == "phishing_subresource") { RecordAction(UserMetricsAction("PhishingInterstitial.Proceed")); - else if (metric_name == "billing" || metric_name == "billing_subresource") + } else if (metric_name == "billing" || + metric_name == "billing_subresource") { RecordAction(UserMetricsAction("BillingInterstitial.Proceed")); + } } else if (decision == MetricsHelper::DONT_PROCEED) { - if (metric_name == "malware" || metric_name == "malware_subresource") + if (metric_name == "malware" || metric_name == "malware_subresource") { RecordAction(UserMetricsAction("MalwareInterstitial.Back")); - else if (metric_name == "harmful" || metric_name == "harmful_subresource") + } else if (metric_name == "harmful" || + metric_name == "harmful_subresource") { RecordAction(UserMetricsAction("HarmfulInterstitial.Back")); - else if (metric_name == "ssl_overridable") + } else if (metric_name == "ssl_overridable") { RecordAction(UserMetricsAction("SSLOverridableInterstitial.Back")); - else if (metric_name == "ssl_nonoverridable") + } else if (metric_name == "ssl_nonoverridable") { RecordAction(UserMetricsAction("SSLNonOverridableInsterstitial.Back")); - else if (metric_name == "bad_clock") + } else if (metric_name == "bad_clock") { RecordAction(UserMetricsAction("BadClockInterstitial.Back")); - else if (metric_name == "phishing" || metric_name == "phishing_subresource") + } else if (metric_name == "phishing" || + metric_name == "phishing_subresource") { RecordAction(UserMetricsAction("PhishingInterstitial.Back")); - else if (metric_name == "billing" || metric_name == "billing_subresource") + } else if (metric_name == "billing" || + metric_name == "billing_subresource") { RecordAction(UserMetricsAction("BillingInterstitial.Back")); + } } } void MaybeRecordInteractionAsAction(MetricsHelper::Interaction interaction, const std::string& metric_name) { if (interaction == MetricsHelper::TOTAL_VISITS) { - if (metric_name == "malware" || metric_name == "malware_subresource") + if (metric_name == "malware" || metric_name == "malware_subresource") { RecordAction(UserMetricsAction("MalwareInterstitial.Show")); - else if (metric_name == "harmful" || metric_name == "harmful_subresource") + } else if (metric_name == "harmful" || + metric_name == "harmful_subresource") { RecordAction(UserMetricsAction("HarmfulInterstitial.Show")); - else if (metric_name == "ssl_overridable") + } else if (metric_name == "ssl_overridable") { RecordAction(UserMetricsAction("SSLOverridableInterstitial.Show")); - else if (metric_name == "ssl_nonoverridable") + } else if (metric_name == "ssl_nonoverridable") { RecordAction(UserMetricsAction("SSLNonOverridableInterstitial.Show")); - else if (metric_name == "bad_clock") + } else if (metric_name == "bad_clock") { RecordAction(UserMetricsAction("BadClockInterstitial.Show")); - else if (metric_name == "phishing" || metric_name == "phishing_subresource") + } else if (metric_name == "phishing" || + metric_name == "phishing_subresource") { RecordAction(UserMetricsAction("PhishingInterstitial.Show")); - else if (metric_name == "billing" || metric_name == "billing_subresource") + } else if (metric_name == "billing" || + metric_name == "billing_subresource") { RecordAction(UserMetricsAction("BillingInterstitial.Show")); + } } else if (interaction == MetricsHelper::SHOW_ADVANCED) { if (metric_name == "malware" || metric_name == "malware_subresource") { RecordAction(UserMetricsAction("MalwareInterstitial.Advanced")); @@ -93,16 +105,20 @@ metric_name == "ssl_nonoverridable") { RecordAction(UserMetricsAction("SSLInterstitial.Advanced")); } else if (metric_name == "phishing" || - metric_name == "phishing_subresource") + metric_name == "phishing_subresource") { RecordAction(UserMetricsAction("PhishingInterstitial.Advanced")); - else if (metric_name == "billing" || metric_name == "billing_subresource") + } else if (metric_name == "billing" || + metric_name == "billing_subresource") { RecordAction(UserMetricsAction("BillingInterstitial.Advanced")); + } } else if (interaction == MetricsHelper::RELOAD) { - if (metric_name == "ssl_nonoverridable") + if (metric_name == "ssl_nonoverridable") { RecordAction(UserMetricsAction("SSLInterstitial.Reload")); + } } else if (interaction == MetricsHelper::OPEN_TIME_SETTINGS) { - if (metric_name == "bad_clock") + if (metric_name == "bad_clock") { RecordAction(UserMetricsAction("BadClockInterstitial.Settings")); + } } else if (metric_name == "phishing" || metric_name == "phishing_subresource") { if (interaction == MetricsHelper::SHOW_PRIVACY_POLICY) { @@ -132,6 +148,9 @@ RecordAction( UserMetricsAction("PhishingInterstitial.CloseInterstitialWithoutUI")); } + } else if (interaction == MetricsHelper::OPEN_ADVANCED_PROTECTION_SETTINGS) { + RecordAction(UserMetricsAction( + "HttpsOnlyModeInterstitial.OpenAdvancedProtectionSettings")); } } @@ -161,8 +180,8 @@ } void MetricsHelper::RecordUserDecision(Decision decision) { - const std::string histogram_name( - "interstitial." + settings_.metric_prefix + ".decision"); + const std::string histogram_name("interstitial." + settings_.metric_prefix + + ".decision"); RecordUserDecisionToMetrics(decision, histogram_name); // Record additional information about sites that users have visited before. // Report |decision| and SHOW together, filtered by the same history state @@ -199,8 +218,8 @@ } void MetricsHelper::RecordUserInteraction(Interaction interaction) { - const std::string histogram_name( - "interstitial." + settings_.metric_prefix + ".interaction"); + const std::string histogram_name("interstitial." + settings_.metric_prefix + + ".interaction"); RecordSingleInteractionToMetrics(interaction, histogram_name); if (!settings_.extra_suffix.empty()) { RecordSingleInteractionToMetrics( @@ -266,8 +285,9 @@ void MetricsHelper::OnGotHistoryCount( history::VisibleVisitCountToHostResult result) { - if (result.success) + if (result.success) { num_visits_ = result.count; + } } } // namespace security_interstitials
diff --git a/components/security_interstitials/core/metrics_helper.h b/components/security_interstitials/core/metrics_helper.h index 57cd90d..335d787c 100644 --- a/components/security_interstitials/core/metrics_helper.h +++ b/components/security_interstitials/core/metrics_helper.h
@@ -15,7 +15,7 @@ namespace history { class HistoryService; struct VisibleVisitCountToHostResult; -} +} // namespace history namespace security_interstitials { @@ -58,6 +58,7 @@ SHOW_ENHANCED_PROTECTION, OPEN_ENHANCED_PROTECTION, CLOSE_INTERSTITIAL_WITHOUT_UI, + OPEN_ADVANCED_PROTECTION_SETTINGS, MAX_INTERACTION };
diff --git a/components/security_interstitials/core/mitm_software_ui.cc b/components/security_interstitials/core/mitm_software_ui.cc index 639cb87..4bde997 100644 --- a/components/security_interstitials/core/mitm_software_ui.cc +++ b/components/security_interstitials/core/mitm_software_ui.cc
@@ -96,6 +96,7 @@ case CMD_REPORT_PHISHING_ERROR: case CMD_CLOSE_INTERSTITIAL_WITHOUT_UI: case CMD_REQUEST_SITE_ACCESS_PERMISSION: + case CMD_OPEN_ANDROID_ADVANCED_PROTECTION_SETTINGS: // Not supported by the SSL error page. NOTREACHED() << "Unsupported command: " << command; case CMD_ERROR:
diff --git a/components/security_interstitials/core/safe_browsing_loud_error_ui.cc b/components/security_interstitials/core/safe_browsing_loud_error_ui.cc index 0107766c..2039674 100644 --- a/components/security_interstitials/core/safe_browsing_loud_error_ui.cc +++ b/components/security_interstitials/core/safe_browsing_loud_error_ui.cc
@@ -244,6 +244,7 @@ case CMD_TEXT_NOT_FOUND: case CMD_CLOSE_INTERSTITIAL_WITHOUT_UI: case CMD_REQUEST_SITE_ACCESS_PERMISSION: + case CMD_OPEN_ANDROID_ADVANCED_PROTECTION_SETTINGS: break; } }
diff --git a/components/security_interstitials/core/safe_browsing_quiet_error_ui.cc b/components/security_interstitials/core/safe_browsing_quiet_error_ui.cc index bdc86b5..ac258ff 100644 --- a/components/security_interstitials/core/safe_browsing_quiet_error_ui.cc +++ b/components/security_interstitials/core/safe_browsing_quiet_error_ui.cc
@@ -109,6 +109,7 @@ case CMD_OPEN_ENHANCED_PROTECTION_SETTINGS: case CMD_CLOSE_INTERSTITIAL_WITHOUT_UI: case CMD_REQUEST_SITE_ACCESS_PERMISSION: + case CMD_OPEN_ANDROID_ADVANCED_PROTECTION_SETTINGS: NOTREACHED(); } }
diff --git a/components/security_interstitials/core/ssl_error_ui.cc b/components/security_interstitials/core/ssl_error_ui.cc index 5ad7993..5bb9225 100644 --- a/components/security_interstitials/core/ssl_error_ui.cc +++ b/components/security_interstitials/core/ssl_error_ui.cc
@@ -80,10 +80,11 @@ IDS_SSL_V2_PRIMARY_PARAGRAPH, common_string_util::GetFormattedHostName(request_url_))); - if (soft_override_enabled_) + if (soft_override_enabled_) { PopulateOverridableStrings(load_time_data); - else + } else { PopulateNonOverridableStrings(load_time_data); + } } const net::SSLInfo& SSLErrorUI::ssl_info() const { @@ -165,8 +166,9 @@ help_string = IDS_SSL_NONOVERRIDABLE_INVALID; break; default: - if (requested_strict_enforcement_) + if (requested_strict_enforcement_) { help_string = IDS_SSL_NONOVERRIDABLE_HSTS; + } } load_time_data.Set("finalParagraph", l10n_util::GetStringFUTF16(help_string, url)); @@ -247,7 +249,8 @@ case CMD_OPEN_LOGIN: case CMD_REPORT_PHISHING_ERROR: case CMD_CLOSE_INTERSTITIAL_WITHOUT_UI: - case CMD_REQUEST_SITE_ACCESS_PERMISSION: { + case CMD_REQUEST_SITE_ACCESS_PERMISSION: + case CMD_OPEN_ANDROID_ADVANCED_PROTECTION_SETTINGS: { // Not supported by the SSL error page. DUMP_WILL_BE_NOTREACHED() << "Unsupported command: " << command; break; @@ -261,4 +264,4 @@ } } -} // security_interstitials +} // namespace security_interstitials
diff --git a/components/security_interstitials_strings.grdp b/components/security_interstitials_strings.grdp index 50c7ca8..65428cb 100644 --- a/components/security_interstitials_strings.grdp +++ b/components/security_interstitials_strings.grdp
@@ -515,7 +515,7 @@ </if> <if expr="is_android"> <message name="IDS_HTTPS_ONLY_MODE_WITH_ADVANCED_PROTECTION_PRIMARY_PARAGRAPH_ANDROID" desc="Main paragraph of the HTTPS-Only Mode warning. This warning is shown when the browser tries to upgrade a navigation to a site to HTTPS but the site does not support HTTPS. The user also has Advanced Protection enabled."> - This site will remain blocked because you have Advanced Protection turned on in Android settings. <ph name="BEGIN_LEARN_MORE_LINK"><a href="#" id="learn-more-link"></ph>Learn more about this warning<ph name="END_LEARN_MORE_LINK"></a></ph> + This site will remain blocked because you have Advanced Protection turned on in <ph name="BEGIN_ANDROID_SETTINGS_LINK"><a href="#" id="android-advanced-protection-settings-link"></ph>Android settings<ph name="END_ANDROID_SETTINGS_LINK"></a></ph>. <ph name="BEGIN_LEARN_MORE_LINK"><a href="#" id="learn-more-link"></ph>Learn more about this warning<ph name="END_LEARN_MORE_LINK"></a></ph> </message> </if>
diff --git a/components/security_interstitials_strings_grdp/IDS_HTTPS_ONLY_MODE_WITH_ADVANCED_PROTECTION_PRIMARY_PARAGRAPH_ANDROID.png.sha1 b/components/security_interstitials_strings_grdp/IDS_HTTPS_ONLY_MODE_WITH_ADVANCED_PROTECTION_PRIMARY_PARAGRAPH_ANDROID.png.sha1 index f06dd04..ca83edc 100644 --- a/components/security_interstitials_strings_grdp/IDS_HTTPS_ONLY_MODE_WITH_ADVANCED_PROTECTION_PRIMARY_PARAGRAPH_ANDROID.png.sha1 +++ b/components/security_interstitials_strings_grdp/IDS_HTTPS_ONLY_MODE_WITH_ADVANCED_PROTECTION_PRIMARY_PARAGRAPH_ANDROID.png.sha1
@@ -1 +1 @@ -f67d800a3a45cefe564c23d65e375b5f39677c4a \ No newline at end of file +891ff0dd0beff5a54ecdba81691e49ee46689525 \ No newline at end of file
diff --git a/components/signin/public/android/java/src/org/chromium/components/signin/base/AccountInfo.java b/components/signin/public/android/java/src/org/chromium/components/signin/base/AccountInfo.java index d71a25e..9792137 100644 --- a/components/signin/public/android/java/src/org/chromium/components/signin/base/AccountInfo.java +++ b/components/signin/public/android/java/src/org/chromium/components/signin/base/AccountInfo.java
@@ -26,7 +26,7 @@ public class AccountInfo extends CoreAccountInfo { /** Used to instantiate `AccountInfo`. */ public static class Builder { - private CoreAccountInfo mCoreAccountInfo; + private final CoreAccountInfo mCoreAccountInfo; private String mFullName = ""; private String mGivenName = ""; private @Nullable String mHostedDomain; @@ -99,7 +99,7 @@ private final @Nullable String mHostedDomain; private final @Nullable Bitmap mAccountImage; - private AccountCapabilities mAccountCapabilities; + private final AccountCapabilities mAccountCapabilities; /** Used from JNI to marshal `AccountInfo` from C++ to Java. */ @CalledByNative
diff --git a/components/signin/public/android/junit/src/org/chromium/components/signin/base/AccountCapabilitiesTest.java b/components/signin/public/android/junit/src/org/chromium/components/signin/base/AccountCapabilitiesTest.java index ff02f99..90c3f5f 100644 --- a/components/signin/public/android/junit/src/org/chromium/components/signin/base/AccountCapabilitiesTest.java +++ b/components/signin/public/android/junit/src/org/chromium/components/signin/base/AccountCapabilitiesTest.java
@@ -104,7 +104,7 @@ /** List of parameters to run in capability fetching tests. */ public static class CapabilitiesTestParams implements ParameterProvider { - private static List<ParameterSet> sCapabilties = + private static final List<ParameterSet> sCapabilties = Arrays.asList( new ParameterSet() .name("CanHaveEmailAddressDisplayed")
diff --git a/components/stylus_handwriting/android/java/src/org/chromium/components/stylus_handwriting/DirectWritingTrigger.java b/components/stylus_handwriting/android/java/src/org/chromium/components/stylus_handwriting/DirectWritingTrigger.java index dffa5835..7325aaa 100644 --- a/components/stylus_handwriting/android/java/src/org/chromium/components/stylus_handwriting/DirectWritingTrigger.java +++ b/components/stylus_handwriting/android/java/src/org/chromium/components/stylus_handwriting/DirectWritingTrigger.java
@@ -36,7 +36,8 @@ private static final String TAG = "DwTrigger"; private DirectWritingServiceBinder mBinder = new DirectWritingServiceBinder(); - private DirectWritingServiceConfiguration mConfig = new DirectWritingServiceConfiguration(); + private final DirectWritingServiceConfiguration mConfig = + new DirectWritingServiceConfiguration(); // Track whether DW recognition has been started. private boolean mRecognitionStarted;
diff --git a/components/stylus_handwriting/android/java/src/org/chromium/components/stylus_handwriting/StylusWritingController.java b/components/stylus_handwriting/android/java/src/org/chromium/components/stylus_handwriting/StylusWritingController.java index d26a0af..8d9c24c 100644 --- a/components/stylus_handwriting/android/java/src/org/chromium/components/stylus_handwriting/StylusWritingController.java +++ b/components/stylus_handwriting/android/java/src/org/chromium/components/stylus_handwriting/StylusWritingController.java
@@ -24,7 +24,7 @@ private @Nullable PointerIcon mHandwritingIcon; private @Nullable StylusApiOption mStylusHandler; private boolean mIconFetched; - private boolean mLazyFetchHandWritingIconFeatureEnabled; + private final boolean mLazyFetchHandWritingIconFeatureEnabled; private boolean mShouldOverrideStylusHoverIcon; private boolean mIsWindowFocused;
diff --git a/components/stylus_handwriting/android/junit/src/org/chromium/components/stylus_handwriting/DirectWritingServiceCallbackTest.java b/components/stylus_handwriting/android/junit/src/org/chromium/components/stylus_handwriting/DirectWritingServiceCallbackTest.java index dc95863..d9f16f3 100644 --- a/components/stylus_handwriting/android/junit/src/org/chromium/components/stylus_handwriting/DirectWritingServiceCallbackTest.java +++ b/components/stylus_handwriting/android/junit/src/org/chromium/components/stylus_handwriting/DirectWritingServiceCallbackTest.java
@@ -71,7 +71,8 @@ @Mock private StylusWritingImeCallback mImeCallback; @Mock private ViewGroup mContainerView; - private DirectWritingServiceCallback mDwServiceCallback = new DirectWritingServiceCallback(); + private final DirectWritingServiceCallback mDwServiceCallback = + new DirectWritingServiceCallback(); private Context mContext; private static String mojoStringToJavaString(String16 mojoString) {
diff --git a/components/subresource_filter/android/java/src/org/chromium/components/subresource_filter/AdsBlockedDialog.java b/components/subresource_filter/android/java/src/org/chromium/components/subresource_filter/AdsBlockedDialog.java index a98d59a..fd5b1013 100644 --- a/components/subresource_filter/android/java/src/org/chromium/components/subresource_filter/AdsBlockedDialog.java +++ b/components/subresource_filter/android/java/src/org/chromium/components/subresource_filter/AdsBlockedDialog.java
@@ -42,7 +42,7 @@ private final ModalDialogManager mModalDialogManager; private @Nullable PropertyModel mDialogModel; private @Nullable ClickableSpan mClickableSpan; - private Handler mDialogHandler; + private final Handler mDialogHandler; @CalledByNative static AdsBlockedDialog create(long nativeDialog, WindowAndroid windowAndroid) {
diff --git a/components/translate/content/android/java/src/org/chromium/components/translate/TranslateOptions.java b/components/translate/content/android/java/src/org/chromium/components/translate/TranslateOptions.java index 01099f7..856669b4 100644 --- a/components/translate/content/android/java/src/org/chromium/components/translate/TranslateOptions.java +++ b/components/translate/content/android/java/src/org/chromium/components/translate/TranslateOptions.java
@@ -90,7 +90,7 @@ private String @Nullable [] mContentLanguagesCodes; // Language code to UI display language name map Conceptually final - private Map<String, String> mCodeToRepresentation; + private final Map<String, String> mCodeToRepresentation; // Will reflect the state before the object was ever modified private final boolean[] mOriginalOptions;
diff --git a/components/ukm/android/java/src/org/chromium/components/ukm/UkmRecorder.java b/components/ukm/android/java/src/org/chromium/components/ukm/UkmRecorder.java index 3ef122b..7f99d50 100644 --- a/components/ukm/android/java/src/org/chromium/components/ukm/UkmRecorder.java +++ b/components/ukm/android/java/src/org/chromium/components/ukm/UkmRecorder.java
@@ -28,8 +28,8 @@ @JNINamespace("metrics") @NullMarked public class UkmRecorder { - private WebContents mWebContents; - private String mEventName; + private final WebContents mWebContents; + private final String mEventName; private @Nullable List<Metric> mMetrics; @VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE)
diff --git a/components/ukm/android/javatests/src/org/chromium/components/ukm/UkmRecorderTest.java b/components/ukm/android/javatests/src/org/chromium/components/ukm/UkmRecorderTest.java index 4063086..be5dd25 100644 --- a/components/ukm/android/javatests/src/org/chromium/components/ukm/UkmRecorderTest.java +++ b/components/ukm/android/javatests/src/org/chromium/components/ukm/UkmRecorderTest.java
@@ -27,9 +27,9 @@ private @Mock WebContents mWebContents; private @Mock UkmRecorder.Natives mUkmRecorderJniMock; - private final String mTestEventName = "event1"; - private final String mMetricName1 = "metricName1"; - private final String mMetricName2 = "metricName2"; + private static final String TEST_EVENT_NAME = "event1"; + private static final String METRIC_NAME1 = "metricName1"; + private static final String METRIC_NAME2 = "metricName2"; @Before public void setUp() { @@ -38,20 +38,20 @@ @Test public void record_multipleMetrics() { - new UkmRecorder(mWebContents, mTestEventName) - .addMetric(mMetricName1, 5) - .addMetric(mMetricName2, 10) + new UkmRecorder(mWebContents, TEST_EVENT_NAME) + .addMetric(METRIC_NAME1, 5) + .addMetric(METRIC_NAME2, 10) .record(); verify(mUkmRecorderJniMock) .recordEventWithMultipleMetrics( any(), - eq(mTestEventName), + eq(TEST_EVENT_NAME), argThat( metricsList -> metricsList.length == 2 - && metricsList[0].mName.equals(mMetricName1) + && metricsList[0].mName.equals(METRIC_NAME1) && metricsList[0].mValue == 5 - && metricsList[1].mName.equals(mMetricName2) + && metricsList[1].mName.equals(METRIC_NAME2) && metricsList[1].mValue == 10)); } }
diff --git a/components/variations/BUILD.gn b/components/variations/BUILD.gn index 913e712..32ce3e7d 100644 --- a/components/variations/BUILD.gn +++ b/components/variations/BUILD.gn
@@ -143,8 +143,14 @@ sources += [ "android/variations_seed_bridge.cc", "android/variations_seed_bridge.h", + "variations_crash_keys_android.cc", + "variations_crash_keys_android.h", ] - deps += [ "//components/variations/android:variations_seed_jni" ] + deps += [ + "//components/crash/android:anr_collector_jni_headers", + "//components/crash/android:anr_build_id_provider", + "//components/variations/android:variations_seed_jni", + ] } if (is_chromeos) {
diff --git a/components/variations/DEPS b/components/variations/DEPS index cc99f56..95ae852 100644 --- a/components/variations/DEPS +++ b/components/variations/DEPS
@@ -5,6 +5,7 @@ "+chromeos/ash/components/dbus/featured", "-components", "+components/compression", + "+components/crash/android", "+components/crash/core/common", "+components/keyed_service", "+components/metrics",
diff --git a/components/variations/android/java/src/org/chromium/components/variations/firstrun/VariationsSeedFetcher.java b/components/variations/android/java/src/org/chromium/components/variations/firstrun/VariationsSeedFetcher.java index cb07c53..7d83501 100644 --- a/components/variations/android/java/src/org/chromium/components/variations/firstrun/VariationsSeedFetcher.java +++ b/components/variations/android/java/src/org/chromium/components/variations/firstrun/VariationsSeedFetcher.java
@@ -261,11 +261,11 @@ /** Object holding information about the seed download parameters. */ public static class SeedFetchParameters { - private @VariationsPlatform int mPlatform; - private @Nullable String mRestrictMode; - private @Nullable String mMilestone; + private final @VariationsPlatform int mPlatform; + private final @Nullable String mRestrictMode; + private final @Nullable String mMilestone; private @Nullable String mChannel; - private boolean mIsFastFetchMode; + private final boolean mIsFastFetchMode; // This is added as a convenience for using Mockito. @Override
diff --git a/components/variations/variations_crash_keys.cc b/components/variations/variations_crash_keys.cc index ae8de74..7443eb5e 100644 --- a/components/variations/variations_crash_keys.cc +++ b/components/variations/variations_crash_keys.cc
@@ -22,8 +22,16 @@ #include "components/variations/synthetic_trials.h" #include "components/variations/variations_switches.h" -#if BUILDFLAG(IS_CHROMEOS) +#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) #include "base/task/thread_pool.h" +#endif + +#if BUILDFLAG(IS_ANDROID) +#include "base/task/cancelable_task_tracker.h" +#include "components/variations/variations_crash_keys_android.h" +#endif + +#if BUILDFLAG(IS_CHROMEOS) #include "components/variations/variations_crash_keys_chromeos.h" #endif @@ -31,9 +39,9 @@ namespace { -// Size of the "num-experiments" crash key in bytes. 1024*6 bytes should be able -// to hold about 341 entries, given each entry is 18 bytes long (due to being -// of the form "8e7abfb0-c16397b7,"). +// Size of the "variations" crash key (kExperimentListKey) in bytes. +// 1024*6 bytes should be able to hold about 341 entries, given each entry is +// 18 bytes long (due to being of the form "8e7abfb0-c16397b7,"). #if BUILDFLAG(LARGE_VARIATION_KEY_SIZE) constexpr size_t kVariationsKeySize = 1024 * 8; constexpr char kVariationKeySizeHistogram[] = @@ -104,11 +112,17 @@ // observer calls that happen on a different thread. scoped_refptr<base::SequencedTaskRunner> ui_thread_task_runner_; -#if BUILDFLAG(IS_CHROMEOS) +#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) // Task runner corresponding to a background thread, used for tasks that may // block. scoped_refptr<base::SequencedTaskRunner> background_thread_task_runner_; -#endif // IS_CHROMEOS +#endif // IS_CHROMEOS || IS_ANDROID + +#if BUILDFLAG(IS_ANDROID) + // A task tracker that allows us to cancel any tasks that have been posted + // but have not started to run. + base::CancelableTaskTracker cancelable_task_tracker_; +#endif // IS_ANDROID // A serialized string containing the variations state. std::string variations_string_; @@ -128,6 +142,14 @@ // thread, calling OnFieldTrialGroupFinalized(), and accessing // |ui_thread_task_runner_| before it is set. ui_thread_task_runner_ = base::SequencedTaskRunner::GetCurrentDefault(); + +#if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_ANDROID) + // Set |background_thread_task_runner_| before observering field trials for + // the same reason mentioned above. + background_thread_task_runner_ = base::ThreadPool::CreateSequencedTaskRunner( + {base::TaskPriority::BEST_EFFORT, base::MayBlock()}); +#endif // IS_CHROMEOS || IS_ANDROID + // Observe field trials before filling the crash key with the currently // active field trials. Otherwise, there could be a race condition where a // trial is activated on a different thread before we started observing. @@ -148,10 +170,6 @@ for (const auto& entry : active_groups) { AppendFieldTrial(entry.trial_name, entry.group_name, entry.is_overridden); } -#if BUILDFLAG(IS_CHROMEOS) - background_thread_task_runner_ = base::ThreadPool::CreateSequencedTaskRunner( - {base::TaskPriority::BEST_EFFORT, base::MayBlock()}); -#endif // IS_CHROMEOS UpdateCrashKeys(); } @@ -251,6 +269,11 @@ variations::switches::kVariationsSeedVersion)); } +#if BUILDFLAG(IS_ANDROID) + SaveVariationsForAnrReporting(&cancelable_task_tracker_, + background_thread_task_runner_, info); +#endif // IS_ANDROID + #if BUILDFLAG(IS_CHROMEOS) ReportVariationsToChromeOs(background_thread_task_runner_, info); #endif // IS_CHROMEOS
diff --git a/components/variations/variations_crash_keys_android.cc b/components/variations/variations_crash_keys_android.cc new file mode 100644 index 0000000..0617783 --- /dev/null +++ b/components/variations/variations_crash_keys_android.cc
@@ -0,0 +1,62 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/variations/variations_crash_keys_android.h" + +#include "base/android/build_info.h" +#include "base/android/jni_android.h" +#include "base/android/jni_string.h" +#include "base/command_line.h" +#include "base/strings/strcat.h" +#include "base/strings/string_number_conversions.h" +#include "components/crash/android/anr_build_id_provider.h" + +// Must come after all headers that specialize FromJniType() / ToJniType(). +#include "components/crash/android/anr_collector_jni_headers/AnrCollector_jni.h" + +namespace { + +// This is defined in content/public/common/content_switches.h, which cannot be +// included here because of cyclic dependencies. +constexpr const char kProcessTypeSwitchName[] = "type"; + +// Turn the variations::ExperimentListInfo struct into a string and pass it to +// the JNI function, which will save the string to a file on disk and save the +// hash of the string to the process state summary, which will be queried later +// for ANR reporting purposes. +void SaveVariations(variations::ExperimentListInfo info) { + std::string combined_variations_string = base::StrCat( + {base::NumberToString(info.num_experiments), "\n", info.experiment_list}); + std::string elf_build_id = crash_reporter::GetElfBuildId(); + + JNIEnv* env = base::android::AttachCurrentThread(); + anr_collector::Java_AnrCollector_saveVariations( + env, combined_variations_string, elf_build_id); +} + +} // namespace + +namespace variations { + +void SaveVariationsForAnrReporting( + base::CancelableTaskTracker* tracker, + scoped_refptr<base::SequencedTaskRunner> runner, + ExperimentListInfo info) { + // ANR collection and reporting is only available on R and above. + bool sdk_version_enough = + base::android::BuildInfo::GetInstance()->sdk_int() >= + base::android::SDK_VERSION_R; + bool is_browser_process = base::CommandLine::ForCurrentProcess() + ->GetSwitchValueASCII(kProcessTypeSwitchName) + .empty(); + if (sdk_version_enough && is_browser_process) { + // Since a second call to SaveVariations() overwrites the value saved by the + // first call, we can safely cancel all the previously posted tasks here. + tracker->TryCancelAll(); + tracker->PostTask(runner.get(), FROM_HERE, + base::BindOnce(&SaveVariations, info)); + } +} + +} // namespace variations
diff --git a/components/variations/variations_crash_keys_android.h b/components/variations/variations_crash_keys_android.h new file mode 100644 index 0000000..c5411d0 --- /dev/null +++ b/components/variations/variations_crash_keys_android.h
@@ -0,0 +1,30 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_VARIATIONS_VARIATIONS_CRASH_KEYS_ANDROID_H_ +#define COMPONENTS_VARIATIONS_VARIATIONS_CRASH_KEYS_ANDROID_H_ + +#include "base/component_export.h" +#include "base/task/cancelable_task_tracker.h" +#include "base/task/sequenced_task_runner.h" +#include "components/variations/variations_crash_keys.h" + +namespace variations { + +// On a separate background thread, report the provided Finch experiments to +// Android by saving the Finch experiments to a file on disk AND saving the hash +// of the file to the process state summary. +// When an ANR happens, the Android app will be forcibly closed. When the app is +// launched again, it can query the process state summary and get the hash of +// the Finch experiments. It will then read each file on disk, find the file +// that matches the hash, and add the list of experiments to the ANR report. +COMPONENT_EXPORT(VARIATIONS) +void SaveVariationsForAnrReporting( + base::CancelableTaskTracker* tracker, + scoped_refptr<base::SequencedTaskRunner> runner, + ExperimentListInfo info); + +} // namespace variations + +#endif // COMPONENTS_VARIATIONS_VARIATIONS_CRASH_KEYS_ANDROID_H_
diff --git a/components/visited_url_ranking/internal/url_grouping/group_suggestions_manager.cc b/components/visited_url_ranking/internal/url_grouping/group_suggestions_manager.cc index 9c18328..bf5cea8 100644 --- a/components/visited_url_ranking/internal/url_grouping/group_suggestions_manager.cc +++ b/components/visited_url_ranking/internal/url_grouping/group_suggestions_manager.cc
@@ -55,15 +55,6 @@ std::move(transforms)); } -const char* GetNameForInput(URLVisitAggregateRankingModelInputSignals signal) { - for (const auto& field : kSuggestionsPredictionSchema) { - if (field.signal == signal) { - return field.name; - } - } - return nullptr; -} - void RecordSuggestionUKM( const GroupSuggestion& shown_suggestion, const std::vector<scoped_refptr<segmentation_platform::InputContext>>& @@ -295,7 +286,8 @@ return; } std::erase_if(suggestions->suggestions, [&](const auto& suggestion) { - return !suggestion_tracker_->ShouldShowSuggestion(suggestion); + return !suggestion_tracker_->ShouldShowSuggestion(suggestion, + result.inputs); }); base::UmaHistogramCounts100( "GroupSuggestionsService.SuggestionsCountAfterThrottling", @@ -352,7 +344,7 @@ } void GroupSuggestionsManager::OnSuggestionResult( - GroupSuggestion shown_suggestion, + const GroupSuggestion& shown_suggestion, const std::vector<scoped_refptr<segmentation_platform::InputContext>>& inputs, GroupSuggestionsDelegate::UserResponseMetadata user_response) { @@ -365,7 +357,7 @@ } // TODO(ssid): Track all suggestions instead of assuming UI shows the first. DCHECK_EQ(user_response.suggestion_id, shown_suggestion.suggestion_id); - suggestion_tracker_->AddSuggestion(shown_suggestion, + suggestion_tracker_->AddSuggestion(shown_suggestion, inputs, user_response.user_response); }
diff --git a/components/visited_url_ranking/internal/url_grouping/group_suggestions_manager.h b/components/visited_url_ranking/internal/url_grouping/group_suggestions_manager.h index 438a512..7d82ae3 100644 --- a/components/visited_url_ranking/internal/url_grouping/group_suggestions_manager.h +++ b/components/visited_url_ranking/internal/url_grouping/group_suggestions_manager.h
@@ -67,7 +67,7 @@ inputs); void OnSuggestionResult( - GroupSuggestion shown_suggestion, + const GroupSuggestion& shown_suggestion, const std::vector<scoped_refptr<segmentation_platform::InputContext>>& inputs, GroupSuggestionsDelegate::UserResponseMetadata user_response);
diff --git a/components/visited_url_ranking/internal/url_grouping/group_suggestions_service_impl_unittest.cc b/components/visited_url_ranking/internal/url_grouping/group_suggestions_service_impl_unittest.cc index 6a2e7e5..f81d8745 100644 --- a/components/visited_url_ranking/internal/url_grouping/group_suggestions_service_impl_unittest.cc +++ b/components/visited_url_ranking/internal/url_grouping/group_suggestions_service_impl_unittest.cc
@@ -37,6 +37,12 @@ constexpr char kTestUrl4[] = "https://www.example4.com/"; constexpr char kTestUrl5[] = "https://www.example5.com/"; constexpr char kTestUrl6[] = "https://www.example6.com/"; +constexpr char kTestUrl7[] = "https://www.example7.com/"; +constexpr char kTestUrl8[] = "https://www.example8.com/"; +constexpr char kTestUrl9[] = "https://www.example9.com/"; +constexpr char kTestUrl10[] = "https://www.example10.com/"; +constexpr char kTestUrl11[] = "https://www.example11.com/"; +constexpr char kTestUrl12[] = "https://www.example12.com/"; URLVisitAggregate CreateVisitForTab(base::TimeDelta time_since_active, int tab_id, @@ -121,18 +127,18 @@ std::vector<URLVisitAggregate> candidates; // 5 tabs with new IDs. candidates.push_back( - CreateVisitForTab(base::Seconds(60), 11, GURL(kTestUrl1))); + CreateVisitForTab(base::Seconds(60), 11, GURL(kTestUrl7))); GetTabMetadata(candidates[0]).is_currently_active = true; candidates.push_back( - CreateVisitForTab(base::Seconds(250), 12, GURL(kTestUrl2))); + CreateVisitForTab(base::Seconds(250), 12, GURL(kTestUrl8))); candidates.push_back( - CreateVisitForTab(base::Seconds(300), 14, GURL(kTestUrl3))); + CreateVisitForTab(base::Seconds(300), 14, GURL(kTestUrl9))); candidates.push_back( - CreateVisitForTab(base::Seconds(500), 15, GURL(kTestUrl4))); + CreateVisitForTab(base::Seconds(500), 15, GURL(kTestUrl10))); candidates.push_back( - CreateVisitForTab(base::Seconds(500), 16, GURL(kTestUrl5))); + CreateVisitForTab(base::Seconds(500), 16, GURL(kTestUrl11))); candidates.push_back( - CreateVisitForTab(base::Seconds(800), 17, GURL(kTestUrl6))); + CreateVisitForTab(base::Seconds(800), 17, GURL(kTestUrl12))); return candidates; } @@ -224,7 +230,6 @@ EXPECT_CALL(*mock_delegate_, ShowSuggestion(_, _)).Times(0); TriggerSuggestions(GetSampleCandidates()); - // Remove 2 tabs to generate different suggestion, that should be shown. auto candidates = GetNonOverlappingCandidates(); EXPECT_CALL(*mock_delegate_, ShowSuggestion(_, _)).Times(1); TriggerSuggestions(std::move(candidates));
diff --git a/components/visited_url_ranking/internal/url_grouping/group_suggestions_tracker.cc b/components/visited_url_ranking/internal/url_grouping/group_suggestions_tracker.cc index 5a4e361..0964821c 100644 --- a/components/visited_url_ranking/internal/url_grouping/group_suggestions_tracker.cc +++ b/components/visited_url_ranking/internal/url_grouping/group_suggestions_tracker.cc
@@ -4,22 +4,27 @@ #include "components/visited_url_ranking/internal/url_grouping/group_suggestions_tracker.h" +#include <cstdint> #include <unordered_set> +#include "base/containers/contains.h" #include "base/containers/fixed_flat_map.h" #include "base/containers/flat_set.h" +#include "base/hash/hash.h" #include "base/json/values_util.h" #include "base/time/time.h" #include "components/prefs/pref_registry_simple.h" #include "components/prefs/pref_service.h" #include "components/prefs/scoped_user_pref_update.h" +#include "components/visited_url_ranking/public/features.h" #include "components/visited_url_ranking/public/url_grouping/group_suggestions.h" +#include "components/visited_url_ranking/public/url_visit_schema.h" namespace visited_url_ranking { namespace { -constexpr base::TimeDelta kSuggestionAgeLimit = base::Hours(24); +using segmentation_platform::processing::ProcessedValue; constexpr auto kReasonToMaxOverlappingTabs = base::MakeFixedFlatMap<GroupSuggestion::SuggestionReason, float>({ @@ -40,6 +45,29 @@ return static_cast<float>(overlap.size()) / tab_ids.size(); } +std::optional<std::string> GetHostForTab( + const std::vector<scoped_refptr<segmentation_platform::InputContext>>& + inputs, + float tab_id) { + const char* tab_id_input = + GetNameForInput(URLVisitAggregateRankingModelInputSignals::kTabId); + for (const auto& input : inputs) { + std::optional<ProcessedValue> tab_id_value = + input->GetMetadataArgument(tab_id_input); + std::optional<ProcessedValue> url_value = input->GetMetadataArgument("url"); + if (!tab_id_value || !url_value) { + continue; + } + if (tab_id_value->float_val == tab_id) { + if (!url_value->url->host().empty()) { + return url_value->url->host(); + } + return std::nullopt; + } + } + return std::nullopt; +} + } // namespace const char GroupSuggestionsTracker::kGroupSuggestionsTrackerStatePref[] = @@ -50,6 +78,8 @@ "user_response"; const char GroupSuggestionsTracker::kGroupSuggestionsTrackerUserTabIdsKey[] = "tab_ids"; +const char GroupSuggestionsTracker::kGroupSuggestionsTrackerHostHashesKey[] = + "host_hashes"; GroupSuggestionsTracker::GroupSuggestionsTracker(PrefService* pref_service) : pref_service_(pref_service) { @@ -63,7 +93,8 @@ GroupSuggestionsTracker::ShownSuggestion::FromDict( old_suggestion.GetDict()); if (suggestion_optional.has_value() && - (now - suggestion_optional->time_shown <= kSuggestionAgeLimit)) { + (now - suggestion_optional->time_shown <= + features::kGroupSuggestionThrottleAgeLimit.Get())) { suggestions_.push_back(std::move(suggestion_optional.value())); new_suggestion_list.Append(old_suggestion.Clone()); } @@ -92,6 +123,12 @@ } shown_suggestion_dict.Set(kGroupSuggestionsTrackerUserTabIdsKey, std::move(suggestion_tab_ids)); + base::Value::List suggestion_host_hashes; + for (int host_hash : host_hashes) { + suggestion_host_hashes.Append(host_hash); + } + shown_suggestion_dict.Set(kGroupSuggestionsTrackerHostHashesKey, + std::move(suggestion_host_hashes)); shown_suggestion_dict.Set(kGroupSuggestionsTrackerUserResponseKey, static_cast<int>(user_response)); return shown_suggestion_dict; @@ -118,11 +155,23 @@ if (!tab_ids_list_ptr) { return std::nullopt; } - for (unsigned i = 0; i < tab_ids_list_ptr->size(); i++) { - tab_ids.push_back((*tab_ids_list_ptr)[i].GetInt()); + for (const auto& i : *tab_ids_list_ptr) { + tab_ids.push_back(i.GetInt()); } suggestion.tab_ids = std::move(tab_ids); + // Populate host hashes. + std::set<int> host_hashes; + auto* host_hashes_list_ptr = + dict.FindList(kGroupSuggestionsTrackerHostHashesKey); + if (!host_hashes_list_ptr) { + return std::nullopt; + } + for (const auto& i : *host_hashes_list_ptr) { + host_hashes.insert(i.GetInt()); + } + suggestion.host_hashes = std::move(host_hashes); + // Populate user response. auto user_response_optional = dict.FindInt(kGroupSuggestionsTrackerUserResponseKey); @@ -142,17 +191,26 @@ void GroupSuggestionsTracker::AddSuggestion( const GroupSuggestion& suggestion, + const std::vector<scoped_refptr<segmentation_platform::InputContext>>& + inputs, GroupSuggestionsDelegate::UserResponse user_response) { ShownSuggestion item; item.time_shown = base::Time::Now(); item.tab_ids = suggestion.tab_ids; item.user_response = user_response; + for (const int tab_id : item.tab_ids) { + std::optional<std::string> host_optional = GetHostForTab(inputs, tab_id); + if (host_optional.has_value()) { + item.host_hashes.insert(base::PersistentHash(*host_optional)); + } + } suggestions_.push_back(std::move(item)); // Append latest suggestion and remove old suggestions in storage. base::Time now = base::Time::Now(); std::erase_if(suggestions_, [&](const ShownSuggestion& item) { - return now - item.time_shown > kSuggestionAgeLimit; + return now - item.time_shown > + features::kGroupSuggestionThrottleAgeLimit.Get(); }); base::Value::List new_suggestion_list; for (const ShownSuggestion& shown_suggestion : suggestions_) { @@ -163,7 +221,9 @@ } bool GroupSuggestionsTracker::ShouldShowSuggestion( - const GroupSuggestion& suggestion) { + const GroupSuggestion& suggestion, + const std::vector<scoped_refptr<segmentation_platform::InputContext>>& + inputs) { if (suggestion.tab_ids.empty() || suggestion.suggestion_reason == GroupSuggestion::SuggestionReason::kUnknown) { @@ -174,7 +234,8 @@ // Remove any old suggestions: std::erase_if(suggestions_, [&](const ShownSuggestion& item) { - return now - item.time_shown > kSuggestionAgeLimit; + return now - item.time_shown > + features::kGroupSuggestionThrottleAgeLimit.Get(); }); base::flat_set<int> all_shown; @@ -185,6 +246,25 @@ if (overlap > kReasonToMaxOverlappingTabs.at(suggestion.suggestion_reason)) { return false; } + + base::flat_set<int> all_shown_hosts; + for (const auto& item : suggestions_) { + all_shown_hosts.insert(item.host_hashes.begin(), item.host_hashes.end()); + } + std::vector<int> suggestion_hosts; + for (const int tab_id : suggestion.tab_ids) { + std::optional<std::string> host_optional = GetHostForTab(inputs, tab_id); + if (host_optional) { + suggestion_hosts.push_back(base::PersistentHash(*host_optional)); + } + } + float hosts_overlap = + GetOverlappingTabCount(all_shown_hosts, suggestion_hosts); + if (hosts_overlap > + kReasonToMaxOverlappingTabs.at(suggestion.suggestion_reason)) { + return false; + } + return true; }
diff --git a/components/visited_url_ranking/internal/url_grouping/group_suggestions_tracker.h b/components/visited_url_ranking/internal/url_grouping/group_suggestions_tracker.h index 646ae6bc..408396c 100644 --- a/components/visited_url_ranking/internal/url_grouping/group_suggestions_tracker.h +++ b/components/visited_url_ranking/internal/url_grouping/group_suggestions_tracker.h
@@ -6,6 +6,7 @@ #define COMPONENTS_VISITED_URL_RANKING_INTERNAL_URL_GROUPING_GROUP_SUGGESTIONS_TRACKER_H_ #include "base/containers/flat_set.h" +#include "components/segmentation_platform/public/input_context.h" #include "components/visited_url_ranking/public/url_grouping/group_suggestions.h" #include "components/visited_url_ranking/public/url_grouping/group_suggestions_delegate.h" @@ -20,6 +21,7 @@ static const char kGroupSuggestionsTrackerTimeKey[]; static const char kGroupSuggestionsTrackerUserResponseKey[]; static const char kGroupSuggestionsTrackerUserTabIdsKey[]; + static const char kGroupSuggestionsTrackerHostHashesKey[]; explicit GroupSuggestionsTracker(PrefService* pref_service); ~GroupSuggestionsTracker(); @@ -29,10 +31,16 @@ static void RegisterProfilePrefs(PrefRegistrySimple* registry); - void AddSuggestion(const GroupSuggestion& suggestion, - GroupSuggestionsDelegate::UserResponse user_response); + void AddSuggestion( + const GroupSuggestion& suggestion, + const std::vector<scoped_refptr<segmentation_platform::InputContext>>& + inputs, + GroupSuggestionsDelegate::UserResponse user_response); - bool ShouldShowSuggestion(const GroupSuggestion& suggestion); + bool ShouldShowSuggestion( + const GroupSuggestion& suggestion, + const std::vector<scoped_refptr<segmentation_platform::InputContext>>& + inputs); private: struct ShownSuggestion { @@ -51,6 +59,7 @@ base::Time time_shown; std::vector<int> tab_ids; + std::set<int> host_hashes; GroupSuggestionsDelegate::UserResponse user_response = GroupSuggestionsDelegate::UserResponse::kUnknown; };
diff --git a/components/visited_url_ranking/internal/url_grouping/group_suggestions_tracker_unittest.cc b/components/visited_url_ranking/internal/url_grouping/group_suggestions_tracker_unittest.cc index 430e43f..90920d3 100644 --- a/components/visited_url_ranking/internal/url_grouping/group_suggestions_tracker_unittest.cc +++ b/components/visited_url_ranking/internal/url_grouping/group_suggestions_tracker_unittest.cc
@@ -4,14 +4,49 @@ #include "components/visited_url_ranking/internal/url_grouping/group_suggestions_tracker.h" +#include "base/hash/hash.h" #include "base/test/task_environment.h" #include "components/prefs/testing_pref_service.h" +#include "components/segmentation_platform/public/input_context.h" #include "components/visited_url_ranking/public/url_grouping/group_suggestions.h" #include "components/visited_url_ranking/public/url_grouping/group_suggestions_delegate.h" #include "testing/gtest/include/gtest/gtest.h" +#include "url/gurl.h" namespace visited_url_ranking { +namespace { + +// Helper to create InputContext for tests. +scoped_refptr<segmentation_platform::InputContext> CreateTestInputContext( + int tab_id, + const std::string& url_spec) { + auto input_context = + base::MakeRefCounted<segmentation_platform::InputContext>(); + input_context->metadata_args.emplace( + "tab_id", segmentation_platform::processing::ProcessedValue( + static_cast<float>(tab_id))); + if (!url_spec.empty()) { + input_context->metadata_args.emplace( + "url", + segmentation_platform::processing::ProcessedValue(GURL(url_spec))); + } + return input_context; +} + +// Helper to create a list of InputContexts for tests. +std::vector<scoped_refptr<segmentation_platform::InputContext>> +CreateTestInputs( + const std::vector<std::pair<int, std::string>>& tab_url_pairs) { + std::vector<scoped_refptr<segmentation_platform::InputContext>> inputs; + for (const auto& pair : tab_url_pairs) { + inputs.push_back(CreateTestInputContext(pair.first, pair.second)); + } + return inputs; +} + +} // namespace + class GroupSuggestionsTrackerTest : public testing::Test { public: GroupSuggestionsTrackerTest() = default; @@ -49,6 +84,40 @@ } } + // Helper to verify stored host hashes in prefs. + void VerifyStoredHostHashes( + const std::vector<std::set<int>>& expected_host_hashes_list) { + const auto& suggestion_list_pref = pref_service_.GetList( + GroupSuggestionsTracker::kGroupSuggestionsTrackerStatePref); + ASSERT_EQ(expected_host_hashes_list.size(), suggestion_list_pref.size()); + + for (size_t i = 0; i < suggestion_list_pref.size(); ++i) { + const base::Value::Dict& suggestion_dic = + suggestion_list_pref[i].GetDict(); + const base::Value::List* dic_host_hashes_list_ptr = + suggestion_dic.FindList( + GroupSuggestionsTracker::kGroupSuggestionsTrackerHostHashesKey); + ASSERT_TRUE(dic_host_hashes_list_ptr) + << "Host hashes key not found for suggestion " << i; + + std::set<int> actual_host_hashes; + for (const base::Value& hash_val : *dic_host_hashes_list_ptr) { + actual_host_hashes.insert(hash_val.GetInt()); + } + EXPECT_EQ(actual_host_hashes, expected_host_hashes_list[i]) + << "Host hash mismatch for suggestion " << i; + } + } + + // Wrapper for AddSuggestion to pass inputs. + void AddSuggestion( + const GroupSuggestion& suggestion, + const std::vector<scoped_refptr<segmentation_platform::InputContext>>& + inputs, + GroupSuggestionsDelegate::UserResponse user_response) { + tracker_->AddSuggestion(suggestion, inputs, user_response); + } + protected: TestingPrefServiceSimple pref_service_; base::test::TaskEnvironment task_environment_{ @@ -58,14 +127,16 @@ TEST_F(GroupSuggestionsTrackerTest, ShouldShowSuggestion_EmptySuggestion) { GroupSuggestion suggestion; - EXPECT_FALSE(tracker_->ShouldShowSuggestion(suggestion)); + std::vector<scoped_refptr<segmentation_platform::InputContext>> empty_inputs; + EXPECT_FALSE(tracker_->ShouldShowSuggestion(suggestion, empty_inputs)); } TEST_F(GroupSuggestionsTrackerTest, ShouldShowSuggestion_UnknownReason) { GroupSuggestion suggestion; suggestion.tab_ids = {1, 2, 3}; suggestion.suggestion_reason = GroupSuggestion::SuggestionReason::kUnknown; - EXPECT_FALSE(tracker_->ShouldShowSuggestion(suggestion)); + std::vector<scoped_refptr<segmentation_platform::InputContext>> empty_inputs; + EXPECT_FALSE(tracker_->ShouldShowSuggestion(suggestion, empty_inputs)); } TEST_F(GroupSuggestionsTrackerTest, ShouldShowSuggestion_FirstTime) { @@ -73,16 +144,18 @@ suggestion.tab_ids = {1, 2, 3}; suggestion.suggestion_reason = GroupSuggestion::SuggestionReason::kRecentlyOpened; - EXPECT_TRUE(tracker_->ShouldShowSuggestion(suggestion)); + std::vector<scoped_refptr<segmentation_platform::InputContext>> empty_inputs; + EXPECT_TRUE(tracker_->ShouldShowSuggestion(suggestion, empty_inputs)); } TEST_F(GroupSuggestionsTrackerTest, ShouldShowSuggestion_OverlappingTabs) { + std::vector<scoped_refptr<segmentation_platform::InputContext>> empty_inputs; std::vector<GroupSuggestion> suggestions; GroupSuggestion suggestion1; suggestion1.tab_ids = {1, 2, 3}; suggestion1.suggestion_reason = GroupSuggestion::SuggestionReason::kRecentlyOpened; - tracker_->AddSuggestion(suggestion1, + tracker_->AddSuggestion(suggestion1, empty_inputs, GroupSuggestionsDelegate::UserResponse::kAccepted); suggestions.push_back(std::move(suggestion1)); VerifySuggestionsStorage(suggestions); @@ -91,32 +164,33 @@ suggestion2.tab_ids = {3, 4, 5}; suggestion2.suggestion_reason = GroupSuggestion::SuggestionReason::kRecentlyOpened; - EXPECT_TRUE(tracker_->ShouldShowSuggestion(suggestion2)); + EXPECT_TRUE(tracker_->ShouldShowSuggestion(suggestion2, empty_inputs)); GroupSuggestion suggestion3; suggestion3.tab_ids = {4, 5, 6}; suggestion3.suggestion_reason = GroupSuggestion::SuggestionReason::kRecentlyOpened; - EXPECT_TRUE(tracker_->ShouldShowSuggestion(suggestion3)); + EXPECT_TRUE(tracker_->ShouldShowSuggestion(suggestion3, empty_inputs)); - tracker_->AddSuggestion(suggestion3, + tracker_->AddSuggestion(suggestion3, empty_inputs, GroupSuggestionsDelegate::UserResponse::kAccepted); suggestions.push_back(std::move(suggestion3)); VerifySuggestionsStorage(suggestions); GroupSuggestion suggestion4; suggestion4.tab_ids = {1, 4, 7}; - EXPECT_FALSE(tracker_->ShouldShowSuggestion(suggestion4)); + EXPECT_FALSE(tracker_->ShouldShowSuggestion(suggestion4, empty_inputs)); } TEST_F(GroupSuggestionsTrackerTest, ShouldShowSuggestion_PersistShownSuggestions) { + std::vector<scoped_refptr<segmentation_platform::InputContext>> empty_inputs; std::vector<GroupSuggestion> suggestions; GroupSuggestion suggestion1; suggestion1.tab_ids = {1, 2, 3}; suggestion1.suggestion_reason = GroupSuggestion::SuggestionReason::kRecentlyOpened; - tracker_->AddSuggestion(suggestion1, + tracker_->AddSuggestion(suggestion1, empty_inputs, GroupSuggestionsDelegate::UserResponse::kAccepted); suggestions.push_back(std::move(suggestion1)); VerifySuggestionsStorage(suggestions); @@ -125,21 +199,22 @@ suggestion2.tab_ids = {2, 3, 4}; suggestion2.suggestion_reason = GroupSuggestion::SuggestionReason::kRecentlyOpened; - EXPECT_FALSE(tracker_->ShouldShowSuggestion(suggestion2)); + EXPECT_FALSE(tracker_->ShouldShowSuggestion(suggestion2, empty_inputs)); // Reset GroupSuggestionsTracker instance. tracker_.reset(); tracker_ = std::make_unique<GroupSuggestionsTracker>(&pref_service_); - EXPECT_FALSE(tracker_->ShouldShowSuggestion(suggestion2)); + EXPECT_FALSE(tracker_->ShouldShowSuggestion(suggestion2, empty_inputs)); } TEST_F(GroupSuggestionsTrackerTest, ShouldShowSuggestion_DifferentReasons) { + std::vector<scoped_refptr<segmentation_platform::InputContext>> empty_inputs; std::vector<GroupSuggestion> suggestions; GroupSuggestion suggestion1; suggestion1.tab_ids = {1, 2, 3}; suggestion1.suggestion_reason = GroupSuggestion::SuggestionReason::kRecentlyOpened; - tracker_->AddSuggestion(suggestion1, + tracker_->AddSuggestion(suggestion1, empty_inputs, GroupSuggestionsDelegate::UserResponse::kAccepted); suggestions.push_back(std::move(suggestion1)); VerifySuggestionsStorage(suggestions); @@ -148,23 +223,24 @@ suggestion2.tab_ids = {1, 2, 3}; suggestion2.suggestion_reason = GroupSuggestion::SuggestionReason::kSwitchedBetween; - EXPECT_FALSE(tracker_->ShouldShowSuggestion(suggestion2)); + EXPECT_FALSE(tracker_->ShouldShowSuggestion(suggestion2, empty_inputs)); GroupSuggestion suggestion3; suggestion3.tab_ids = {1, 2, 3}; suggestion3.suggestion_reason = GroupSuggestion::SuggestionReason::kSimilarSource; - EXPECT_FALSE(tracker_->ShouldShowSuggestion(suggestion3)); + EXPECT_FALSE(tracker_->ShouldShowSuggestion(suggestion3, empty_inputs)); } TEST_F(GroupSuggestionsTrackerTest, ShouldShowSuggestion_OverlappingTabs_SwitchedBetween) { + std::vector<scoped_refptr<segmentation_platform::InputContext>> empty_inputs; std::vector<GroupSuggestion> suggestions; GroupSuggestion suggestion1; suggestion1.tab_ids = {1, 2}; suggestion1.suggestion_reason = GroupSuggestion::SuggestionReason::kSwitchedBetween; - tracker_->AddSuggestion(suggestion1, + tracker_->AddSuggestion(suggestion1, empty_inputs, GroupSuggestionsDelegate::UserResponse::kAccepted); suggestions.push_back(std::move(suggestion1)); VerifySuggestionsStorage(suggestions); @@ -173,14 +249,14 @@ suggestion2.tab_ids = {1, 2}; suggestion2.suggestion_reason = GroupSuggestion::SuggestionReason::kSwitchedBetween; - EXPECT_FALSE(tracker_->ShouldShowSuggestion(suggestion2)); + EXPECT_FALSE(tracker_->ShouldShowSuggestion(suggestion2, empty_inputs)); GroupSuggestion suggestion3; suggestion3.tab_ids = {1, 3}; suggestion3.suggestion_reason = GroupSuggestion::SuggestionReason::kSwitchedBetween; - EXPECT_TRUE(tracker_->ShouldShowSuggestion(suggestion3)); - tracker_->AddSuggestion(suggestion3, + EXPECT_TRUE(tracker_->ShouldShowSuggestion(suggestion3, empty_inputs)); + tracker_->AddSuggestion(suggestion3, empty_inputs, GroupSuggestionsDelegate::UserResponse::kAccepted); suggestions.push_back(std::move(suggestion3)); VerifySuggestionsStorage(suggestions); @@ -189,17 +265,18 @@ suggestion4.tab_ids = {2, 3}; suggestion4.suggestion_reason = GroupSuggestion::SuggestionReason::kSwitchedBetween; - EXPECT_FALSE(tracker_->ShouldShowSuggestion(suggestion4)); + EXPECT_FALSE(tracker_->ShouldShowSuggestion(suggestion4, empty_inputs)); } TEST_F(GroupSuggestionsTrackerTest, ShouldShowSuggestion_OverlappingTabs_SimilarSource) { + std::vector<scoped_refptr<segmentation_platform::InputContext>> empty_inputs; std::vector<GroupSuggestion> suggestions; GroupSuggestion suggestion1; suggestion1.tab_ids = {1, 2, 3}; suggestion1.suggestion_reason = GroupSuggestion::SuggestionReason::kSimilarSource; - tracker_->AddSuggestion(suggestion1, + tracker_->AddSuggestion(suggestion1, empty_inputs, GroupSuggestionsDelegate::UserResponse::kAccepted); suggestions.push_back(std::move(suggestion1)); VerifySuggestionsStorage(suggestions); @@ -208,9 +285,9 @@ suggestion2.tab_ids = {3, 4, 5}; suggestion2.suggestion_reason = GroupSuggestion::SuggestionReason::kSimilarSource; - EXPECT_TRUE(tracker_->ShouldShowSuggestion(suggestion2)); + EXPECT_TRUE(tracker_->ShouldShowSuggestion(suggestion2, empty_inputs)); - tracker_->AddSuggestion(suggestion2, + tracker_->AddSuggestion(suggestion2, empty_inputs, GroupSuggestionsDelegate::UserResponse::kAccepted); suggestions.push_back(std::move(suggestion2)); VerifySuggestionsStorage(suggestions); @@ -219,7 +296,222 @@ suggestion3.tab_ids = {4, 5, 6}; suggestion3.suggestion_reason = GroupSuggestion::SuggestionReason::kSimilarSource; - EXPECT_FALSE(tracker_->ShouldShowSuggestion(suggestion3)); + EXPECT_FALSE(tracker_->ShouldShowSuggestion(suggestion3, empty_inputs)); +} + +TEST_F(GroupSuggestionsTrackerTest, AddSuggestion_Storeshosthashes) { + GroupSuggestion suggestion1; + suggestion1.tab_ids = {1, 2, 3}; + suggestion1.suggestion_reason = + GroupSuggestion::SuggestionReason::kRecentlyOpened; + auto inputs1 = CreateTestInputs({{1, "https://hosta.com/path1"}, + {2, "https://hostb.com/path2"}, + {3, "https://hosta.com/path3"}}); + + AddSuggestion(suggestion1, inputs1, + GroupSuggestionsDelegate::UserResponse::kAccepted); + + std::set<int> expected_hashes1; + expected_hashes1.insert(base::PersistentHash("hosta.com")); + expected_hashes1.insert(base::PersistentHash("hostb.com")); + VerifyStoredHostHashes({expected_hashes1}); + + GroupSuggestion suggestion2; + suggestion2.tab_ids = {4, 5}; + suggestion2.suggestion_reason = + GroupSuggestion::SuggestionReason::kRecentlyOpened; + auto inputs2 = CreateTestInputs( + {{4, "https://hostc.com/path"}, {5, "https://hostd.com/path"}}); + + AddSuggestion(suggestion2, inputs2, + GroupSuggestionsDelegate::UserResponse::kRejected); + + std::set<int> expected_hashes2; + expected_hashes2.insert(base::PersistentHash("hostc.com")); + expected_hashes2.insert(base::PersistentHash("hostd.com")); + VerifyStoredHostHashes({expected_hashes1, expected_hashes2}); +} + +TEST_F(GroupSuggestionsTrackerTest, + ShouldShowSuggestion_Overlappinghosthashes) { + // Threshold for kRecentlyOpened is 0.55 + GroupSuggestion suggestion1; + suggestion1.tab_ids = {1, 2, 3}; + suggestion1.suggestion_reason = + GroupSuggestion::SuggestionReason::kRecentlyOpened; + auto inputs1 = CreateTestInputs({{1, "https://hosta.com/p1"}, + {2, "https://hostb.com/p2"}, + {3, "https://hostc.com/p3"}}); + AddSuggestion(suggestion1, inputs1, + GroupSuggestionsDelegate::UserResponse::kAccepted); + + GroupSuggestion suggestion2; // Candidate + suggestion2.tab_ids = {4, 5, 6}; + suggestion2.suggestion_reason = + GroupSuggestion::SuggestionReason::kRecentlyOpened; + auto inputs2 = + CreateTestInputs({{4, "https://hosta.com/p4"}, // Overlaps hosta + {5, "https://hostb.com/p5"}, // Overlaps hostb + {6, "https://hostd.com/p6"}}); + // Candidate hosts: A, B, D. Stored hosts: A, B, C. + // Overlapping hosts with stored: A, B. Count = 2. + // Total hosts in candidate suggestion2 = 3. Ratio = 2/3 = 0.66. + // 0.66 > 0.55 (threshold for kRecentlyOpened), so should NOT show. + EXPECT_FALSE(tracker_->ShouldShowSuggestion(suggestion2, inputs2)); + + GroupSuggestion suggestion3; // Candidate + suggestion3.tab_ids = {7, 8, 9}; + suggestion3.suggestion_reason = + GroupSuggestion::SuggestionReason::kRecentlyOpened; + auto inputs3 = + CreateTestInputs({{7, "https://hosta.com/p7"}, // Overlaps hosta + {8, "https://hoste.com/p8"}, + {9, "https://hostf.com/p9"}}); + // Candidate hosts: A, E, F. Stored hosts: A, B, C. + // Overlapping hosts with stored: A. Count = 1. + // Total hosts in candidate suggestion3 = 3. Ratio = 1/3 = 0.33. + // 0.33 <= 0.55, so should show. + EXPECT_TRUE(tracker_->ShouldShowSuggestion(suggestion3, inputs3)); +} + +TEST_F(GroupSuggestionsTrackerTest, + ShouldShowSuggestion_NoHostOverlapIfCandidateInputsEmpty) { + GroupSuggestion suggestion1; + suggestion1.tab_ids = {1, 2, 3}; + suggestion1.suggestion_reason = + GroupSuggestion::SuggestionReason::kRecentlyOpened; + auto inputs1 = CreateTestInputs({{1, "https://hosta.com/p1"}, + {2, "https://hostb.com/p2"}, + {3, "https://hostc.com/p3"}}); + AddSuggestion(suggestion1, inputs1, + GroupSuggestionsDelegate::UserResponse::kAccepted); + + GroupSuggestion suggestion2; + suggestion2.tab_ids = {4, 5, 6}; // New tab IDs to pass tab overlap check + suggestion2.suggestion_reason = + GroupSuggestion::SuggestionReason::kRecentlyOpened; + std::vector<scoped_refptr<segmentation_platform::InputContext>> + empty_candidate_inputs; + // If candidate inputs are empty, GethostforTab returns nullopt, + // suggestion_hosts for candidate is empty, hosts_overlap is 0. + // Host check passes. + EXPECT_TRUE( + tracker_->ShouldShowSuggestion(suggestion2, empty_candidate_inputs)); +} + +TEST_F(GroupSuggestionsTrackerTest, + ShouldShowSuggestion_HostOverlapWithEmptyCandidateHostsFromInputs) { + GroupSuggestion suggestion1; + suggestion1.tab_ids = {1, 2, 3}; + suggestion1.suggestion_reason = + GroupSuggestion::SuggestionReason::kRecentlyOpened; + auto inputs1 = CreateTestInputs({{1, "https://hosta.com/p1"}, + {2, "https://hostb.com/p2"}, + {3, "https://hostc.com/p3"}}); + AddSuggestion(suggestion1, inputs1, + GroupSuggestionsDelegate::UserResponse::kAccepted); + + GroupSuggestion suggestion2; // Candidate + suggestion2.tab_ids = {4, 5, 6}; + suggestion2.suggestion_reason = + GroupSuggestion::SuggestionReason::kRecentlyOpened; + // Inputs for candidate tabs exist, but without URLs. + auto inputs2_no_urls = CreateTestInputs({{4, ""}, {5, ""}, {6, ""}}); + // GethostforTab will return nullopt for these, candidate's suggestion_hosts + // empty. Host overlap will be 0. + EXPECT_TRUE(tracker_->ShouldShowSuggestion(suggestion2, inputs2_no_urls)); +} + +TEST_F(GroupSuggestionsTrackerTest, + ShouldShowSuggestion_TabOverlapDominatesHostOverlap) { + // Threshold for kRecentlyOpened is 0.55 for both tab and host overlap. + GroupSuggestion suggestion1; + suggestion1.tab_ids = {1, 2, 3, 7, 8}; // 5 tabs + suggestion1.suggestion_reason = + GroupSuggestion::SuggestionReason::kRecentlyOpened; + auto inputs1 = CreateTestInputs({{1, "https://hosta.com"}, + {2, "https://hostb.com"}, + {3, "https://hostc.com"}, + {7, "https://hostg.com"}, + {8, "https://hosth.com"}}); + AddSuggestion(suggestion1, inputs1, + GroupSuggestionsDelegate::UserResponse::kAccepted); + + // Candidate 2: High tab overlap, low host overlap + GroupSuggestion suggestion2; + suggestion2.tab_ids = { + 1, 2, 3, 4, 5}; // 3 overlapping tabs: 1,2,3. Overlap = 3/5 = 0.6 > 0.55 + suggestion2.suggestion_reason = + GroupSuggestion::SuggestionReason::kRecentlyOpened; + auto inputs2 = CreateTestInputs( + {{1, "https://hostd.com"}, + {2, "https://hoste.com"}, + {3, "https://hostf.com"}, // Different hosts for common tabs + {4, "https://hosti.com"}, + {5, "https://hostj.com"}}); + // Hosts for candidate: D,E,F,I,J. Stored hosts: A,B,C,G,H. Overlap = 0. + // (Passes host check) Fails due to tab overlap. + EXPECT_FALSE(tracker_->ShouldShowSuggestion(suggestion2, inputs2)); + + // Candidate 3: Low tab overlap, high host overlap + GroupSuggestion suggestion3; + suggestion3.tab_ids = {10, 11, 12, 13, + 14}; // 0 overlapping tabs. (Passes tab check) + suggestion3.suggestion_reason = + GroupSuggestion::SuggestionReason::kRecentlyOpened; + auto inputs3 = + CreateTestInputs({{10, "https://hosta.com"}, + {11, "https://hostb.com"}, + {12, "https://hostc.com"}, // 3 overlapping hosts + {13, "https://hostx.com"}, + {14, "https://hosty.com"}}); + // Hosts for candidate: A,B,C,X,Y. Stored hosts: A,B,C,G,H. Overlap A,B,C. + // Count 3. Host overlap = 3/5 = 0.6 > 0.55. (Fails host check) + EXPECT_FALSE(tracker_->ShouldShowSuggestion(suggestion3, inputs3)); +} + +TEST_F(GroupSuggestionsTrackerTest, + ShouldShowSuggestion_DifferentReasonThresholdsForHostOverlap) { + // kRecentlyOpened threshold: 0.55; kSwitchedBetween threshold: 0.60 + GroupSuggestion suggestion_stored; + suggestion_stored.tab_ids = {1, 2, 3, 4}; + suggestion_stored.suggestion_reason = + GroupSuggestion::SuggestionReason::kRecentlyOpened; + auto inputs_stored = CreateTestInputs({{1, "https://hosta.com"}, + {2, "https://hostb.com"}, + {3, "https://hostc.com"}, + {4, "https://hostd.com"}}); + AddSuggestion(suggestion_stored, inputs_stored, + GroupSuggestionsDelegate::UserResponse::kAccepted); + // Stored hosts: A, B, C, D + + // Candidate 1: Reason kRecentlyOpened (threshold 0.55) + GroupSuggestion candidate1; + candidate1.tab_ids = {10, 11, 12, 13, 14}; // New tabs + candidate1.suggestion_reason = + GroupSuggestion::SuggestionReason::kRecentlyOpened; + auto inputs_candidate1 = + CreateTestInputs({{10, "https://hosta.com"}, + {11, "https://hostb.com"}, + {12, "https://hostc.com"}, // 3 overlaps + {13, "https://hoste.com"}, + {14, "https://hostf.com"}}); + // Host overlap: 3/5 = 0.6. 0.6 > 0.55 -> FAIL + EXPECT_FALSE(tracker_->ShouldShowSuggestion(candidate1, inputs_candidate1)); + + // Candidate 2: Reason kSwitchedBetween (threshold 0.60) + GroupSuggestion candidate2; + candidate2.tab_ids = {20, 21, 22, 23, 24}; // New tabs + candidate2.suggestion_reason = + GroupSuggestion::SuggestionReason::kSwitchedBetween; + auto inputs_candidate2 = + CreateTestInputs({{20, "https://hosta.com"}, + {21, "https://hostb.com"}, + {22, "https://hostc.com"}, // 3 overlaps + {23, "https://hoste.com"}, + {24, "https://hostf.com"}}); + // Host overlap: 3/5 = 0.6. 0.6 <= 0.60 -> PASS (host check) + EXPECT_TRUE(tracker_->ShouldShowSuggestion(candidate2, inputs_candidate2)); } } // namespace visited_url_ranking
diff --git a/components/visited_url_ranking/internal/url_grouping/grouping_heuristics.cc b/components/visited_url_ranking/internal/url_grouping/grouping_heuristics.cc index 547d59c..4ceeda5 100644 --- a/components/visited_url_ranking/internal/url_grouping/grouping_heuristics.cc +++ b/components/visited_url_ranking/internal/url_grouping/grouping_heuristics.cc
@@ -46,15 +46,6 @@ UrlGroupingSuggestionId::Generator g_id_generator; -const char* GetNameForInput(URLVisitAggregateRankingModelInputSignals signal) { - for (const auto& field : kSuggestionsPredictionSchema) { - if (field.signal == signal) { - return field.name; - } - } - return nullptr; -} - // A heuristic that find the recently opened tabs and groups them. class RecentlyOpenedHeuristic : public GroupingHeuristics::Heuristic { public:
diff --git a/components/visited_url_ranking/internal/url_grouping/tab_event_tracker_impl.h b/components/visited_url_ranking/internal/url_grouping/tab_event_tracker_impl.h index 1165ac3e..bf395a27 100644 --- a/components/visited_url_ranking/internal/url_grouping/tab_event_tracker_impl.h +++ b/components/visited_url_ranking/internal/url_grouping/tab_event_tracker_impl.h
@@ -49,8 +49,8 @@ base::Time time); ~TabSelection(); - int tab_id; - TabSelectionType tab_selection_type; + int tab_id{-1}; + TabSelectionType tab_selection_type{TabSelectionType::kUnknown}; base::Time time; // Whether this selection has been committed to the the TabEventTracker to // store. @@ -61,8 +61,8 @@ std::set<int> closing_tabs_; std::optional<TabSelection> current_selection_; OnNewEventCallback on_new_event_callback_; - bool tab_switcher_trigger_only_; - bool trigger_on_navigation_; + const bool tab_switcher_trigger_only_; + const bool trigger_on_navigation_; }; } // namespace visited_url_ranking
diff --git a/components/visited_url_ranking/public/features.cc b/components/visited_url_ranking/public/features.cc index 9269ae16..f4ffa85c 100644 --- a/components/visited_url_ranking/public/features.cc +++ b/components/visited_url_ranking/public/features.cc
@@ -181,4 +181,8 @@ /*name=*/"group_suggestion_trigger_calculation_on_page_load", /*default_value=*/true}; +constexpr base::FeatureParam<base::TimeDelta> kGroupSuggestionThrottleAgeLimit{ + &kGroupSuggestionService, + /*name=*/"group_suggestion_throttle_age_limit", + /*default_value=*/base::Days(1)}; } // namespace visited_url_ranking::features
diff --git a/components/visited_url_ranking/public/features.h b/components/visited_url_ranking/public/features.h index 7dad836..260e222 100644 --- a/components/visited_url_ranking/public/features.h +++ b/components/visited_url_ranking/public/features.h
@@ -144,6 +144,10 @@ // page loads. extern const base::FeatureParam<bool> kGroupSuggestionTriggerCalculationOnPageLoad; + +// Parameter determining the age threshold for suggestion throttling. +extern const base::FeatureParam<base::TimeDelta> + kGroupSuggestionThrottleAgeLimit; } // namespace visited_url_ranking::features #endif // COMPONENTS_VISITED_URL_RANKING_PUBLIC_FEATURES_H_
diff --git a/components/visited_url_ranking/public/url_visit_schema.cc b/components/visited_url_ranking/public/url_visit_schema.cc index 77f9d3a..623d6f8 100644 --- a/components/visited_url_ranking/public/url_visit_schema.cc +++ b/components/visited_url_ranking/public/url_visit_schema.cc
@@ -158,4 +158,13 @@ {.signal = URLVisitAggregateRankingModelInputSignals::kIsLastTab, .name = kSignalIsLastTab}}}; +const char* GetNameForInput(URLVisitAggregateRankingModelInputSignals signal) { + for (const auto& field : kSuggestionsPredictionSchema) { + if (field.signal == signal) { + return field.name; + } + } + return nullptr; +} + } // namespace visited_url_ranking
diff --git a/components/visited_url_ranking/public/url_visit_schema.h b/components/visited_url_ranking/public/url_visit_schema.h index 0822104..d064e0c 100644 --- a/components/visited_url_ranking/public/url_visit_schema.h +++ b/components/visited_url_ranking/public/url_visit_schema.h
@@ -72,6 +72,9 @@ extern const std::array<FieldSchema, kSuggestionsNumInputs> kSuggestionsPredictionSchema; +// Helper function to get the name of the input signal. +const char* GetNameForInput(URLVisitAggregateRankingModelInputSignals signal); + } // namespace visited_url_ranking #endif // COMPONENTS_VISITED_URL_RANKING_PUBLIC_URL_VISIT_SCHEMA_H_
diff --git a/components/visited_url_ranking/public/url_visit_util.cc b/components/visited_url_ranking/public/url_visit_util.cc index b6a94c82..e5ec32e 100644 --- a/components/visited_url_ranking/public/url_visit_util.cc +++ b/components/visited_url_ranking/public/url_visit_util.cc
@@ -169,8 +169,8 @@ signal_value_map.emplace( "title", ProcessedValue(base::UTF16ToUTF8( *url_visit_aggregate.GetAssociatedTitles().begin()))); - signal_value_map.emplace( - "url", ProcessedValue(*url_visit_aggregate.GetAssociatedURLs().begin())); + GURL url = *(*url_visit_aggregate.GetAssociatedURLs().begin()); + signal_value_map.emplace("url", std::move(url)); signal_value_map.emplace("url_key", ProcessedValue(url_visit_aggregate.url_key));
diff --git a/components/viz/common/frame_sinks/begin_frame_args.h b/components/viz/common/frame_sinks/begin_frame_args.h index 23cef541..5517e21 100644 --- a/components/viz/common/frame_sinks/begin_frame_args.h +++ b/components/viz/common/frame_sinks/begin_frame_args.h
@@ -278,12 +278,6 @@ // |true| if the observer has produced damage (e.g. sent a CompositorFrame or // damaged a surface) as part of responding to the BeginFrame. bool has_damage = false; - - // Specifies the interval at which the client's content is updated. This can - // be used to configure the display to the optimal vsync interval available. - // If unspecified, or set to BeginFrameArgs::MinInterval, it is assumed that - // the client can animate at the maximum frame rate supported by the Display. - std::optional<base::TimeDelta> preferred_frame_interval; }; } // namespace viz
diff --git a/components/viz/common/quads/compositor_frame_metadata.cc b/components/viz/common/quads/compositor_frame_metadata.cc index 104c8b2..e4fa58c 100644 --- a/components/viz/common/quads/compositor_frame_metadata.cc +++ b/components/viz/common/quads/compositor_frame_metadata.cc
@@ -42,6 +42,7 @@ send_frame_token_to_embedder(other.send_frame_token_to_embedder), min_page_scale_factor(other.min_page_scale_factor), top_controls_visible_height(other.top_controls_visible_height), + preferred_frame_interval(other.preferred_frame_interval), display_transform_hint(other.display_transform_hint), transition_directives(other.transition_directives), has_shared_element_resources(other.has_shared_element_resources),
diff --git a/components/viz/common/quads/compositor_frame_metadata.h b/components/viz/common/quads/compositor_frame_metadata.h index 09e9c03d..358d0a86 100644 --- a/components/viz/common/quads/compositor_frame_metadata.h +++ b/components/viz/common/quads/compositor_frame_metadata.h
@@ -174,6 +174,12 @@ // value set. std::optional<float> top_controls_visible_height; + // Specifies the interval at which the client's content is updated. This can + // be used to configure the display to the optimal vsync interval available. + // If unspecified, or set to BeginFrameArgs::MinInterval, it is assumed that + // the client can animate at the maximum frame rate supported by the Display. + std::optional<base::TimeDelta> preferred_frame_interval; + // Display transform hint when the frame is generated. Note this is only // applicable to frames of the root surface. gfx::OverlayTransform display_transform_hint = gfx::OVERLAY_TRANSFORM_NONE;
diff --git a/components/viz/common/quads/compositor_frame_metadata_unittest.cc b/components/viz/common/quads/compositor_frame_metadata_unittest.cc index c0cddaa..84ccc2d 100644 --- a/components/viz/common/quads/compositor_frame_metadata_unittest.cc +++ b/components/viz/common/quads/compositor_frame_metadata_unittest.cc
@@ -26,8 +26,7 @@ bool AreBeginFrameAcksEqual(const BeginFrameAck& a, const BeginFrameAck& b) { return a.frame_id == b.frame_id && a.trace_id == b.trace_id && - a.has_damage == b.has_damage && - a.preferred_frame_interval == b.preferred_frame_interval; + a.has_damage == b.has_damage; } bool AreLatencyInfosEqual(const ui::LatencyInfo& a, const ui::LatencyInfo& b) { @@ -72,12 +71,11 @@ metadata.deadline = FrameDeadline(base::TimeTicks() + base::Seconds(123), 15, base::Milliseconds(16), true); metadata.begin_frame_ack = BeginFrameAck(999, 888, true, 777); - metadata.begin_frame_ack.preferred_frame_interval.emplace( - base::Milliseconds(11)); metadata.frame_token = 6; metadata.send_frame_token_to_embedder = true; metadata.min_page_scale_factor = 123.3f; metadata.top_controls_visible_height.emplace(0.5); + metadata.preferred_frame_interval.emplace(base::Milliseconds(11)); metadata.display_transform_hint = gfx::OVERLAY_TRANSFORM_FLIP_VERTICAL; metadata.delegated_ink_metadata = std::make_unique<gfx::DelegatedInkMetadata>( gfx::PointF(88.8, 44.4), 1.f, SK_ColorRED, @@ -117,6 +115,9 @@ metadata.top_controls_visible_height); EXPECT_FLOAT_EQ(*clone.top_controls_visible_height, *metadata.top_controls_visible_height); + EXPECT_EQ(clone.preferred_frame_interval, metadata.preferred_frame_interval); + EXPECT_EQ(*clone.preferred_frame_interval, + *metadata.preferred_frame_interval); EXPECT_EQ(clone.display_transform_hint, metadata.display_transform_hint); EXPECT_EQ(!!clone.delegated_ink_metadata, !!metadata.delegated_ink_metadata);
diff --git a/components/viz/common/resources/shared_image_format.cc b/components/viz/common/resources/shared_image_format.cc index 24698f17..10af54a 100644 --- a/components/viz/common/resources/shared_image_format.cc +++ b/components/viz/common/resources/shared_image_format.cc
@@ -35,8 +35,6 @@ return "BGRA_8888"; } else if (format == SinglePlaneFormat::kALPHA_8) { return "ALPHA_8"; - } else if (format == SinglePlaneFormat::kLUMINANCE_8) { - return "LUMINANCE_8"; } else if (format == SinglePlaneFormat::kRGB_565) { return "RGB_565"; } else if (format == SinglePlaneFormat::kBGR_565) { @@ -383,7 +381,6 @@ case mojom::SingleplanarFormat::RG_88: return 16; case mojom::SingleplanarFormat::ALPHA_8: - case mojom::SingleplanarFormat::LUMINANCE_8: case mojom::SingleplanarFormat::R_8: return 8; case mojom::SingleplanarFormat::ETC1:
diff --git a/components/viz/common/resources/shared_image_format.h b/components/viz/common/resources/shared_image_format.h index 5229892..5fb4a36 100644 --- a/components/viz/common/resources/shared_image_format.h +++ b/components/viz/common/resources/shared_image_format.h
@@ -273,8 +273,6 @@ SharedImageFormat(mojom::SingleplanarFormat::BGRA_8888); static constexpr SharedImageFormat kALPHA_8 = SharedImageFormat(mojom::SingleplanarFormat::ALPHA_8); - static constexpr SharedImageFormat kLUMINANCE_8 = - SharedImageFormat(mojom::SingleplanarFormat::LUMINANCE_8); static constexpr SharedImageFormat kRGB_565 = SharedImageFormat(mojom::SingleplanarFormat::RGB_565); static constexpr SharedImageFormat kBGR_565 = @@ -305,11 +303,11 @@ SharedImageFormat(mojom::SingleplanarFormat::R_F16); // All known singleplanar formats. - static constexpr SharedImageFormat kAll[19] = { - kRGBA_8888, kRGBA_4444, kBGRA_8888, kALPHA_8, kLUMINANCE_8, - kRGB_565, kBGR_565, kETC1, kR_8, kRG_88, - kLUMINANCE_F16, kRGBA_F16, kR_16, kRG_1616, kRGBX_8888, - kBGRX_8888, kRGBA_1010102, kBGRA_1010102, kR_F16}; + static constexpr SharedImageFormat kAll[18] = { + kRGBA_8888, kRGBA_4444, kBGRA_8888, kALPHA_8, kRGB_565, + kBGR_565, kETC1, kR_8, kRG_88, kLUMINANCE_F16, + kRGBA_F16, kR_16, kRG_1616, kRGBX_8888, kBGRX_8888, + kRGBA_1010102, kBGRA_1010102, kR_F16}; }; // Constants for common multi-planar formats.
diff --git a/components/viz/common/resources/shared_image_format_utils.cc b/components/viz/common/resources/shared_image_format_utils.cc index 43d22ed0..296b80e 100644 --- a/components/viz/common/resources/shared_image_format_utils.cc +++ b/components/viz/common/resources/shared_image_format_utils.cc
@@ -29,8 +29,6 @@ } else if (format == SinglePlaneFormat::kBGR_565 || format == SinglePlaneFormat::kRGB_565) { return kRGB_565_SkColorType; - } else if (format == SinglePlaneFormat::kLUMINANCE_8) { - return kGray_8_SkColorType; } else if (format == SinglePlaneFormat::kRGBX_8888 || format == SinglePlaneFormat::kBGRX_8888 || format == SinglePlaneFormat::kETC1) { @@ -98,8 +96,6 @@ return SinglePlaneFormat::kALPHA_8; case kRGB_565_SkColorType: return SinglePlaneFormat::kBGR_565; - case kGray_8_SkColorType: - return SinglePlaneFormat::kLUMINANCE_8; case kRGB_888x_SkColorType: return SinglePlaneFormat::kRGBX_8888; case kRGBA_1010102_SkColorType: @@ -262,8 +258,6 @@ return GL_RGBA4; } else if (format == SinglePlaneFormat::kALPHA_8) { return GL_ALPHA8_EXT; - } else if (format == SinglePlaneFormat::kLUMINANCE_8) { - return GL_LUMINANCE8_EXT; } else if (format == SinglePlaneFormat::kBGR_565 || format == SinglePlaneFormat::kRGB_565) { return GL_RGB565;
diff --git a/components/viz/service/display/dc_layer_overlay.cc b/components/viz/service/display/dc_layer_overlay.cc index 04ed561..6cbc612 100644 --- a/components/viz/service/display/dc_layer_overlay.cc +++ b/components/viz/service/display/dc_layer_overlay.cc
@@ -374,15 +374,6 @@ is_overlay, has_occluding_surface_damage, damage_rects_empty); } -QuadList::Iterator FindAnOverlayCandidate(QuadList& quad_list) { - for (auto it = quad_list.begin(); it != quad_list.end(); ++it) { - if (it->material == DrawQuad::Material::kTextureContent) { - return it; - } - } - return quad_list.end(); -} - QuadList::Iterator FindAnOverlayCandidateExcludingMediaFoundationVideoContent( QuadList& quad_list) { QuadList::Iterator it = quad_list.end(); @@ -884,6 +875,11 @@ global_overlay_state.processed_yuv_overlay_count, allow_promotion_hinting_); + // There's copy requests, so we'll only allow quads that require overlay. + if (render_pass->HasCapture() && !OverlayCandidate::RequiresOverlay(*it)) { + result.code = DC_LAYER_FAILED_COPY_REQUESTS; + } + if (result.is_yuv_overlay) { global_overlay_state.yuv_quads++; if (no_undamaged_overlay_promotion_) { @@ -969,6 +965,15 @@ bool is_overlay = !IsOccluded(gfx::RectF(quad_rect_in_target_space), quad_list->begin(), it, render_pass_filters); + // When the the render pass has capture, always treat the overlay as the + // "underlay" case, so we always replace the video quad with a hole punch. + // If it is treated in the "overlay" case, we will remove the video quad + // from the render pass and potentially show stale/invalid pixels in the + // copy output. + if (render_pass->HasCapture()) { + is_overlay = false; + } + // Protected video is always put in an overlay, but texture quads can be // skipped if they're not underlay compatible. const bool requires_overlay = IsOverlayRequiredForQuad(*it); @@ -1136,14 +1141,14 @@ // enabled. When video capture is enabled, some frames might not have copy // request. if (render_pass->HasCapture()) { - // Find a valid overlay candidate from quad_list. - QuadList::Iterator it = FindAnOverlayCandidate(*quad_list); + QuadList::Iterator it = + FindAnOverlayCandidateExcludingMediaFoundationVideoContent(*quad_list); if (it != quad_list->end()) { render_pass->video_capture_enabled ? RecordDCLayerResult(DC_LAYER_FAILED_VIDEO_CAPTURE_ENABLED, *it) : RecordDCLayerResult(DC_LAYER_FAILED_COPY_REQUESTS, *it); + return true; } - return true; } if (render_pass->content_color_usage == gfx::ContentColorUsage::kHDR) {
diff --git a/components/viz/service/display/overlay_dc_unittest.cc b/components/viz/service/display/overlay_dc_unittest.cc index 7fdbc5b9..b041d03 100644 --- a/components/viz/service/display/overlay_dc_unittest.cc +++ b/components/viz/service/display/overlay_dc_unittest.cc
@@ -34,6 +34,7 @@ #include "components/viz/service/display/output_surface.h" #include "components/viz/service/display/overlay_candidate.h" #include "components/viz/service/display/overlay_processor_win.h" +#include "components/viz/test/draw_quad_matchers.h" #include "components/viz/test/fake_skia_output_surface.h" #include "components/viz/test/overlay_candidate_matchers.h" #include "components/viz/test/test_context_provider.h" @@ -1294,6 +1295,52 @@ } } +// Check that a protected video can be promoted to overlay even if there is a +// video capture on the root render pass. +TEST_F(DCLayerOverlayProcessorTest, VideoCaptureOnRootPassWithProtectedQuad) { + InitializeDCLayerOverlayProcessor(); + + // Create a pass with video capture enabled. + auto pass = CreateRenderPass(); + pass->damage_rect = gfx::Rect(0, 0, 256, 256); + pass->video_capture_enabled = true; + pass->shared_quad_state_list.back()->overlay_damage_index = 0; + + CreateOpaqueQuadAt(resource_provider_.get(), + pass->shared_quad_state_list.back(), pass.get(), + gfx::Rect(0, 0, 32, 32), SkColors::kRed); + + // Create a protected video YUV quad below the red solid quad. + auto* quad = CreateFullscreenCandidateYUVTextureQuad( + resource_provider_.get(), child_resource_provider_.get(), + child_provider_.get(), pass->shared_quad_state_list.back(), pass.get()); + quad->protected_video_type = gfx::ProtectedVideoType::kHardwareProtected; + + AggregatedRenderPassList pass_list; + pass_list.push_back(std::move(pass)); + + OverlayProcessorInterface::FilterOperationsMap render_pass_filters; + OverlayProcessorInterface::FilterOperationsMap render_pass_backdrop_filters; + SurfaceDamageRectList surface_damage_rect_list = {gfx::Rect(0, 0, 256, 256)}; + auto overlay_data = ProcessRootPassForOverlays( + &pass_list, render_pass_filters, render_pass_backdrop_filters, + std::move(surface_damage_rect_list)); + + // Expect the protected video is promoted to overlay. + EXPECT_EQ(1U, overlay_data.promoted_overlays.size()); + + // Check that we still have the red solid color quad, but the YUV quad has + // been replaced with a placeholder. + auto* root_pass = pass_list.back().get(); + EXPECT_THAT(root_pass->quad_list, + testing::ElementsAreArray({ + // Red quad from input + IsSolidColorQuad(SkColors::kRed), + // Protected video is replaced by a video hole. + IsSolidColorQuad(SkColors::kTransparent), + })); +} + // Check that video capture on a non-root pass does not affect overlay promotion // on the root pass itself. TEST_F(DCLayerOverlayProcessorTest, VideoCaptureOnIsolatedRenderPass) {
diff --git a/components/viz/service/frame_sinks/compositor_frame_sink_support.cc b/components/viz/service/frame_sinks/compositor_frame_sink_support.cc index a6355a4..6a9b434 100644 --- a/components/viz/service/frame_sinks/compositor_frame_sink_support.cc +++ b/components/viz/service/frame_sinks/compositor_frame_sink_support.cc
@@ -281,24 +281,6 @@ } } -void CompositorFrameSinkSupport::ApplyPreferredFrameRate(uint64_t source_id) { - // Skip throttling for very small changes in frame interval. - // A value of 2 ms proved to be enough to not have throttle firing during - // a constant video playback but can be changed to a higher value if - // over firing occurs in some edge case while always aiming to keep it - // lower than a full frame interval. - if ((last_known_frame_interval_ - preferred_frame_interval_).magnitude() > - base::Milliseconds(2)) { - TRACE_EVENT_INSTANT2("viz", "Set sink framerate", TRACE_EVENT_SCOPE_THREAD, - "interval", preferred_frame_interval_, "sourceid", - source_id); - last_known_frame_interval_ = preferred_frame_interval_; - // Only throttle simple cadences. - ThrottleBeginFrame(preferred_frame_interval_, - /*simple_cadence_only=*/true); - } -} - void CompositorFrameSinkSupport::OnSurfaceCommitted(Surface* surface) { if (surface->HasPendingFrame()) { // Make sure we periodically check if the frame should activate. @@ -686,11 +668,6 @@ begin_frame_source_->DidFinishFrame(this); frame_sink_manager_->DidFinishFrame(frame_sink_id_, last_begin_frame_args_); } - if (ack.preferred_frame_interval && - frame_sink_type_ == mojom::CompositorFrameSinkType::kLayerTree) { - preferred_frame_interval_ = *ack.preferred_frame_interval; - ApplyPreferredFrameRate(ack.frame_id.source_id); - } } void CompositorFrameSinkSupport::SubmitCompositorFrame( @@ -804,16 +781,30 @@ // |frame.metadata.frame_token| instead of maintaining a |last_frame_index_|. uint64_t frame_index = ++last_frame_index_; - if (frame.metadata.begin_frame_ack.preferred_frame_interval) { - preferred_frame_interval_ = - *frame.metadata.begin_frame_ack.preferred_frame_interval; + if (frame.metadata.preferred_frame_interval) { + preferred_frame_interval_ = *frame.metadata.preferred_frame_interval; } else { preferred_frame_interval_ = BeginFrameArgs::MinInterval(); } if (features::ShouldOnBeginFrameThrottleVideo() && frame_sink_type_ == mojom::CompositorFrameSinkType::kVideo) { - ApplyPreferredFrameRate(frame.metadata.begin_frame_ack.frame_id.source_id); + // Skip throttling for very small changes in frame interval. + // A value of 2 ms proved to be enough to not have throttle firing during + // a constant video playback but can be changed to a higher value if + // over firing occurs in some edge case while always aiming to keep it + // lower than a full frame interval. + if ((last_known_frame_interval_ - preferred_frame_interval_).magnitude() > + base::Milliseconds(2)) { + TRACE_EVENT_INSTANT2("viz", "Set sink framerate", + TRACE_EVENT_SCOPE_THREAD, "interval", + preferred_frame_interval_, "sourceid", + frame.metadata.begin_frame_ack.frame_id.source_id); + last_known_frame_interval_ = preferred_frame_interval_; + // Only throttle simple cadences. + ThrottleBeginFrame(preferred_frame_interval_, + /*simple_cadence_only=*/true); + } } Surface* prev_surface =
diff --git a/components/webapk/android/libs/client/src/org/chromium/components/webapk/lib/client/WebApkVerifySignature.java b/components/webapk/android/libs/client/src/org/chromium/components/webapk/lib/client/WebApkVerifySignature.java index f205922..52aa2e2 100644 --- a/components/webapk/android/libs/client/src/org/chromium/components/webapk/lib/client/WebApkVerifySignature.java +++ b/components/webapk/android/libs/client/src/org/chromium/components/webapk/lib/client/WebApkVerifySignature.java
@@ -123,10 +123,10 @@ /** Block contains metadata about a zip entry. */ private static class Block implements Comparable<Block> { - String mFilename; - int mPosition; + final String mFilename; + final int mPosition; int mHeaderSize; - int mCompressedSize; + final int mCompressedSize; Block(String filename, int position, int compressedSize) { mFilename = filename; @@ -142,7 +142,7 @@ } /** Comparator for sorting the list by position ascending. */ - public static Comparator<Block> positionComparator = + public static final Comparator<Block> POSITION_COMPARATOR = new Comparator<Block>() { @Override public int compare(Block b1, Block b2) { @@ -353,7 +353,7 @@ } // We need blocks to be sorted by position at this point. - Collections.sort(mBlocks, Block.positionComparator); + Collections.sort(mBlocks, Block.POSITION_COMPARATOR); int lastByte = 0; // Read the 'local file header' block to the size of the header in bytes.
diff --git a/components/webapps/browser/android/java/src/org/chromium/components/webapps/AddToHomescreenCoordinator.java b/components/webapps/browser/android/java/src/org/chromium/components/webapps/AddToHomescreenCoordinator.java index eacc0bc..a5997a25 100644 --- a/components/webapps/browser/android/java/src/org/chromium/components/webapps/AddToHomescreenCoordinator.java +++ b/components/webapps/browser/android/java/src/org/chromium/components/webapps/AddToHomescreenCoordinator.java
@@ -31,12 +31,12 @@ @JNINamespace("webapps") @NullMarked public class AddToHomescreenCoordinator { - private Context mActivityContext; - private ModalDialogManager mModalDialogManager; + private final Context mActivityContext; + private final ModalDialogManager mModalDialogManager; private @Nullable PropertyModel mModel; - private WindowAndroid mWindowAndroid; + private final WindowAndroid mWindowAndroid; // May be null during tests. - private WebContents mWebContents; + private final WebContents mWebContents; @VisibleForTesting public AddToHomescreenCoordinator(
diff --git a/components/webapps/browser/android/java/src/org/chromium/components/webapps/AddToHomescreenDialogView.java b/components/webapps/browser/android/java/src/org/chromium/components/webapps/AddToHomescreenDialogView.java index 3866eb0c9..1b59284b 100644 --- a/components/webapps/browser/android/java/src/org/chromium/components/webapps/AddToHomescreenDialogView.java +++ b/components/webapps/browser/android/java/src/org/chromium/components/webapps/AddToHomescreenDialogView.java
@@ -48,26 +48,26 @@ public class AddToHomescreenDialogView implements View.OnClickListener, ModalDialogProperties.Controller { private PropertyModel mDialogModel; - private ModalDialogManager mModalDialogManager; + private final ModalDialogManager mModalDialogManager; @VisibleForTesting protected AddToHomescreenViewDelegate mDelegate; - private View mParentView; + private final View mParentView; /** * {@link #mShortcutTitleInput} and the {@link #mAppLayout} are mutually exclusive, depending on * whether the home screen item is a bookmark shortcut or a web/native app. */ - private EditText mShortcutTitleInput; + private final EditText mShortcutTitleInput; - private LinearLayout mAppLayout; - private TextView mAppNameView; - private EditText mHomebrewAppNameInput; - private TextView mAppOriginView; - private RatingBar mAppRatingBar; - private ImageView mPlayLogoView; + private final LinearLayout mAppLayout; + private final TextView mAppNameView; + private final EditText mHomebrewAppNameInput; + private final TextView mAppOriginView; + private final RatingBar mAppRatingBar; + private final ImageView mPlayLogoView; - private View mProgressBarView; - private ImageView mIconView; + private final View mProgressBarView; + private final ImageView mIconView; private @AppType int mAppType; private boolean mCanSubmit;
diff --git a/components/webapps/browser/android/java/src/org/chromium/components/webapps/AddToHomescreenDialogViewTest.java b/components/webapps/browser/android/java/src/org/chromium/components/webapps/AddToHomescreenDialogViewTest.java index 054672a8..d59856fd 100644 --- a/components/webapps/browser/android/java/src/org/chromium/components/webapps/AddToHomescreenDialogViewTest.java +++ b/components/webapps/browser/android/java/src/org/chromium/components/webapps/AddToHomescreenDialogViewTest.java
@@ -28,10 +28,10 @@ @RunWith(BaseRobolectricTestRunner.class) public class AddToHomescreenDialogViewTest { private AddToHomescreenDialogView mAddToHomescreenDialogView; - private CallbackHelper mAddCallback = new CallbackHelper(); - private CallbackHelper mTitleClickCallback = new CallbackHelper(); - private CallbackHelper mDismissCallback = new CallbackHelper(); - private MockModalDialogManager mModalDialogManager = new MockModalDialogManager(); + private final CallbackHelper mAddCallback = new CallbackHelper(); + private final CallbackHelper mTitleClickCallback = new CallbackHelper(); + private final CallbackHelper mDismissCallback = new CallbackHelper(); + private final MockModalDialogManager mModalDialogManager = new MockModalDialogManager(); private static final String TEST_TITLE = "YouTube"; private static final String TEST_URL = "youtube.com";
diff --git a/components/webapps/browser/android/java/src/org/chromium/components/webapps/AddToHomescreenMediator.java b/components/webapps/browser/android/java/src/org/chromium/components/webapps/AddToHomescreenMediator.java index 342d403..53ad9f7 100644 --- a/components/webapps/browser/android/java/src/org/chromium/components/webapps/AddToHomescreenMediator.java +++ b/components/webapps/browser/android/java/src/org/chromium/components/webapps/AddToHomescreenMediator.java
@@ -30,8 +30,8 @@ @NullMarked class AddToHomescreenMediator implements AddToHomescreenViewDelegate { private long mNativeAddToHomescreenMediator; - private PropertyModel mModel; - private WindowAndroid mWindowAndroid; + private final PropertyModel mModel; + private final WindowAndroid mWindowAndroid; private @Nullable AppData mNativeAppData; AddToHomescreenMediator(PropertyModel model, WindowAndroid windowAndroid) {
diff --git a/components/webapps/browser/android/java/src/org/chromium/components/webapps/AddToHomescreenMediatorTest.java b/components/webapps/browser/android/java/src/org/chromium/components/webapps/AddToHomescreenMediatorTest.java index ba86c29..9b453cc 100644 --- a/components/webapps/browser/android/java/src/org/chromium/components/webapps/AddToHomescreenMediatorTest.java +++ b/components/webapps/browser/android/java/src/org/chromium/components/webapps/AddToHomescreenMediatorTest.java
@@ -29,7 +29,7 @@ @Mock private AddToHomescreenMediator.Natives mNativeMock; @Mock private WindowAndroid mWindowAndroid; - private PropertyModel mPropertyModel = + private final PropertyModel mPropertyModel = new PropertyModel.Builder(AddToHomescreenProperties.ALL_KEYS).build(); private static final long NATIVE_POINTER = 12;
diff --git a/components/webapps/browser/android/java/src/org/chromium/components/webapps/bottomsheet/PwaBottomSheetController.java b/components/webapps/browser/android/java/src/org/chromium/components/webapps/bottomsheet/PwaBottomSheetController.java index ebcc491..73ea875 100644 --- a/components/webapps/browser/android/java/src/org/chromium/components/webapps/bottomsheet/PwaBottomSheetController.java +++ b/components/webapps/browser/android/java/src/org/chromium/components/webapps/bottomsheet/PwaBottomSheetController.java
@@ -122,9 +122,9 @@ /** The Adapter for the view's Screenshots RecyclerView. */ static class ScreenshotsAdapter extends RecyclerView.Adapter<ScreenshotViewHolder> { - private Context mContext; - private ArrayList<Bitmap> mScreenshots; - private boolean mShouldPadForDialogContent; + private final Context mContext; + private final ArrayList<Bitmap> mScreenshots; + private final boolean mShouldPadForDialogContent; public ScreenshotsAdapter(Context context, boolean shouldPadForDialogContent) { mContext = context;
diff --git a/components/webapps/browser/android/java/src/org/chromium/components/webapps/pwa_restore_ui/PwaRestoreBottomSheetMediator.java b/components/webapps/browser/android/java/src/org/chromium/components/webapps/pwa_restore_ui/PwaRestoreBottomSheetMediator.java index 57ed69e..26647480 100644 --- a/components/webapps/browser/android/java/src/org/chromium/components/webapps/pwa_restore_ui/PwaRestoreBottomSheetMediator.java +++ b/components/webapps/browser/android/java/src/org/chromium/components/webapps/pwa_restore_ui/PwaRestoreBottomSheetMediator.java
@@ -32,7 +32,7 @@ // The callback for the parent to get notified on when Restore is clicked. private final Runnable mParentRestoreClickHandler; - private long mNativeMediator; + private final long mNativeMediator; PwaRestoreBottomSheetMediator( ArrayList apps,
diff --git a/components/webapps/browser/android/java/src/org/chromium/components/webapps/pwa_restore_ui/PwaRestoreBottomSheetViewRenderTest.java b/components/webapps/browser/android/java/src/org/chromium/components/webapps/pwa_restore_ui/PwaRestoreBottomSheetViewRenderTest.java index 1a23827..72a589db 100644 --- a/components/webapps/browser/android/java/src/org/chromium/components/webapps/pwa_restore_ui/PwaRestoreBottomSheetViewRenderTest.java +++ b/components/webapps/browser/android/java/src/org/chromium/components/webapps/pwa_restore_ui/PwaRestoreBottomSheetViewRenderTest.java
@@ -50,7 +50,7 @@ private static Activity sActivity; @ClassParameter - private static List<ParameterSet> sClassParams = + private static final List<ParameterSet> sClassParams = new NightModeTestUtils.NightModeParams().getParameters(); @ClassRule
diff --git a/components/webapps/browser/android/java/src/org/chromium/components/webapps/pwa_restore_ui/PwaRestoreProperties.java b/components/webapps/browser/android/java/src/org/chromium/components/webapps/pwa_restore_ui/PwaRestoreProperties.java index 3798949..f75a0489 100644 --- a/components/webapps/browser/android/java/src/org/chromium/components/webapps/pwa_restore_ui/PwaRestoreProperties.java +++ b/components/webapps/browser/android/java/src/org/chromium/components/webapps/pwa_restore_ui/PwaRestoreProperties.java
@@ -28,7 +28,7 @@ private final String mAppId; private final String mAppName; private final Bitmap mAppIcon; - private int mLastUsedDaysAgo; + private final int mLastUsedDaysAgo; // Whether the app is selected or not. private boolean mSelected;
diff --git a/components/webapps/browser/android/java/src/org/chromium/components/webapps/pwa_universal_install/PwaUniversalInstallBottomSheetCoordinator.java b/components/webapps/browser/android/java/src/org/chromium/components/webapps/pwa_universal_install/PwaUniversalInstallBottomSheetCoordinator.java index f2e70812..136a6f5 100644 --- a/components/webapps/browser/android/java/src/org/chromium/components/webapps/pwa_universal_install/PwaUniversalInstallBottomSheetCoordinator.java +++ b/components/webapps/browser/android/java/src/org/chromium/components/webapps/pwa_universal_install/PwaUniversalInstallBottomSheetCoordinator.java
@@ -71,7 +71,7 @@ private @AppType @Nullable Integer mAppType; // Whether we are showing the dialog for the root of the domain (path == '/') or a leaf page. - private boolean mIsRoot; + private final boolean mIsRoot; // Whether we are yet to show this dialog (the dialog is shown after a brief delay, possibly // with a toast while we wait for it to appear). @@ -81,7 +81,7 @@ private @Nullable Toast mToast; // Tracks when the fetch application data starts. - private long mFetchStartTime; + private final long mFetchStartTime; private final Runnable mInstallCallback; private final Runnable mAddShortcutCallback;
diff --git a/components/webauthn/android/java/src/org/chromium/components/webauthn/AuthenticatorImpl.java b/components/webauthn/android/java/src/org/chromium/components/webauthn/AuthenticatorImpl.java index cb5ba84f..77a6f09 100644 --- a/components/webauthn/android/java/src/org/chromium/components/webauthn/AuthenticatorImpl.java +++ b/components/webauthn/android/java/src/org/chromium/components/webauthn/AuthenticatorImpl.java
@@ -64,7 +64,7 @@ private @Nullable Origin mOrigin; /** The origin of the main frame. */ - private @Nullable Origin mTopOrigin; + private final @Nullable Origin mTopOrigin; /** The payment information to be added to the "clientDataJson". */ private @Nullable PaymentOptions mPayment; @@ -72,7 +72,7 @@ private @Nullable MakeCredential_Response mMakeCredentialCallback; private @Nullable GetCredential_Response mGetCredentialCallback; private @Nullable Fido2CredentialRequest mPendingFido2CredentialRequest; - private Set<Fido2CredentialRequest> mUnclosedFido2CredentialRequests = new HashSet<>(); + private final Set<Fido2CredentialRequest> mUnclosedFido2CredentialRequests = new HashSet<>(); // Information about the request cached here for metric reporting purposes. private boolean mIsConditionalRequest;
diff --git a/components/webauthn/android/java/src/org/chromium/components/webauthn/Barrier.java b/components/webauthn/android/java/src/org/chromium/components/webauthn/Barrier.java index c39432a..ce59c56 100644 --- a/components/webauthn/android/java/src/org/chromium/components/webauthn/Barrier.java +++ b/components/webauthn/android/java/src/org/chromium/components/webauthn/Barrier.java
@@ -38,7 +38,7 @@ BOTH, } - private Callback<Integer> mErrorCallback; + private final Callback<Integer> mErrorCallback; @Nullable private Runnable mFido2ApiRunnable; @Nullable private Runnable mCredManRunnable; private Status mFido2ApiStatus;
diff --git a/components/webauthn/android/java/src/org/chromium/components/webauthn/Fido2GetCredentialsComparator.java b/components/webauthn/android/java/src/org/chromium/components/webauthn/Fido2GetCredentialsComparator.java index c049e1d6..8bc99b3 100644 --- a/components/webauthn/android/java/src/org/chromium/components/webauthn/Fido2GetCredentialsComparator.java +++ b/components/webauthn/android/java/src/org/chromium/components/webauthn/Fido2GetCredentialsComparator.java
@@ -75,7 +75,7 @@ private @Nullable State mPasskeysCacheResultState; private @Nullable State mFido2ResultState; - private boolean mIsGoogleRp; + private final boolean mIsGoogleRp; void onGetCredentialsSuccessful(int credentialCount) { if (mFido2ResultState != null) {
diff --git a/components/webauthn/android/java/src/org/chromium/components/webauthn/cred_man/CredManCreateCredentialRequestHelper.java b/components/webauthn/android/java/src/org/chromium/components/webauthn/cred_man/CredManCreateCredentialRequestHelper.java index 88468e2..0525d2b 100644 --- a/components/webauthn/android/java/src/org/chromium/components/webauthn/cred_man/CredManCreateCredentialRequestHelper.java +++ b/components/webauthn/android/java/src/org/chromium/components/webauthn/cred_man/CredManCreateCredentialRequestHelper.java
@@ -31,7 +31,7 @@ private byte @Nullable [] mUserId; static class Builder { - private CredManCreateCredentialRequestHelper mHelper; + private final CredManCreateCredentialRequestHelper mHelper; Builder(String requestAsJson, byte @Nullable [] clientDataHash) { mHelper = CredManCreateCredentialRequestHelper.getInstance();
diff --git a/components/webauthn/android/java/src/org/chromium/components/webauthn/cred_man/CredManGetCredentialRequestHelper.java b/components/webauthn/android/java/src/org/chromium/components/webauthn/cred_man/CredManGetCredentialRequestHelper.java index 6281c58a..fb81451 100644 --- a/components/webauthn/android/java/src/org/chromium/components/webauthn/cred_man/CredManGetCredentialRequestHelper.java +++ b/components/webauthn/android/java/src/org/chromium/components/webauthn/cred_man/CredManGetCredentialRequestHelper.java
@@ -45,7 +45,7 @@ private @Nullable RenderFrameHost mRenderFrameHost; static class Builder { - private CredManGetCredentialRequestHelper mHelper; + private final CredManGetCredentialRequestHelper mHelper; Builder( String requestAsJson,
diff --git a/components/webauthn/android/java/src/org/chromium/components/webauthn/cred_man/CredManHelper.java b/components/webauthn/android/java/src/org/chromium/components/webauthn/cred_man/CredManHelper.java index a5727cb..b304e11 100644 --- a/components/webauthn/android/java/src/org/chromium/components/webauthn/cred_man/CredManHelper.java +++ b/components/webauthn/android/java/src/org/chromium/components/webauthn/cred_man/CredManHelper.java
@@ -70,13 +70,13 @@ private static final String TAG = "CredManHelper"; private @Nullable Barrier mBarrier; - private boolean mPlayServicesAvailable; + private final boolean mPlayServicesAvailable; private boolean mRequestPasswords; private final AuthenticationContextProvider mAuthenticationContextProvider; private final WebauthnBrowserBridge.Provider mBridgeProvider; private byte @Nullable [] mClientDataJson; private ConditionalUiState mConditionalUiState = ConditionalUiState.NONE; - private @Nullable CredManRequestDecorator mCredManRequestDecorator; + private final @Nullable CredManRequestDecorator mCredManRequestDecorator; private CredManMetricsHelper mMetricsHelper; private @Nullable Runnable mNoCredentialsFallback;
diff --git a/components/webauthn/android/junit/src/org/chromium/components/webauthn/WebauthnModeProviderRobolectricTest.java b/components/webauthn/android/junit/src/org/chromium/components/webauthn/WebauthnModeProviderRobolectricTest.java index f9d3f59..90fb347 100644 --- a/components/webauthn/android/junit/src/org/chromium/components/webauthn/WebauthnModeProviderRobolectricTest.java +++ b/components/webauthn/android/junit/src/org/chromium/components/webauthn/WebauthnModeProviderRobolectricTest.java
@@ -29,7 +29,7 @@ manifest = Config.NONE, shadows = {}) public class WebauthnModeProviderRobolectricTest { - private WebauthnModeProvider mProvider = WebauthnModeProvider.getInstance(); + private final WebauthnModeProvider mProvider = WebauthnModeProvider.getInstance(); @Mock WebContents mWebContents; @Mock WebauthnModeProvider.Natives mNatives;
diff --git a/components/webauthn/android/junit/src/org/chromium/components/webauthn/cred_man/CredManHelperRobolectricTest.java b/components/webauthn/android/junit/src/org/chromium/components/webauthn/cred_man/CredManHelperRobolectricTest.java index a884c5a5..452b0d5 100644 --- a/components/webauthn/android/junit/src/org/chromium/components/webauthn/cred_man/CredManHelperRobolectricTest.java +++ b/components/webauthn/android/junit/src/org/chromium/components/webauthn/cred_man/CredManHelperRobolectricTest.java
@@ -92,10 +92,11 @@ private Fido2ApiTestHelper.AuthenticatorCallback mCallback; private PublicKeyCredentialCreationOptions mCreationOptions; private PublicKeyCredentialRequestOptions mRequestOptions; - private String mOriginString = "https://subdomain.coolwebsitekayserispor.com"; - private byte[] mClientDataHash = new byte[] {1, 2, 3}; + private final String mOriginString = "https://subdomain.coolwebsitekayserispor.com"; + private final byte[] mClientDataHash = new byte[] {1, 2, 3}; - private CredentialManager mCredentialManager = Shadow.newInstanceOf(CredentialManager.class); + private final CredentialManager mCredentialManager = + Shadow.newInstanceOf(CredentialManager.class); @Mock private Context mContext; @Mock private RenderFrameHost mFrameHost; @Mock private WebContents mWebContents; @@ -110,7 +111,7 @@ @Mock private CredManGetCredentialRequestHelper mCredManGetCredentialRequestHelper; @Mock private GetCredentialRequest mGetCredentialRequest; @Mock private AuthenticationContextProvider mAuthenticationContextProviderMock; - private WebauthnBrowserBridge.Provider mBridgeProvider = + private final WebauthnBrowserBridge.Provider mBridgeProvider = new WebauthnBrowserBridge.Provider() { @Override public WebauthnBrowserBridge getBridge() {
diff --git a/components/webauthn/android/junit/src/org/chromium/components/webauthn/cred_man/GpmCredManRequestDecoratorRobolectricTest.java b/components/webauthn/android/junit/src/org/chromium/components/webauthn/cred_man/GpmCredManRequestDecoratorRobolectricTest.java index 71fc862..96e59cc8 100644 --- a/components/webauthn/android/junit/src/org/chromium/components/webauthn/cred_man/GpmCredManRequestDecoratorRobolectricTest.java +++ b/components/webauthn/android/junit/src/org/chromium/components/webauthn/cred_man/GpmCredManRequestDecoratorRobolectricTest.java
@@ -38,12 +38,12 @@ private static final String ORIGIN = "www.coolwebsite.com"; private static final byte[] USER_ID = new byte[] {3, 5, 8}; - private CreateCredentialRequest.Builder mBuilder = + private final CreateCredentialRequest.Builder mBuilder = Shadow.newInstanceOf(CreateCredentialRequest.Builder.class); @Mock private CredManCreateCredentialRequestHelper mCreateHelper; @Mock private CredManGetCredentialRequestHelper mGetHelper; - private GpmCredManRequestDecorator mDecorator = GpmCredManRequestDecorator.getInstance(); + private final GpmCredManRequestDecorator mDecorator = GpmCredManRequestDecorator.getInstance(); @Before public void setUp() throws Exception {
diff --git a/components/webauthn/android/junit/src/org/chromium/components/webauthn/cred_man/ShadowCredentialOption.java b/components/webauthn/android/junit/src/org/chromium/components/webauthn/cred_man/ShadowCredentialOption.java index 174e711..db42adc 100644 --- a/components/webauthn/android/junit/src/org/chromium/components/webauthn/cred_man/ShadowCredentialOption.java +++ b/components/webauthn/android/junit/src/org/chromium/components/webauthn/cred_man/ShadowCredentialOption.java
@@ -54,7 +54,7 @@ private String mType; private Bundle mCredentialRetrievalData; private Bundle mCandidateQueryData; - private Set<ComponentName> mAllowedProviders = Set.of(); + private final Set<ComponentName> mAllowedProviders = Set.of(); @Implementation protected void __constructor__(
diff --git a/components/webauthn/android/junit/src/org/chromium/components/webauthn/cred_man/ShadowGetCredentialRequest.java b/components/webauthn/android/junit/src/org/chromium/components/webauthn/cred_man/ShadowGetCredentialRequest.java index 9af1db31..42c69b1 100644 --- a/components/webauthn/android/junit/src/org/chromium/components/webauthn/cred_man/ShadowGetCredentialRequest.java +++ b/components/webauthn/android/junit/src/org/chromium/components/webauthn/cred_man/ShadowGetCredentialRequest.java
@@ -48,7 +48,7 @@ private Bundle mData; private String mOrigin; - private List<CredentialOption> mCredentialOptions = new ArrayList<>(); + private final List<CredentialOption> mCredentialOptions = new ArrayList<>(); @Implementation protected void __constructor__(Bundle data) {
diff --git a/components/webxr/android/java/src/org/chromium/components/webxr/ArCoreInstallUtils.java b/components/webxr/android/java/src/org/chromium/components/webxr/ArCoreInstallUtils.java index b1f12d2..9cffc50 100644 --- a/components/webxr/android/java/src/org/chromium/components/webxr/ArCoreInstallUtils.java +++ b/components/webxr/android/java/src/org/chromium/components/webxr/ArCoreInstallUtils.java
@@ -31,8 +31,8 @@ */ private static class InstallRequest implements ActivityLifecycleCallbacks { private @Nullable ArCoreInstallUtils mInstallInstance; - private ImmutableWeakReference<Activity> mWeakActivity; - private ImmutableWeakReference<Application> mWeakApplication; + private final ImmutableWeakReference<Activity> mWeakActivity; + private final ImmutableWeakReference<Application> mWeakApplication; public InstallRequest(ArCoreInstallUtils instance, Activity activity) { this.mInstallInstance = instance;
diff --git a/components/webxr/android/java/src/org/chromium/components/webxr/ArOverlayDelegate.java b/components/webxr/android/java/src/org/chromium/components/webxr/ArOverlayDelegate.java index 13f5fd3..931a1bf1 100644 --- a/components/webxr/android/java/src/org/chromium/components/webxr/ArOverlayDelegate.java +++ b/components/webxr/android/java/src/org/chromium/components/webxr/ArOverlayDelegate.java
@@ -24,11 +24,10 @@ private static final String TAG = "ArOverlayDelegate"; private static final boolean DEBUG_LOGS = false; - private ArCompositorDelegate mArCompositorDelegate; - private boolean mUseOverlay; - private boolean mCanRenderDomContent; - private boolean mDomSurfaceNeedsConfiguring; - private WebContents mWebContents; + private final ArCompositorDelegate mArCompositorDelegate; + private final boolean mUseOverlay; + private final boolean mDomSurfaceNeedsConfiguring; + private final WebContents mWebContents; public ArOverlayDelegate( ArCompositorDelegate compositorDelegate, @@ -41,8 +40,7 @@ mWebContents = webContents; mUseOverlay = useOverlay; - mCanRenderDomContent = canRenderDomContent; - mDomSurfaceNeedsConfiguring = mUseOverlay && !mCanRenderDomContent; + mDomSurfaceNeedsConfiguring = mUseOverlay && !canRenderDomContent; } @Override
diff --git a/components/webxr/android/java/src/org/chromium/components/webxr/CardboardOverlayDelegate.java b/components/webxr/android/java/src/org/chromium/components/webxr/CardboardOverlayDelegate.java index be419d5..1d16d26 100644 --- a/components/webxr/android/java/src/org/chromium/components/webxr/CardboardOverlayDelegate.java +++ b/components/webxr/android/java/src/org/chromium/components/webxr/CardboardOverlayDelegate.java
@@ -40,8 +40,8 @@ | View.SYSTEM_UI_FLAG_FULLSCREEN | View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY; - private Activity mActivity; - private VrCompositorDelegate mCompositorDelegate; + private final Activity mActivity; + private final VrCompositorDelegate mCompositorDelegate; private @Nullable View mCardboardView;
diff --git a/components/webxr/android/java/src/org/chromium/components/webxr/XrActivityListener.java b/components/webxr/android/java/src/org/chromium/components/webxr/XrActivityListener.java index 3f41d6b..b6f9cc3 100644 --- a/components/webxr/android/java/src/org/chromium/components/webxr/XrActivityListener.java +++ b/components/webxr/android/java/src/org/chromium/components/webxr/XrActivityListener.java
@@ -33,8 +33,8 @@ private static final boolean DEBUG_LOGS = false; private long mNativeXrActivityListener; - private ImmutableWeakReference<Activity> mWeakActivity; - private ImmutableWeakReference<Application> mWeakApplication; + private final ImmutableWeakReference<Activity> mWeakActivity; + private final ImmutableWeakReference<Application> mWeakApplication; /** * Constructs a new XrActivityListener. This listener will listen for events on the Activity
diff --git a/components/webxr/android/java/src/org/chromium/components/webxr/XrDelegateImpl.java b/components/webxr/android/java/src/org/chromium/components/webxr/XrDelegateImpl.java index 353de557..e378ddb 100644 --- a/components/webxr/android/java/src/org/chromium/components/webxr/XrDelegateImpl.java +++ b/components/webxr/android/java/src/org/chromium/components/webxr/XrDelegateImpl.java
@@ -20,7 +20,7 @@ public class XrDelegateImpl implements XrDelegate { private @SessionType int mActiveSession = SessionType.NONE; - private ObservableSupplierImpl<Boolean> mHasActiveSessionSupplier = + private final ObservableSupplierImpl<Boolean> mHasActiveSessionSupplier = new ObservableSupplierImpl<>(); public XrDelegateImpl() {
diff --git a/components/webxr/android/java/src/org/chromium/components/webxr/XrImmersiveOverlay.java b/components/webxr/android/java/src/org/chromium/components/webxr/XrImmersiveOverlay.java index 53c5f445..c08ed2c 100644 --- a/components/webxr/android/java/src/org/chromium/components/webxr/XrImmersiveOverlay.java +++ b/components/webxr/android/java/src/org/chromium/components/webxr/XrImmersiveOverlay.java
@@ -151,7 +151,7 @@ private class XrSurfaceView { private @Nullable SurfaceView mSurfaceView; - private WebContentsObserver mWebContentsObserver; + private final WebContentsObserver mWebContentsObserver; private boolean mSurfaceViewNeedsDestruction; private boolean mDestructionFromVisibilityChanged;
diff --git a/components/webxr/android/java/src/org/chromium/components/webxr/XrSessionCoordinator.java b/components/webxr/android/java/src/org/chromium/components/webxr/XrSessionCoordinator.java index d4eca4b..c25c05c1 100644 --- a/components/webxr/android/java/src/org/chromium/components/webxr/XrSessionCoordinator.java +++ b/components/webxr/android/java/src/org/chromium/components/webxr/XrSessionCoordinator.java
@@ -59,7 +59,7 @@ private static @Nullable XrSessionCoordinator sActiveSessionInstance; /** Whether there is a non-null valid {@link #sActiveSessionInstance}. */ - private static XrSessionTypeSupplier sActiveSessionAvailableSupplier = + private static final XrSessionTypeSupplier sActiveSessionAvailableSupplier = new XrSessionTypeSupplier(SessionType.NONE); private long mNativeXrSessionCoordinator;
diff --git a/content/browser/BUILD.gn b/content/browser/BUILD.gn index 7c954c3..b40575d6 100644 --- a/content/browser/BUILD.gn +++ b/content/browser/BUILD.gn
@@ -462,6 +462,8 @@ "ai/echo_ai_language_model.h", "ai/echo_ai_manager_impl.cc", "ai/echo_ai_manager_impl.h", + "ai/echo_ai_proofreader.h", + "ai/echo_ai_proofreader.cc", "ai/echo_ai_rewriter.cc", "ai/echo_ai_rewriter.h", "ai/echo_ai_summarizer.cc",
diff --git a/content/browser/accessibility/browser_accessibility_manager_android.cc b/content/browser/accessibility/browser_accessibility_manager_android.cc index 06248cd..68d2f3b 100644 --- a/content/browser/accessibility/browser_accessibility_manager_android.cc +++ b/content/browser/accessibility/browser_accessibility_manager_android.cc
@@ -387,6 +387,10 @@ } break; + case ui::AXEventGenerator::Event::CHILDREN_CHANGED: + wcax->ClearNodeInfoCacheForGivenId(android_node->GetUniqueId()); + break; + // Currently unused events on this platform. case ui::AXEventGenerator::Event::NONE: case ui::AXEventGenerator::Event::ACCESS_KEY_CHANGED: @@ -399,7 +403,6 @@ case ui::AXEventGenerator::Event::BUSY_CHANGED: case ui::AXEventGenerator::Event::CARET_BOUNDS_CHANGED: case ui::AXEventGenerator::Event::CHECKED_STATE_DESCRIPTION_CHANGED: - case ui::AXEventGenerator::Event::CHILDREN_CHANGED: case ui::AXEventGenerator::Event::CONTROLS_CHANGED: case ui::AXEventGenerator::Event::DETAILS_CHANGED: case ui::AXEventGenerator::Event::DESCRIBED_BY_CHANGED:
diff --git a/content/browser/ai/echo_ai_manager_impl.cc b/content/browser/ai/echo_ai_manager_impl.cc index 8e96e548..711d8f1a 100644 --- a/content/browser/ai/echo_ai_manager_impl.cc +++ b/content/browser/ai/echo_ai_manager_impl.cc
@@ -10,6 +10,7 @@ #include "components/language/core/common/locale_util.h" #include "components/optimization_guide/core/optimization_guide_features.h" #include "content/browser/ai/echo_ai_language_model.h" +#include "content/browser/ai/echo_ai_proofreader.h" #include "content/browser/ai/echo_ai_rewriter.h" #include "content/browser/ai/echo_ai_summarizer.h" #include "content/browser/ai/echo_ai_writer.h" @@ -269,6 +270,16 @@ client_remote->OnResult(std::move(summarizer)); } +void EchoAIManagerImpl::ReturnAIProofreaderCreationResult( + mojo::Remote<blink::mojom::AIManagerCreateProofreaderClient> + client_remote) { + model_downloaded_ = true; + mojo::PendingRemote<blink::mojom::AIProofreader> proofreader; + mojo::MakeSelfOwnedReceiver(std::make_unique<EchoAIProofreader>(), + proofreader.InitWithNewPipeAndPassReceiver()); + client_remote->OnResult(std::move(proofreader)); +} + void EchoAIManagerImpl::DoMockDownloadingAndReturn(base::OnceClosure callback) { // Mock the downloading process update for testing. for (auto& observer : download_progress_observers_) {
diff --git a/content/browser/ai/echo_ai_manager_impl.h b/content/browser/ai/echo_ai_manager_impl.h index b3f3b09..c884688 100644 --- a/content/browser/ai/echo_ai_manager_impl.h +++ b/content/browser/ai/echo_ai_manager_impl.h
@@ -78,6 +78,9 @@ void ReturnAISummarizerCreationResult( mojo::Remote<blink::mojom::AIManagerCreateSummarizerClient> client_remote); + void ReturnAIProofreaderCreationResult( + mojo::Remote<blink::mojom::AIManagerCreateProofreaderClient> + client_remot); void DoMockDownloadingAndReturn(base::OnceClosure callback);
diff --git a/content/browser/ai/echo_ai_proofreader.cc b/content/browser/ai/echo_ai_proofreader.cc new file mode 100644 index 0000000..44e049c --- /dev/null +++ b/content/browser/ai/echo_ai_proofreader.cc
@@ -0,0 +1,33 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "content/browser/ai/echo_ai_proofreader.h" + +#include <optional> + +#include "base/functional/bind.h" +#include "base/location.h" +#include "base/time/time.h" +#include "content/public/browser/browser_thread.h" +#include "mojo/public/cpp/bindings/remote.h" +#include "mojo/public/cpp/bindings/self_owned_receiver.h" +#include "third_party/blink/public/mojom/ai/model_streaming_responder.mojom.h" + +namespace content { + +EchoAIProofreader::EchoAIProofreader() = default; + +EchoAIProofreader::~EchoAIProofreader() = default; + +void EchoAIProofreader::Proofread( + const std::string& input, + mojo::PendingRemote<blink::mojom::ModelStreamingResponder> + pending_responder) { + mojo::Remote<blink::mojom::ModelStreamingResponder> responder( + std::move(pending_responder)); + responder->OnStreaming("Model not available in Chromium\n" + input); + responder->OnCompletion(/*context_info=*/nullptr); +} + +} // namespace content
diff --git a/content/browser/ai/echo_ai_proofreader.h b/content/browser/ai/echo_ai_proofreader.h new file mode 100644 index 0000000..584726ba --- /dev/null +++ b/content/browser/ai/echo_ai_proofreader.h
@@ -0,0 +1,38 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef CONTENT_BROWSER_AI_ECHO_AI_PROOFREADER_H_ +#define CONTENT_BROWSER_AI_ECHO_AI_PROOFREADER_H_ + +#include "base/memory/weak_ptr.h" +#include "mojo/public/cpp/bindings/pending_remote.h" +#include "mojo/public/cpp/bindings/remote_set.h" +#include "third_party/blink/public/mojom/ai/ai_proofreader.mojom.h" + +namespace content { + +// The implementation of `blink::mojom::AIProofreader` which only echoes back +// the prompt text used for testing. +class EchoAIProofreader : public blink::mojom::AIProofreader { + public: + EchoAIProofreader(); + EchoAIProofreader(const EchoAIProofreader&) = delete; + EchoAIProofreader& operator=(const EchoAIProofreader&) = delete; + + ~EchoAIProofreader() override; + + // `blink::mojom::AIProofreader` implementation. + void Proofread(const std::string& input, + mojo::PendingRemote<blink::mojom::ModelStreamingResponder> + pending_responder) override; + + private: + mojo::RemoteSet<blink::mojom::ModelStreamingResponder> responder_set_; + + base::WeakPtrFactory<EchoAIProofreader> weak_ptr_factory_{this}; +}; + +} // namespace content + +#endif // CONTENT_BROWSER_AI_ECHO_AI_PROOFREADER_H_
diff --git a/content/browser/btm/btm_test_utils.cc b/content/browser/btm/btm_test_utils.cc index c77f5a20..f51ff44 100644 --- a/content/browser/btm/btm_test_utils.cc +++ b/content/browser/btm/btm_test_utils.cc
@@ -410,7 +410,8 @@ const blink::StorageKey& storage_key, net::CookieSettingOverrides overrides) { return IsFullCookieAccessAllowed(url, storage_key.ToNetSiteForCookies(), - storage_key.origin(), overrides); + storage_key.origin(), overrides, + storage_key.ToCookiePartitionKey()); } void TpcBlockingBrowserClient::GrantCookieAccessDueToHeuristic(
diff --git a/content/browser/fenced_frame/fenced_frame.cc b/content/browser/fenced_frame/fenced_frame.cc index 46ecce2..2316e1c 100644 --- a/content/browser/fenced_frame/fenced_frame.cc +++ b/content/browser/fenced_frame/fenced_frame.cc
@@ -313,7 +313,8 @@ inner_render_manager->current_frame_host() ->GetSiteInstance() ->group(), - static_cast<RenderViewHostImpl*>(rvh), nullptr)) { + static_cast<RenderViewHostImpl*>(rvh), /*proxy=*/nullptr, + /*navigation_metrics_token=*/std::nullopt)) { return proxy_host; }
diff --git a/content/browser/indexed_db/indexed_db_leveldb_coding.cc b/content/browser/indexed_db/indexed_db_leveldb_coding.cc index 563a990..63ae39a 100644 --- a/content/browser/indexed_db/indexed_db_leveldb_coding.cc +++ b/content/browser/indexed_db/indexed_db_leveldb_coding.cc
@@ -635,7 +635,7 @@ std::unique_ptr<IndexedDBKey> key; if (!DecodeIDBKeyRecursive(slice, &key, recursion + 1)) return false; - array.push_back(*key); + array.push_back(std::move(*key)); } *value = std::make_unique<IndexedDBKey>(std::move(array)); return true;
diff --git a/content/browser/indexed_db/indexed_db_leveldb_coding_unittest.cc b/content/browser/indexed_db/indexed_db_leveldb_coding_unittest.cc index 89d1c3d..24c3310 100644 --- a/content/browser/indexed_db/indexed_db_leveldb_coding_unittest.cc +++ b/content/browser/indexed_db/indexed_db_leveldb_coding_unittest.cc
@@ -33,13 +33,16 @@ } static IndexedDBKey CreateArrayIDBKey(const IndexedDBKey& key1) { - IndexedDBKey::KeyArray array = {key1}; + IndexedDBKey::KeyArray array; + array.emplace_back(key1.Clone()); return IndexedDBKey(std::move(array)); } static IndexedDBKey CreateArrayIDBKey(const IndexedDBKey& key1, const IndexedDBKey& key2) { - IndexedDBKey::KeyArray array = {key1, key2}; + IndexedDBKey::KeyArray array; + array.emplace_back(key1.Clone()); + array.emplace_back(key2.Clone()); return IndexedDBKey(std::move(array)); } @@ -514,21 +517,21 @@ std::string v; std::string_view slice; - std::vector<IndexedDBKey> test_cases = { - IndexedDBKey(1234, blink::mojom::IDBKeyType::Number), - IndexedDBKey(7890, blink::mojom::IDBKeyType::Date), - IndexedDBKey(u"Hello World!"), IndexedDBKey(std::string("\x01\x02")), - IndexedDBKey(IndexedDBKey::KeyArray())}; + IndexedDBKey::KeyArray array; + array.emplace_back(1234, blink::mojom::IDBKeyType::Number); + array.emplace_back(7890, blink::mojom::IDBKeyType::Date); + array.emplace_back(u"Hello World!"); + array.emplace_back(std::string("\x01\x02")); + array.emplace_back(IndexedDBKey::KeyArray()); - IndexedDBKey::KeyArray array = { - IndexedDBKey(1234, blink::mojom::IDBKeyType::Number), - IndexedDBKey(7890, blink::mojom::IDBKeyType::Date), - IndexedDBKey(u"Hello World!"), IndexedDBKey(std::string("\x01\x02")), - IndexedDBKey(IndexedDBKey::KeyArray())}; - test_cases.push_back(IndexedDBKey(std::move(array))); + auto test_cases = std::to_array( + {IndexedDBKey(1234, blink::mojom::IDBKeyType::Number), + IndexedDBKey(7890, blink::mojom::IDBKeyType::Date), + IndexedDBKey(u"Hello World!"), IndexedDBKey(std::string("\x01\x02")), + IndexedDBKey(IndexedDBKey::KeyArray()), IndexedDBKey(std::move(array))}); for (size_t i = 0; i < test_cases.size(); ++i) { - expected_key = test_cases[i]; + expected_key = test_cases[i].Clone(); v.clear(); EncodeIDBKey(expected_key, &v); slice = std::string_view(&*v.begin(), v.size()); @@ -710,7 +713,7 @@ } TEST(IndexedDBLevelDBCodingTest, ExtractAndCompareIDBKeys) { - std::vector<IndexedDBKey> keys = { + auto keys = std::to_array({ IndexedDBKey(-10, blink::mojom::IDBKeyType::Number), IndexedDBKey(0, blink::mojom::IDBKeyType::Number), IndexedDBKey(3.14, blink::mojom::IDBKeyType::Number), @@ -753,7 +756,7 @@ CreateArrayIDBKey(CreateArrayIDBKey(CreateArrayIDBKey())), CreateArrayIDBKey( CreateArrayIDBKey(CreateArrayIDBKey(CreateArrayIDBKey()))), - }; + }); for (size_t i = 0; i < keys.size() - 1; ++i) { const IndexedDBKey& key_a = keys[i]; @@ -793,7 +796,7 @@ } TEST(IndexedDBLevelDBCodingTest, EncodeAndCompareIDBKeysWithSentinels) { - std::vector<IndexedDBKey> keys = { + auto keys = std::to_array({ IndexedDBKey(-15, blink::mojom::IDBKeyType::Number), IndexedDBKey(-10, blink::mojom::IDBKeyType::Number), IndexedDBKey(0, blink::mojom::IDBKeyType::Number), @@ -838,7 +841,7 @@ CreateArrayIDBKey(CreateArrayIDBKey(CreateArrayIDBKey())), CreateArrayIDBKey( CreateArrayIDBKey(CreateArrayIDBKey(CreateArrayIDBKey()))), - }; + }); for (size_t i = 0; i < keys.size() - 1; ++i) { const IndexedDBKey& key_a = keys[i]; @@ -867,8 +870,12 @@ EXPECT_EQ(sqlite_compare(encoded_b, encoded_b), 0); } + std::vector<IndexedDBKey> keys_vec; + for (const auto& key : keys) { + keys_vec.emplace_back(key.Clone()); + } // Also test decoding by treating all test cases as one massive array key. - const IndexedDBKey all_keys_key(keys); + const IndexedDBKey all_keys_key(std::move(keys_vec)); std::string encoded; EncodeSortableIDBKey(all_keys_key, &encoded); IndexedDBKey decoded_value;
diff --git a/content/browser/indexed_db/instance/backing_store.h b/content/browser/indexed_db/instance/backing_store.h index dd1f22c..5206a45 100644 --- a/content/browser/indexed_db/instance/backing_store.h +++ b/content/browser/indexed_db/instance/backing_store.h
@@ -218,17 +218,18 @@ virtual const blink::IndexedDBKey& GetKey() const = 0; virtual const blink::IndexedDBKey& GetPrimaryKey() const = 0; + virtual blink::IndexedDBKey TakeKey() && = 0; virtual IndexedDBValue& GetValue() = 0; - virtual bool Continue(const blink::IndexedDBKey* key, - const blink::IndexedDBKey* primary_key, + virtual bool Continue(const blink::IndexedDBKey& key, + const blink::IndexedDBKey& primary_key, IteratorState state, Status*) = 0; virtual bool Advance(uint32_t count, Status*) = 0; // Clone may return a nullptr if cloning fails for any reason. virtual std::unique_ptr<Cursor> Clone() const = 0; - bool Continue(Status* s) { return Continue(nullptr, nullptr, SEEK, s); } + bool Continue(Status* s) { return Continue({}, {}, SEEK, s); } }; virtual ~BackingStore() = default;
diff --git a/content/browser/indexed_db/instance/connection.cc b/content/browser/indexed_db/instance/connection.cc index 8715f2a..b0c9b1c 100644 --- a/content/browser/indexed_db/instance/connection.cc +++ b/content/browser/indexed_db/instance/connection.cc
@@ -303,7 +303,7 @@ void Connection::Get(int64_t transaction_id, int64_t object_store_id, int64_t index_id, - const IndexedDBKeyRange& key_range, + IndexedDBKeyRange key_range, bool key_only, blink::mojom::IDBDatabase::GetCallback callback) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); @@ -338,18 +338,18 @@ blink::mojom::IDBDatabaseGetResultPtr>( std::move(callback), transaction->AsWeakPtr()); - transaction->ScheduleTask(BindWeakOperation( - &Database::GetOperation, database_, object_store_id, index_id, - std::make_unique<IndexedDBKeyRange>(key_range), - key_only ? indexed_db::CursorType::kKeyOnly - : indexed_db::CursorType::kKeyAndValue, - std::move(aborting_callback))); + transaction->ScheduleTask( + BindWeakOperation(&Database::GetOperation, database_, object_store_id, + index_id, std::move(key_range), + key_only ? indexed_db::CursorType::kKeyOnly + : indexed_db::CursorType::kKeyAndValue, + std::move(aborting_callback))); } void Connection::GetAll(int64_t transaction_id, int64_t object_store_id, int64_t index_id, - const IndexedDBKeyRange& key_range, + IndexedDBKeyRange key_range, blink::mojom::IDBGetAllResultType result_type, int64_t max_count, blink::mojom::IDBCursorDirection direction, @@ -392,15 +392,14 @@ } transaction->ScheduleTask(database_->CreateGetAllOperation( - object_store_id, index_id, std::make_unique<IndexedDBKeyRange>(key_range), - result_type, max_count, direction, std::move(callback), transaction)); + object_store_id, index_id, std::move(key_range), result_type, max_count, + direction, std::move(callback), transaction)); } -void Connection::SetIndexKeys( - int64_t transaction_id, - int64_t object_store_id, - const IndexedDBKey& primary_key, - const std::vector<IndexedDBIndexKeys>& index_keys) { +void Connection::SetIndexKeys(int64_t transaction_id, + int64_t object_store_id, + IndexedDBKey primary_key, + std::vector<IndexedDBIndexKeys> index_keys) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); if (!IsConnected()) { return; @@ -433,9 +432,9 @@ transaction->ScheduleTask( blink::mojom::IDBTaskType::Preemptive, - BindWeakOperation( - &Database::SetIndexKeysOperation, database_, object_store_id, - std::make_unique<IndexedDBKey>(primary_key), index_keys)); + BindWeakOperation(&Database::SetIndexKeysOperation, database_, + object_store_id, std::move(primary_key), + std::move(index_keys))); } void Connection::SetIndexesReady(int64_t transaction_id, @@ -476,7 +475,7 @@ int64_t transaction_id, int64_t object_store_id, int64_t index_id, - const IndexedDBKeyRange& key_range, + IndexedDBKeyRange key_range, blink::mojom::IDBCursorDirection direction, bool key_only, blink::mojom::IDBTaskType task_type, @@ -528,7 +527,7 @@ std::make_unique<Database::OpenCursorOperationParams>()); params->object_store_id = object_store_id; params->index_id = index_id; - params->key_range = std::make_unique<IndexedDBKeyRange>(key_range); + params->key_range = std::move(key_range); params->direction = direction; params->cursor_type = key_only ? indexed_db::CursorType::kKeyOnly : indexed_db::CursorType::kKeyAndValue; @@ -542,7 +541,7 @@ void Connection::Count(int64_t transaction_id, int64_t object_store_id, int64_t index_id, - const IndexedDBKeyRange& key_range, + IndexedDBKeyRange key_range, CountCallback callback) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); @@ -565,13 +564,12 @@ transaction->ScheduleTask(BindWeakOperation( &Database::CountOperation, database_, object_store_id, index_id, - std::make_unique<blink::IndexedDBKeyRange>(key_range), - std::move(wrapped_callback))); + std::move(key_range), std::move(wrapped_callback))); } void Connection::DeleteRange(int64_t transaction_id, int64_t object_store_id, - const IndexedDBKeyRange& key_range, + IndexedDBKeyRange key_range, DeleteRangeCallback success_callback) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); @@ -598,8 +596,7 @@ transaction->ScheduleTask(BindWeakOperation( &Database::DeleteRangeOperation, database_, object_store_id, - std::make_unique<IndexedDBKeyRange>(key_range), - std::move(wrapped_callback))); + std::move(key_range), std::move(wrapped_callback))); } void Connection::GetKeyGeneratorCurrentNumber(
diff --git a/content/browser/indexed_db/instance/connection.h b/content/browser/indexed_db/instance/connection.h index 8f0d3c7..16444c59 100644 --- a/content/browser/indexed_db/instance/connection.h +++ b/content/browser/indexed_db/instance/connection.h
@@ -145,22 +145,21 @@ void Get(int64_t transaction_id, int64_t object_store_id, int64_t index_id, - const blink::IndexedDBKeyRange& key_range, + blink::IndexedDBKeyRange key_range, bool key_only, blink::mojom::IDBDatabase::GetCallback callback) override; void GetAll(int64_t transaction_id, int64_t object_store_id, int64_t index_id, - const blink::IndexedDBKeyRange& key_range, + blink::IndexedDBKeyRange key_range, blink::mojom::IDBGetAllResultType result_type, int64_t max_count, blink::mojom::IDBCursorDirection direction, blink::mojom::IDBDatabase::GetAllCallback callback) override; - void SetIndexKeys( - int64_t transaction_id, - int64_t object_store_id, - const blink::IndexedDBKey& primary_key, - const std::vector<blink::IndexedDBIndexKeys>& index_keys) override; + void SetIndexKeys(int64_t transaction_id, + int64_t object_store_id, + blink::IndexedDBKey primary_key, + std::vector<blink::IndexedDBIndexKeys> index_keys) override; void SetIndexesReady(int64_t transaction_id, int64_t object_store_id, const std::vector<int64_t>& index_ids) override; @@ -168,7 +167,7 @@ int64_t transaction_id, int64_t object_store_id, int64_t index_id, - const blink::IndexedDBKeyRange& key_range, + blink::IndexedDBKeyRange key_range, blink::mojom::IDBCursorDirection direction, bool key_only, blink::mojom::IDBTaskType task_type, @@ -176,11 +175,11 @@ void Count(int64_t transaction_id, int64_t object_store_id, int64_t index_id, - const blink::IndexedDBKeyRange& key_range, + blink::IndexedDBKeyRange key_range, CountCallback callback) override; void DeleteRange(int64_t transaction_id, int64_t object_store_id, - const blink::IndexedDBKeyRange& key_range, + blink::IndexedDBKeyRange key_range, DeleteRangeCallback success_callback) override; void GetKeyGeneratorCurrentNumber( int64_t transaction_id,
diff --git a/content/browser/indexed_db/instance/cursor.cc b/content/browser/indexed_db/instance/cursor.cc index c3c1d67..7606255 100644 --- a/content/browser/indexed_db/instance/cursor.cc +++ b/content/browser/indexed_db/instance/cursor.cc
@@ -146,8 +146,10 @@ mojo_value = blink::mojom::IDBValue::New(); } - std::vector<IndexedDBKey> keys = {key()}; - std::vector<IndexedDBKey> primary_keys = {primary_key()}; + std::vector<IndexedDBKey> keys; + keys.emplace_back(key().Clone()); + std::vector<IndexedDBKey> primary_keys; + primary_keys.emplace_back(primary_key().Clone()); std::vector<blink::mojom::IDBValuePtr> values; values.push_back(std::move(mojo_value)); std::move(callback).Run(blink::mojom::IDBCursorResult::NewValues( @@ -156,8 +158,8 @@ return s; } -void Cursor::Continue(const IndexedDBKey& key, - const IndexedDBKey& primary_key, +void Cursor::Continue(IndexedDBKey key, + IndexedDBKey primary_key, blink::mojom::IDBCursor::ContinueCallback callback) { TRACE_EVENT0("IndexedDB", "Cursor::Continue"); if (!transaction_) { @@ -178,23 +180,19 @@ transaction_->ScheduleTask( task_type_, BindWeakOperation<Cursor>( - &Cursor::ContinueOperation, ptr_factory_.GetWeakPtr(), - key.IsValid() ? std::make_unique<blink::IndexedDBKey>(key) : nullptr, - primary_key.IsValid() - ? std::make_unique<blink::IndexedDBKey>(primary_key) - : nullptr, - std::move(aborting_callback))); + &Cursor::ContinueOperation, ptr_factory_.GetWeakPtr(), std::move(key), + std::move(primary_key), std::move(aborting_callback))); } Status Cursor::ContinueOperation( - std::unique_ptr<IndexedDBKey> key, - std::unique_ptr<IndexedDBKey> primary_key, + IndexedDBKey key, + IndexedDBKey primary_key, blink::mojom::IDBCursor::ContinueCallback callback, Transaction* /*transaction*/) { TRACE_EVENT0("IndexedDB", "Cursor::ContinueOperation"); Status s = Status::OK(); - if (!cursor_ || !cursor_->Continue(key.get(), primary_key.get(), - BackingStore::Cursor::SEEK, &s)) { + if (!cursor_ || + !cursor_->Continue(key, primary_key, BackingStore::Cursor::SEEK, &s)) { cursor_.reset(); if (s.ok()) { // This happens if we reach the end of the iterator and can't continue. @@ -224,8 +222,10 @@ mojo_value = blink::mojom::IDBValue::New(); } - std::vector<IndexedDBKey> keys = {this->key()}; - std::vector<IndexedDBKey> primary_keys = {this->primary_key()}; + std::vector<IndexedDBKey> keys; + keys.emplace_back(this->key().Clone()); + std::vector<IndexedDBKey> primary_keys; + primary_keys.emplace_back(this->primary_key().Clone()); std::vector<blink::mojom::IDBValuePtr> values; values.push_back(std::move(mojo_value)); std::move(callback).Run(blink::mojom::IDBCursorResult::NewValues( @@ -303,8 +303,8 @@ saved_cursor_ = cursor_->Clone(); } - found_keys.push_back(cursor_->GetKey()); - found_primary_keys.push_back(cursor_->GetPrimaryKey()); + found_keys.emplace_back(cursor_->GetKey().Clone()); + found_primary_keys.emplace_back(cursor_->GetPrimaryKey().Clone()); switch (cursor_type_) { case indexed_db::CursorType::kKeyOnly:
diff --git a/content/browser/indexed_db/instance/cursor.h b/content/browser/indexed_db/instance/cursor.h index 4b09b9d..c00c282 100644 --- a/content/browser/indexed_db/instance/cursor.h +++ b/content/browser/indexed_db/instance/cursor.h
@@ -44,8 +44,8 @@ // blink::mojom::IDBCursor implementation void Advance(uint32_t count, blink::mojom::IDBCursor::AdvanceCallback callback) override; - void Continue(const blink::IndexedDBKey& key, - const blink::IndexedDBKey& primary_key, + void Continue(blink::IndexedDBKey key, + blink::IndexedDBKey primary_key, blink::mojom::IDBCursor::ContinueCallback callback) override; void Prefetch(int32_t count, blink::mojom::IDBCursor::PrefetchCallback callback) override; @@ -69,8 +69,8 @@ blink::mojom::IDBTaskType task_type, base::WeakPtr<Transaction> transaction); - Status ContinueOperation(std::unique_ptr<blink::IndexedDBKey> key, - std::unique_ptr<blink::IndexedDBKey> primary_key, + Status ContinueOperation(blink::IndexedDBKey key, + blink::IndexedDBKey primary_key, blink::mojom::IDBCursor::ContinueCallback callback, Transaction* transaction); Status AdvanceOperation(uint32_t count,
diff --git a/content/browser/indexed_db/instance/database.cc b/content/browser/indexed_db/instance/database.cc index b509d743..9e2a6f5 100644 --- a/content/browser/indexed_db/instance/database.cc +++ b/content/browser/indexed_db/instance/database.cc
@@ -86,7 +86,7 @@ (!idb_return_value.empty() && object_store_metadata.auto_increment && !object_store_metadata.key_path.IsNull()); if (is_generated_key) { - idb_return_value.primary_key = cursor.GetPrimaryKey(); + idb_return_value.primary_key = cursor.GetPrimaryKey().Clone(); idb_return_value.key_path = object_store_metadata.key_path; } @@ -339,7 +339,7 @@ Status Database::GetOperation(int64_t object_store_id, int64_t index_id, - std::unique_ptr<IndexedDBKeyRange> key_range, + IndexedDBKeyRange key_range, CursorType cursor_type, blink::mojom::IDBDatabase::GetCallback callback, Transaction* transaction) { @@ -356,37 +356,36 @@ const IndexedDBObjectStoreMetadata& object_store_metadata = GetObjectStoreMetadata(object_store_id); - const IndexedDBKey* key; - - base::expected<std::unique_ptr<BackingStore::Cursor>, Status> - backing_store_cursor; - if (key_range->IsOnlyKey()) { - key = &key_range->lower(); + IndexedDBKey key; + if (key_range.IsOnlyKey()) { + key = std::move(key_range).TakeOnlyKey(); } else { + base::expected<std::unique_ptr<BackingStore::Cursor>, Status> + backing_store_cursor; if (index_id == IndexedDBIndexMetadata::kInvalidId) { // ObjectStore Retrieval Operation if (cursor_type == CursorType::kKeyOnly) { backing_store_cursor = transaction->BackingStoreTransaction()->OpenObjectStoreKeyCursor( - object_store_id, *key_range, + object_store_id, key_range, blink::mojom::IDBCursorDirection::Next); } else { backing_store_cursor = transaction->BackingStoreTransaction()->OpenObjectStoreCursor( - object_store_id, *key_range, + object_store_id, key_range, blink::mojom::IDBCursorDirection::Next); } } else if (cursor_type == CursorType::kKeyOnly) { // Index Value Retrieval Operation backing_store_cursor = transaction->BackingStoreTransaction()->OpenIndexKeyCursor( - object_store_id, index_id, *key_range, + object_store_id, index_id, key_range, blink::mojom::IDBCursorDirection::Next); } else { // Index Referenced Value Retrieval Operation backing_store_cursor = transaction->BackingStoreTransaction()->OpenIndexCursor( - object_store_id, index_id, *key_range, + object_store_id, index_id, key_range, blink::mojom::IDBCursorDirection::Next); } @@ -405,14 +404,14 @@ return Status::OK(); } - key = &(*backing_store_cursor)->GetKey(); + key = std::move(**backing_store_cursor).TakeKey(); } if (index_id == IndexedDBIndexMetadata::kInvalidId) { // Object Store Retrieval Operation IndexedDBReturnValue value; Status s = transaction->BackingStoreTransaction()->GetRecord( - object_store_id, *key, &value); + object_store_id, key, &value); if (!s.ok()) { std::move(callback).Run( blink::mojom::IDBDatabaseGetResult::NewErrorResult( @@ -429,13 +428,13 @@ if (cursor_type == CursorType::kKeyOnly) { std::move(callback).Run( - blink::mojom::IDBDatabaseGetResult::NewKey(std::move(*key))); + blink::mojom::IDBDatabaseGetResult::NewKey(std::move(key))); return s; } if (object_store_metadata.auto_increment && !object_store_metadata.key_path.IsNull()) { - value.primary_key = *key; + value.primary_key = std::move(key); value.key_path = object_store_metadata.key_path; } @@ -451,7 +450,7 @@ // From here we are dealing only with indexes. std::unique_ptr<IndexedDBKey> primary_key; Status s = transaction->BackingStoreTransaction()->GetPrimaryKeyViaIndex( - object_store_id, index_id, *key, &primary_key); + object_store_id, index_id, key, &primary_key); if (!s.ok()) { std::move(callback).Run(blink::mojom::IDBDatabaseGetResult::NewErrorResult( CreateIDBErrorPtr(blink::mojom::IDBException::kUnknownError, @@ -487,7 +486,7 @@ } if (object_store_metadata.auto_increment && !object_store_metadata.key_path.IsNull()) { - value.primary_key = *primary_key; + value.primary_key = std::move(*primary_key); value.key_path = object_store_metadata.key_path; } @@ -503,7 +502,7 @@ Transaction::Operation Database::CreateGetAllOperation( int64_t object_store_id, int64_t index_id, - std::unique_ptr<blink::IndexedDBKeyRange> key_range, + blink::IndexedDBKeyRange key_range, blink::mojom::IDBGetAllResultType result_type, int64_t max_count, blink::mojom::IDBCursorDirection direction, @@ -570,7 +569,7 @@ Status Database::GetAllOperation( int64_t object_store_id, int64_t index_id, - std::unique_ptr<IndexedDBKeyRange> key_range, + IndexedDBKeyRange key_range, blink::mojom::IDBGetAllResultType result_type, int64_t max_count, blink::mojom::IDBCursorDirection direction, @@ -597,22 +596,22 @@ if (index_id == IndexedDBIndexMetadata::kInvalidId) { // Object Store: Key Retrieval Operation cursor = transaction->BackingStoreTransaction()->OpenObjectStoreKeyCursor( - object_store_id, *key_range, direction); + object_store_id, key_range, direction); } else { // Index Value: (Primary Key) Retrieval Operation cursor = transaction->BackingStoreTransaction()->OpenIndexKeyCursor( - object_store_id, index_id, *key_range, direction); + object_store_id, index_id, key_range, direction); } } else { // Retrieving values if (index_id == IndexedDBIndexMetadata::kInvalidId) { // Object Store: Value Retrieval Operation cursor = transaction->BackingStoreTransaction()->OpenObjectStoreCursor( - object_store_id, *key_range, direction); + object_store_id, key_range, direction); } else { // Object Store: Referenced Value Retrieval Operation cursor = transaction->BackingStoreTransaction()->OpenIndexCursor( - object_store_id, index_id, *key_range, direction); + object_store_id, index_id, key_range, direction); } } @@ -676,9 +675,10 @@ blink::mojom::IDBRecordPtr return_record; if (result_type == blink::mojom::IDBGetAllResultType::Keys) { - return_record = blink::mojom::IDBRecord::New((*cursor)->GetPrimaryKey(), - /*value=*/nullptr, - /*index_key=*/std::nullopt); + return_record = + blink::mojom::IDBRecord::New((*cursor)->GetPrimaryKey().Clone(), + /*value=*/nullptr, + /*index_key=*/std::nullopt); } else if (result_type == blink::mojom::IDBGetAllResultType::Values) { blink::mojom::IDBReturnValuePtr return_value = ExtractReturnValueFromCursorValue(bucket_context_.get(), @@ -695,16 +695,16 @@ std::optional<IndexedDBKey> index_key; if (index_id != IndexedDBIndexMetadata::kInvalidId) { // The index key only exists for `IDBIndex::getAllRecords()`. - index_key = (*cursor)->GetKey(); + index_key = (*cursor)->GetKey().Clone(); } - return_record = blink::mojom::IDBRecord::New((*cursor)->GetPrimaryKey(), - std::move(return_value), - std::move(index_key)); + return_record = blink::mojom::IDBRecord::New( + (*cursor)->GetPrimaryKey().Clone(), std::move(return_value), + std::move(index_key)); } else { NOTREACHED(); } - found_records.push_back(std::move(return_record)); + found_records.emplace_back(std::move(return_record)); // Periodically stream records if we have too many. if (found_records.size() >= max_values_before_sending) { @@ -717,8 +717,8 @@ Status Database::SetIndexKeysOperation( int64_t object_store_id, - std::unique_ptr<IndexedDBKey> primary_key, - const std::vector<IndexedDBIndexKeys>& index_keys, + IndexedDBKey primary_key, + std::vector<IndexedDBIndexKeys> index_keys, Transaction* transaction) { DCHECK(transaction); TRACE_EVENT1("IndexedDB", "Database::SetIndexKeysOperation", "txn.id", @@ -729,7 +729,7 @@ BackingStore::RecordIdentifier record_identifier; bool found = false; Status s = transaction->BackingStoreTransaction()->KeyExistsInObjectStore( - object_store_id, *primary_key, &record_identifier, &found); + object_store_id, primary_key, &record_identifier, &found); if (!s.ok()) { return s; } @@ -745,9 +745,10 @@ const IndexedDBObjectStoreMetadata& object_store_metadata = GetObjectStoreMetadata(object_store_id); - bool backing_store_success = MakeIndexWriters( - transaction, object_store_metadata, *primary_key, false, index_keys, - &index_writers, &error_message, &obeys_constraints); + bool backing_store_success = + MakeIndexWriters(transaction, object_store_metadata, primary_key, false, + std::move(index_keys), &index_writers, &error_message, + &obeys_constraints); if (!backing_store_success) { return transaction->Abort(DatabaseError( blink::mojom::IDBException::kUnknownError, @@ -806,23 +807,23 @@ DCHECK_EQ(params->task_type, blink::mojom::IDBTaskType::Normal); backing_store_cursor = transaction->BackingStoreTransaction()->OpenObjectStoreKeyCursor( - params->object_store_id, *params->key_range, params->direction); + params->object_store_id, params->key_range, params->direction); } else { backing_store_cursor = transaction->BackingStoreTransaction()->OpenObjectStoreCursor( - params->object_store_id, *params->key_range, params->direction); + params->object_store_id, params->key_range, params->direction); } } else { DCHECK_EQ(params->task_type, blink::mojom::IDBTaskType::Normal); if (params->cursor_type == CursorType::kKeyOnly) { backing_store_cursor = transaction->BackingStoreTransaction()->OpenIndexKeyCursor( - params->object_store_id, params->index_id, *params->key_range, + params->object_store_id, params->index_id, params->key_range, params->direction); } else { backing_store_cursor = transaction->BackingStoreTransaction()->OpenIndexCursor( - params->object_store_id, params->index_id, *params->key_range, + params->object_store_id, params->index_id, params->key_range, params->direction); } } @@ -861,15 +862,15 @@ std::move(params->callback) .Run(blink::mojom::IDBDatabaseOpenCursorResult::NewValue( blink::mojom::IDBDatabaseOpenCursorValue::New( - std::move(pending_remote), cursor->key(), cursor->primary_key(), - std::move(mojo_value)))); + std::move(pending_remote), cursor->key().Clone(), + cursor->primary_key().Clone(), std::move(mojo_value)))); return Status::OK(); } Status Database::CountOperation( int64_t object_store_id, int64_t index_id, - std::unique_ptr<IndexedDBKeyRange> key_range, + IndexedDBKeyRange key_range, blink::mojom::IDBDatabase::CountCallback callback, Transaction* transaction) { TRACE_EVENT1("IndexedDB", "Database::CountOperation", "txn.id", @@ -884,12 +885,11 @@ if (index_id == IndexedDBIndexMetadata::kInvalidId) { backing_store_cursor = transaction->BackingStoreTransaction()->OpenObjectStoreKeyCursor( - object_store_id, *key_range, - blink::mojom::IDBCursorDirection::Next); + object_store_id, key_range, blink::mojom::IDBCursorDirection::Next); } else { backing_store_cursor = transaction->BackingStoreTransaction()->OpenIndexKeyCursor( - object_store_id, index_id, *key_range, + object_store_id, index_id, key_range, blink::mojom::IDBCursorDirection::Next); } if (!backing_store_cursor.has_value()) { @@ -917,7 +917,7 @@ Status Database::DeleteRangeOperation( int64_t object_store_id, - std::unique_ptr<IndexedDBKeyRange> key_range, + IndexedDBKeyRange key_range, blink::mojom::IDBDatabase::DeleteRangeCallback success_callback, Transaction* transaction) { TRACE_EVENT1("IndexedDB", "Database::DeleteRangeOperation", "txn.id", @@ -926,7 +926,7 @@ Status s; if (IsObjectStoreIdInMetadata(object_store_id)) { s = transaction->BackingStoreTransaction()->DeleteRange(object_store_id, - *key_range); + key_range); } else { s = Status::InvalidArgument("Invalid object_store_id."); }
diff --git a/content/browser/indexed_db/instance/database.h b/content/browser/indexed_db/instance/database.h index 00c6592..1a5afdb 100644 --- a/content/browser/indexed_db/instance/database.h +++ b/content/browser/indexed_db/instance/database.h
@@ -108,15 +108,15 @@ Status GetOperation(int64_t object_store_id, int64_t index_id, - std::unique_ptr<blink::IndexedDBKeyRange> key_range, + blink::IndexedDBKeyRange key_range, indexed_db::CursorType cursor_type, blink::mojom::IDBDatabase::GetCallback callback, Transaction* transaction); Status SetIndexKeysOperation( int64_t object_store_id, - std::unique_ptr<blink::IndexedDBKey> primary_key, - const std::vector<blink::IndexedDBIndexKeys>& index_keys, + blink::IndexedDBKey primary_key, + std::vector<blink::IndexedDBIndexKeys> index_keys, Transaction* transaction); Status SetIndexesReadyOperation(size_t index_count, Transaction* transaction); @@ -131,7 +131,7 @@ ~OpenCursorOperationParams(); int64_t object_store_id; int64_t index_id; - std::unique_ptr<blink::IndexedDBKeyRange> key_range; + blink::IndexedDBKeyRange key_range; blink::mojom::IDBCursorDirection direction; indexed_db::CursorType cursor_type; blink::mojom::IDBTaskType task_type; @@ -143,13 +143,13 @@ Status CountOperation(int64_t object_store_id, int64_t index_id, - std::unique_ptr<blink::IndexedDBKeyRange> key_range, + blink::IndexedDBKeyRange key_range, blink::mojom::IDBDatabase::CountCallback callback, Transaction* transaction); Status DeleteRangeOperation( int64_t object_store_id, - std::unique_ptr<blink::IndexedDBKeyRange> key_range, + blink::IndexedDBKeyRange key_range, blink::mojom::IDBDatabase::DeleteRangeCallback success_callback, Transaction* transaction); @@ -167,7 +167,7 @@ base::OnceCallback<Status(Transaction*)> CreateGetAllOperation( int64_t object_store_id, int64_t index_id, - std::unique_ptr<blink::IndexedDBKeyRange> key_range, + blink::IndexedDBKeyRange key_range, blink::mojom::IDBGetAllResultType result_type, int64_t max_count, blink::mojom::IDBCursorDirection direction, @@ -245,7 +245,7 @@ Status GetAllOperation(int64_t object_store_id, int64_t index_id, - std::unique_ptr<blink::IndexedDBKeyRange> key_range, + blink::IndexedDBKeyRange key_range, blink::mojom::IDBGetAllResultType result_type, int64_t max_count, blink::mojom::IDBCursorDirection direction,
diff --git a/content/browser/indexed_db/instance/database_unittest.cc b/content/browser/indexed_db/instance/database_unittest.cc index dea67a1..6c1067f 100644 --- a/content/browser/indexed_db/instance/database_unittest.cc +++ b/content/browser/indexed_db/instance/database_unittest.cc
@@ -67,12 +67,16 @@ TestIDBRecord(IndexedDBKey primary_key, const IndexedDBValue& value, std::optional<IndexedDBKey> index_key) - : primary_key(primary_key), value(value.Clone()), index_key(index_key) {} + : primary_key(std::move(primary_key)), + value(value.Clone()), + index_key(std::move(index_key)) {} TestIDBRecord(const TestIDBRecord& other) { - primary_key = other.primary_key; + primary_key = other.primary_key.Clone(); value = other.value.Clone(); - index_key = other.index_key; + if (other.index_key) { + index_key = other.index_key->Clone(); + } } IndexedDBKey primary_key; @@ -263,12 +267,14 @@ // `external_objects` is not set and remains empty. blink::mojom::IDBReturnValuePtr CreateIDBReturnValuePtr( const std::string& bits, - IndexedDBKey primary_key = {}, + const IndexedDBKey* primary_key = nullptr, IndexedDBKeyPath key_path = {}) { blink::mojom::IDBReturnValuePtr result = blink::mojom::IDBReturnValue::New(); result->value = blink::mojom::IDBValue::New(); result->value->bits.assign(bits.begin(), bits.end()); - result->primary_key = std::move(primary_key); + if (primary_key) { + result->primary_key = primary_key->Clone(); + } result->key_path = std::move(key_path); return result; } @@ -734,11 +740,12 @@ // Populate the object store and optionally the index with the provided // records. - for (const TestIDBRecord& record : database_parameters.records) { + for (TestIDBRecord& record : database_parameters.records) { std::vector<IndexedDBIndexKeys> index_keys; ASSERT_EQ(record.index_key.has_value(), has_index); if (has_index) { - IndexedDBIndexKeys index_key{index_id, {*record.index_key}}; + IndexedDBIndexKeys index_key{index_id, {}}; + index_key.keys.emplace_back(std::move(*record.index_key)); index_keys.emplace_back(std::move(index_key)); } @@ -751,7 +758,7 @@ transaction_->in_flight_memory_ += 1000; status = transaction_->DoPut( - store_id, record.value.Clone(), record.primary_key, + store_id, record.value.Clone(), std::move(record.primary_key), blink::mojom::IDBPutMode::AddOnly, std::move(index_keys), callback.Get(), transaction_); EXPECT_TRUE(status.ok()) << status.ToString(); @@ -767,15 +774,11 @@ transaction_->AsWeakPtr(), std::move(get_all_callback)); result_sink_wrapper->UseDedicatedReceiverForTesting(); - std::unique_ptr<blink::IndexedDBKeyRange> key_range = - std::make_unique<blink::IndexedDBKeyRange>( - get_all_parameters.key_range); - - status = db_->GetAllOperation(store_id, index_id, std::move(key_range), - get_all_parameters.result_type, - get_all_parameters.max_count, - get_all_parameters.direction, - std::move(result_sink_wrapper), transaction_); + status = db_->GetAllOperation( + store_id, index_id, std::move(get_all_parameters.key_range), + get_all_parameters.result_type, get_all_parameters.max_count, + get_all_parameters.direction, std::move(result_sink_wrapper), + transaction_); EXPECT_TRUE(status.ok()) << status.ToString(); result_sink.WaitForResults(); @@ -1657,13 +1660,10 @@ TestGetAllParameters get_all_parameters; - std::unique_ptr<blink::IndexedDBKeyRange> key_range = - std::make_unique<blink::IndexedDBKeyRange>(get_all_parameters.key_range); - Status status = db_->GetAllOperation( kTestObjectStoreId, /*index_id=*/blink::IndexedDBIndexMetadata::kInvalidId, - std::move(key_range), get_all_parameters.result_type, + std::move(get_all_parameters.key_range), get_all_parameters.result_type, get_all_parameters.max_count, get_all_parameters.direction, std::move(result_sink_wrapper), transaction_); ASSERT_TRUE(status.IsInvalidArgument()) << status.ToString(); @@ -1702,11 +1702,8 @@ TestGetAllParameters get_all_parameters; - std::unique_ptr<blink::IndexedDBKeyRange> key_range = - std::make_unique<blink::IndexedDBKeyRange>(get_all_parameters.key_range); - status = db_->GetAllOperation( - kTestObjectStoreId, kTestIndexId, std::move(key_range), + kTestObjectStoreId, kTestIndexId, std::move(get_all_parameters.key_range), get_all_parameters.result_type, get_all_parameters.max_count, get_all_parameters.direction, std::move(result_sink_wrapper), transaction_); @@ -1782,21 +1779,21 @@ const blink::mojom::IDBRecordPtr expected_results[] = { blink::mojom::IDBRecord::New( - /*primary_key=*/expected_generated_keys[2], + /*primary_key=*/expected_generated_keys[2].Clone(), /*value=*/ - CreateIDBReturnValuePtr("value3", expected_generated_keys[2], + CreateIDBReturnValuePtr("value3", &expected_generated_keys[2], object_store_key_path), /*index_key=*/IndexedDBKey{"index_key1"}), blink::mojom::IDBRecord::New( - /*primary_key=*/expected_generated_keys[1], + /*primary_key=*/expected_generated_keys[1].Clone(), /*value=*/ - CreateIDBReturnValuePtr("value2", expected_generated_keys[1], + CreateIDBReturnValuePtr("value2", &expected_generated_keys[1], object_store_key_path), /*index_key=*/IndexedDBKey{"index_key2"}), blink::mojom::IDBRecord::New( - /*primary_key=*/expected_generated_keys[0], + /*primary_key=*/expected_generated_keys[0].Clone(), /*value=*/ - CreateIDBReturnValuePtr("value1", expected_generated_keys[0], + CreateIDBReturnValuePtr("value1", &expected_generated_keys[0], object_store_key_path), /*index_key=*/IndexedDBKey{"index_key3"}), };
diff --git a/content/browser/indexed_db/instance/index_writer.cc b/content/browser/indexed_db/instance/index_writer.cc index 5e99a07..3b9f4f8a 100644 --- a/content/browser/indexed_db/instance/index_writer.cc +++ b/content/browser/indexed_db/instance/index_writer.cc
@@ -29,8 +29,8 @@ : index_metadata_(index_metadata) {} IndexWriter::IndexWriter(const IndexedDBIndexMetadata& index_metadata, - const std::vector<IndexedDBKey>& keys) - : index_metadata_(index_metadata), keys_(keys) {} + std::vector<IndexedDBKey> keys) + : index_metadata_(index_metadata), keys_(std::move(keys)) {} IndexWriter::~IndexWriter() {} @@ -104,22 +104,22 @@ bool MakeIndexWriters(Transaction* transaction, const IndexedDBObjectStoreMetadata& object_store, - const IndexedDBKey& primary_key, // makes a copy + const IndexedDBKey& primary_key, bool key_was_generated, - const std::vector<IndexedDBIndexKeys>& index_keys, + std::vector<IndexedDBIndexKeys> index_keys, std::vector<std::unique_ptr<IndexWriter>>* index_writers, std::string* error_message, bool* completed) { *completed = false; - for (const auto& it : index_keys) { + for (IndexedDBIndexKeys& it : index_keys) { auto found = object_store.indexes.find(it.id); if (found == object_store.indexes.end()) { continue; } const IndexedDBIndexMetadata& index = found->second; // A copy is made because additional keys may be added. - std::vector<IndexedDBKey> keys = it.keys; + std::vector<IndexedDBKey> keys = std::move(it.keys); // If the object_store is using a key generator to produce the primary key, // and the store uses in-line keys, index key paths may reference it. @@ -127,7 +127,7 @@ if (index.key_path == object_store.key_path) { // The index key path is the same as the store's key path - no index key // will have been sent by the front end, so synthesize one here. - keys.push_back(primary_key); + keys.emplace_back(primary_key.Clone()); } else if (index.key_path.type() == blink::mojom::IDBKeyPathType::Array) { // An index with compound keys for a store with a key generator and
diff --git a/content/browser/indexed_db/instance/index_writer.h b/content/browser/indexed_db/instance/index_writer.h index af4361ed0..d9c7d03 100644 --- a/content/browser/indexed_db/instance/index_writer.h +++ b/content/browser/indexed_db/instance/index_writer.h
@@ -29,7 +29,7 @@ explicit IndexWriter(const blink::IndexedDBIndexMetadata& index_metadata); IndexWriter(const blink::IndexedDBIndexMetadata& index_metadata, - const std::vector<blink::IndexedDBKey>& keys); + std::vector<blink::IndexedDBKey> keys); [[nodiscard]] bool VerifyIndexKeys(BackingStore::Transaction* transaction, int64_t object_store_id, @@ -64,7 +64,7 @@ const blink::IndexedDBObjectStoreMetadata& metadata, const blink::IndexedDBKey& primary_key, bool key_was_generated, - const std::vector<blink::IndexedDBIndexKeys>& index_keys, + std::vector<blink::IndexedDBIndexKeys> index_keys, std::vector<std::unique_ptr<IndexWriter>>* index_writers, std::string* error_message, bool* completed);
diff --git a/content/browser/indexed_db/instance/leveldb/backing_store.cc b/content/browser/indexed_db/instance/leveldb/backing_store.cc index 4406305..1b3037f 100644 --- a/content/browser/indexed_db/instance/leveldb/backing_store.cc +++ b/content/browser/indexed_db/instance/leveldb/backing_store.cc
@@ -3193,7 +3193,8 @@ database_id_(other->database_id_), cursor_options_(other->cursor_options_), iterator_(std::move(iterator)), - current_key_(std::make_unique<IndexedDBKey>(*other->current_key_)) { + current_key_( + std::make_unique<IndexedDBKey>(other->current_key_->Clone())) { DCHECK(transaction_); DCHECK(iterator_); } @@ -3217,6 +3218,10 @@ return *current_key_; } +blink::IndexedDBKey BackingStore::Cursor::TakeKey() && { + return std::move(*current_key_); +} + // static std::unique_ptr<TransactionalLevelDBIterator> BackingStore::Cursor::CloneIterator(const BackingStore::Cursor* other) { @@ -3267,7 +3272,7 @@ return false; } } - return Continue(nullptr, nullptr, READY, s); + return Continue({}, {}, READY, s); } bool BackingStore::Cursor::Advance(uint32_t count, Status* s) { @@ -3280,40 +3285,40 @@ return true; } -bool BackingStore::Cursor::Continue(const IndexedDBKey* key, - const IndexedDBKey* primary_key, +bool BackingStore::Cursor::Continue(const IndexedDBKey& key, + const IndexedDBKey& primary_key, IteratorState next_state, Status* s) { TRACE_EVENT0("IndexedDB", "BackingStore::Cursor::Continue"); - DCHECK(!key || next_state == SEEK); + DCHECK(!key.IsValid() || next_state == SEEK); if (cursor_options_.forward) { return ContinueNext(key, primary_key, next_state, s) == ContinueResult::DONE; - } else { - return ContinuePrevious(key, primary_key, next_state, s) == - ContinueResult::DONE; } + return ContinuePrevious(key, primary_key, next_state, s) == + ContinueResult::DONE; } BackingStore::Cursor::ContinueResult BackingStore::Cursor::ContinueNext( - const IndexedDBKey* key, - const IndexedDBKey* primary_key, + const IndexedDBKey& key, + const IndexedDBKey& primary_key, IteratorState next_state, Status* s) { DCHECK(cursor_options_.forward); - DCHECK(!key || key->IsValid()); - DCHECK(!primary_key || primary_key->IsValid()); *s = Status::OK(); // TODO(alecflett): avoid a copy here? - IndexedDBKey previous_key = current_key_ ? *current_key_ : IndexedDBKey(); + std::optional<IndexedDBKey> previous_key; + if (current_key_) { + previous_key.emplace(current_key_->Clone()); + } // If seeking to a particular key (or key and primary key), skip the cursor // forward rather than iterating it. - if (next_state == SEEK && key) { + if (next_state == SEEK && key.IsValid()) { std::string leveldb_key = - primary_key ? EncodeKey(*key, *primary_key) : EncodeKey(*key); + primary_key.IsValid() ? EncodeKey(key, primary_key) : EncodeKey(key); *s = iterator_->Seek(leveldb_key); if (!s->ok()) { return ContinueResult::LEVELDB_ERROR; @@ -3358,8 +3363,8 @@ // Cursor is now positioned at a non-stale record in range. // "Unique" cursors should continue seeking until a new key value is seen. - if (cursor_options_.unique && previous_key.IsValid() && - current_key_->Equals(previous_key)) { + if (cursor_options_.unique && previous_key && previous_key->IsValid() && + current_key_->Equals(*previous_key)) { continue; } @@ -3370,17 +3375,18 @@ } BackingStore::Cursor::ContinueResult BackingStore::Cursor::ContinuePrevious( - const IndexedDBKey* key, - const IndexedDBKey* primary_key, + const IndexedDBKey& key, + const IndexedDBKey& primary_key, IteratorState next_state, Status* s) { DCHECK(!cursor_options_.forward); - DCHECK(!key || key->IsValid()); - DCHECK(!primary_key || primary_key->IsValid()); *s = Status::OK(); // TODO(alecflett): avoid a copy here? - IndexedDBKey previous_key = current_key_ ? *current_key_ : IndexedDBKey(); + std::optional<IndexedDBKey> previous_key; + if (current_key_) { + previous_key.emplace(current_key_->Clone()); + } // When iterating with PrevNoDuplicate, spec requires that the value we // yield for each key is the *first* duplicate in forwards order. We do this @@ -3430,12 +3436,12 @@ // If seeking to a key (or key and primary key), continue until found. // TODO(jsbell): If Seek() optimization is added above, remove this. - if (key) { - if (primary_key && key->Equals(*current_key_) && - primary_key->IsLessThan(this->GetPrimaryKey())) { + if (key.IsValid()) { + if (primary_key.IsValid() && key.Equals(*current_key_) && + primary_key.IsLessThan(this->GetPrimaryKey())) { continue; } - if (key->IsLessThan(*current_key_)) { + if (key.IsLessThan(*current_key_)) { continue; } } @@ -3447,13 +3453,14 @@ // cursor should be positioned at the first duplicate already, new // duplicates may have been inserted since the cursor was last iterated, // and should be skipped to maintain "unique" iteration. - if (previous_key.IsValid() && current_key_->Equals(previous_key)) { + if (previous_key && previous_key->IsValid() && + current_key_->Equals(*previous_key)) { continue; } // If we've found a new key, remember it and keep going. if (!duplicate_key.IsValid()) { - duplicate_key = *current_key_; + duplicate_key = current_key_->Clone(); earliest_duplicate = std::string(iterator_->Key()); continue; } @@ -3732,7 +3739,8 @@ const IndexKeyCursorImpl* other, std::unique_ptr<TransactionalLevelDBIterator> iterator) : BackingStore::Cursor(other, std::move(iterator)), - primary_key_(std::make_unique<IndexedDBKey>(*other->primary_key_)) {} + primary_key_( + std::make_unique<IndexedDBKey>(other->primary_key_->Clone())) {} std::unique_ptr<IndexedDBKey> primary_key_; }; @@ -3842,11 +3850,11 @@ } private: - explicit IndexCursorImpl( - const IndexCursorImpl* other, - std::unique_ptr<TransactionalLevelDBIterator> iterator) + IndexCursorImpl(const IndexCursorImpl* other, + std::unique_ptr<TransactionalLevelDBIterator> iterator) : BackingStore::Cursor(other, std::move(iterator)), - primary_key_(std::make_unique<IndexedDBKey>(*other->primary_key_)), + primary_key_( + std::make_unique<IndexedDBKey>(other->primary_key_->Clone())), current_value_(other->current_value_.Clone()), primary_leveldb_key_(other->primary_leveldb_key_) {}
diff --git a/content/browser/indexed_db/instance/leveldb/backing_store.h b/content/browser/indexed_db/instance/leveldb/backing_store.h index 4c99960..d16e455 100644 --- a/content/browser/indexed_db/instance/leveldb/backing_store.h +++ b/content/browser/indexed_db/instance/leveldb/backing_store.h
@@ -366,8 +366,9 @@ // indexed_db::BackingStore::Cursor: const blink::IndexedDBKey& GetKey() const override; const blink::IndexedDBKey& GetPrimaryKey() const override; - bool Continue(const blink::IndexedDBKey* key, - const blink::IndexedDBKey* primary_key, + blink::IndexedDBKey TakeKey() && override; + bool Continue(const blink::IndexedDBKey& key, + const blink::IndexedDBKey& primary_key, IteratorState state, Status*) override; bool Advance(uint32_t count, Status*) override; @@ -414,15 +415,15 @@ enum class ContinueResult { LEVELDB_ERROR, DONE, OUT_OF_BOUNDS }; // For cursors with direction Next or NextNoDuplicate. - ContinueResult ContinueNext(const blink::IndexedDBKey* key, - const blink::IndexedDBKey* primary_key, + ContinueResult ContinueNext(const blink::IndexedDBKey& key, + const blink::IndexedDBKey& primary_key, IteratorState state, Status*); // For cursors with direction Prev or PrevNoDuplicate. The PrevNoDuplicate // case has additional complexity of not being symmetric with // NextNoDuplicate. - ContinueResult ContinuePrevious(const blink::IndexedDBKey* key, - const blink::IndexedDBKey* primary_key, + ContinueResult ContinuePrevious(const blink::IndexedDBKey& key, + const blink::IndexedDBKey& primary_key, IteratorState state, Status*);
diff --git a/content/browser/indexed_db/instance/leveldb/backing_store_unittest.cc b/content/browser/indexed_db/instance/leveldb/backing_store_unittest.cc index 280e001..d6b051f 100644 --- a/content/browser/indexed_db/instance/leveldb/backing_store_unittest.cc +++ b/content/browser/indexed_db/instance/leveldb/backing_store_unittest.cc
@@ -712,7 +712,7 @@ TEST_F(BackingStoreTest, PutGetConsistency) { base::RunLoop loop; - const IndexedDBKey key = key1_; + const IndexedDBKey& key = key1_; IndexedDBValue& value = value1_; BackingStore::Database db(*backing_store(), BackingStore::DatabaseMetadata{u"name"}); @@ -810,7 +810,11 @@ blink::mojom::IDBTransactionMode::ReadWrite); transaction3->Begin(CreateDummyLock()); - EXPECT_TRUE(transaction3->DeleteRange(1, IndexedDBKeyRange(key3_)).ok()); + EXPECT_TRUE( + transaction3 + ->DeleteRange( + 1, IndexedDBKeyRange(key3_.Clone(), key3_.Clone(), false, false)) + .ok()); succeeded = false; EXPECT_TRUE( transaction3->CommitPhaseOne(CreateBlobWriteCallback(&succeeded)).ok()); @@ -831,9 +835,9 @@ BackingStore::Database db(*backing_store(), BackingStore::DatabaseMetadata{u"name"}); db.metadata().id = 1; - const std::vector<IndexedDBKey> keys = { - IndexedDBKey(u"key0"), IndexedDBKey(u"key1"), IndexedDBKey(u"key2"), - IndexedDBKey(u"key3")}; + const auto keys = + std::to_array({IndexedDBKey(u"key0"), IndexedDBKey(u"key1"), + IndexedDBKey(u"key2"), IndexedDBKey(u"key3")}); const int64_t object_store_id = 1; @@ -843,12 +847,12 @@ external_objects().push_back(CreateBlobInfo(base::UTF8ToUTF16(type), 1)); } - std::array<IndexedDBValue, 4> values{ + auto values = std::to_array({ IndexedDBValue("value0", {external_objects()[0]}), IndexedDBValue("value1", {external_objects()[1]}), IndexedDBValue("value2", {external_objects()[2]}), IndexedDBValue("value3", {external_objects()[3]}), - }; + }); ASSERT_GE(keys.size(), values.size()); // Validate that cleaning up after writing blobs does not delete those @@ -885,15 +889,15 @@ BackingStore::Database db(*backing_store(), BackingStore::DatabaseMetadata{u"name"}); db.metadata().id = 1; - const std::vector<IndexedDBKey> keys = { - IndexedDBKey(u"key0"), IndexedDBKey(u"key1"), IndexedDBKey(u"key2"), - IndexedDBKey(u"key3")}; + const auto keys = + std::to_array({IndexedDBKey(u"key0"), IndexedDBKey(u"key1"), + IndexedDBKey(u"key2"), IndexedDBKey(u"key3")}); const auto ranges = std::to_array({ - IndexedDBKeyRange(keys[1], keys[2], false, false), - IndexedDBKeyRange(keys[1], keys[2], false, false), - IndexedDBKeyRange(keys[0], keys[2], true, false), - IndexedDBKeyRange(keys[1], keys[3], false, true), - IndexedDBKeyRange(keys[0], keys[3], true, true), + IndexedDBKeyRange(keys[1].Clone(), keys[2].Clone(), false, false), + IndexedDBKeyRange(keys[1].Clone(), keys[2].Clone(), false, false), + IndexedDBKeyRange(keys[0].Clone(), keys[2].Clone(), true, false), + IndexedDBKeyRange(keys[1].Clone(), keys[3].Clone(), false, true), + IndexedDBKeyRange(keys[0].Clone(), keys[3].Clone(), true, true), }); for (size_t i = 0; i < std::size(ranges); ++i) { @@ -910,12 +914,12 @@ blob_context_->ClearWrites(); file_system_access_context_->ClearWrites(); - std::array<IndexedDBValue, 4> values{ + auto values = std::to_array({ IndexedDBValue("value0", {external_objects[0]}), IndexedDBValue("value1", {external_objects[1]}), IndexedDBValue("value2", {external_objects[2]}), IndexedDBValue("value3", {external_objects[3]}), - }; + }); ASSERT_GE(keys.size(), values.size()); // Initiate transaction1 - write records. @@ -969,15 +973,18 @@ BackingStore::Database db(*backing_store(), BackingStore::DatabaseMetadata{u"name"}); db.metadata().id = 1; - const std::vector<IndexedDBKey> keys = { - IndexedDBKey(u"key0"), IndexedDBKey(u"key1"), IndexedDBKey(u"key2"), - IndexedDBKey(u"key3"), IndexedDBKey(u"key4"), - }; - const std::vector<IndexedDBKeyRange> ranges = { - IndexedDBKeyRange(keys[3], keys[4], true, false), - IndexedDBKeyRange(keys[2], keys[1], false, false), - IndexedDBKeyRange(keys[2], keys[1], true, true), - }; + const auto keys = std::to_array({ + IndexedDBKey(u"key0"), + IndexedDBKey(u"key1"), + IndexedDBKey(u"key2"), + IndexedDBKey(u"key3"), + IndexedDBKey(u"key4"), + }); + const auto ranges = std::to_array({ + IndexedDBKeyRange(keys[3].Clone(), keys[4].Clone(), true, false), + IndexedDBKeyRange(keys[2].Clone(), keys[1].Clone(), false, false), + IndexedDBKeyRange(keys[2].Clone(), keys[1].Clone(), true, true), + }); for (size_t i = 0; i < std::size(ranges); ++i) { const int64_t object_store_id = i + 1; @@ -993,12 +1000,12 @@ blob_context_->ClearWrites(); file_system_access_context_->ClearWrites(); - std::array<IndexedDBValue, 4> values{ + auto values = std::to_array({ IndexedDBValue("value0", {external_objects[0]}), IndexedDBValue("value1", {external_objects[1]}), IndexedDBValue("value2", {external_objects[2]}), IndexedDBValue("value3", {external_objects[3]}), - }; + }); ASSERT_GE(keys.size(), values.size()); // Initiate transaction1 - write records. @@ -1141,7 +1148,10 @@ db.CreateTransaction(blink::mojom::IDBTransactionDurability::Relaxed, blink::mojom::IDBTransactionMode::ReadWrite); transaction3->Begin(CreateDummyLock()); - EXPECT_TRUE(transaction3->DeleteRange(1, IndexedDBKeyRange(key3_)).ok()); + EXPECT_TRUE( + transaction3 + ->DeleteRange(1, IndexedDBKeyRange(key3_.Clone(), {}, false, false)) + .ok()); succeeded = false; EXPECT_TRUE( transaction3->CommitPhaseOne(CreateBlobWriteCallback(&succeeded)).ok()); @@ -1246,8 +1256,8 @@ // Make sure that using very high ( more than 32 bit ) values for // database_id and object_store_id still work. TEST_F(BackingStoreTest, HighIds) { - IndexedDBKey key1 = key1_; - IndexedDBKey key2 = key2_; + IndexedDBKey& key1 = key1_; + IndexedDBKey& key2 = key2_; IndexedDBValue& value1 = value1_; const int64_t high_database_id = 1ULL << 35; @@ -1323,7 +1333,7 @@ // Make sure that other invalid ids do not crash. TEST_F(BackingStoreTest, InvalidIds) { - const IndexedDBKey key = key1_; + const IndexedDBKey& key = key1_; IndexedDBValue& value = value1_; // valid ids for use when testing invalid ids @@ -1765,7 +1775,7 @@ transaction.Begin(CreateDummyLock()); // Prepare test data for second transaction. - IndexedDBKey key = IndexedDBKey(u"key0"); + IndexedDBKey key(u"key0"); std::string name = "name0"; IndexedDBExternalObject test_blob = CreateBlobInfo(base::UTF8ToUTF16(name), 100); @@ -2022,7 +2032,7 @@ transaction->Begin(CreateDummyLock()); BackingStore::RecordIdentifier record; - IndexedDBKey key = IndexedDBKey(u"key"); + IndexedDBKey key(u"key"); IndexedDBValue value = IndexedDBValue("value3", external_objects()); EXPECT_TRUE( @@ -2093,9 +2103,9 @@ // See: http://crbug.com/488851 // TODO(enne): we could use more comprehensive testing for ClearObjectStore. TEST_P(BackingStoreTestWithExternalObjects, ClearObjectStoreObjects) { - const std::vector<IndexedDBKey> keys = { - IndexedDBKey(u"key0"), IndexedDBKey(u"key1"), IndexedDBKey(u"key2"), - IndexedDBKey(u"key3")}; + const auto keys = + std::to_array({IndexedDBKey(u"key0"), IndexedDBKey(u"key1"), + IndexedDBKey(u"key2"), IndexedDBKey(u"key3")}); const int64_t object_store_id = 999; @@ -2113,12 +2123,12 @@ external_objects.push_back(CreateBlobInfo(base::UTF8ToUTF16(type), 1)); } - std::array<IndexedDBValue, 4> values{ + auto values = std::to_array({ IndexedDBValue("value0", {external_objects[0]}), IndexedDBValue("value1", {external_objects[1]}), IndexedDBValue("value2", {external_objects[2]}), IndexedDBValue("value3", {external_objects[3]}), - }; + }); ASSERT_GE(keys.size(), values.size()); // Initiate transaction1 - write records.
diff --git a/content/browser/indexed_db/instance/transaction.cc b/content/browser/indexed_db/instance/transaction.cc index 96ef54b2..0d93550 100644 --- a/content/browser/indexed_db/instance/transaction.cc +++ b/content/browser/indexed_db/instance/transaction.cc
@@ -448,9 +448,9 @@ void Transaction::Put(int64_t object_store_id, blink::mojom::IDBValuePtr input_value, - const blink::IndexedDBKey& key, + blink::IndexedDBKey key, blink::mojom::IDBPutMode mode, - const std::vector<blink::IndexedDBIndexKeys>& index_keys, + std::vector<blink::IndexedDBIndexKeys> index_keys, blink::mojom::IDBTransaction::PutCallback callback) { if (!IsAcceptingRequests()) { return; @@ -489,8 +489,9 @@ // This is decremented in DoPut. in_flight_memory_ += value.SizeEstimate(); ScheduleTask(BindWeakOperation(&Transaction::DoPut, AsWeakPtr(), - object_store_id, std::move(value), key, mode, - index_keys, std::move(wrapped_callback))); + object_store_id, std::move(value), + std::move(key), mode, std::move(index_keys), + std::move(wrapped_callback))); } Status Transaction::DoPut(int64_t object_store_id, @@ -563,9 +564,9 @@ std::vector<std::unique_ptr<IndexWriter>> index_writers; std::string error_message; bool obeys_constraints = false; - bool backing_store_success = - MakeIndexWriters(this, object_store, key, key_was_generated, index_keys, - &index_writers, &error_message, &obeys_constraints); + bool backing_store_success = MakeIndexWriters( + this, object_store, key, key_was_generated, std::move(index_keys), + &index_writers, &error_message, &obeys_constraints); if (!backing_store_success) { on_put_error(std::move(callback), blink::mojom::IDBException::kUnknownError, u"Internal error: backing store error updating index keys."); @@ -618,7 +619,8 @@ { TRACE_EVENT1("IndexedDB", "Database::PutOperation.Callbacks", "txn.id", id()); - std::move(callback).Run(blink::mojom::IDBTransactionPutResult::NewKey(key)); + std::move(callback).Run( + blink::mojom::IDBTransactionPutResult::NewKey(std::move(key))); } bucket_context()->delegate().on_content_changed.Run(
diff --git a/content/browser/indexed_db/instance/transaction.h b/content/browser/indexed_db/instance/transaction.h index 4d1180f..cbbe716 100644 --- a/content/browser/indexed_db/instance/transaction.h +++ b/content/browser/indexed_db/instance/transaction.h
@@ -198,9 +198,9 @@ void DeleteObjectStore(int64_t object_store_id) override; void Put(int64_t object_store_id, blink::mojom::IDBValuePtr value, - const blink::IndexedDBKey& key, + blink::IndexedDBKey key, blink::mojom::IDBPutMode mode, - const std::vector<blink::IndexedDBIndexKeys>& index_keys, + std::vector<blink::IndexedDBIndexKeys> index_keys, blink::mojom::IDBTransaction::PutCallback callback) override; void Commit(int64_t num_errors_handled) override;
diff --git a/content/browser/renderer_host/batched_proxy_ipc_sender.cc b/content/browser/renderer_host/batched_proxy_ipc_sender.cc index b8a04b4..49b3f18 100644 --- a/content/browser/renderer_host/batched_proxy_ipc_sender.cc +++ b/content/browser/renderer_host/batched_proxy_ipc_sender.cc
@@ -19,8 +19,10 @@ using perfetto::protos::pbzero::ChromeTrackEvent; BatchedProxyIPCSender::BatchedProxyIPCSender( - base::SafeRef<RenderFrameProxyHost> root_proxy) - : root_proxy_host_(root_proxy) { + base::SafeRef<RenderFrameProxyHost> root_proxy, + const std::optional<base::UnguessableToken>& navigation_metrics_token) + : root_proxy_host_(root_proxy), + navigation_metrics_token_(navigation_metrics_token) { DCHECK(!root_proxy->frame_tree_node()->parent()); } @@ -67,7 +69,7 @@ } root_proxy_host_->GetAssociatedRemoteFrame()->CreateRemoteChildren( - std::move(create_remote_children_params_)); + std::move(create_remote_children_params_), navigation_metrics_token_); for (const auto& proxy_host : proxy_hosts_) { proxy_host->SetRenderFrameProxyCreated(true);
diff --git a/content/browser/renderer_host/batched_proxy_ipc_sender.h b/content/browser/renderer_host/batched_proxy_ipc_sender.h index 942b0d1..a084011 100644 --- a/content/browser/renderer_host/batched_proxy_ipc_sender.h +++ b/content/browser/renderer_host/batched_proxy_ipc_sender.h
@@ -57,8 +57,9 @@ // assume that new proxies will start to be created from the root. class CONTENT_EXPORT BatchedProxyIPCSender { public: - explicit BatchedProxyIPCSender( - base::SafeRef<RenderFrameProxyHost> root_proxy); + BatchedProxyIPCSender( + base::SafeRef<RenderFrameProxyHost> root_proxy, + const std::optional<base::UnguessableToken>& navigation_metrics_token); ~BatchedProxyIPCSender(); // Creates a new node in `create_remote_children_params_` with all the @@ -108,6 +109,14 @@ std::map<GlobalRoutingID, raw_ptr<blink::mojom::CreateRemoteChildParams, CtnExperimental>> proxy_to_child_params_; + + // If this class is used to create proxies for a navigation, this token + // identifies the navigation for metrics purposes. It needs to be sent to the + // renderer in the proxy creation IPC so that the renderer can record + // appropriate navigation-related trace events and metrics. In non-navigation + // cases like creating proxies for new subframes, this should be left as + // nullopt. + std::optional<base::UnguessableToken> navigation_metrics_token_; }; } // namespace content
diff --git a/content/browser/renderer_host/browsing_context_state.cc b/content/browser/renderer_host/browsing_context_state.cc index 90f3db4..c6aab49 100644 --- a/content/browser/renderer_host/browsing_context_state.cc +++ b/content/browser/renderer_host/browsing_context_state.cc
@@ -42,13 +42,13 @@ : replication_state_(std::move(replication_state)), parent_(parent), browsing_instance_id_(browsing_instance_id) { - TRACE_EVENT_BEGIN("navigation", "BrowsingContextState", + TRACE_EVENT_BEGIN("navigation.debug", "BrowsingContextState", perfetto::Track::FromPointer(this), "browsing_context_state_when_created", this); } BrowsingContextState::~BrowsingContextState() { - TRACE_EVENT_END("navigation", perfetto::Track::FromPointer(this)); + TRACE_EVENT_END("navigation.debug", perfetto::Track::FromPointer(this)); CHECK(proxy_hosts_.empty()); }
diff --git a/content/browser/renderer_host/frame_tree.cc b/content/browser/renderer_host/frame_tree.cc index 19e6de8..c795440 100644 --- a/content/browser/renderer_host/frame_tree.cc +++ b/content/browser/renderer_host/frame_tree.cc
@@ -494,7 +494,8 @@ FrameTreeNode* source, SiteInstanceGroup* site_instance_group, const scoped_refptr<BrowsingContextState>& - source_new_browsing_context_state) { + source_new_browsing_context_state, + const std::optional<base::UnguessableToken>& navigation_metrics_token) { // Will be instantiated with the root proxy later and passed to // `CreateRenderFrameProxy()` to batch create proxies for child frames. std::unique_ptr<BatchedProxyIPCSender> batched_proxy_ipc_sender; @@ -504,7 +505,7 @@ GetRenderViewHost(site_instance_group).get(); if (render_view_host) { root()->render_manager()->EnsureRenderViewInitialized( - render_view_host, site_instance_group); + render_view_host, site_instance_group, navigation_metrics_token); } else { // Due to the check above, we are creating either an opener proxy (when // source is null) or a main frame proxy due to a subframe navigation @@ -523,6 +524,7 @@ // pass an instance of `BatchedProxyIPCSender` here instead of nullptr. root()->render_manager()->CreateRenderFrameProxy( site_instance_group, root_browsing_context_state, + navigation_metrics_token, /*batched_proxy_ipc_sender=*/nullptr); // We only need to use `BatchedProxyIPCSender` when navigating to a new @@ -537,8 +539,8 @@ root_browsing_context_state ->GetRenderFrameProxyHost(site_instance_group) ->GetSafeRef(); - batched_proxy_ipc_sender = - std::make_unique<BatchedProxyIPCSender>(std::move(root_proxy)); + batched_proxy_ipc_sender = std::make_unique<BatchedProxyIPCSender>( + std::move(root_proxy), navigation_metrics_token); } } @@ -608,7 +610,7 @@ site_instance_group, node == source ? source_new_browsing_context_state : node->current_frame_host()->browsing_context_state(), - batched_proxy_ipc_sender.get()); + navigation_metrics_token, batched_proxy_ipc_sender.get()); } }
diff --git a/content/browser/renderer_host/frame_tree.h b/content/browser/renderer_host/frame_tree.h index a75ef1b..67316c6a 100644 --- a/content/browser/renderer_host/frame_tree.h +++ b/content/browser/renderer_host/frame_tree.h
@@ -413,14 +413,22 @@ // temporarily created for |source| in cross-SiteInstanceGroup cases (to allow // a remote-to-local swap to the new RenderFrameHost in |source|), but the // subtree rooted at source is skipped. + // // |source_new_browsing_context_state| is the BrowsingContextState used by the // speculative frame host, which may differ from the BrowsingContextState in // |source| during cross-origin cross- browsing-instance navigations. + // + // |navigation_metrics_token| is a token identifying the navigation for which + // these proxies are being created, if any. It allows metrics code and trace + // events to tie together different IPCs and events pertaining to a particular + // navigation. It's nullopt for non-navigation cases such as creating proxies + // for a new subframe. void CreateProxiesForSiteInstanceGroup( FrameTreeNode* source, SiteInstanceGroup* site_instance_group, const scoped_refptr<BrowsingContextState>& - source_new_browsing_context_state); + source_new_browsing_context_state, + const std::optional<base::UnguessableToken>& navigation_metrics_token); // Convenience accessor for the main frame's RenderFrameHostImpl. RenderFrameHostImpl* GetMainFrame() const;
diff --git a/content/browser/renderer_host/frame_tree_node.cc b/content/browser/renderer_host/frame_tree_node.cc index 0e5cd26..f3f5847 100644 --- a/content/browser/renderer_host/frame_tree_node.cc +++ b/content/browser/renderer_host/frame_tree_node.cc
@@ -170,7 +170,7 @@ fenced_frame_status_( ComputeFencedFrameStatus(frame_tree, parent_, frame_policy)), render_manager_(this, frame_tree.manager_delegate()) { - TRACE_EVENT_BEGIN("navigation", "FrameTreeNode", + TRACE_EVENT_BEGIN("navigation.debug", "FrameTreeNode", perfetto::Track::FromPointer(this), "frame_tree_node_when_created", this); std::pair<FrameTreeNodeIdMap::iterator, bool> result = @@ -320,7 +320,7 @@ DCHECK(!current_frame_host() || !IsLoading()); // Matches the TRACE_EVENT_BEGIN in the constructor. - TRACE_EVENT_END("navigation", perfetto::Track::FromPointer(this)); + TRACE_EVENT_END("navigation.debug", perfetto::Track::FromPointer(this)); } void FrameTreeNode::AddObserver(Observer* observer) {
diff --git a/content/browser/renderer_host/navigation_controller_impl.cc b/content/browser/renderer_host/navigation_controller_impl.cc index 5a3c601b..099d690a 100644 --- a/content/browser/renderer_host/navigation_controller_impl.cc +++ b/content/browser/renderer_host/navigation_controller_impl.cc
@@ -4161,7 +4161,8 @@ /*local_surface_id=*/std::nullopt, node->current_frame_host()->GetCachedPermissionStatuses(), /*should_skip_screentshot=*/false, - /*force_new_document_sequence_number=*/false); + /*force_new_document_sequence_number=*/false, + /*navigation_metrics_token=*/base::UnguessableToken::Create()); #if BUILDFLAG(IS_ANDROID) if (ValidateDataURLAsString(params.data_url_as_string)) { commit_params->data_url_as_string = params.data_url_as_string->as_string();
diff --git a/content/browser/renderer_host/navigation_controller_impl_unittest.cc b/content/browser/renderer_host/navigation_controller_impl_unittest.cc index 495daa7..b9e7ef0 100644 --- a/content/browser/renderer_host/navigation_controller_impl_unittest.cc +++ b/content/browser/renderer_host/navigation_controller_impl_unittest.cc
@@ -151,6 +151,7 @@ blink::mojom::FrameReplicationStatePtr replication_state, bool is_loading, const base::UnguessableToken& devtools_frame_token, + const std::optional<base::UnguessableToken>& navigation_metrics_token, blink::mojom::RemoteFrameInterfacesFromBrowserPtr remote_frame_interfaces, blink::mojom::RemoteMainFrameInterfacesPtr remote_main_frame_interfaces),
diff --git a/content/browser/renderer_host/navigation_entry_impl.cc b/content/browser/renderer_host/navigation_entry_impl.cc index 655453d0..ec3c77e 100644 --- a/content/browser/renderer_host/navigation_entry_impl.cc +++ b/content/browser/renderer_host/navigation_entry_impl.cc
@@ -1008,7 +1008,8 @@ /*local_surface_id=*/std::nullopt, /*initial_permission_statuses=*/std::nullopt, /*should_skip_screenshot*/ false, - /*force_new_document_sequence_number=*/false); + /*force_new_document_sequence_number=*/false, + /*navigation_metrics_token=*/base::UnguessableToken::Create()); #if BUILDFLAG(IS_ANDROID) // `data_url_as_string` is saved in NavigationEntry but should only be used by // main frames, because loadData* navigations can only happen on the main
diff --git a/content/browser/renderer_host/navigation_request.cc b/content/browser/renderer_host/navigation_request.cc index 775c1d3..e577637 100644 --- a/content/browser/renderer_host/navigation_request.cc +++ b/content/browser/renderer_host/navigation_request.cc
@@ -1446,7 +1446,8 @@ /*local_surface_id=*/std::nullopt, frame_tree_node->current_frame_host()->GetCachedPermissionStatuses(), /*should_skip_screenshot=*/false, - /*force_new_document_sequence_number=*/false); + /*force_new_document_sequence_number=*/false, + /*navigation_metrics_token=*/base::UnguessableToken::Create()); commit_params->navigation_timing->system_entropy_at_navigation_start = SystemEntropyUtils::ComputeSystemEntropyForFrameTreeNode( @@ -1600,7 +1601,8 @@ /*local_surface_id=*/std::nullopt, render_frame_host->GetCachedPermissionStatuses(), /*should_skip_screenshot=*/false, - /*force_new_document_sequence_number=*/false); + /*force_new_document_sequence_number=*/false, + /*navigation_metrics_token=*/base::UnguessableToken::Create()); blink::mojom::BeginNavigationParamsPtr begin_params = blink::mojom::BeginNavigationParams::New(); std::unique_ptr<NavigationRequest> navigation_request(new NavigationRequest(
diff --git a/content/browser/renderer_host/navigation_request.h b/content/browser/renderer_host/navigation_request.h index 92dabdb..1cf67402 100644 --- a/content/browser/renderer_host/navigation_request.h +++ b/content/browser/renderer_host/navigation_request.h
@@ -633,6 +633,21 @@ return confidence_level_; } + // This token is passed in various IPCs pertaining to navigations, such as + // frame and proxy creation as well as CommitNavigation, and is used by + // renderer-side metrics code to tie together different IPCs that were sent as + // part of performing a particular navigation. It is not intended to be used + // for anything other than metrics and trace events. + // + // Note that this token is stored in CommitNavigationParams, even though it's + // also needed before CommitNavigation (e.g., it needs to be included in frame + // and proxy creation IPCs which are sent before CommitNavigation) - this + // should be ok since commit_params() are initialized when a NavigationRequest + // is created. + const base::UnguessableToken& navigation_metrics_token() const { + return commit_params().navigation_metrics_token; + } + // Called on same-document navigation requests that need to be restarted as // cross-document navigations. This happens when a same-document commit fails // due to another navigation committing in the meantime.
diff --git a/content/browser/renderer_host/render_frame_host_impl.cc b/content/browser/renderer_host/render_frame_host_impl.cc index 90ee10ad..c66512a 100644 --- a/content/browser/renderer_host/render_frame_host_impl.cc +++ b/content/browser/renderer_host/render_frame_host_impl.cc
@@ -4171,7 +4171,8 @@ const std::optional<blink::FrameToken>& previous_frame_token, const std::optional<blink::FrameToken>& opener_frame_token, const std::optional<blink::FrameToken>& parent_frame_token, - const std::optional<blink::FrameToken>& previous_sibling_frame_token) { + const std::optional<blink::FrameToken>& previous_sibling_frame_token, + const std::optional<base::UnguessableToken>& navigation_metrics_token) { TRACE_EVENT0("navigation", "RenderFrameHostImpl::CreateRenderFrame"); DCHECK(!IsRenderFrameLive()) << "Creating frame twice"; @@ -4205,6 +4206,7 @@ params->associated_interface_provider_remote .InitWithNewEndpointAndPassReceiver()); params->document_token = document_associated_data_->token(); + params->navigation_metrics_token = navigation_metrics_token; // If this is a new RenderFrameHost for a frame that has already committed a // document, we don't have a policy container yet. Indeed, in that case, this
diff --git a/content/browser/renderer_host/render_frame_host_impl.h b/content/browser/renderer_host/render_frame_host_impl.h index 197c669c..a687da2a 100644 --- a/content/browser/renderer_host/render_frame_host_impl.h +++ b/content/browser/renderer_host/render_frame_host_impl.h
@@ -770,7 +770,8 @@ const std::optional<blink::FrameToken>& previous_frame_token, const std::optional<blink::FrameToken>& opener_frame_token, const std::optional<blink::FrameToken>& parent_frame_token, - const std::optional<blink::FrameToken>& previous_sibling_frame_token); + const std::optional<blink::FrameToken>& previous_sibling_frame_token, + const std::optional<base::UnguessableToken>& navigation_metrics_token); // Deletes the RenderFrame in the renderer process. // Postcondition: |IsPendingDeletion()| is true.
diff --git a/content/browser/renderer_host/render_frame_host_manager.cc b/content/browser/renderer_host/render_frame_host_manager.cc index b61dfcc..a8eea52 100644 --- a/content/browser/renderer_host/render_frame_host_manager.cc +++ b/content/browser/renderer_host/render_frame_host_manager.cc
@@ -1133,11 +1133,13 @@ // `render_frame_host` (the frame whose opener is being updated) might not // have had proxies for the new opener chain in its SiteInstance's group. Make - // sure they exist. + // sure they exist. This is not related to a navigation, so no + // navigation_metrics_token is needed. if (frame_tree_node_->opener()) { frame_tree_node_->opener()->render_manager()->CreateOpenerProxies( render_frame_host->GetSiteInstance()->group(), frame_tree_node_, - render_frame_host->browsing_context_state()); + render_frame_host->browsing_context_state(), + /*navigation_metrics_token=*/std::nullopt); } auto opener_frame_token = @@ -1327,7 +1329,7 @@ // renderer, so that other frames can still communicate with this frame. See // https://crbug.com/653746. if (proxy && !proxy->is_render_frame_proxy_live()) - proxy->InitRenderFrameProxy(); + proxy->InitRenderFrameProxy(/*navigation_metrics_token=*/std::nullopt); } bool RenderFrameHostManager::DeleteFromPendingList( @@ -1967,9 +1969,15 @@ } DiscardSpeculativeRFH(request->GetTypeForNavigationDiscardReason()); + + // Ensure that the navigation metrics token has been created, which should + // have happened when `request` was created. + CHECK(!request->navigation_metrics_token().is_empty()); + bool success = CreateSpeculativeRenderFrameHost( current_site_instance, dest_site_instance.get(), - recovering_without_early_commit, process_allocation_context); + recovering_without_early_commit, process_allocation_context, + request->navigation_metrics_token()); DCHECK(success); if (should_keep_target_process_alive) { @@ -2025,7 +2033,8 @@ RenderFrameHostImpl::LifecycleStateImplToString( navigation_rfh->lifecycle_state())); - if (!ReinitializeMainRenderFrame(navigation_rfh)) { + if (!ReinitializeMainRenderFrame(navigation_rfh, + request->navigation_metrics_token())) { AppendReason(reason, "GetFrameHostForNavigation / main-frame-not-reinitialized"); TRACE_EVENT_INSTANT("navigation", @@ -3230,7 +3239,8 @@ render_frame_host_.get(), blink::RuntimeFeatureStateContext()); } - if (!ReinitializeMainRenderFrame(render_frame_host_.get())) { + if (!ReinitializeMainRenderFrame(render_frame_host_.get(), + /*navigation_metrics_token=*/std::nullopt)) { NOTREACHED(); } @@ -3935,10 +3945,12 @@ SiteInstanceGroup* old_group, SiteInstanceGroup* new_group, bool recovering_without_early_commit, - const scoped_refptr<BrowsingContextState>& browsing_context_state) { + const scoped_refptr<BrowsingContextState>& browsing_context_state, + const std::optional<base::UnguessableToken>& navigation_metrics_token) { // Only create opener proxies if they are in the same BrowsingInstance. if (new_group->IsRelatedSiteInstanceGroup(old_group)) { - CreateOpenerProxies(new_group, frame_tree_node_, browsing_context_state); + CreateOpenerProxies(new_group, frame_tree_node_, browsing_context_state, + navigation_metrics_token); } else { // Ensure that the frame tree has RenderFrameProxyHosts for the // new SiteInstanceGroup in all necessary nodes. We do this for all frames @@ -3948,7 +3960,8 @@ // here. We will still check whether two frames are in the same // BrowsingInstance before we allow them to interact (e.g., postMessage). frame_tree_node_->frame_tree().CreateProxiesForSiteInstanceGroup( - frame_tree_node_, new_group, browsing_context_state); + frame_tree_node_, new_group, browsing_context_state, + navigation_metrics_token); } // When navigating same-site and recovering from a crash, create a proxy @@ -3968,7 +3981,8 @@ // |render_frame_host_->browsing_context_state()| is the right // BrowsingContextState to use. CreateRenderFrameProxy(new_group, - render_frame_host_->browsing_context_state()); + render_frame_host_->browsing_context_state(), + navigation_metrics_token); } } @@ -4004,12 +4018,14 @@ // Start from opener's parent. There's no need to create a proxy in the // opener's SiteInstance's group, since new windows are always first opened in // the same SiteInstanceGroup as their opener, and if the new window navigates - // cross-site, that proxy would be created as part of unloading. + // cross-site, that proxy would be created as part of unloading. This is not + // related to a navigation, so navigation_metrics_token is not passed. for (RenderFrameHostImpl* ancestor = opener->parent(); ancestor; ancestor = ancestor->GetParent()) { if (ancestor->GetSiteInstance()->group() != current_group) { CreateRenderFrameProxy(ancestor->GetSiteInstance()->group(), - browsing_context_state); + browsing_context_state, + /*navigation_metrics_token=*/std::nullopt); } } } @@ -4134,7 +4150,8 @@ SiteInstanceImpl* old_instance, SiteInstanceImpl* new_instance, bool recovering_without_early_commit, - const ProcessAllocationContext& process_allocation_context) { + const ProcessAllocationContext& process_allocation_context, + const std::optional<base::UnguessableToken>& navigation_metrics_token) { TRACE_EVENT("navigation", "RenderFrameHostManager::CreateSpeculativeRenderFrameHost", ChromeTrackEvent::kFrameTreeNodeInfo, *frame_tree_node_, @@ -4240,10 +4257,12 @@ CreateProxiesForNewRenderFrameHost( old_instance->group(), new_instance->group(), - recovering_without_early_commit, browsing_context_state); + recovering_without_early_commit, browsing_context_state, + navigation_metrics_token); speculative_render_frame_host_ = CreateSpeculativeRenderFrame( - new_instance, recovering_without_early_commit, browsing_context_state); + new_instance, recovering_without_early_commit, browsing_context_state, + navigation_metrics_token); return !!speculative_render_frame_host_; } @@ -4251,7 +4270,8 @@ RenderFrameHostManager::CreateSpeculativeRenderFrame( SiteInstanceImpl* instance, bool recovering_without_early_commit, - const scoped_refptr<BrowsingContextState>& browsing_context_state) { + const scoped_refptr<BrowsingContextState>& browsing_context_state, + const std::optional<base::UnguessableToken>& navigation_metrics_token) { TRACE_EVENT("navigation", "RenderFrameHostManager::CreateSpeculativeRenderFrame", ChromeTrackEvent::kFrameTreeNodeInfo, *frame_tree_node_); @@ -4318,7 +4338,8 @@ SiteInstanceGroup* site_instance_group = instance->group(); if (!InitRenderView(site_instance_group, render_view_host, browsing_context_state->GetRenderFrameProxyHost( - site_instance_group))) { + site_instance_group), + navigation_metrics_token)) { return nullptr; } @@ -4349,8 +4370,9 @@ // CreateRenderFrame. In such a case, InitRenderView will not create the // RenderFrame in the renderer process and it needs to be done // explicitly. - if (!InitRenderFrame(new_render_frame_host.get())) + if (!InitRenderFrame(new_render_frame_host.get(), navigation_metrics_token)) { return nullptr; + } return new_render_frame_host; } @@ -4358,6 +4380,7 @@ void RenderFrameHostManager::CreateRenderFrameProxy( SiteInstanceGroup* group, const scoped_refptr<BrowsingContextState>& browsing_context_state, + const std::optional<base::UnguessableToken>& navigation_metrics_token, BatchedProxyIPCSender* batched_proxy_ipc_sender) { CHECK(group); TRACE_EVENT("navigation.debug", @@ -4442,9 +4465,11 @@ // Make sure that the `blink::RemoteFrame` is present in the renderer. if (frame_tree_node_->IsMainFrame() && proxy->GetRenderViewHost()) { - InitRenderView(group, proxy->GetRenderViewHost(), proxy); + InitRenderView(group, proxy->GetRenderViewHost(), proxy, + navigation_metrics_token); } else { - proxy->InitRenderFrameProxy(batched_proxy_ipc_sender); + proxy->InitRenderFrameProxy(navigation_metrics_token, + batched_proxy_ipc_sender); } } @@ -4498,15 +4523,19 @@ continue; } + // Note: Since this is not related to a navigation, no + // navigation_metrics_token is passed. child->render_manager()->CreateRenderFrameProxy( pair.second->site_instance_group(), - child->current_frame_host()->browsing_context_state()); + child->current_frame_host()->browsing_context_state(), + /*navigation_metrics_token=*/std::nullopt); } } void RenderFrameHostManager::EnsureRenderViewInitialized( RenderViewHostImpl* render_view_host, - SiteInstanceGroup* group) { + SiteInstanceGroup* group, + const std::optional<base::UnguessableToken>& navigation_metrics_token) { DCHECK(frame_tree_node_->IsMainFrame()); if (render_view_host->IsRenderViewLive()) @@ -4520,7 +4549,7 @@ if (!proxy) return; - InitRenderView(group, render_view_host, proxy); + InitRenderView(group, render_view_host, proxy, navigation_metrics_token); } void RenderFrameHostManager::SwapOuterDelegateFrame( @@ -4552,7 +4581,8 @@ bool RenderFrameHostManager::InitRenderView( SiteInstanceGroup* site_instance_group, RenderViewHostImpl* render_view_host, - RenderFrameProxyHost* proxy) { + RenderFrameProxyHost* proxy, + const std::optional<base::UnguessableToken>& navigation_metrics_token) { // Ensure the renderer process is initialized before creating the // `blink::WebView`. if (!render_view_host->GetAgentSchedulingGroup().Init()) @@ -4565,7 +4595,7 @@ auto opener_frame_token = GetOpenerFrameToken(site_instance_group); bool created = delegate_->CreateRenderViewForRenderManager( - render_view_host, opener_frame_token, proxy); + render_view_host, opener_frame_token, proxy, navigation_metrics_token); if (created && proxy) { proxy->SetRenderFrameProxyCreated(true); @@ -4688,7 +4718,8 @@ } bool RenderFrameHostManager::InitRenderFrame( - RenderFrameHostImpl* render_frame_host) { + RenderFrameHostImpl* render_frame_host, + const std::optional<base::UnguessableToken>& navigation_metrics_token) { if (render_frame_host->IsRenderFrameLive()) { return true; } @@ -4729,7 +4760,7 @@ render_frame_host->browsing_context_state()->GetRenderFrameProxyHost( site_instance_group); if (existing_proxy && !existing_proxy->is_render_frame_proxy_live()) - existing_proxy->InitRenderFrameProxy(); + existing_proxy->InitRenderFrameProxy(navigation_metrics_token); // Figure out the FrameToken of the frame or proxy that this frame will // replace. This usually will be `existing_proxy`'s FrameToken, but @@ -4739,7 +4770,7 @@ return render_frame_host->CreateRenderFrame( previous_frame_token, opener_frame_token, parent_frame_token, - previous_sibling_frame_token); + previous_sibling_frame_token, navigation_metrics_token); } std::optional<blink::FrameToken> @@ -4789,7 +4820,8 @@ } bool RenderFrameHostManager::ReinitializeMainRenderFrame( - RenderFrameHostImpl* render_frame_host) { + RenderFrameHostImpl* render_frame_host, + const std::optional<base::UnguessableToken>& navigation_metrics_token) { CHECK(!frame_tree_node_->parent()); // This should be used only when the RenderFrame is not live. @@ -4797,17 +4829,19 @@ DCHECK(!render_frame_host->must_be_replaced_for_crash()); // Recreate the opener chain. - CreateOpenerProxies(render_frame_host->GetSiteInstance()->group(), - frame_tree_node_, - render_frame_host_->browsing_context_state()); + CreateOpenerProxies( + render_frame_host->GetSiteInstance()->group(), frame_tree_node_, + render_frame_host_->browsing_context_state(), navigation_metrics_token); // Main frames need both the `blink::WebView` and `RenderFrame` reinitialized, // so use `InitRenderView`. DCHECK(!render_frame_host->browsing_context_state()->GetRenderFrameProxyHost( render_frame_host->GetSiteInstance()->group())); if (!InitRenderView(render_frame_host->GetSiteInstance()->group(), - render_frame_host->render_view_host(), nullptr)) + render_frame_host->render_view_host(), nullptr, + navigation_metrics_token)) { return false; + } DCHECK(render_frame_host->IsRenderFrameLive()); @@ -5512,7 +5546,8 @@ void RenderFrameHostManager::CreateOpenerProxies( SiteInstanceGroup* group, FrameTreeNode* skip_this_node, - const scoped_refptr<BrowsingContextState>& browsing_context_state) { + const scoped_refptr<BrowsingContextState>& browsing_context_state, + const std::optional<base::UnguessableToken>& navigation_metrics_token) { base::ElapsedTimer timer; // TODO(crbug.com/40205442): Add a DCHECK verifying that |instance @@ -5530,7 +5565,8 @@ // nodes need to reference them. for (FrameTree* tree : base::Reversed(opener_frame_trees)) { tree->root()->render_manager()->CreateOpenerProxiesForFrameTree( - group, skip_this_node, browsing_context_state); + group, skip_this_node, browsing_context_state, + navigation_metrics_token); } // Set openers for nodes in |nodes_with_back_links| in a second pass. @@ -5563,7 +5599,8 @@ void RenderFrameHostManager::CreateOpenerProxiesForFrameTree( SiteInstanceGroup* group, FrameTreeNode* skip_this_node, - const scoped_refptr<BrowsingContextState>& browsing_context_state) { + const scoped_refptr<BrowsingContextState>& browsing_context_state, + const std::optional<base::UnguessableToken>& navigation_metrics_token) { // Currently, this function is only called on main frames. It should // actually work correctly for subframes as well, so if that need ever // arises, it should be sufficient to remove this DCHECK. @@ -5577,8 +5614,8 @@ if (skip_this_node && &skip_this_node->frame_tree() != &frame_tree) { skip_this_node = nullptr; } - frame_tree.CreateProxiesForSiteInstanceGroup(skip_this_node, group, - browsing_context_state); + frame_tree.CreateProxiesForSiteInstanceGroup( + skip_this_node, group, browsing_context_state, navigation_metrics_token); } std::optional<blink::FrameToken> RenderFrameHostManager::GetOpenerFrameToken( @@ -5707,7 +5744,8 @@ current_frame_host()->GetParent()->GetSiteInstance(), /*recovering_without_early_commit=*/false, ProcessAllocationContext{ - ProcessAllocationSource::kNoProcessCreationExpected})) { + ProcessAllocationSource::kNoProcessCreationExpected}, + /*navigation_metrics_token=*/std::nullopt)) { NotifyPrepareForInnerDelegateAttachComplete(false /* success */); return; }
diff --git a/content/browser/renderer_host/render_frame_host_manager.h b/content/browser/renderer_host/render_frame_host_manager.h index 9db49a1..318b14650 100644 --- a/content/browser/renderer_host/render_frame_host_manager.h +++ b/content/browser/renderer_host/render_frame_host_manager.h
@@ -195,10 +195,17 @@ // process is not shared, then the WebContentsImpl will act as though the // renderer is not running (i.e., it will render "sad tab"). This method is // automatically called from LoadURL. + // + // `navigation_metrics_token` is a token identifying the navigation for + // which this view is being created, if any. It allows metrics code and + // trace events to tie together different IPCs and events pertaining to a + // particular navigation. virtual bool CreateRenderViewForRenderManager( RenderViewHost* render_view_host, const std::optional<blink::FrameToken>& opener_frame_token, - RenderFrameProxyHost* proxy_host) = 0; + RenderFrameProxyHost* proxy_host, + const std::optional<base::UnguessableToken>& + navigation_metrics_token) = 0; virtual void CreateRenderWidgetHostViewForRenderManager( RenderViewHost* render_view_host) = 0; virtual void BeforeUnloadFiredFromRenderManager( @@ -391,23 +398,36 @@ // it will be committed immediately. If false the it will be committed later, // following the usual navigation path. |browsing_context_state| is the // BrowsingContextState that will be stored in the speculative - // RenderFrameHost. + // RenderFrameHost. `navigation_metrics_token` is a token identifying the + // navigation for which this speculative frame is being created; it allows + // metrics code and trace events to tie together different IPCs and events + // pertaining to a particular navigation. This token should be nullopt if this + // function is used for a non-navigation case, such as when attaching inner + // frame trees. std::unique_ptr<RenderFrameHostImpl> CreateSpeculativeRenderFrame( SiteInstanceImpl* instance, bool for_early_commit, - const scoped_refptr<BrowsingContextState>& browsing_context_state); + const scoped_refptr<BrowsingContextState>& browsing_context_state, + const std::optional<base::UnguessableToken>& navigation_metrics_token); // Helper method to create and initialize a `RenderFrameProxyHost`. // `browsing_context_state` is the `BrowsingContextState` in which the newly - // created `RenderFrameProxyHost` will be stored. If - // `batched_proxy_ipc_sender` is not null, then proxy creation will be + // created `RenderFrameProxyHost` will be stored. + // + // If this proxy is being created as part of a new navigation, + // `navigation_metrics_token` identifies that navigation for metrics purposes. + // This token is nullopt when this proxy is not created for a navigation, such + // as when adding proxies for a new subframe created via CreateChildFrame. + // + // If `batched_proxy_ipc_sender` is not null, then proxy creation will be // delayed, and batched created later when - // `BatchedProxyIPCSender::CreateAllProxies()` is called. The only - // case where `batched_proxy_ipc_sender` is not null is when called by + // `BatchedProxyIPCSender::CreateAllProxies()` is called. The only case where + // `batched_proxy_ipc_sender` is not null is when called by // `FrameTree::CreateProxiesForSiteInstance()`. void CreateRenderFrameProxy( SiteInstanceGroup* group, const scoped_refptr<BrowsingContextState>& browsing_context_state, + const std::optional<base::UnguessableToken>& navigation_metrics_token, BatchedProxyIPCSender* batched_proxy_ipc_sender = nullptr); // Creates proxies for a new child frame at FrameTreeNode |child| in all @@ -520,8 +540,10 @@ void OnDidUpdateFrameOwnerProperties( const blink::mojom::FrameOwnerProperties& properties); - void EnsureRenderViewInitialized(RenderViewHostImpl* render_view_host, - SiteInstanceGroup* group); + void EnsureRenderViewInitialized( + RenderViewHostImpl* render_view_host, + SiteInstanceGroup* group, + const std::optional<base::UnguessableToken>& navigation_metrics_token); // Creates RenderFrameProxies and inactive RenderViewHosts for this frame's // FrameTree and for its opener chain in the given SiteInstanceGroup. This @@ -533,10 +555,13 @@ // case it is in the same FrameTree as another node on its opener chain). // |browsing_context_state| is the BrowsingContextState that is used in the // speculative RenderFrameHost for cross browsing-instance navigations. + // If these proxies are being created as part of a new navigation, + // `navigation_metrics_token` identifies that navigation for metrics purposes. void CreateOpenerProxies( SiteInstanceGroup* group, FrameTreeNode* skip_this_node, - const scoped_refptr<BrowsingContextState>& browsing_context_state); + const scoped_refptr<BrowsingContextState>& browsing_context_state, + const std::optional<base::UnguessableToken>& navigation_metrics_token); // Ensure that this frame has proxies in all SiteInstances that can discover // this frame by name (e.g., via window.open("", "frame_name")). See @@ -610,9 +635,13 @@ // null, it creates a `blink::RemoteFrame` in the target renderer process // which is used to route IPC messages. Returns early if the RenderViewHost // has already been initialized for another RenderFrameHost. - bool InitRenderView(SiteInstanceGroup* site_instance_group, - RenderViewHostImpl* render_view_host, - RenderFrameProxyHost* proxy); + // If the RenderView and proxy are being created as part of a new navigation, + // `navigation_metrics_token` identifies that navigation for metrics purposes. + bool InitRenderView( + SiteInstanceGroup* site_instance_group, + RenderViewHostImpl* render_view_host, + RenderFrameProxyHost* proxy, + const std::optional<base::UnguessableToken>& navigation_metrics_token); // Returns the SiteInstance that should be used to host the navigation handled // by |navigation_request|. @@ -933,11 +962,14 @@ // speculative RenderFrameHost for cross browsing-instance navigations. // TODO(https://crbug.com/40202433): Formalize an invariant that this function // is a no-op if |old_group| and |new_group| are the same. + // If the proxies are being created as part of a new navigation, + // `navigation_metrics_token` identifies that navigation for metrics purposes. void CreateProxiesForNewRenderFrameHost( SiteInstanceGroup* old_group, SiteInstanceGroup* new_group, bool recovering_without_early_commit, - const scoped_refptr<BrowsingContextState>& browsing_context_state); + const scoped_refptr<BrowsingContextState>& browsing_context_state, + const std::optional<base::UnguessableToken>& navigation_metrics_token); // Traverse the opener chain and populate `opener_frame_trees` with // all FrameTrees accessible by following frame openers of nodes in the @@ -958,11 +990,13 @@ // the opener chain. Don't create proxies for the subtree rooted at // |skip_this_node|. |browsing_context_state| is the BrowsingContextState that // is used in the speculative RenderFrameHost for cross browsing-instance - // navigations. + // navigations. If the proxies are being created as part of a new navigation, + // `navigation_metrics_token` identifies that navigation for metrics purposes. void CreateOpenerProxiesForFrameTree( SiteInstanceGroup* group, FrameTreeNode* skip_this_node, - const scoped_refptr<BrowsingContextState>& browsing_context_state); + const scoped_refptr<BrowsingContextState>& browsing_context_state, + const std::optional<base::UnguessableToken>& navigation_metrics_token); // The different types of RenderFrameHost creation that can occur. // See CreateRenderFrameHost for how these influence creation. @@ -998,16 +1032,23 @@ // navigation. It might be destroyed and re-created later if the navigation is // redirected to a different SiteInstance. |recovering_without_early_commit| // is true if we are reviving a crashed render frame by creating a proxy and - // committing later rather than doing an immediate commit. + // committing later rather than doing an immediate commit. If the speculative + // RenderFrameHost is being created as part of a new navigation, + // `navigation_metrics_token` identifies that navigation for metrics purposes. + // This token should be nullopt if this function is used for a non-navigation + // case, such as when attaching inner frame trees. bool CreateSpeculativeRenderFrameHost( SiteInstanceImpl* old_instance, SiteInstanceImpl* new_instance, bool recovering_without_early_commit, - const ProcessAllocationContext& process_allocation_context); + const ProcessAllocationContext& process_allocation_context, + const std::optional<base::UnguessableToken>& navigation_metrics_token); // Initialization for RenderFrameHost uses the same sequence as InitRenderView // above. - bool InitRenderFrame(RenderFrameHostImpl* render_frame_host); + bool InitRenderFrame( + RenderFrameHostImpl* render_frame_host, + const std::optional<base::UnguessableToken>& navigation_metrics_token); // Find the `blink::FrameToken` of the frame or proxy that this frame will // replace or std::nullopt if there is none. When initializing a new @@ -1022,8 +1063,12 @@ // Helper to reinitialize the RenderFrame, RenderView, and the opener chain // for the provided |render_frame_host|. Used when the |render_frame_host| - // needs to be reused for a new navigation, but it is not live. - bool ReinitializeMainRenderFrame(RenderFrameHostImpl* render_frame_host); + // needs to be reused for a new navigation, but it is not live. If this is + // done as part of a new navigation, `navigation_metrics_token` identifies + // that navigation for metrics purposes. + bool ReinitializeMainRenderFrame( + RenderFrameHostImpl* render_frame_host, + const std::optional<base::UnguessableToken>& navigation_metrics_token); // Sets the |pending_rfh| to be the active one. Called when the pending // RenderFrameHost commits.
diff --git a/content/browser/renderer_host/render_frame_host_manager_unittest.cc b/content/browser/renderer_host/render_frame_host_manager_unittest.cc index 439afea..d4fc791 100644 --- a/content/browser/renderer_host/render_frame_host_manager_unittest.cc +++ b/content/browser/renderer_host/render_frame_host_manager_unittest.cc
@@ -1199,7 +1199,7 @@ web_contents1->GetPrimaryFrameTree().root()->render_manager(); // Test the case that new RVH is considered live. RenderViewHostImpl* rvh1 = manager1->current_frame_host()->render_view_host(); - rvh1->CreateRenderView(std::nullopt, MSG_ROUTING_NONE, false); + rvh1->CreateRenderView(std::nullopt, MSG_ROUTING_NONE, false, std::nullopt); EXPECT_TRUE(rvh1->IsRenderViewLive()); EXPECT_TRUE(manager1->current_frame_host()->IsRenderFrameLive()); @@ -1240,7 +1240,7 @@ // Make sure the new RVH is considered live. This is usually done in // RenderWidgetHost::Init when opening a new tab from a link. RenderViewHostImpl* rvh2 = manager2->current_frame_host()->render_view_host(); - rvh2->CreateRenderView(std::nullopt, MSG_ROUTING_NONE, false); + rvh2->CreateRenderView(std::nullopt, MSG_ROUTING_NONE, false, std::nullopt); EXPECT_TRUE(rvh2->IsRenderViewLive()); const GURL kUrl2(GetWebUIURL("foo/bar")); @@ -1574,7 +1574,8 @@ // Make sure the new opener RVH is considered live. RenderViewHostImpl* opener_rvh = opener1_manager->current_frame_host()->render_view_host(); - opener_rvh->CreateRenderView(std::nullopt, MSG_ROUTING_NONE, false); + opener_rvh->CreateRenderView(std::nullopt, MSG_ROUTING_NONE, false, + std::nullopt); EXPECT_TRUE(opener_rvh->IsRenderViewLive()); EXPECT_TRUE(opener1_manager->current_frame_host()->IsRenderFrameLive());
diff --git a/content/browser/renderer_host/render_frame_proxy_host.cc b/content/browser/renderer_host/render_frame_proxy_host.cc index dc3a4db2..2c2e4c1 100644 --- a/content/browser/renderer_host/render_frame_proxy_host.cc +++ b/content/browser/renderer_host/render_frame_proxy_host.cc
@@ -133,7 +133,7 @@ render_frame_proxy_created_(false), render_view_host_(std::move(render_view_host)), frame_token_(frame_token) { - TRACE_EVENT_BEGIN("navigation", "RenderFrameProxyHost", + TRACE_EVENT_BEGIN("navigation.debug", "RenderFrameProxyHost", perfetto::Track::FromPointer(this), "render_frame_proxy_host_when_created", *this); GetAgentSchedulingGroup().AddRoute(routing_id_, this); @@ -197,7 +197,7 @@ g_routing_id_frame_proxy_map.Get().erase( RenderFrameProxyHostID(GetProcess()->GetDeprecatedID(), routing_id_)); g_token_frame_proxy_map.Get().erase(frame_token_); - TRACE_EVENT_END("navigation", perfetto::Track::FromPointer(this)); + TRACE_EVENT_END("navigation.debug", perfetto::Track::FromPointer(this)); } void RenderFrameProxyHost::SetChildRWHView(RenderWidgetHostViewChildFrame* view, @@ -225,6 +225,7 @@ } bool RenderFrameProxyHost::InitRenderFrameProxy( + const std::optional<base::UnguessableToken>& navigation_metrics_token, BatchedProxyIPCSender* batched_proxy_ipc_sender) { DCHECK(!render_frame_proxy_created_); // We shouldn't be creating proxies for subframes of frames in @@ -308,6 +309,12 @@ // `BatchedProxyIPCSender::CreateAllProxies`, after all proxies // are created. } else { + // Note that `navigation_metrics_token` is intentionally *not* passed in + // this IPC. This is because in practice, this path is no longer used for + // creating proxies during a navigation; this is done via + // `batched_proxy_ipc_sender` above instead. This path is still used for + // non-navigation proxy creation, such as creating proxies for a newly + // created subframe. parent_proxy->GetAssociatedRemoteFrame()->CreateRemoteChild( frame_token_, opener_frame_token, frame_tree_node_->tree_scope_type(), frame_tree_node_->current_replication_state().Clone(), @@ -321,7 +328,7 @@ frame_token_, opener_frame_token, frame_tree_node_->current_replication_state().Clone(), frame_tree_node_->IsLoading(), devtools_frame_token, - CreateAndBindRemoteFrameInterfaces(), + navigation_metrics_token, CreateAndBindRemoteFrameInterfaces(), CreateAndBindRemoteMainFrameInterfaces()); SetRenderFrameProxyCreated(true); } @@ -379,7 +386,8 @@ if (frame_tree_node_->opener()) { frame_tree_node_->opener()->render_manager()->CreateOpenerProxies( site_instance_group(), frame_tree_node_, - frame_tree_node_->current_frame_host()->browsing_context_state()); + frame_tree_node_->current_frame_host()->browsing_context_state(), + /*navigation_metrics_token=*/std::nullopt); } if (!is_render_frame_proxy_live()) @@ -685,7 +693,8 @@ ->render_manager() ->CreateRenderFrameProxy( target_rfh->GetSiteInstance()->group(), - source_rfh->GetMainFrame()->browsing_context_state()); + source_rfh->GetMainFrame()->browsing_context_state(), + /*navigation_metrics_token=*/std::nullopt); } else if (is_guest_to_embedder_communication) { // A RenderFrameProxyHost was already created when the guest was // attached. @@ -737,9 +746,10 @@ source_rfh->frame_tree_node()->current_frame_host()); source_rfh->frame_tree_node() ->render_manager() - ->CreateOpenerProxies(target_rfh->GetSiteInstance()->group(), - nullptr, - source_rfh->browsing_context_state()); + ->CreateOpenerProxies( + target_rfh->GetSiteInstance()->group(), nullptr, + source_rfh->browsing_context_state(), + /*navigation_metrics_token=*/std::nullopt); did_call_create_opener_proxies = true; } }
diff --git a/content/browser/renderer_host/render_frame_proxy_host.h b/content/browser/renderer_host/render_frame_proxy_host.h index be8fcae..07274495 100644 --- a/content/browser/renderer_host/render_frame_proxy_host.h +++ b/content/browser/renderer_host/render_frame_proxy_host.h
@@ -123,10 +123,13 @@ RenderProcessHost* GetProcess() const { return process_; } // Initializes the object and creates the `blink::RemoteFrame` in the process - // for the `site_instance_group_`. If `batched_proxy_ipc_sender` is not null, + // for the `site_instance_group_`. If this proxy is being initialized as part + // of a new navigation, `navigation_metrics_token` identifies that navigation + // for metrics purposes. If `batched_proxy_ipc_sender` is not null, // then the proxy will not be created immediately. It will be batch created // later. bool InitRenderFrameProxy( + const std::optional<base::UnguessableToken>& navigation_metrics_token, BatchedProxyIPCSender* batched_proxy_ipc_sender = nullptr); int GetRoutingID() const { return routing_id_; }
diff --git a/content/browser/renderer_host/render_view_host_impl.cc b/content/browser/renderer_host/render_view_host_impl.cc index 4a70fd01..6e6d9a3e 100644 --- a/content/browser/renderer_host/render_view_host_impl.cc +++ b/content/browser/renderer_host/render_view_host_impl.cc
@@ -328,7 +328,7 @@ "Navigation.RenderViewHostConstructor"); TRACE_EVENT("navigation", "RenderViewHostImpl::RenderViewHostImpl", ChromeTrackEvent::kRenderViewHost, *this); - TRACE_EVENT_BEGIN("navigation", "RenderViewHost", + TRACE_EVENT_BEGIN("navigation.debug", "RenderViewHost", perfetto::Track::FromPointer(this), "render_view_host_when_created", this); @@ -390,7 +390,7 @@ frame_tree_->UnregisterRenderViewHost(render_view_host_map_id_, this); // Corresponds to the TRACE_EVENT_BEGIN in RenderViewHostImpl's constructor. - TRACE_EVENT_END("navigation", perfetto::Track::FromPointer(this)); + TRACE_EVENT_END("navigation.debug", perfetto::Track::FromPointer(this)); } RenderViewHostDelegate* RenderViewHostImpl::GetDelegate() { @@ -411,7 +411,8 @@ bool RenderViewHostImpl::CreateRenderView( const std::optional<blink::FrameToken>& opener_frame_token, int proxy_route_id, - bool window_was_opened_by_another_window) { + bool window_was_opened_by_another_window, + const std::optional<base::UnguessableToken>& navigation_metrics_token) { TRACE_EVENT0("renderer_host,navigation", "RenderViewHostImpl::CreateRenderView"); DCHECK(!IsRenderViewLive()) << "Creating view twice"; @@ -456,6 +457,7 @@ params->devtools_main_frame_token = frame_tree_node->current_frame_host()->devtools_frame_token(); DCHECK_EQ(&frame_tree_node->frame_tree(), frame_tree_); + params->navigation_metrics_token = navigation_metrics_token; if (frame_tree_->is_prerendering() || frame_tree_->page_delegate()->IsPageInPreviewMode()) {
diff --git a/content/browser/renderer_host/render_view_host_impl.h b/content/browser/renderer_host/render_view_host_impl.h index 56e52f0..f9dc4c4 100644 --- a/content/browser/renderer_host/render_view_host_impl.h +++ b/content/browser/renderer_host/render_view_host_impl.h
@@ -153,10 +153,14 @@ // "noopener", and even if the opener has been closed since. // `proxy_route_id` is only used when creating a `blink::WebView` in an // inactive state. + // `navigation_metrics_token` identifies the navigation for which this + // view is being created, if any. This is used for navigation-related + // metrics and trace events recorded in the renderer process. virtual bool CreateRenderView( const std::optional<blink::FrameToken>& opener_frame_token, int proxy_route_id, - bool window_was_opened_by_another_window); + bool window_was_opened_by_another_window, + const std::optional<base::UnguessableToken>& navigation_metrics_token); RenderViewHostDelegate* GetDelegate();
diff --git a/content/browser/web_contents/web_contents_impl.cc b/content/browser/web_contents/web_contents_impl.cc index 55efc47d..c7e153a0 100644 --- a/content/browser/web_contents/web_contents_impl.cc +++ b/content/browser/web_contents/web_contents_impl.cc
@@ -3232,7 +3232,7 @@ // calls below will just early return. inner_render_manager->InitRenderView( inner_main_frame->GetSiteInstance()->group(), inner_render_view_host, - nullptr); + /*proxy=*/nullptr, /*navigation_metrics_token=*/std::nullopt); if (!inner_render_manager->GetRenderWidgetHostView()) { inner_web_contents_impl->CreateRenderWidgetHostViewForRenderManager( inner_render_view_host); @@ -3346,7 +3346,7 @@ // call below will just early return. inner_render_manager->InitRenderView( inner_main_frame->GetSiteInstance()->group(), inner_render_view_host, - /*proxy=*/nullptr); + /*proxy=*/nullptr, /*navigation_metrics_token=*/std::nullopt); // If we are reusing the RenderViewHost and it doesn't already have a // RenderWidgetHostView, we need to create one if this is the main frame. @@ -4017,8 +4017,9 @@ if (params.desired_renderer_state == CreateParams::kInitializeAndWarmupRendererProcess) { if (!GetRenderManager()->current_frame_host()->IsRenderFrameLive()) { - GetRenderManager()->InitRenderView(site_instance->group(), - GetRenderViewHost(), nullptr); + GetRenderManager()->InitRenderView( + site_instance->group(), GetRenderViewHost(), /*proxy=*/nullptr, + /*navigation_metrics_token=*/std::nullopt); } } @@ -4235,6 +4236,12 @@ } } +void WebContentsImpl::PreHandleDragExit() { + if (delegate_) { + delegate_->PreHandleDragExit(); + } +} + KeyboardEventProcessingResult WebContentsImpl::PreHandleKeyboardEvent( const input::NativeWebKeyboardEvent& event) { OPTIONAL_TRACE_EVENT0(TRACE_DISABLED_BY_DEFAULT("content.verbose"), @@ -10348,7 +10355,8 @@ bool WebContentsImpl::CreateRenderViewForRenderManager( RenderViewHost* render_view_host, const std::optional<blink::FrameToken>& opener_frame_token, - RenderFrameProxyHost* proxy_host) { + RenderFrameProxyHost* proxy_host, + const std::optional<base::UnguessableToken>& navigation_metrics_token) { TRACE_EVENT1("browser,navigation", "WebContentsImpl::CreateRenderViewForRenderManager", "render_view_host", render_view_host); @@ -10366,7 +10374,8 @@ // TODO(crbug.com/40166243): Given MPArch, should we pass // opened_by_another_window_ for non primary FrameTrees? if (!rvh_impl->CreateRenderView(opener_frame_token, proxy_routing_id, - opened_by_another_window_)) { + opened_by_another_window_, + navigation_metrics_token)) { return false; }
diff --git a/content/browser/web_contents/web_contents_impl.h b/content/browser/web_contents/web_contents_impl.h index c6eafe5..08497c5 100644 --- a/content/browser/web_contents/web_contents_impl.h +++ b/content/browser/web_contents/web_contents_impl.h
@@ -1120,6 +1120,7 @@ bool PreHandleMouseEvent(const blink::WebMouseEvent& event) override; void PreHandleDragUpdate(const DropData& drop_data, const gfx::PointF& client_pt); + void PreHandleDragExit(); KeyboardEventProcessingResult PreHandleKeyboardEvent( const input::NativeWebKeyboardEvent& event) override; bool HandleMouseEvent(const blink::WebMouseEvent& event) override; @@ -1207,7 +1208,9 @@ bool CreateRenderViewForRenderManager( RenderViewHost* render_view_host, const std::optional<blink::FrameToken>& opener_frame_token, - RenderFrameProxyHost* proxy_host) override; + RenderFrameProxyHost* proxy_host, + const std::optional<base::UnguessableToken>& navigation_metrics_token) + override; void ReattachOuterDelegateIfNeeded() override; void CreateRenderWidgetHostViewForRenderManager( RenderViewHost* render_view_host) override;
diff --git a/content/browser/web_contents/web_contents_impl_unittest.cc b/content/browser/web_contents/web_contents_impl_unittest.cc index 87f8472..be5ac0e 100644 --- a/content/browser/web_contents/web_contents_impl_unittest.cc +++ b/content/browser/web_contents/web_contents_impl_unittest.cc
@@ -1059,7 +1059,9 @@ TestWebContents::Create(browser_context(), instance)); popup->SetOpener(contents()); contents()->GetRenderManager()->CreateOpenerProxies( - instance->group(), nullptr, pending_rfh->browsing_context_state()); + instance->group(), /*skip_this_node=*/nullptr, + pending_rfh->browsing_context_state(), + /*navigation_metrics_token=*/std::nullopt); // If swapped out is forbidden, a new proxy should be created for the opener // in the group |instance| belongs to, and we should ensure that its routing
diff --git a/content/browser/web_contents/web_contents_view_aura.cc b/content/browser/web_contents/web_contents_view_aura.cc index 90615f5..2836fccd 100644 --- a/content/browser/web_contents/web_contents_view_aura.cc +++ b/content/browser/web_contents/web_contents_view_aura.cc
@@ -1539,6 +1539,8 @@ void WebContentsViewAura::CompleteDragExit() { drag_in_progress_ = false; + web_contents_->PreHandleDragExit(); + if (current_rwh_for_drag_ && !web_contents_->IsBeingDestroyed() && current_rvh_for_drag_ == GetRenderViewHostID(web_contents_->GetRenderViewHost())) {
diff --git a/content/browser/web_contents/web_drag_dest_mac.mm b/content/browser/web_contents/web_drag_dest_mac.mm index 495aa05..31ce1f2 100644 --- a/content/browser/web_contents/web_drag_dest_mac.mm +++ b/content/browser/web_contents/web_drag_dest_mac.mm
@@ -274,6 +274,8 @@ if (_webContents->ShouldIgnoreInputEvents()) return; + _webContents->PreHandleDragExit(); + if (!_dropDataFiltered || !_dropDataUnfiltered) return;
diff --git a/content/child/runtime_features.cc b/content/child/runtime_features.cc index d157689a..78972aa 100644 --- a/content/child/runtime_features.cc +++ b/content/child/runtime_features.cc
@@ -411,7 +411,9 @@ {"WebAppLaunchQueue", raw_ref(features::kAndroidWebAppLaunchHandler)}, #endif {"WebAuthenticationNewBfCacheHandlingBlink", - raw_ref(device::kWebAuthnNewBfCacheHandling)}}; + raw_ref(device::kWebAuthnNewBfCacheHandling)}, + {"LocalNetworkAccessPermissionPolicy", + raw_ref(network::features::kLocalNetworkAccessChecks)}}; for (const auto& mapping : runtimeFeatureNameToChromiumFeatureMapping) { SetRuntimeFeatureFromChromiumFeature( *mapping.chromium_feature, mapping.option, [&mapping](bool enabled) {
diff --git a/content/common/frame.mojom b/content/common/frame.mojom index d1e85817..09f1899c 100644 --- a/content/common/frame.mojom +++ b/content/common/frame.mojom
@@ -173,6 +173,10 @@ // This must be null unless the view being created is a partitioned popin. // See https://explainers-by-googlers.github.io/partitioned-popins/ blink.mojom.PartitionedPopinParams? partitioned_popin_params; + + // Identifies the navigation that triggered this view creation, if any. Used + // for collecting metrics. + mojo_base.mojom.UnguessableToken? navigation_metrics_token; }; // A union to distinguish between parameters specific to local main frame @@ -353,6 +357,10 @@ // Set if this frame corresponds to the main frame for a non top-level // FrameTree (GuestView, fenced frame etc.). bool is_for_nested_main_frame; + + // Identifies the navigation that triggered this frame creation, if any. Used + // for collecting metrics. + mojo_base.mojom.UnguessableToken? navigation_metrics_token; }; // Provided with each call to Frame::GetSerializedHtmlWithLocalLinks() so that
diff --git a/content/public/android/java/src/org/chromium/content/browser/BackgroundSyncNetworkObserver.java b/content/public/android/java/src/org/chromium/content/browser/BackgroundSyncNetworkObserver.java index 6ee7731..d0c81b10 100644 --- a/content/public/android/java/src/org/chromium/content/browser/BackgroundSyncNetworkObserver.java +++ b/content/public/android/java/src/org/chromium/content/browser/BackgroundSyncNetworkObserver.java
@@ -56,7 +56,7 @@ private static @Nullable BackgroundSyncNetworkObserver sInstance; // List of native observers. These are each called when the network state changes. - private List<Long> mNativePtrs; + private final List<Long> mNativePtrs; private @ConnectionType int mLastBroadcastConnectionType; private boolean mHasBroadcastConnectionType;
diff --git a/content/public/android/java/src/org/chromium/content/browser/GestureListenerManagerImpl.java b/content/public/android/java/src/org/chromium/content/browser/GestureListenerManagerImpl.java index ad79061..5921d30c 100644 --- a/content/public/android/java/src/org/chromium/content/browser/GestureListenerManagerImpl.java +++ b/content/public/android/java/src/org/chromium/content/browser/GestureListenerManagerImpl.java
@@ -66,7 +66,7 @@ private final RewindableIterator<GestureStateListener> mIterator; private final HashMap<GestureStateListener, Integer> mListenerFrequency; private @Nullable SelectionPopupControllerImpl mSelectionPopupController; - private ViewAndroidDelegate mViewDelegate; + private final ViewAndroidDelegate mViewDelegate; private @Nullable InternalAccessDelegate mScrollDelegate; private final boolean mHidePastePopupOnGSB; private final boolean mResetGestureDetectionOnLosingFocus;
diff --git a/content/public/android/java/src/org/chromium/content/browser/MediaSessionImpl.java b/content/public/android/java/src/org/chromium/content/browser/MediaSessionImpl.java index edcbeb2..93b3a10 100644 --- a/content/public/android/java/src/org/chromium/content/browser/MediaSessionImpl.java +++ b/content/public/android/java/src/org/chromium/content/browser/MediaSessionImpl.java
@@ -32,8 +32,8 @@ public class MediaSessionImpl extends MediaSession { private long mNativeMediaSessionAndroid; - private ObserverList<MediaSessionObserver> mObservers; - private ObserverList.RewindableIterator<MediaSessionObserver> mObserversIterator; + private final ObserverList<MediaSessionObserver> mObservers; + private final ObserverList.RewindableIterator<MediaSessionObserver> mObserversIterator; private boolean mIsControllable; private @Nullable Boolean mIsSuspended;
diff --git a/content/public/android/java/src/org/chromium/content/browser/ScreenOrientationProviderImpl.java b/content/public/android/java/src/org/chromium/content/browser/ScreenOrientationProviderImpl.java index 5726050..935ee99 100644 --- a/content/public/android/java/src/org/chromium/content/browser/ScreenOrientationProviderImpl.java +++ b/content/public/android/java/src/org/chromium/content/browser/ScreenOrientationProviderImpl.java
@@ -36,7 +36,7 @@ public class ScreenOrientationProviderImpl implements ActivityStateListener, ScreenOrientationProvider { private static class Holder { - private static ScreenOrientationProviderImpl sInstance = + private static final ScreenOrientationProviderImpl sInstance = new ScreenOrientationProviderImpl(); } @@ -54,7 +54,7 @@ * The values of the map are the most recent default web screen orientation request for each * activity. */ - private Map<Activity, Byte> mDefaultOrientationOverrides = new WeakHashMap<>(); + private final Map<Activity, Byte> mDefaultOrientationOverrides = new WeakHashMap<>(); /** * The keys of the map are the activities for which screen orientation requests are @@ -63,7 +63,7 @@ * The map will contain an entry with a null value if screen orientation requests are delayed * for an activity but no screen orientation requests have been made for the activity. */ - private Map<Activity, Pair<Boolean, Integer>> mDelayedRequests = new WeakHashMap<>(); + private final Map<Activity, Pair<Boolean, Integer>> mDelayedRequests = new WeakHashMap<>(); private static final class PendingRequest implements WindowEventObserver { private final ScreenOrientationProviderImpl mProvider;
diff --git a/content/public/android/java/src/org/chromium/content/browser/ServicificationStartupUma.java b/content/public/android/java/src/org/chromium/content/browser/ServicificationStartupUma.java index ba961db..8efa298 100644 --- a/content/public/android/java/src/org/chromium/content/browser/ServicificationStartupUma.java +++ b/content/public/android/java/src/org/chromium/content/browser/ServicificationStartupUma.java
@@ -40,7 +40,7 @@ } // Caches the pending commits before the native is initialized. - private int[] mPendingCommits = new int[ServicificationStartup.NUM_ENTRIES]; + private final int[] mPendingCommits = new int[ServicificationStartup.NUM_ENTRIES]; private boolean mIsNativeInitialized; private static final ServicificationStartupUma sInstance = new ServicificationStartupUma();
diff --git a/content/public/android/java/src/org/chromium/content/browser/TtsPlatformImpl.java b/content/public/android/java/src/org/chromium/content/browser/TtsPlatformImpl.java index 3b37017..8bab77b 100644 --- a/content/public/android/java/src/org/chromium/content/browser/TtsPlatformImpl.java +++ b/content/public/android/java/src/org/chromium/content/browser/TtsPlatformImpl.java
@@ -51,14 +51,14 @@ } private static class PendingUtterance { - TtsPlatformImpl mImpl; - int mUtteranceId; - String mText; - String mLang; - String mEngineId; - float mRate; - float mPitch; - float mVolume; + final TtsPlatformImpl mImpl; + final int mUtteranceId; + final String mText; + final String mLang; + final String mEngineId; + final float mRate; + final float mPitch; + final float mVolume; private PendingUtterance( TtsPlatformImpl impl, @@ -85,7 +85,7 @@ } private static class TtsEngine { - private TextToSpeech mTextToSpeech; + private final TextToSpeech mTextToSpeech; private @Nullable List<TtsVoice> mVoices; private boolean mInitialized; private @Nullable String mCurrentLanguage;
diff --git a/content/public/android/java/src/org/chromium/content/browser/WindowEventObserverManager.java b/content/public/android/java/src/org/chromium/content/browser/WindowEventObserverManager.java index 948309e..6cca26e 100644 --- a/content/public/android/java/src/org/chromium/content/browser/WindowEventObserverManager.java +++ b/content/public/android/java/src/org/chromium/content/browser/WindowEventObserverManager.java
@@ -23,7 +23,7 @@ private final ObserverList<WindowEventObserver> mWindowEventObservers = new ObserverList<>(); private @Nullable WindowAndroid mWindowAndroid; - private ViewEventSinkImpl mViewEventSink; + private final ViewEventSinkImpl mViewEventSink; private boolean mAttachedToWindow; // The cache of device's current orientation and DIP scale factor.
diff --git a/content/public/android/java/src/org/chromium/content/browser/accessibility/AccessibilityActionAndEventTracker.java b/content/public/android/java/src/org/chromium/content/browser/accessibility/AccessibilityActionAndEventTracker.java index 4401b0b5e..cf68f89 100644 --- a/content/public/android/java/src/org/chromium/content/browser/accessibility/AccessibilityActionAndEventTracker.java +++ b/content/public/android/java/src/org/chromium/content/browser/accessibility/AccessibilityActionAndEventTracker.java
@@ -15,7 +15,7 @@ /** Helper class for tracking accessibility actions and events for end-to-end tests. */ @NullMarked public class AccessibilityActionAndEventTracker { - private LinkedList<String> mEvents; + private final LinkedList<String> mEvents; private boolean mTestComplete; public AccessibilityActionAndEventTracker() {
diff --git a/content/public/android/java/src/org/chromium/content/browser/accessibility/AccessibilityEventDispatcher.java b/content/public/android/java/src/org/chromium/content/browser/accessibility/AccessibilityEventDispatcher.java index 00522047..e5a162b 100644 --- a/content/public/android/java/src/org/chromium/content/browser/accessibility/AccessibilityEventDispatcher.java +++ b/content/public/android/java/src/org/chromium/content/browser/accessibility/AccessibilityEventDispatcher.java
@@ -22,12 +22,12 @@ public class AccessibilityEventDispatcher { // Maps an AccessibilityEvent type to a throttle delay in milliseconds. This is populated once // in the constructor. - private Map<Integer, Integer> mEventThrottleDelays; + private final Map<Integer, Integer> mEventThrottleDelays; // Set of AccessibilityEvent types to throttle wholesale, rather than on a per |virtualViewId| // basis. Delays are still set independently in the |mEventThrottleDelays| map. This is // populated once in the constructor. - private Set<Integer> mViewIndependentEventsToThrottle; + private final Set<Integer> mViewIndependentEventsToThrottle; // Set of AccessibilityEvent types that are relevant to enabled accessibility services and // will be enqueued to be dispatched. @@ -35,15 +35,15 @@ // For events being throttled (see: |mEventsToThrottle|), this array will map the eventType // to the last time (long in milliseconds) such an event has been sent. - private Map<Long, Long> mEventLastFiredTimes = new HashMap<Long, Long>(); + private final Map<Long, Long> mEventLastFiredTimes = new HashMap<Long, Long>(); // For events being throttled (see: |mEventsToThrottle|), this array will map the eventType // to a single Runnable that will send an event after some delay. - private Map<Long, Runnable> mPendingEvents = new HashMap<Long, Runnable>(); + private final Map<Long, Runnable> mPendingEvents = new HashMap<Long, Runnable>(); // Implementation of the callback interface to {@link WebContentsAccessibilityImpl} so that we // can maintain a connection through JNI to the native code. - private Client mClient; + private final Client mClient; /** * Callback interface to link {@link WebContentsAccessibilityImpl} with an instance of the
diff --git a/content/public/android/java/src/org/chromium/content/browser/accessibility/ViewStructureBuilder.java b/content/public/android/java/src/org/chromium/content/browser/accessibility/ViewStructureBuilder.java index ea5a050..557c28f5 100644 --- a/content/public/android/java/src/org/chromium/content/browser/accessibility/ViewStructureBuilder.java +++ b/content/public/android/java/src/org/chromium/content/browser/accessibility/ViewStructureBuilder.java
@@ -32,7 +32,7 @@ */ @NullMarked public class ViewStructureBuilder { - private RenderCoordinatesImpl mRenderCoordinates; + private final RenderCoordinatesImpl mRenderCoordinates; public ViewStructureBuilder(RenderCoordinatesImpl renderCoordinates) { this.mRenderCoordinates = renderCoordinates;
diff --git a/content/public/android/java/src/org/chromium/content/browser/accessibility/captioning/CaptioningController.java b/content/public/android/java/src/org/chromium/content/browser/accessibility/captioning/CaptioningController.java index c2d62bc..ac300cc7 100644 --- a/content/public/android/java/src/org/chromium/content/browser/accessibility/captioning/CaptioningController.java +++ b/content/public/android/java/src/org/chromium/content/browser/accessibility/captioning/CaptioningController.java
@@ -15,7 +15,7 @@ @JNINamespace("content") @NullMarked public class CaptioningController implements SystemCaptioningBridge.SystemCaptioningBridgeListener { - private SystemCaptioningBridge mSystemCaptioningBridge; + private final SystemCaptioningBridge mSystemCaptioningBridge; private long mNativeCaptioningController; public CaptioningController(WebContents webContents) {
diff --git a/content/public/android/java/src/org/chromium/content/browser/accessibility/captioning/CaptioningStyle.java b/content/public/android/java/src/org/chromium/content/browser/accessibility/captioning/CaptioningStyle.java index 0366c84..4cdd76c 100644 --- a/content/public/android/java/src/org/chromium/content/browser/accessibility/captioning/CaptioningStyle.java +++ b/content/public/android/java/src/org/chromium/content/browser/accessibility/captioning/CaptioningStyle.java
@@ -19,12 +19,12 @@ */ @NullMarked public class CaptioningStyle { - private @Nullable Integer mBackgroundColor; - private @Nullable Integer mEdgeColor; - private @Nullable Integer mEdgeType; - private @Nullable Integer mForegroundColor; - private @Nullable Integer mWindowColor; - private @Nullable Typeface mTypeface; + private final @Nullable Integer mBackgroundColor; + private final @Nullable Integer mEdgeColor; + private final @Nullable Integer mEdgeType; + private final @Nullable Integer mForegroundColor; + private final @Nullable Integer mWindowColor; + private final @Nullable Typeface mTypeface; /** * Construct a Chromium CaptioningStyle object.
diff --git a/content/public/android/java/src/org/chromium/content/browser/androidoverlay/AndroidOverlayProviderImpl.java b/content/public/android/java/src/org/chromium/content/browser/androidoverlay/AndroidOverlayProviderImpl.java index 439fa00..d357e876 100644 --- a/content/public/android/java/src/org/chromium/content/browser/androidoverlay/AndroidOverlayProviderImpl.java +++ b/content/public/android/java/src/org/chromium/content/browser/androidoverlay/AndroidOverlayProviderImpl.java
@@ -37,7 +37,7 @@ private int mNumOverlays; // Runnable that notifies us that a client has been released. - private Runnable mNotifyReleasedRunnable = + private final Runnable mNotifyReleasedRunnable = new Runnable() { @Override public void run() {
diff --git a/content/public/android/java/src/org/chromium/content/browser/androidoverlay/DialogOverlayImpl.java b/content/public/android/java/src/org/chromium/content/browser/androidoverlay/DialogOverlayImpl.java index 80f1ff37..70d1107 100644 --- a/content/public/android/java/src/org/chromium/content/browser/androidoverlay/DialogOverlayImpl.java +++ b/content/public/android/java/src/org/chromium/content/browser/androidoverlay/DialogOverlayImpl.java
@@ -42,7 +42,7 @@ private @Nullable AndroidOverlayClient mClient; // Runnable that we'll run when the overlay notifies us that it's been released. - private Runnable mReleasedRunnable; + private final Runnable mReleasedRunnable; private @Nullable DialogOverlayCore mDialogCore;
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 71622a9..2ce8d71 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
@@ -32,7 +32,8 @@ new UnownedUserDataKey<>(WindowLayoutInfoListener.class); private final Consumer<WindowLayoutInfo> mWindowLayoutInfoChangedCallback; private @Nullable WindowAndroid mWindowAndroid; - private ObserverList<DevicePosturePlatformProviderAndroid> mObservers = new ObserverList<>(); + private final ObserverList<DevicePosturePlatformProviderAndroid> mObservers = + new ObserverList<>(); private @Nullable WindowLayoutInfo mCurrentWindowLayoutInfo; private WindowLayoutInfoListener(WindowAndroid window) {
diff --git a/content/public/android/java/src/org/chromium/content/browser/input/ImeAdapterImpl.java b/content/public/android/java/src/org/chromium/content/browser/input/ImeAdapterImpl.java index 6c456a6..76f0e8a 100644 --- a/content/public/android/java/src/org/chromium/content/browser/input/ImeAdapterImpl.java +++ b/content/public/android/java/src/org/chromium/content/browser/input/ImeAdapterImpl.java
@@ -140,7 +140,7 @@ private @Nullable ShowKeyboardResultReceiver mShowKeyboardResultReceiver; private final WebContentsImpl mWebContents; - private ViewAndroidDelegate mViewDelegate; + private final ViewAndroidDelegate mViewDelegate; // This holds the information necessary for constructing CursorAnchorInfo, and notifies to // InputMethodManager on appropriate timing, depending on how IME requested the information @@ -174,7 +174,7 @@ private boolean mRestartInputOnNextStateUpdate; // Do not access directly, use getStylusWritingImeCallback() instead. private @Nullable StylusWritingImeCallback mStylusWritingImeCallback; - private SparseArray<OngoingGesture> mOngoingGestures = new SparseArray<>(); + private final SparseArray<OngoingGesture> mOngoingGestures = new SparseArray<>(); // True if ImeAdapter is connected to render process. private boolean mIsConnected;
diff --git a/content/public/android/java/src/org/chromium/content/browser/input/InputMethodManagerWrapperImpl.java b/content/public/android/java/src/org/chromium/content/browser/input/InputMethodManagerWrapperImpl.java index 058e7c0..e7d3a9dc4 100644 --- a/content/public/android/java/src/org/chromium/content/browser/input/InputMethodManagerWrapperImpl.java +++ b/content/public/android/java/src/org/chromium/content/browser/input/InputMethodManagerWrapperImpl.java
@@ -36,7 +36,7 @@ private @Nullable WindowAndroid mWindowAndroid; - private Delegate mDelegate; + private final Delegate mDelegate; private @Nullable Runnable mPendingRunnableOnInputConnection;
diff --git a/content/public/android/java/src/org/chromium/content/browser/input/SelectPopupAdapter.java b/content/public/android/java/src/org/chromium/content/browser/input/SelectPopupAdapter.java index f010ef3..0a907f80 100644 --- a/content/public/android/java/src/org/chromium/content/browser/input/SelectPopupAdapter.java +++ b/content/public/android/java/src/org/chromium/content/browser/input/SelectPopupAdapter.java
@@ -25,7 +25,7 @@ @NullMarked public class SelectPopupAdapter extends ArrayAdapter<SelectPopupItem> { // Holds the items of the select popup alert dialog list. - private List<SelectPopupItem> mItems; + private final List<SelectPopupItem> mItems; // True if all items have type PopupItemType.ENABLED. private boolean mAreAllItemsEnabled;
diff --git a/content/public/android/java/src/org/chromium/content/browser/input/SuggestionsPopupWindow.java b/content/public/android/java/src/org/chromium/content/browser/input/SuggestionsPopupWindow.java index 9490291..e495017 100644 --- a/content/public/android/java/src/org/chromium/content/browser/input/SuggestionsPopupWindow.java +++ b/content/public/android/java/src/org/chromium/content/browser/input/SuggestionsPopupWindow.java
@@ -191,7 +191,7 @@ } private class SuggestionAdapter extends BaseAdapter { - private LayoutInflater mInflater = + private final LayoutInflater mInflater = (LayoutInflater) mContext.getSystemService(Context.LAYOUT_INFLATER_SERVICE); @Override
diff --git a/content/public/android/java/src/org/chromium/content/browser/input/TextSuggestionsPopupWindow.java b/content/public/android/java/src/org/chromium/content/browser/input/TextSuggestionsPopupWindow.java index c96be86..3ce2db435 100644 --- a/content/public/android/java/src/org/chromium/content/browser/input/TextSuggestionsPopupWindow.java +++ b/content/public/android/java/src/org/chromium/content/browser/input/TextSuggestionsPopupWindow.java
@@ -24,8 +24,8 @@ public class TextSuggestionsPopupWindow extends SuggestionsPopupWindow { private SuggestionInfo[] mSuggestionInfos; - private TextAppearanceSpan mPrefixSpan; - private TextAppearanceSpan mSuffixSpan; + private final TextAppearanceSpan mPrefixSpan; + private final TextAppearanceSpan mSuffixSpan; /** * @param context Android context to use.
diff --git a/content/public/android/java/src/org/chromium/content/browser/picker/TwoFieldDatePicker.java b/content/public/android/java/src/org/chromium/content/browser/picker/TwoFieldDatePicker.java index fb3c8f0..3481bafb 100644 --- a/content/public/android/java/src/org/chromium/content/browser/picker/TwoFieldDatePicker.java +++ b/content/public/android/java/src/org/chromium/content/browser/picker/TwoFieldDatePicker.java
@@ -36,9 +36,9 @@ // It'd be nice to use android.text.Time like in other Dialogs but // it suffers from the 2038 effect so it would prevent us from // having dates over 2038. - private Calendar mMinDate; + private final Calendar mMinDate; - private Calendar mMaxDate; + private final Calendar mMaxDate; private Calendar mCurrentDate;
diff --git a/content/public/android/java/src/org/chromium/content/browser/selection/MagnifierAnimator.java b/content/public/android/java/src/org/chromium/content/browser/selection/MagnifierAnimator.java index 75d765e..191fe4d0 100644 --- a/content/public/android/java/src/org/chromium/content/browser/selection/MagnifierAnimator.java +++ b/content/public/android/java/src/org/chromium/content/browser/selection/MagnifierAnimator.java
@@ -21,7 +21,7 @@ private static final long DURATION_MS = 100; - private MagnifierWrapper mMagnifier; + private final MagnifierWrapper mMagnifier; private ValueAnimator mAnimator; private boolean mMagnifierIsShowing;
diff --git a/content/public/android/java/src/org/chromium/content/browser/selection/MagnifierWrapperImpl.java b/content/public/android/java/src/org/chromium/content/browser/selection/MagnifierWrapperImpl.java index 1a4214b..9b20246 100644 --- a/content/public/android/java/src/org/chromium/content/browser/selection/MagnifierWrapperImpl.java +++ b/content/public/android/java/src/org/chromium/content/browser/selection/MagnifierWrapperImpl.java
@@ -20,7 +20,7 @@ private static final String TAG = "Magnifier"; private @Nullable Magnifier mMagnifier; - private SelectionPopupControllerImpl.ReadbackViewCallback mCallback; + private final SelectionPopupControllerImpl.ReadbackViewCallback mCallback; /** Constructor. */ public MagnifierWrapperImpl(SelectionPopupControllerImpl.ReadbackViewCallback callback) {
diff --git a/content/public/android/java/src/org/chromium/content/browser/selection/SelectionPopupControllerImpl.java b/content/public/android/java/src/org/chromium/content/browser/selection/SelectionPopupControllerImpl.java index 795f62a..bf33d37 100644 --- a/content/public/android/java/src/org/chromium/content/browser/selection/SelectionPopupControllerImpl.java +++ b/content/public/android/java/src/org/chromium/content/browser/selection/SelectionPopupControllerImpl.java
@@ -145,19 +145,19 @@ private final Handler mHandler; private @Nullable Context mContext; private @Nullable WindowAndroid mWindowAndroid; - private WebContentsImpl mWebContents; + private final WebContentsImpl mWebContents; private @Nullable ActionModeCallback mCallback; private @Nullable RenderFrameHost mRenderFrameHost; private long mNativeSelectionPopupController; - private SelectionClient.ResultCallback mResultCallback; + private final SelectionClient.ResultCallback mResultCallback; // Selection rectangle in DIP. private final Rect mSelectionRect = new Rect(); // Self-repeating task that repeatedly hides the ActionMode. This is // required because ActionMode only exposes a temporary hide routine. - private Runnable mRepeatingHideRunnable; + private final Runnable mRepeatingHideRunnable; // Can be null temporarily when switching between WindowAndroid. private @Nullable View mView;
diff --git a/content/public/android/java/src/org/chromium/content/browser/selection/SmartSelectionProvider.java b/content/public/android/java/src/org/chromium/content/browser/selection/SmartSelectionProvider.java index d399ca1f..3f37504 100644 --- a/content/public/android/java/src/org/chromium/content/browser/selection/SmartSelectionProvider.java +++ b/content/public/android/java/src/org/chromium/content/browser/selection/SmartSelectionProvider.java
@@ -48,13 +48,13 @@ int SUGGEST_AND_CLASSIFY = 1; } - private SelectionClient.ResultCallback mResultCallback; + private final SelectionClient.ResultCallback mResultCallback; private @Nullable WindowAndroid mWindowAndroid; private @Nullable ClassificationTask mClassificationTask; private @Nullable TextClassifier mTextClassifier; - private Handler mHandler; - private Runnable mFailureResponseRunnable; + private final Handler mHandler; + private final Runnable mFailureResponseRunnable; private final @Nullable SmartSelectionEventProcessor mSelectionEventProcessor; public SmartSelectionProvider(
diff --git a/content/public/android/java/src/org/chromium/content/browser/sms/SmsProviderGms.java b/content/public/android/java/src/org/chromium/content/browser/sms/SmsProviderGms.java index dfea80f5..7be7da3b 100644 --- a/content/public/android/java/src/org/chromium/content/browser/sms/SmsProviderGms.java +++ b/content/public/android/java/src/org/chromium/content/browser/sms/SmsProviderGms.java
@@ -42,7 +42,7 @@ private @Nullable SmsUserConsentReceiver mUserConsentReceiver; private @Nullable SmsVerificationReceiver mVerificationReceiver; - private Wrappers.WebOTPServiceContext mContext; + private final Wrappers.WebOTPServiceContext mContext; private @Nullable WindowAndroid mWindow; private Wrappers.@Nullable SmsRetrieverClientWrapper mClient;
diff --git a/content/public/android/java/src/org/chromium/content/browser/sms/SmsUserConsentReceiver.java b/content/public/android/java/src/org/chromium/content/browser/sms/SmsUserConsentReceiver.java index 4c105b4..d32f846 100644 --- a/content/public/android/java/src/org/chromium/content/browser/sms/SmsUserConsentReceiver.java +++ b/content/public/android/java/src/org/chromium/content/browser/sms/SmsUserConsentReceiver.java
@@ -30,7 +30,7 @@ private static final boolean DEBUG = false; private final SmsProviderGms mProvider; private boolean mDestroyed; - private Wrappers.WebOTPServiceContext mContext; + private final Wrappers.WebOTPServiceContext mContext; public SmsUserConsentReceiver(SmsProviderGms provider, Wrappers.WebOTPServiceContext context) { mDestroyed = false;
diff --git a/content/public/android/java/src/org/chromium/content/browser/sms/SmsVerificationReceiver.java b/content/public/android/java/src/org/chromium/content/browser/sms/SmsVerificationReceiver.java index 131a0e2..33236206 100644 --- a/content/public/android/java/src/org/chromium/content/browser/sms/SmsVerificationReceiver.java +++ b/content/public/android/java/src/org/chromium/content/browser/sms/SmsVerificationReceiver.java
@@ -48,7 +48,7 @@ private static final boolean DEBUG = false; private final SmsProviderGms mProvider; private boolean mDestroyed; - private Wrappers.WebOTPServiceContext mContext; + private final Wrappers.WebOTPServiceContext mContext; @IntDef({ BackendAvailability.AVAILABLE,
diff --git a/content/public/android/java/src/org/chromium/content/common/InputTransferTokenWrapper.java b/content/public/android/java/src/org/chromium/content/common/InputTransferTokenWrapper.java index 364d7ef..d3c4aa54 100644 --- a/content/public/android/java/src/org/chromium/content/common/InputTransferTokenWrapper.java +++ b/content/public/android/java/src/org/chromium/content/common/InputTransferTokenWrapper.java
@@ -18,7 +18,7 @@ */ @NullMarked public class InputTransferTokenWrapper implements Parcelable { - private InputTransferToken mToken; + private final InputTransferToken mToken; public InputTransferTokenWrapper(InputTransferToken token) { assert token != null;
diff --git a/content/public/android/java/src/org/chromium/content_public/browser/InputTransferHandler.java b/content/public/android/java/src/org/chromium/content_public/browser/InputTransferHandler.java index f4795a5..41ac46e 100644 --- a/content/public/android/java/src/org/chromium/content_public/browser/InputTransferHandler.java +++ b/content/public/android/java/src/org/chromium/content_public/browser/InputTransferHandler.java
@@ -25,10 +25,10 @@ public class InputTransferHandler implements WindowAndroid.SelectionHandlesObserver { private static @Nullable Integer sInitialBrowserToken; - private InputTransferToken mBrowserToken; + private final InputTransferToken mBrowserToken; private @Nullable InputTransferToken mVizToken; private boolean mSelectionHandlesActive; - private WindowAndroid mWindowAndroid; + private final WindowAndroid mWindowAndroid; public InputTransferHandler(InputTransferToken browserToken, WindowAndroid windowAndroid) { if (sInitialBrowserToken == null) {
diff --git a/content/public/android/java/src/org/chromium/content_public/browser/InterfaceRegistrar.java b/content/public/android/java/src/org/chromium/content_public/browser/InterfaceRegistrar.java index 96d64a4..7df006bd 100644 --- a/content/public/android/java/src/org/chromium/content_public/browser/InterfaceRegistrar.java +++ b/content/public/android/java/src/org/chromium/content_public/browser/InterfaceRegistrar.java
@@ -28,7 +28,7 @@ private static @Nullable Registry<WebContents> sWebContentsRegistry; private static @Nullable Registry<RenderFrameHost> sRenderFrameHostRegistry; - private List<InterfaceRegistrar<ParamType>> mRegistrars = + private final List<InterfaceRegistrar<ParamType>> mRegistrars = new ArrayList<InterfaceRegistrar<ParamType>>(); public static void applySingletonRegistrars(InterfaceRegistry interfaceRegistry) {
diff --git a/content/public/android/java/src/org/chromium/content_public/browser/NavigationEntry.java b/content/public/android/java/src/org/chromium/content_public/browser/NavigationEntry.java index d79eb98..cde2e59 100644 --- a/content/public/android/java/src/org/chromium/content_public/browser/NavigationEntry.java +++ b/content/public/android/java/src/org/chromium/content_public/browser/NavigationEntry.java
@@ -19,8 +19,8 @@ private final GURL mVirtualUrl; private final String mTitle; private Bitmap mFavicon; - private int mTransition; - private long mTimestamp; + private final int mTransition; + private final long mTimestamp; private final boolean mIsInitialEntry; /** Default constructor. */
diff --git a/content/public/android/java/src/org/chromium/content_public/common/ResourceRequestBody.java b/content/public/android/java/src/org/chromium/content_public/common/ResourceRequestBody.java index e964a15..55e85975 100644 --- a/content/public/android/java/src/org/chromium/content_public/common/ResourceRequestBody.java +++ b/content/public/android/java/src/org/chromium/content_public/common/ResourceRequestBody.java
@@ -24,7 +24,7 @@ * different from the value passed as an argument of * ResourceRequestBody.createFromBytes method below). */ - private byte[] mEncodedNativeForm; + private final byte[] mEncodedNativeForm; // ResourceRequestBody Java objects can only be constructed by // - ResourceRequestBody::createFromBytes(byte[])
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/GestureListenerManagerTest.java b/content/public/android/javatests/src/org/chromium/content/browser/GestureListenerManagerTest.java index ad2fba5..faf00a0 100644 --- a/content/public/android/javatests/src/org/chromium/content/browser/GestureListenerManagerTest.java +++ b/content/public/android/javatests/src/org/chromium/content/browser/GestureListenerManagerTest.java
@@ -48,7 +48,7 @@ private static final class GestureStateListenerImpl extends GestureStateListener { private int mNumOnScrollOffsetOrExtentChangedCalls; - public CallbackHelper mCallbackHelper = new CallbackHelper(); + public final CallbackHelper mCallbackHelper = new CallbackHelper(); private boolean mGotStarted; private boolean mDidScrollOffsetChangeWhileScrolling; private Integer mLastScrollOffsetY;
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/JavaBridgeBasicsTest.java b/content/public/android/javatests/src/org/chromium/content/browser/JavaBridgeBasicsTest.java index e43376207e..7b50fe9e 100644 --- a/content/public/android/javatests/src/org/chromium/content/browser/JavaBridgeBasicsTest.java +++ b/content/public/android/javatests/src/org/chromium/content/browser/JavaBridgeBasicsTest.java
@@ -718,7 +718,7 @@ @Feature({"AndroidWebView", "Android-JavaBridge"}) public void testBlockingUiThreadDoesNotBlockCallsFromJs() { class TestObject { - private CountDownLatch mLatch; + private final CountDownLatch mLatch; public TestObject() { mLatch = new CountDownLatch(1); @@ -874,7 +874,7 @@ return getClass(); } - public String field = "foo"; + public final String field = "foo"; }, "testObject", null); @@ -1207,7 +1207,7 @@ return mValue; } - private int mValue; + private final int mValue; } mActivityTestRule.injectObjectAndReload(new Test(13), "testObject"); Assert.assertEquals("13", executeJavaScriptAndGetStringResult("testObject.getValue()")); @@ -1223,7 +1223,7 @@ @Feature({"AndroidWebView", "Android-JavaBridge"}) public void testMethodCalledOnAnotherInstance() throws Throwable { class TestObject { - private int mIndex; + private final int mIndex; TestObject(int index) { mIndex = index; @@ -1253,7 +1253,7 @@ @Feature({"AndroidWebView", "Android-JavaBridge"}) public void testWebViewAfterRenderViewSwapped() throws Throwable { class TestObject { - private int mIndex; + private final int mIndex; TestObject(int index) { mIndex = index;
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/JavaBridgeChildFrameTest.java b/content/public/android/javatests/src/org/chromium/content/browser/JavaBridgeChildFrameTest.java index 55cea22f..e36358a 100644 --- a/content/public/android/javatests/src/org/chromium/content/browser/JavaBridgeChildFrameTest.java +++ b/content/public/android/javatests/src/org/chromium/content/browser/JavaBridgeChildFrameTest.java
@@ -155,9 +155,9 @@ @DisabledTest(message = "https://crbug.com/677053") public void testRemovingTransientObjectHolders() throws Throwable { class Test { - private Object mInner = new Object(); + private final Object mInner = new Object(); // Expecting the inner object to be retrieved twice. - private CountDownLatch mLatch = new CountDownLatch(2); + private final CountDownLatch mLatch = new CountDownLatch(2); @JavascriptInterface public Object getInner() { @@ -227,7 +227,7 @@ public void testHolderFrame() throws Throwable { class Test { WeakReference<Object> mWeakRefForInner; - private CountDownLatch mLatch = new CountDownLatch(1); + private final CountDownLatch mLatch = new CountDownLatch(1); @JavascriptInterface public Object getInner() {
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/JavaBridgeCoercionTest.java b/content/public/android/javatests/src/org/chromium/content/browser/JavaBridgeCoercionTest.java index 3a298f82..8be45b69 100644 --- a/content/public/android/javatests/src/org/chromium/content/browser/JavaBridgeCoercionTest.java +++ b/content/public/android/javatests/src/org/chromium/content/browser/JavaBridgeCoercionTest.java
@@ -44,9 +44,9 @@ @Rule public JavaBridgeActivityTestRule mActivityTestRule = new JavaBridgeActivityTestRule(); private static class TestObject extends Controller { - private Object mObjectInstance; - private CustomType mCustomTypeInstance; - private CustomType2 mCustomType2Instance; + private final Object mObjectInstance; + private final CustomType mCustomTypeInstance; + private final CustomType2 mCustomType2Instance; private boolean mBooleanValue; private byte mByteValue;
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/JavaBridgeFieldsTest.java b/content/public/android/javatests/src/org/chromium/content/browser/JavaBridgeFieldsTest.java index c420a2d..8ebbc61 100644 --- a/content/public/android/javatests/src/org/chromium/content/browser/JavaBridgeFieldsTest.java +++ b/content/public/android/javatests/src/org/chromium/content/browser/JavaBridgeFieldsTest.java
@@ -41,17 +41,17 @@ return mStringValue; } - public boolean booleanField = true; - public byte byteField = 42; - public char charField = '\u002A'; - public short shortField = 42; - public int intField = 42; - public long longField = 42L; - public float floatField = 42.0f; - public double doubleField = 42.0; - public String stringField = "foo"; - public Object objectField = new Object(); - public CustomType customTypeField = new CustomType(); + public final boolean booleanField = true; + public final byte byteField = 42; + public final char charField = '\u002A'; + public final short shortField = 42; + public final int intField = 42; + public final long longField = 42L; + public final float floatField = 42.0f; + public final double doubleField = 42.0; + public final String stringField = "foo"; + public final Object objectField = new Object(); + public final CustomType customTypeField = new CustomType(); } // A custom type used when testing passing objects.
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/MediaSessionTest.java b/content/public/android/javatests/src/org/chromium/content/browser/MediaSessionTest.java index e8a7b8d..46e6cd7 100644 --- a/content/public/android/javatests/src/org/chromium/content/browser/MediaSessionTest.java +++ b/content/public/android/javatests/src/org/chromium/content/browser/MediaSessionTest.java
@@ -98,11 +98,11 @@ private MediaSessionObserver mObserver; - private ArrayList<StateRecord> mStateRecords = new ArrayList<StateRecord>(); + private final ArrayList<StateRecord> mStateRecords = new ArrayList<StateRecord>(); private static class StateRecord { - public boolean isControllable; - public boolean isSuspended; + public final boolean isControllable; + public final boolean isSuspended; public StateRecord(boolean isControllable, boolean isSuspended) { this.isControllable = isControllable;
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/WebContentsObserverAndroidTest.java b/content/public/android/javatests/src/org/chromium/content/browser/WebContentsObserverAndroidTest.java index 92bd431..55c8973 100644 --- a/content/public/android/javatests/src/org/chromium/content/browser/WebContentsObserverAndroidTest.java +++ b/content/public/android/javatests/src/org/chromium/content/browser/WebContentsObserverAndroidTest.java
@@ -38,7 +38,8 @@ "<html><head></head><body>didFirstVisuallyNonEmptyPaint test</body></html>"); private static class TestWebContentsObserver extends WebContentsObserver { - private CallbackHelper mDidFirstVisuallyNonEmptyPaintCallbackHelper = new CallbackHelper(); + private final CallbackHelper mDidFirstVisuallyNonEmptyPaintCallbackHelper = + new CallbackHelper(); public TestWebContentsObserver(WebContents webContents) { super(webContents);
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/accessibility/AccessibilityEventDispatcherTest.java b/content/public/android/javatests/src/org/chromium/content/browser/accessibility/AccessibilityEventDispatcherTest.java index 1c57088..d690de8 100644 --- a/content/public/android/javatests/src/org/chromium/content/browser/accessibility/AccessibilityEventDispatcherTest.java +++ b/content/public/android/javatests/src/org/chromium/content/browser/accessibility/AccessibilityEventDispatcherTest.java
@@ -23,8 +23,8 @@ @RunWith(BaseJUnit4ClassRunner.class) public class AccessibilityEventDispatcherTest { private AccessibilityEventDispatcher mDispatcher; - private Map<Integer, Integer> mEventDelays = new HashMap<Integer, Integer>(); - private Set<Integer> mViewIndependentEvents = new HashSet<Integer>(); + private final Map<Integer, Integer> mEventDelays = new HashMap<Integer, Integer>(); + private final Set<Integer> mViewIndependentEvents = new HashSet<Integer>(); // Helper member variables for testing. private boolean mRunnablePosted;
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/accessibility/TestViewStructure.java b/content/public/android/javatests/src/org/chromium/content/browser/accessibility/TestViewStructure.java index 2675f0a5..c5196e8 100644 --- a/content/public/android/javatests/src/org/chromium/content/browser/accessibility/TestViewStructure.java +++ b/content/public/android/javatests/src/org/chromium/content/browser/accessibility/TestViewStructure.java
@@ -41,7 +41,7 @@ private Bundle mBundle; private HtmlInfo mHtmlInfo; private int mChildCount; - private ArrayList<TestViewStructure> mChildren = new ArrayList<TestViewStructure>(); + private final ArrayList<TestViewStructure> mChildren = new ArrayList<TestViewStructure>(); private float mTextSize; private int mFgColor; private int mBgColor;
diff --git a/content/public/android/javatests/src/org/chromium/content/browser/androidoverlay/DialogOverlayImplTestRule.java b/content/public/android/javatests/src/org/chromium/content/browser/androidoverlay/DialogOverlayImplTestRule.java index 4dfe584..676882bb 100644 --- a/content/public/android/javatests/src/org/chromium/content/browser/androidoverlay/DialogOverlayImplTestRule.java +++ b/content/public/android/javatests/src/org/chromium/content/browser/androidoverlay/DialogOverlayImplTestRule.java
@@ -30,7 +30,7 @@ // True if we should create a secure overlay. private boolean mSecure; - private String mInitialUrl; + private final String mInitialUrl; /** * AndroidOverlay client that supports waiting operations for callbacks. One may call @@ -71,7 +71,7 @@ private boolean mHasReceivedOverlayModeChange; private boolean mUseOverlayMode; - private ArrayBlockingQueue<Event> mPending; + private final ArrayBlockingQueue<Event> mPending; public Client() { mPending = new ArrayBlockingQueue<Event>(10); @@ -152,7 +152,7 @@ } } - private Client mClient = new Client(); + private final Client mClient = new Client(); // Return the URL to start with. public DialogOverlayImplTestRule(String url) {
diff --git a/content/public/android/junit/src/org/chromium/content/browser/androidoverlay/DialogOverlayCoreTest.java b/content/public/android/junit/src/org/chromium/content/browser/androidoverlay/DialogOverlayCoreTest.java index 907883a..98bd0fb5 100644 --- a/content/public/android/junit/src/org/chromium/content/browser/androidoverlay/DialogOverlayCoreTest.java +++ b/content/public/android/junit/src/org/chromium/content/browser/androidoverlay/DialogOverlayCoreTest.java
@@ -82,7 +82,7 @@ /** The default fake surface holder doesn't let us provide a surface. */ public static class MyFakeSurfaceHolder extends ShadowSurfaceView.FakeSurfaceHolder { - private Surface mSurface; + private final Surface mSurface; // @param surface The Surface that we'll provide via getSurface. public MyFakeSurfaceHolder(Surface surface) {
diff --git a/content/public/android/junit/src/org/chromium/content/browser/selection/SmartSelectionEventProcessorTest.java b/content/public/android/junit/src/org/chromium/content/browser/selection/SmartSelectionEventProcessorTest.java index aa3107c..43deb8d 100644 --- a/content/public/android/junit/src/org/chromium/content/browser/selection/SmartSelectionEventProcessorTest.java +++ b/content/public/android/junit/src/org/chromium/content/browser/selection/SmartSelectionEventProcessorTest.java
@@ -49,7 +49,7 @@ // Char index (in 10s) // Word index (thou) - private static String sText = + private static final String sText = "" // 0 1 2 3 4 // -7-6 -5-4 -3-2 -1 0 1 2
diff --git a/content/public/android/junit/src/org/chromium/content/browser/webcontents/WebContentsObserverProxyTest.java b/content/public/android/junit/src/org/chromium/content/browser/webcontents/WebContentsObserverProxyTest.java index 9967bdb9..353c6da 100644 --- a/content/public/android/junit/src/org/chromium/content/browser/webcontents/WebContentsObserverProxyTest.java +++ b/content/public/android/junit/src/org/chromium/content/browser/webcontents/WebContentsObserverProxyTest.java
@@ -30,7 +30,7 @@ @Mock private WebContentsObserverProxy.Natives mWebContentsObserverProxyJni; private WebContentsImpl mWebContentsImpl; - private final long mNativeWebContentsAndroid = 1; + private static final long M_NATIVE_WEB_CONTENTS_ANDROID = 1; @Before public void setUp() {
diff --git a/content/public/browser/web_contents_delegate.h b/content/public/browser/web_contents_delegate.h index 503ab27..a9be46f 100644 --- a/content/public/browser/web_contents_delegate.h +++ b/content/public/browser/web_contents_delegate.h
@@ -310,6 +310,7 @@ const blink::WebMouseEvent& event); virtual void PreHandleDragUpdate(const DropData& drop_data, const gfx::PointF& client_pt) {} + virtual void PreHandleDragExit() {} // Allows delegates to handle keyboard events before sending to the renderer. // See enum for description of return values.
diff --git a/content/public/test/android/javatests/src/org/chromium/content_public/browser/test/util/TestCallbackHelperContainer.java b/content/public/test/android/javatests/src/org/chromium/content_public/browser/test/util/TestCallbackHelperContainer.java index 248e94f..01973d9 100644 --- a/content/public/test/android/javatests/src/org/chromium/content_public/browser/test/util/TestCallbackHelperContainer.java +++ b/content/public/test/android/javatests/src/org/chromium/content_public/browser/test/util/TestCallbackHelperContainer.java
@@ -46,7 +46,7 @@ /** CallbackHelper for OnPageFinished. */ public static class OnPageFinishedHelper extends CallbackHelper { - private List<String> mUrlList = Collections.synchronizedList(new ArrayList<>()); + private final List<String> mUrlList = Collections.synchronizedList(new ArrayList<>()); private String mUrl; public void notifyCalled(String url) {
diff --git a/content/public/test/fake_remote_frame.cc b/content/public/test/fake_remote_frame.cc index 8ad9617..0b9b5c8 100644 --- a/content/public/test/fake_remote_frame.cc +++ b/content/public/test/fake_remote_frame.cc
@@ -107,7 +107,8 @@ } void FakeRemoteFrame::CreateRemoteChildren( - std::vector<blink::mojom::CreateRemoteChildParamsPtr> params) {} + std::vector<blink::mojom::CreateRemoteChildParamsPtr> params, + const std::optional<base::UnguessableToken>& navigation_metrics_token) {} void FakeRemoteFrame::ForwardFencedFrameEventToEmbedder( const std::string& event_type) {}
diff --git a/content/public/test/fake_remote_frame.h b/content/public/test/fake_remote_frame.h index 5052c95..5d1b0a9 100644 --- a/content/public/test/fake_remote_frame.h +++ b/content/public/test/fake_remote_frame.h
@@ -102,7 +102,9 @@ blink::mojom::RemoteFrameInterfacesFromBrowserPtr remote_frame_interfaces) override; void CreateRemoteChildren( - std::vector<blink::mojom::CreateRemoteChildParamsPtr> params) override; + std::vector<blink::mojom::CreateRemoteChildParamsPtr> params, + const std::optional<base::UnguessableToken>& navigation_metrics_token) + override; void ForwardFencedFrameEventToEmbedder( const std::string& event_type) override;
diff --git a/content/renderer/agent_scheduling_group.cc b/content/renderer/agent_scheduling_group.cc index df7a95f5..5e65b382 100644 --- a/content/renderer/agent_scheduling_group.cc +++ b/content/renderer/agent_scheduling_group.cc
@@ -407,7 +407,7 @@ params->opener_frame_token, /*parent_frame_token=*/std::nullopt, /*previous_sibling_frame_token=*/std::nullopt, - params->devtools_main_frame_token, + params->devtools_main_frame_token, params->navigation_metrics_token, blink::mojom::TreeScopeType::kDocument, std::move(params->replication_state), std::move(local_params->widget_params), @@ -440,8 +440,8 @@ /*web_view=*/nullptr, params->previous_frame_token, params->opener_frame_token, params->parent_frame_token, params->previous_sibling_frame_token, params->devtools_frame_token, - params->tree_scope_type, std::move(params->replication_state), - std::move(params->widget_params), + params->navigation_metrics_token, params->tree_scope_type, + std::move(params->replication_state), std::move(params->widget_params), std::move(params->frame_owner_properties), params->is_on_initial_empty_document, params->document_token, std::move(params->policy_container), params->is_for_nested_main_frame);
diff --git a/content/renderer/render_frame_impl.cc b/content/renderer/render_frame_impl.cc index 2ec398b..b6da726a 100644 --- a/content/renderer/render_frame_impl.cc +++ b/content/renderer/render_frame_impl.cc
@@ -1689,6 +1689,7 @@ base::optional_ref<const blink::FrameToken> parent_frame_token, base::optional_ref<const blink::FrameToken> previous_sibling_frame_token, const base::UnguessableToken& devtools_frame_token, + const std::optional<base::UnguessableToken>& navigation_metrics_token, blink::mojom::TreeScopeType tree_scope_type, blink::mojom::FrameReplicationStatePtr replicated_state, mojom::CreateFrameWidgetParamsPtr widget_params,
diff --git a/content/renderer/render_frame_impl.h b/content/renderer/render_frame_impl.h index 3949fd5d..6a9e6967 100644 --- a/content/renderer/render_frame_impl.h +++ b/content/renderer/render_frame_impl.h
@@ -250,6 +250,7 @@ base::optional_ref<const blink::FrameToken> parent_frame_token, base::optional_ref<const blink::FrameToken> previous_sibling_frame_token, const base::UnguessableToken& devtools_frame_token, + const std::optional<base::UnguessableToken>& navigation_metrics_token, blink::mojom::TreeScopeType tree_scope_type, blink::mojom::FrameReplicationStatePtr replicated_state, mojom::CreateFrameWidgetParamsPtr widget_params,
diff --git a/content/renderer/render_frame_impl_browsertest.cc b/content/renderer/render_frame_impl_browsertest.cc index 768eb91..8e0acb2 100644 --- a/content/renderer/render_frame_impl_browsertest.cc +++ b/content/renderer/render_frame_impl_browsertest.cc
@@ -182,6 +182,7 @@ /*parent_frame_token=*/blink::FrameToken(remote_child_token), /*previous_sibling_frame_token=*/std::nullopt, base::UnguessableToken::Create(), + /*navigation_metrics_token=*/std::nullopt, blink::mojom::TreeScopeType::kDocument, std::move(frame_replication_state), std::move(widget_params), blink::mojom::FrameOwnerProperties::New(),
diff --git a/content/renderer/render_view_browsertest.cc b/content/renderer/render_view_browsertest.cc index e75a335f..73b4ea2 100644 --- a/content/renderer/render_view_browsertest.cc +++ b/content/renderer/render_view_browsertest.cc
@@ -1135,9 +1135,10 @@ /*opener_frame_token=*/std::nullopt, /*parent_frame_token=*/std::nullopt, /*previous_sibling_frame_token=*/std::nullopt, - base::UnguessableToken::Create(), blink::mojom::TreeScopeType::kDocument, - std::move(replication_state), std::move(widget_params), - blink::mojom::FrameOwnerProperties::New(), + base::UnguessableToken::Create(), + /*navigation_metrics_token=*/base::UnguessableToken::Create(), + blink::mojom::TreeScopeType::kDocument, std::move(replication_state), + std::move(widget_params), blink::mojom::FrameOwnerProperties::New(), /*is_on_initial_empty_document=*/true, blink::DocumentToken(), CreateStubPolicyContainer(), /*is_for_nested_main_frame=*/false); @@ -1205,8 +1206,9 @@ /*opener_frame_token=*/std::nullopt, /*parent_frame_token=*/web_frame->GetFrameToken(), /*previous_sibling_frame_token=*/std::nullopt, - base::UnguessableToken::Create(), blink::mojom::TreeScopeType::kDocument, - std::move(replication_state), + base::UnguessableToken::Create(), + /*navigation_metrics_token=*/base::UnguessableToken::Create(), + blink::mojom::TreeScopeType::kDocument, std::move(replication_state), /*widget_params=*/nullptr, blink::mojom::FrameOwnerProperties::New(), /*is_on_initial_empty_document=*/true, blink::DocumentToken(), CreateStubPolicyContainer(), /*is_for_nested_main_frame=*/false);
diff --git a/content/test/BUILD.gn b/content/test/BUILD.gn index 6e99811f..4df3847 100644 --- a/content/test/BUILD.gn +++ b/content/test/BUILD.gn
@@ -3479,6 +3479,7 @@ "//base:base_unittest_support_java", "//build/config/freetype", "//cc/slim", + "//components/crash/android:anr_collector_java", "//components/download/internal/common:internal_java", "//content/browser:fontations_name_table_ffi", "//content/public/android:content_java",
diff --git a/content/test/gpu/gpu_tests/test_expectations/webcodecs_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webcodecs_expectations.txt index 122677f..f016086 100644 --- a/content/test/gpu/gpu_tests/test_expectations/webcodecs_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/webcodecs_expectations.txt
@@ -149,18 +149,35 @@ crbug.com/371802469 [ amd-0x7340 angle-opengl asan graphite-disabled mac ] WebCodecs_Encode_camera_hvc1.1.6.L123.00_prefer-hardware [ Failure ] # Flaky crashes that started when upgrading to Mac 15.4 -crbug.com/416294710 [ sequoia angle-opengl graphite-disabled intel-0x3e9b ] WebCodecs_ContentHint_hvc1.1.6.L123.00_detail [ Failure ] -crbug.com/416294710 [ sequoia angle-opengl graphite-disabled intel-0x3e9b ] WebCodecs_ContentHint_hvc1.1.6.L123.00_motion [ Failure ] -crbug.com/416294710 [ sequoia angle-opengl graphite-disabled intel-0x3e9b ] WebCodecs_EncodeColorSpace_hvc1.1.6.L123.00_prefer-hardware [ Failure ] -crbug.com/416294710 [ sequoia angle-opengl graphite-disabled intel-0x3e9b ] WebCodecs_EncodeDecode_arraybuffer_hvc1.1.6.L123.00_prefer-hardware [ Failure ] -crbug.com/416294710 [ sequoia angle-opengl graphite-disabled intel-0x3e9b ] WebCodecs_EncodeDecode_camera_hvc1.1.6.L123.00_prefer-hardware [ Failure ] -crbug.com/416294710 [ sequoia angle-opengl graphite-disabled intel-0x3e9b ] WebCodecs_EncodeDecode_capture_hvc1.1.6.L123.00_prefer-hardware [ Failure ] -crbug.com/416294710 [ sequoia angle-opengl graphite-disabled intel-0x3e9b ] WebCodecs_EncodeDecode_hw_decoder_hvc1.1.6.L123.00_prefer-hardware [ Failure ] -crbug.com/416294710 [ sequoia angle-opengl graphite-disabled intel-0x3e9b ] WebCodecs_EncodeDecode_offscreen_hvc1.1.6.L123.00_prefer-hardware [ Failure ] -crbug.com/416294710 [ sequoia angle-opengl graphite-disabled intel-0x3e9b ] WebCodecs_EncodeDecode_sw_decoder_hvc1.1.6.L123.00_prefer-hardware [ Failure ] -crbug.com/416294710 [ sequoia angle-opengl graphite-disabled intel-0x3e9b ] WebCodecs_Encode_arraybuffer_hvc1.1.6.L123.00_prefer-hardware [ Failure ] -crbug.com/416294710 [ sequoia angle-opengl graphite-disabled intel-0x3e9b ] WebCodecs_Encode_camera_hvc1.1.6.L123.00_prefer-hardware [ Failure ] -crbug.com/416294710 [ sequoia angle-opengl graphite-disabled intel-0x3e9b ] WebCodecs_Encode_capture_hvc1.1.6.L123.00_prefer-hardware [ Failure ] +crbug.com/416294710 [ sequoia intel-0x3e9b ] WebCodecs_ContentHint_hvc1.1.6.L123.00_detail [ Failure ] +crbug.com/416294710 [ sequoia intel-0x3e9b ] WebCodecs_ContentHint_hvc1.1.6.L123.00_motion [ Failure ] +crbug.com/416294710 [ sequoia intel-0x3e9b ] WebCodecs_EncodeColorSpace_hvc1.1.6.L123.00_prefer-hardware [ Failure ] +crbug.com/416294710 [ sequoia intel-0x3e9b ] WebCodecs_EncodeDecode_arraybuffer_hvc1.1.6.L123.00_prefer-hardware [ Failure ] +crbug.com/416294710 [ sequoia intel-0x3e9b ] WebCodecs_EncodeDecode_camera_hvc1.1.6.L123.00_prefer-hardware [ Failure ] +crbug.com/416294710 [ sequoia intel-0x3e9b ] WebCodecs_EncodeDecode_capture_hvc1.1.6.L123.00_prefer-hardware [ Failure ] +crbug.com/416294710 [ sequoia intel-0x3e9b ] WebCodecs_EncodeDecode_hw_decoder_hvc1.1.6.L123.00_prefer-hardware [ Failure ] +crbug.com/416294710 [ sequoia intel-0x3e9b ] WebCodecs_EncodeDecode_offscreen_hvc1.1.6.L123.00_prefer-hardware [ Failure ] +crbug.com/416294710 [ sequoia intel-0x3e9b ] WebCodecs_EncodeDecode_sw_decoder_hvc1.1.6.L123.00_prefer-hardware [ Failure ] +crbug.com/416294710 [ sequoia intel-0x3e9b ] WebCodecs_Encode_arraybuffer_hvc1.1.6.L123.00_prefer-hardware [ Failure ] +crbug.com/416294710 [ sequoia intel-0x3e9b ] WebCodecs_Encode_camera_hvc1.1.6.L123.00_prefer-hardware [ Failure ] +crbug.com/416294710 [ sequoia intel-0x3e9b ] WebCodecs_Encode_capture_hvc1.1.6.L123.00_prefer-hardware [ Failure ] +crbug.com/416294710 [ sequoia intel-0x3e9b ] WebCodecs_Encode_hw_decoder_hvc1.1.6.L123.00_prefer-hardware [ Failure ] +crbug.com/416294710 [ sequoia intel-0x3e9b ] WebCodecs_Encode_offscreen_hvc1.1.6.L123.00_prefer-hardware [ Failure ] +crbug.com/416294710 [ sequoia intel-0x3e9b ] WebCodecs_Encode_sw_decoder_hvc1.1.6.L123.00_prefer-hardware [ Failure ] +crbug.com/416294710 [ sequoia intel-0x3e9b ] WebCodecs_EncodingFramerateResolutions_1920x1080_120_hvc1.1.6.L186.B0_prefer-hardware_quality [ Failure ] +crbug.com/416294710 [ sequoia intel-0x3e9b ] WebCodecs_EncodingFramerateResolutions_1920x1080_30_hvc1.1.6.L186.B0_prefer-hardware_quality [ Failure ] +crbug.com/416294710 [ sequoia intel-0x3e9b ] WebCodecs_EncodingFramerateResolutions_1920x1080_60_hvc1.1.6.L186.B0_prefer-hardware_quality [ Failure ] +crbug.com/416294710 [ sequoia intel-0x3e9b ] WebCodecs_EncodingFramerateResolutions_3840x2160_120_hvc1.1.6.L186.B0_prefer-hardware_quality [ Failure ] +crbug.com/416294710 [ sequoia intel-0x3e9b ] WebCodecs_EncodingFramerateResolutions_3840x2160_30_hvc1.1.6.L186.B0_prefer-hardware_quality [ Failure ] +crbug.com/416294710 [ sequoia intel-0x3e9b ] WebCodecs_EncodingFramerateResolutions_3840x2160_60_hvc1.1.6.L186.B0_prefer-hardware_quality [ Failure ] +crbug.com/416294710 [ sequoia intel-0x3e9b ] WebCodecs_EncodingModes_offscreen_hvc1.1.6.L123.00_prefer-hardware_constant_quality [ Failure ] +crbug.com/416294710 [ sequoia intel-0x3e9b ] WebCodecs_EncodingRateControl_hvc1.1.6.L123.00_prefer-hardware_constant_1500000 [ Failure ] +crbug.com/416294710 [ sequoia intel-0x3e9b ] WebCodecs_EncodingRateControl_hvc1.1.6.L123.00_prefer-hardware_variable_1500000 [ Failure ] +crbug.com/416294710 [ sequoia intel-0x3e9b ] WebCodecs_EncodingRateControl_hvc1.1.6.L123.00_prefer-hardware_variable_2000000 [ Failure ] +crbug.com/416294710 [ sequoia intel-0x3e9b ] WebCodecs_FrameSizeChange_hvc1.1.6.L123.00_arraybuffer [ Failure ] +crbug.com/416294710 [ sequoia intel-0x3e9b ] WebCodecs_FrameSizeChange_hvc1.1.6.L123.00_capture [ Failure ] +crbug.com/416294710 [ sequoia intel-0x3e9b ] WebCodecs_FrameSizeChange_hvc1.1.6.L123.00_hw_decoder [ Failure ] +crbug.com/416294710 [ sequoia intel-0x3e9b ] WebCodecs_FrameSizeChange_hvc1.1.6.L123.00_offscreen [ Failure ] crbug.com/389978730 [ win11 nvidia-0x2783 ] WebCodecs_EncodeColorSpace_av01.0.04M.08_prefer-hardware [ Failure ]
diff --git a/content/test/test_page_broadcast.cc b/content/test/test_page_broadcast.cc index 59b75cb..3fe52e6 100644 --- a/content/test/test_page_broadcast.cc +++ b/content/test/test_page_broadcast.cc
@@ -56,6 +56,7 @@ blink::mojom::FrameReplicationStatePtr replication_state, bool is_loading, const base::UnguessableToken& devtools_frame_token, + const std::optional<base::UnguessableToken>& navigation_metrics_token, blink::mojom::RemoteFrameInterfacesFromBrowserPtr remote_frame_interfaces, blink::mojom::RemoteMainFrameInterfacesPtr remote_main_frame_interfaces) {}
diff --git a/content/test/test_page_broadcast.h b/content/test/test_page_broadcast.h index 58895f0e..3f4fdfc 100644 --- a/content/test/test_page_broadcast.h +++ b/content/test/test_page_broadcast.h
@@ -41,6 +41,7 @@ blink::mojom::FrameReplicationStatePtr replication_state, bool is_loading, const base::UnguessableToken& devtools_frame_token, + const std::optional<base::UnguessableToken>& navigation_metrics_token, blink::mojom::RemoteFrameInterfacesFromBrowserPtr remote_frame_interfaces, blink::mojom::RemoteMainFrameInterfacesPtr remote_main_frame_interfaces) override;
diff --git a/content/test/test_render_view_host.cc b/content/test/test_render_view_host.cc index c47e397..6b15efb 100644 --- a/content/test/test_render_view_host.cc +++ b/content/test/test_render_view_host.cc
@@ -405,13 +405,17 @@ } bool TestRenderViewHost::CreateTestRenderView() { - return CreateRenderView(std::nullopt, MSG_ROUTING_NONE, false); + return CreateRenderView(/*opener_frame_token=*/std::nullopt, + /*proxy_route_id=*/MSG_ROUTING_NONE, + /*window_was_created_with_opener=*/false, + /*navigation_metrics_token=*/std::nullopt); } bool TestRenderViewHost::CreateRenderView( const std::optional<blink::FrameToken>& opener_frame_token, int proxy_route_id, - bool window_was_created_with_opener) { + bool window_was_created_with_opener, + const std::optional<base::UnguessableToken>& navigation_metrics_token) { DCHECK(!IsRenderViewLive()); // Mark the `blink::WebView` as live, though there's nothing to do here since // we don't yet use mojo to talk to the RenderView.
diff --git a/content/test/test_render_view_host.h b/content/test/test_render_view_host.h index 7020819..336ab37 100644 --- a/content/test/test_render_view_host.h +++ b/content/test/test_render_view_host.h
@@ -288,7 +288,9 @@ bool CreateRenderView( const std::optional<blink::FrameToken>& opener_frame_token, int proxy_route_id, - bool window_was_created_with_opener) override; + bool window_was_created_with_opener, + const std::optional<base::UnguessableToken>& navigation_metrics_token) + override; bool IsTestRenderViewHost() const override; // RenderViewHostTester implementation.
diff --git a/content/test/test_web_contents.cc b/content/test/test_web_contents.cc index ffcfac9..8d63825 100644 --- a/content/test/test_web_contents.cc +++ b/content/test/test_web_contents.cc
@@ -282,12 +282,14 @@ bool TestWebContents::CreateRenderViewForRenderManager( RenderViewHost* render_view_host, const std::optional<blink::FrameToken>& opener_frame_token, - RenderFrameProxyHost* proxy_host) { + RenderFrameProxyHost* proxy_host, + const std::optional<base::UnguessableToken>& navigation_metrics_token) { const auto proxy_routing_id = proxy_host ? proxy_host->GetRoutingID() : MSG_ROUTING_NONE; // This will go to a TestRenderViewHost. static_cast<RenderViewHostImpl*>(render_view_host) - ->CreateRenderView(opener_frame_token, proxy_routing_id, false); + ->CreateRenderView(opener_frame_token, proxy_routing_id, false, + navigation_metrics_token); return true; }
diff --git a/content/test/test_web_contents.h b/content/test/test_web_contents.h index 16c4ad3b..3aee1810 100644 --- a/content/test/test_web_contents.h +++ b/content/test/test_web_contents.h
@@ -123,7 +123,9 @@ bool CreateRenderViewForRenderManager( RenderViewHost* render_view_host, const std::optional<blink::FrameToken>& opener_frame_token, - RenderFrameProxyHost* proxy_host) override; + RenderFrameProxyHost* proxy_host, + const std::optional<base::UnguessableToken>& navigation_metrics_token) + override; // Returns a clone of this TestWebContents. The returned object is also a // TestWebContents. The caller owns the returned object.
diff --git a/crypto/features.cc b/crypto/features.cc index 2cad3c2..5ed1518 100644 --- a/crypto/features.cc +++ b/crypto/features.cc
@@ -12,4 +12,8 @@ "ProcessBoundStringEncryption", base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kIsHardwareBackedFixEnabled, + "IsHardwareBackedFixEnabled", + base::FEATURE_ENABLED_BY_DEFAULT); + } // namespace crypto::features
diff --git a/crypto/features.h b/crypto/features.h index 62787ab..fb92081 100644 --- a/crypto/features.h +++ b/crypto/features.h
@@ -13,6 +13,10 @@ // Enable encryption for process bound strings, if supported by the platform. CRYPTO_EXPORT BASE_DECLARE_FEATURE(kProcessBoundStringEncryption); +// Enables the fix for `UnexportableSigningKey::IsHardwareBacked` when +// dealing with Windows software keys. +CRYPTO_EXPORT BASE_DECLARE_FEATURE(kIsHardwareBackedFixEnabled); + } // namespace crypto::features #endif // CRYPTO_FEATURES_H_
diff --git a/crypto/unexportable_key_unittest.cc b/crypto/unexportable_key_unittest.cc index b9c24a1..9b17911 100644 --- a/crypto/unexportable_key_unittest.cc +++ b/crypto/unexportable_key_unittest.cc
@@ -8,7 +8,9 @@ #include <tuple> #include "base/logging.h" +#include "base/test/scoped_feature_list.h" #include "base/time/time.h" +#include "crypto/features.h" #include "crypto/scoped_fake_unexportable_key_provider.h" #include "testing/gtest/include/gtest/gtest.h" @@ -52,7 +54,9 @@ class UnexportableKeySigningTest : public testing::TestWithParam< - std::tuple<crypto::SignatureVerifier::SignatureAlgorithm, Provider>> { + std::tuple<crypto::SignatureVerifier::SignatureAlgorithm, + Provider, + bool>> { private: #if BUILDFLAG(IS_MAC) crypto::ScopedFakeAppleKeychainV2 scoped_fake_apple_keychain_{ @@ -63,12 +67,23 @@ INSTANTIATE_TEST_SUITE_P(All, UnexportableKeySigningTest, testing::Combine(testing::ValuesIn(kAllAlgorithms), - testing::ValuesIn(kAllProviders))); + testing::ValuesIn(kAllProviders), + testing::Bool())); TEST_P(UnexportableKeySigningTest, RoundTrip) { const crypto::SignatureVerifier::SignatureAlgorithm algo = std::get<0>(GetParam()); const Provider provider_type = std::get<1>(GetParam()); + const bool is_hardware_backed_fix_enabled = std::get<2>(GetParam()); + + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitWithFeatureState( + crypto::features::kIsHardwareBackedFixEnabled, + is_hardware_backed_fix_enabled); + const bool expected_is_hardware_backed = + provider_type == Provider::kFake ? false + : is_hardware_backed_fix_enabled ? (provider_type == Provider::kTPM) + : true; switch (algo) { case crypto::SignatureVerifier::SignatureAlgorithm::ECDSA_SHA256: @@ -123,6 +138,7 @@ } ASSERT_TRUE(key); + EXPECT_EQ(key->IsHardwareBacked(), expected_is_hardware_backed); LOG(INFO) << "Generation took " << (base::TimeTicks::Now() - generate_start); ASSERT_EQ(key->Algorithm(), algo);
diff --git a/crypto/unexportable_key_win.cc b/crypto/unexportable_key_win.cc index 4384567..57e6d1f 100644 --- a/crypto/unexportable_key_win.cc +++ b/crypto/unexportable_key_win.cc
@@ -15,6 +15,7 @@ #include "base/base64.h" #include "base/containers/span.h" +#include "base/feature_list.h" #include "base/logging.h" #include "base/metrics/histogram_functions.h" #include "base/numerics/checked_math.h" @@ -28,6 +29,7 @@ #include "base/threading/scoped_thread_priority.h" #include "base/types/expected.h" #include "base/types/optional_util.h" +#include "crypto/features.h" #include "crypto/hash.h" #include "crypto/random.h" #include "crypto/unexportable_key.h" @@ -390,13 +392,15 @@ return true; } -// ECDSAKey wraps a TPM-stored P-256 ECDSA key. +// ECDSAKey wraps a P-256 ECDSA key stored in the given provider. class ECDSAKey : public UnexportableSigningKey { public: - ECDSAKey(ScopedNCryptKey key, + ECDSAKey(ProviderType provider_type, + ScopedNCryptKey key, std::vector<uint8_t> key_id, std::vector<uint8_t> spki) - : key_(std::move(key)), + : provider_type_(provider_type), + key_(std::move(key)), key_id_(std::move(key_id)), spki_(std::move(spki)) {} @@ -422,21 +426,28 @@ return base::OptionalFromExpected(signature); } - bool IsHardwareBacked() const override { return true; } + bool IsHardwareBacked() const override { + return base::FeatureList::IsEnabled(features::kIsHardwareBackedFixEnabled) + ? provider_type_ == ProviderType::kTPM + : true; + } private: + const ProviderType provider_type_; ScopedNCryptKey key_; const std::vector<uint8_t> key_id_; const std::vector<uint8_t> spki_; }; -// RSAKey wraps a TPM-stored RSA key. +// RSAKey wraps a RSA key stored in the given provider. class RSAKey : public UnexportableSigningKey { public: - RSAKey(ScopedNCryptKey key, + RSAKey(ProviderType provider_type, + ScopedNCryptKey key, std::vector<uint8_t> wrapped, std::vector<uint8_t> spki) - : key_(std::move(key)), + : provider_type_(provider_type), + key_(std::move(key)), wrapped_(std::move(wrapped)), spki_(std::move(spki)) {} @@ -462,9 +473,14 @@ return base::OptionalFromExpected(signature); } - bool IsHardwareBacked() const override { return true; } + bool IsHardwareBacked() const override { + return base::FeatureList::IsEnabled(features::kIsHardwareBackedFixEnabled) + ? provider_type_ == ProviderType::kTPM + : true; + } private: + const ProviderType provider_type_; ScopedNCryptKey key_; const std::vector<uint8_t> wrapped_; const std::vector<uint8_t> spki_; @@ -570,14 +586,16 @@ if (!spki) { return nullptr; } - return std::make_unique<ECDSAKey>(std::move(key), std::move(key_id), + return std::make_unique<ECDSAKey>(provider_type_, std::move(key), + std::move(key_id), std::move(spki.value())); case SignatureVerifier::SignatureAlgorithm::RSA_PKCS1_SHA256: spki = GetRSASPKI(key.get()); if (!spki) { return nullptr; } - return std::make_unique<RSAKey>(std::move(key), std::move(key_id), + return std::make_unique<RSAKey>(provider_type_, std::move(key), + std::move(key_id), std::move(spki.value())); default: return nullptr; @@ -622,7 +640,8 @@ return nullptr; } return std::make_unique<ECDSAKey>( - std::move(key), std::vector<uint8_t>(wrapped.begin(), wrapped.end()), + provider_type_, std::move(key), + std::vector<uint8_t>(wrapped.begin(), wrapped.end()), std::move(spki.value())); } else if (algo_bytes == kRSA) { spki = GetRSASPKI(key.get()); @@ -630,7 +649,8 @@ return nullptr; } return std::make_unique<RSAKey>( - std::move(key), std::vector<uint8_t>(wrapped.begin(), wrapped.end()), + provider_type_, std::move(key), + std::vector<uint8_t>(wrapped.begin(), wrapped.end()), std::move(spki.value())); }
diff --git a/device/bluetooth/android/java/src/org/chromium/device/bluetooth/ChromeBluetoothScanFilterBuilder.java b/device/bluetooth/android/java/src/org/chromium/device/bluetooth/ChromeBluetoothScanFilterBuilder.java index d158415..e2663e2 100644 --- a/device/bluetooth/android/java/src/org/chromium/device/bluetooth/ChromeBluetoothScanFilterBuilder.java +++ b/device/bluetooth/android/java/src/org/chromium/device/bluetooth/ChromeBluetoothScanFilterBuilder.java
@@ -20,7 +20,7 @@ @JNINamespace("device") @NullMarked final class ChromeBluetoothScanFilterBuilder { - private ScanFilter.Builder mBuilder; + private final ScanFilter.Builder mBuilder; /** Constructs a ChromeBluetoothScanFilter */ public ChromeBluetoothScanFilterBuilder() {
diff --git a/device/bluetooth/android/java/src/org/chromium/device/bluetooth/wrapper/DeviceBondStateReceiverWrapper.java b/device/bluetooth/android/java/src/org/chromium/device/bluetooth/wrapper/DeviceBondStateReceiverWrapper.java index e6423d38..a781b9a 100644 --- a/device/bluetooth/android/java/src/org/chromium/device/bluetooth/wrapper/DeviceBondStateReceiverWrapper.java +++ b/device/bluetooth/android/java/src/org/chromium/device/bluetooth/wrapper/DeviceBondStateReceiverWrapper.java
@@ -13,7 +13,7 @@ @NullMarked public class DeviceBondStateReceiverWrapper extends BroadcastReceiver { - private Callback mCallback; + private final Callback mCallback; DeviceBondStateReceiverWrapper(Callback callback) { mCallback = callback;
diff --git a/device/bluetooth/android/java/src/org/chromium/device/bluetooth/wrapper/DeviceConnectStateReceiverWrapper.java b/device/bluetooth/android/java/src/org/chromium/device/bluetooth/wrapper/DeviceConnectStateReceiverWrapper.java index 70727f6..5115c22 100644 --- a/device/bluetooth/android/java/src/org/chromium/device/bluetooth/wrapper/DeviceConnectStateReceiverWrapper.java +++ b/device/bluetooth/android/java/src/org/chromium/device/bluetooth/wrapper/DeviceConnectStateReceiverWrapper.java
@@ -13,7 +13,7 @@ @NullMarked public class DeviceConnectStateReceiverWrapper extends BroadcastReceiver { - private Callback mCallback; + private final Callback mCallback; DeviceConnectStateReceiverWrapper(Callback callback) { mCallback = callback;
diff --git a/device/bluetooth/test/android/java/src/org/chromium/device/bluetooth/ChromeBluetoothScanFilter.java b/device/bluetooth/test/android/java/src/org/chromium/device/bluetooth/ChromeBluetoothScanFilter.java index 2583d6d..e8deb0e7 100644 --- a/device/bluetooth/test/android/java/src/org/chromium/device/bluetooth/ChromeBluetoothScanFilter.java +++ b/device/bluetooth/test/android/java/src/org/chromium/device/bluetooth/ChromeBluetoothScanFilter.java
@@ -17,7 +17,7 @@ */ @JNINamespace("device") final class ChromeBluetoothScanFilter { - private ScanFilter mScanFilter; + private final ScanFilter mScanFilter; /** Constructs a ChromeBluetoothScanFilter */ public ChromeBluetoothScanFilter(ScanFilter filter) {
diff --git a/device/bluetooth/test/android/java/src/org/chromium/device/bluetooth/Fakes.java b/device/bluetooth/test/android/java/src/org/chromium/device/bluetooth/Fakes.java index 8ba9545..c1bd21bc 100644 --- a/device/bluetooth/test/android/java/src/org/chromium/device/bluetooth/Fakes.java +++ b/device/bluetooth/test/android/java/src/org/chromium/device/bluetooth/Fakes.java
@@ -1469,8 +1469,8 @@ } private static class FakeSocketInputStream extends InputStream { - private FakeBluetoothSocket mSocket; - private ByteArrayInputStream mInputStream; + private final FakeBluetoothSocket mSocket; + private final ByteArrayInputStream mInputStream; FakeSocketInputStream(byte[] buffer, FakeBluetoothSocket socket) { mInputStream = new ByteArrayInputStream(buffer); @@ -1491,8 +1491,8 @@ } private static class FakeSocketOutputStream extends OutputStream { - private FakeBluetoothSocket mSocket; - private ByteArrayOutputStream mOutputStream; + private final FakeBluetoothSocket mSocket; + private final ByteArrayOutputStream mOutputStream; private FakeSocketOutputStream(FakeBluetoothSocket socket) { mSocket = socket;
diff --git a/device/gamepad/android/java/src/org/chromium/device/gamepad/GamepadDevice.java b/device/gamepad/android/java/src/org/chromium/device/gamepad/GamepadDevice.java index 54963c0d..6c7e6c9b 100644 --- a/device/gamepad/android/java/src/org/chromium/device/gamepad/GamepadDevice.java +++ b/device/gamepad/android/java/src/org/chromium/device/gamepad/GamepadDevice.java
@@ -85,13 +85,13 @@ static final int VIBRATION_MAX_AMPLITUDE = 255; // An id for the gamepad. - private int mDeviceId; + private final int mDeviceId; // The index of the gamepad in the Navigator. - private int mDeviceIndex; + private final int mDeviceIndex; // The vendor ID of the gamepad, or zero if the gamepad does not have a vendor ID. - private int mDeviceVendorId; + private final int mDeviceVendorId; // The product ID of the gamepad, or zero if the gamepad does not have a product ID. - private int mDeviceProductId; + private final int mDeviceProductId; // Last time the data for this gamepad was updated. private long mTimestamp; @@ -117,13 +117,13 @@ private final float[] mRawAxes = new float[MAX_RAW_AXIS_VALUES]; // An identification string for the gamepad. - private String mDeviceName; + private final String mDeviceName; // Array of axes ids. - private int[] mAxes; + private final int[] mAxes; // Mappings to canonical gamepad - private GamepadMappings mMappings; + private final GamepadMappings mMappings; // True if the gamepad supports "dual-rumble" vibration effects. private boolean mSupportsDualRumble;
diff --git a/device/gamepad/android/java/src/org/chromium/device/gamepad/GamepadList.java b/device/gamepad/android/java/src/org/chromium/device/gamepad/GamepadList.java index 7eb3119a..dd105174 100644 --- a/device/gamepad/android/java/src/org/chromium/device/gamepad/GamepadList.java +++ b/device/gamepad/android/java/src/org/chromium/device/gamepad/GamepadList.java
@@ -41,7 +41,7 @@ private @Nullable InputManager mInputManager; private int mAttachedToWindowCounter; private boolean mIsGamepadAPIActive; - private InputDeviceListener mInputDeviceListener; + private final InputDeviceListener mInputDeviceListener; private GamepadList() { mInputDeviceListener =
diff --git a/device/gamepad/android/junit/src/org/chromium/device/gamepad/GamepadMappingsTest.java b/device/gamepad/android/junit/src/org/chromium/device/gamepad/GamepadMappingsTest.java index 3e2bf56..38985a4 100644 --- a/device/gamepad/android/junit/src/org/chromium/device/gamepad/GamepadMappingsTest.java +++ b/device/gamepad/android/junit/src/org/chromium/device/gamepad/GamepadMappingsTest.java
@@ -41,15 +41,15 @@ private static final String XBOX_WIRELESS_DEVICE_NAME = "Xbox Wireless Controller"; /** Set bits indicate that we don't expect the button at mMappedButtons[index] to be mapped. */ - private BitSet mUnmappedButtons = new BitSet(CanonicalButtonIndex.COUNT); + private final BitSet mUnmappedButtons = new BitSet(CanonicalButtonIndex.COUNT); /** Set bits indicate that we don't expect the axis at mMappedAxes[index] to be mapped. */ - private BitSet mUnmappedAxes = new BitSet(CanonicalAxisIndex.COUNT); + private final BitSet mUnmappedAxes = new BitSet(CanonicalAxisIndex.COUNT); - private float[] mMappedButtons = new float[CanonicalButtonIndex.COUNT + 2]; - private float[] mMappedAxes = new float[CanonicalAxisIndex.COUNT]; - private float[] mRawButtons = new float[GamepadDevice.MAX_RAW_BUTTON_VALUES]; - private float[] mRawAxes = new float[GamepadDevice.MAX_RAW_AXIS_VALUES]; + private final float[] mMappedButtons = new float[CanonicalButtonIndex.COUNT + 2]; + private final float[] mMappedAxes = new float[CanonicalAxisIndex.COUNT]; + private final float[] mRawButtons = new float[GamepadDevice.MAX_RAW_BUTTON_VALUES]; + private final float[] mRawAxes = new float[GamepadDevice.MAX_RAW_AXIS_VALUES]; @Before public void setUp() {
diff --git a/docs/security/faq.md b/docs/security/faq.md index 260d793..1791b63 100644 --- a/docs/security/faq.md +++ b/docs/security/faq.md
@@ -695,6 +695,36 @@ If you believe Chrome's copies of these lists are notably out-of-date, we are happy to field bug reports but we do not consider this to be a vulnerability. +## AI Generated Vulnerability reports + +<a name="TOC-should-i-ask-an-ai-to-generate-a-vulnerability-report-for-chrome"></a> +### Should I ask an AI to Generate a Vulnerability Report for Chrome? + +Simply asking an AI to identify a bug report in Chrome is unlikely to yield a +valid report. Before submitting a report generated by AI please ensure you have +done enough human work to validate that any issue is (a) in our threat model, +and (b) reachable in Chrome by constructing a POC, generating an ASAN trace, +recording the bug reproducing, or performing your own debugging. + +AI is prone to hallucinations when asked to find security bugs and can generate +reports that repeat previously fixed issues, or describe general classes of bugs +without discovering a specific actionable issue. As the reports can be lengthy, +they take a lot of time for our security experts to process and understand +before closing. Submitting reports without doing some work yourself to validate +that an issue is actually present in Chrome harms our users by wasting the time +and resources of the Chrome security team. + +Submitting multiple low-quality AI generated reports will be treated as spamming +and has lead to accounts being banned from our reporting systems. + +AI can be used to accelerate developer workflows and may be useful when +understanding code or translating from one language to another. AI tools can be +helpful when searching for security vulnerabilities in Chrome, but remember that +additional work must be done to ensure that vulnerability reports are brief, +actionable, and reproducible. These must meet the prerequisites of a [baseline +security bug report](https://g.co/chrome/vrp#report-quality) before we can pass +them to teams to be fixed. + ## Certificates & Connection Indicators <a name="TOC-Where-are-the-security-indicators-located-in-the-browser-window-"></a>
diff --git a/extensions/browser/extension_function_histogram_value.h b/extensions/browser/extension_function_histogram_value.h index 9830df24..6d3fd3d 100644 --- a/extensions/browser/extension_function_histogram_value.h +++ b/extensions/browser/extension_function_histogram_value.h
@@ -1998,6 +1998,7 @@ EXPERIMENTALACTOR_EXECUTEACTION = 1935, EXPERIMENTALACTOR_STOPTASK = 1936, BOOKMARKMANAGERPRIVATE_OPENINNEWTABGROUP = 1937, + CONTROLLEDFRAMEINTERNAL_CONTEXTMENUSUPDATE = 1938, // Last entry: Add new entries above, then run: // tools/metrics/histograms/update_extension_histograms.py ENUM_BOUNDARY
diff --git a/extensions/common/extension_features.h b/extensions/common/extension_features.h index 02386195..8f875a4c7 100644 --- a/extensions/common/extension_features.h +++ b/extensions/common/extension_features.h
@@ -224,7 +224,7 @@ // matching condition. BASE_DECLARE_FEATURE(kDeclarativeNetRequestResponseHeaderMatching); -// Enables a relaxed rule count for "safe" dynqmic or session scoped rules above +// Enables a relaxed rule count for "safe" dynamic or session scoped rules above // the current limit. If disabled, all dynamic and session scoped rules are // treated as "safe" but the rule limit's value will be the stricter "unsafe" // limit.
diff --git a/extensions/common/image_util.h b/extensions/common/image_util.h index 53bb7e7..6c9a0d0 100644 --- a/extensions/common/image_util.h +++ b/extensions/common/image_util.h
@@ -5,9 +5,11 @@ #ifndef EXTENSIONS_COMMON_IMAGE_UTIL_H_ #define EXTENSIONS_COMMON_IMAGE_UTIL_H_ +#include <stdint.h> + class SkBitmap; -using SkColor = unsigned int; +using SkColor = uint32_t; namespace base { class FilePath;
diff --git a/extensions/renderer/resources/context_menus_handlers.js b/extensions/renderer/resources/context_menus_handlers.js index 1fbc92ef..cb022a5 100644 --- a/extensions/renderer/resources/context_menus_handlers.js +++ b/extensions/renderer/resources/context_menus_handlers.js
@@ -189,7 +189,7 @@ }; if (isWebview) { bindingUtil.sendRequest( - 'chromeWebViewInternal.contextMenusUpdate', + webViewNamespace + '.contextMenusUpdate', [instanceId, id, updateProperties, successCallback], optArgs); } else { bindingUtil.sendRequest(
diff --git a/gpu/command_buffer/client/gles2_implementation.cc b/gpu/command_buffer/client/gles2_implementation.cc index c41a502..8ab3740 100644 --- a/gpu/command_buffer/client/gles2_implementation.cc +++ b/gpu/command_buffer/client/gles2_implementation.cc
@@ -448,7 +448,7 @@ std::deque<DeferredErrorCallback> local_callbacks; std::swap(deferred_error_callbacks_, local_callbacks); - for (auto c : local_callbacks) { + for (const auto& c : local_callbacks) { error_message_callback_.Run(c.message.c_str(), c.id); } }
diff --git a/gpu/command_buffer/service/program_manager.cc b/gpu/command_buffer/service/program_manager.cc index 1ef0d62..06ab3d1 100644 --- a/gpu/command_buffer/service/program_manager.cc +++ b/gpu/command_buffer/service/program_manager.cc
@@ -1593,7 +1593,7 @@ bool Program::DetectUniformLocationBindingConflicts() const { std::set<GLint> location_binding_used; - for (auto it : bind_uniform_location_map_) { + for (const auto& it : bind_uniform_location_map_) { // Find out if an attribute is statically used in this program's shaders. const sh::Uniform* uniform = nullptr; const std::string* mapped_name = GetUniformMappedName(it.first);
diff --git a/gpu/command_buffer/service/shared_image/external_vk_image_backing_factory.cc b/gpu/command_buffer/service/shared_image/external_vk_image_backing_factory.cc index 7d0bf36..f980e99 100644 --- a/gpu/command_buffer/service/shared_image/external_vk_image_backing_factory.cc +++ b/gpu/command_buffer/service/shared_image/external_vk_image_backing_factory.cc
@@ -131,10 +131,7 @@ } // ALPHA_8 is only used by UI and should never need GL/Vulkan interop. - // LUMINANCE_8 is only used with GL ES2 contexts and shouldn't be relevant for - // devices that support Vulkan. - if (format == viz::SinglePlaneFormat::kALPHA_8 || - format == viz::SinglePlaneFormat::kLUMINANCE_8) { + if (format == viz::SinglePlaneFormat::kALPHA_8) { return false; }
diff --git a/gpu/command_buffer/service/shared_image/shared_image_format_service_utils.cc b/gpu/command_buffer/service/shared_image/shared_image_format_service_utils.cc index 4b5fb2a..0e63413 100644 --- a/gpu/command_buffer/service/shared_image/shared_image_format_service_utils.cc +++ b/gpu/command_buffer/service/shared_image/shared_image_format_service_utils.cc
@@ -60,8 +60,6 @@ return VK_FORMAT_A2R10G10B10_UNORM_PACK32; } else if (format == viz::SinglePlaneFormat::kALPHA_8) { return VK_FORMAT_R8_UNORM; - } else if (format == viz::SinglePlaneFormat::kLUMINANCE_8) { - return VK_FORMAT_R8_UNORM; } else if (format == viz::SinglePlaneFormat::kETC1) { return VK_FORMAT_ETC2_R8G8B8_UNORM_BLOCK; } else if (format == viz::SinglePlaneFormat::kLUMINANCE_F16 || @@ -86,8 +84,7 @@ return GL_BGRA_EXT; } else if (format == viz::SinglePlaneFormat::kALPHA_8) { return GL_ALPHA; - } else if (format == viz::SinglePlaneFormat::kLUMINANCE_8 || - format == viz::SinglePlaneFormat::kLUMINANCE_F16) { + } else if (format == viz::SinglePlaneFormat::kLUMINANCE_F16) { return GL_LUMINANCE; } else if (format == viz::SinglePlaneFormat::kRGB_565 || format == viz::SinglePlaneFormat::kBGR_565 || @@ -121,7 +118,6 @@ if (format == viz::SinglePlaneFormat::kRGBA_8888 || format == viz::SinglePlaneFormat::kBGRA_8888 || format == viz::SinglePlaneFormat::kALPHA_8 || - format == viz::SinglePlaneFormat::kLUMINANCE_8 || format == viz::SinglePlaneFormat::kETC1 || format == viz::SinglePlaneFormat::kR_8 || format == viz::SinglePlaneFormat::kRG_88 || @@ -497,8 +493,7 @@ format == viz::SinglePlaneFormat::kBGRX_8888) { return wgpu::TextureFormat::BGRA8Unorm; } else if (format == viz::SinglePlaneFormat::kR_8 || - format == viz::SinglePlaneFormat::kALPHA_8 || - format == viz::SinglePlaneFormat::kLUMINANCE_8) { + format == viz::SinglePlaneFormat::kALPHA_8) { return wgpu::TextureFormat::R8Unorm; } else if (format == viz::SinglePlaneFormat::kRG_88) { return wgpu::TextureFormat::RG8Unorm;
diff --git a/gpu/command_buffer/service/shared_image/shared_image_format_service_utils_mac.mm b/gpu/command_buffer/service/shared_image/shared_image_format_service_utils_mac.mm index 3dc8a40a..f1d7845 100644 --- a/gpu/command_buffer/service/shared_image/shared_image_format_service_utils_mac.mm +++ b/gpu/command_buffer/service/shared_image/shared_image_format_service_utils_mac.mm
@@ -77,8 +77,7 @@ MTLPixelFormat mtl_pixel_format = MTLPixelFormatInvalid; if (format.is_single_plane()) { if (format == viz::SinglePlaneFormat::kR_8 || - format == viz::SinglePlaneFormat::kALPHA_8 || - format == viz::SinglePlaneFormat::kLUMINANCE_8) { + format == viz::SinglePlaneFormat::kALPHA_8) { mtl_pixel_format = MTLPixelFormatR8Unorm; } else if (format == viz::SinglePlaneFormat::kRG_88) { mtl_pixel_format = MTLPixelFormatRG8Unorm;
diff --git a/gpu/command_buffer/service/shared_image/shared_image_manager.cc b/gpu/command_buffer/service/shared_image/shared_image_manager.cc index fc2da51e..4e8408b 100644 --- a/gpu/command_buffer/service/shared_image/shared_image_manager.cc +++ b/gpu/command_buffer/service/shared_image/shared_image_manager.cc
@@ -129,8 +129,6 @@ return SharedImageFormatUMA::kBGRA_8888; } else if (format == viz::SinglePlaneFormat::kALPHA_8) { return SharedImageFormatUMA::kALPHA_8; - } else if (format == viz::SinglePlaneFormat::kLUMINANCE_8) { - return SharedImageFormatUMA::kLUMINANCE_8; } else if (format == viz::SinglePlaneFormat::kRGB_565) { return SharedImageFormatUMA::kRGB_565; } else if (format == viz::SinglePlaneFormat::kBGR_565) {
diff --git a/gpu/command_buffer/service/shared_image/wrapped_sk_image_backing_factory.cc b/gpu/command_buffer/service/shared_image/wrapped_sk_image_backing_factory.cc index 463df7fc..bab05ec 100644 --- a/gpu/command_buffer/service/shared_image/wrapped_sk_image_backing_factory.cc +++ b/gpu/command_buffer/service/shared_image/wrapped_sk_image_backing_factory.cc
@@ -189,11 +189,7 @@ } } - if (format == viz::SinglePlaneFormat::kLUMINANCE_8) { - // WrappedSkImage does not support LUMINANCE_8. See - // https://crbug.com/1252502 for details. - return false; - } else if (format == viz::SinglePlaneFormat::kALPHA_8) { + if (format == viz::SinglePlaneFormat::kALPHA_8) { // For ALPHA8 skia will pick format depending on context version and // extensions available and we'll have to match that format when we record // DDLs. To avoid matching logic here, fallback to other backings (e.g
diff --git a/gpu/command_buffer/service/webgpu_decoder_impl.cc b/gpu/command_buffer/service/webgpu_decoder_impl.cc index 245adb7..8674e553 100644 --- a/gpu/command_buffer/service/webgpu_decoder_impl.cc +++ b/gpu/command_buffer/service/webgpu_decoder_impl.cc
@@ -1148,17 +1148,17 @@ force_webgpu_compat_ = gpu_preferences.force_webgpu_compat; require_enabled_toggles_ = gpu_preferences.enabled_dawn_features_list; require_disabled_toggles_ = gpu_preferences.disabled_dawn_features_list; - for (std::string f : + for (std::string& f : base::SplitString(features::kWebGPUEnabledToggles.Get(), ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL)) { require_enabled_toggles_.push_back(std::move(f)); } - for (std::string f : + for (std::string& f : base::SplitString(features::kWebGPUDisabledToggles.Get(), ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL)) { require_disabled_toggles_.push_back(std::move(f)); } - for (std::string f : + for (std::string& f : base::SplitString(features::kWebGPUUnsafeFeatures.Get(), ",", base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL)) { runtime_unsafe_features_.insert(std::move(f));
diff --git a/infra/config/generated/builders/ci/GPU FYI Win Builder/targets/chromium.gpu.fyi.json b/infra/config/generated/builders/ci/GPU FYI Win Builder/targets/chromium.gpu.fyi.json index e1721f2..c187760 100644 --- a/infra/config/generated/builders/ci/GPU FYI Win Builder/targets/chromium.gpu.fyi.json +++ b/infra/config/generated/builders/ci/GPU FYI Win Builder/targets/chromium.gpu.fyi.json
@@ -651,7 +651,7 @@ "--stable-jobs", "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc", "--enforce-browser-version", - "--jobs=1" + "--jobs=4" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
diff --git "a/infra/config/generated/builders/ci/GPU FYI Win x64 Builder \050dbg\051/targets/chromium.gpu.fyi.json" "b/infra/config/generated/builders/ci/GPU FYI Win x64 Builder \050dbg\051/targets/chromium.gpu.fyi.json" index 1133709..51144ae5 100644 --- "a/infra/config/generated/builders/ci/GPU FYI Win x64 Builder \050dbg\051/targets/chromium.gpu.fyi.json" +++ "b/infra/config/generated/builders/ci/GPU FYI Win x64 Builder \050dbg\051/targets/chromium.gpu.fyi.json"
@@ -432,7 +432,7 @@ "--stable-jobs", "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc", "--enforce-browser-version", - "--jobs=1" + "--jobs=4" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
diff --git a/infra/config/generated/builders/ci/GPU FYI Win x64 Builder/targets/chromium.gpu.fyi.json b/infra/config/generated/builders/ci/GPU FYI Win x64 Builder/targets/chromium.gpu.fyi.json index 204fcf0..ce4557d1 100644 --- a/infra/config/generated/builders/ci/GPU FYI Win x64 Builder/targets/chromium.gpu.fyi.json +++ b/infra/config/generated/builders/ci/GPU FYI Win x64 Builder/targets/chromium.gpu.fyi.json
@@ -696,7 +696,7 @@ "--stable-jobs", "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc", "--enforce-browser-version", - "--jobs=1" + "--jobs=4" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py" @@ -3646,7 +3646,7 @@ "--stable-jobs", "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc", "--enforce-browser-version", - "--jobs=1" + "--jobs=4" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
diff --git "a/infra/config/generated/builders/ci/GPU Win x64 Builder \050dbg\051/targets/chromium.gpu.json" "b/infra/config/generated/builders/ci/GPU Win x64 Builder \050dbg\051/targets/chromium.gpu.json" index 14e8987..489d25d 100644 --- "a/infra/config/generated/builders/ci/GPU Win x64 Builder \050dbg\051/targets/chromium.gpu.json" +++ "b/infra/config/generated/builders/ci/GPU Win x64 Builder \050dbg\051/targets/chromium.gpu.json"
@@ -425,7 +425,7 @@ "--stable-jobs", "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc", "--enforce-browser-version", - "--jobs=1" + "--jobs=4" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
diff --git a/infra/config/generated/builders/ci/GPU Win x64 Builder/targets/chromium.gpu.json b/infra/config/generated/builders/ci/GPU Win x64 Builder/targets/chromium.gpu.json index 290c5d5..5433f51a 100644 --- a/infra/config/generated/builders/ci/GPU Win x64 Builder/targets/chromium.gpu.json +++ b/infra/config/generated/builders/ci/GPU Win x64 Builder/targets/chromium.gpu.json
@@ -425,7 +425,7 @@ "--stable-jobs", "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc", "--enforce-browser-version", - "--jobs=1" + "--jobs=4" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
diff --git "a/infra/config/generated/builders/ci/Win10 FYI x64 Debug \050NVIDIA\051/targets/chromium.gpu.fyi.json" "b/infra/config/generated/builders/ci/Win10 FYI x64 Debug \050NVIDIA\051/targets/chromium.gpu.fyi.json" index 49b8c9d..60e75b45 100644 --- "a/infra/config/generated/builders/ci/Win10 FYI x64 Debug \050NVIDIA\051/targets/chromium.gpu.fyi.json" +++ "b/infra/config/generated/builders/ci/Win10 FYI x64 Debug \050NVIDIA\051/targets/chromium.gpu.fyi.json"
@@ -431,7 +431,7 @@ "--stable-jobs", "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc", "--enforce-browser-version", - "--jobs=1" + "--jobs=4" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
diff --git "a/infra/config/generated/builders/ci/Win10 FYI x64 Exp Release \050NVIDIA\051/targets/chromium.gpu.fyi.json" "b/infra/config/generated/builders/ci/Win10 FYI x64 Exp Release \050NVIDIA\051/targets/chromium.gpu.fyi.json" index d812ebe..8fd94006 100644 --- "a/infra/config/generated/builders/ci/Win10 FYI x64 Exp Release \050NVIDIA\051/targets/chromium.gpu.fyi.json" +++ "b/infra/config/generated/builders/ci/Win10 FYI x64 Exp Release \050NVIDIA\051/targets/chromium.gpu.fyi.json"
@@ -695,7 +695,7 @@ "--stable-jobs", "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc", "--enforce-browser-version", - "--jobs=1" + "--jobs=4" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
diff --git "a/infra/config/generated/builders/ci/Win10 FYI x64 Release \050NVIDIA\051/targets/chromium.gpu.fyi.json" "b/infra/config/generated/builders/ci/Win10 FYI x64 Release \050NVIDIA\051/targets/chromium.gpu.fyi.json" index 754b6cd6..29a9276 100644 --- "a/infra/config/generated/builders/ci/Win10 FYI x64 Release \050NVIDIA\051/targets/chromium.gpu.fyi.json" +++ "b/infra/config/generated/builders/ci/Win10 FYI x64 Release \050NVIDIA\051/targets/chromium.gpu.fyi.json"
@@ -650,7 +650,7 @@ "--stable-jobs", "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc", "--enforce-browser-version", - "--jobs=1" + "--jobs=4" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
diff --git "a/infra/config/generated/builders/ci/Win10 FYI x86 Release \050NVIDIA\051/targets/chromium.gpu.fyi.json" "b/infra/config/generated/builders/ci/Win10 FYI x86 Release \050NVIDIA\051/targets/chromium.gpu.fyi.json" index 89ae2476..d2fef63 100644 --- "a/infra/config/generated/builders/ci/Win10 FYI x86 Release \050NVIDIA\051/targets/chromium.gpu.fyi.json" +++ "b/infra/config/generated/builders/ci/Win10 FYI x86 Release \050NVIDIA\051/targets/chromium.gpu.fyi.json"
@@ -650,7 +650,7 @@ "--stable-jobs", "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc", "--enforce-browser-version", - "--jobs=1" + "--jobs=4" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
diff --git "a/infra/config/generated/builders/ci/Win10 x64 Debug \050NVIDIA\051/targets/chromium.gpu.json" "b/infra/config/generated/builders/ci/Win10 x64 Debug \050NVIDIA\051/targets/chromium.gpu.json" index 14e8987..489d25d 100644 --- "a/infra/config/generated/builders/ci/Win10 x64 Debug \050NVIDIA\051/targets/chromium.gpu.json" +++ "b/infra/config/generated/builders/ci/Win10 x64 Debug \050NVIDIA\051/targets/chromium.gpu.json"
@@ -425,7 +425,7 @@ "--stable-jobs", "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc", "--enforce-browser-version", - "--jobs=1" + "--jobs=4" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
diff --git "a/infra/config/generated/builders/ci/Win10 x64 Release \050NVIDIA\051/targets/chromium.gpu.json" "b/infra/config/generated/builders/ci/Win10 x64 Release \050NVIDIA\051/targets/chromium.gpu.json" index 290c5d5..5433f51a 100644 --- "a/infra/config/generated/builders/ci/Win10 x64 Release \050NVIDIA\051/targets/chromium.gpu.json" +++ "b/infra/config/generated/builders/ci/Win10 x64 Release \050NVIDIA\051/targets/chromium.gpu.json"
@@ -425,7 +425,7 @@ "--stable-jobs", "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc", "--enforce-browser-version", - "--jobs=1" + "--jobs=4" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-win10-nvidia-dbg-64/targets/chromium.gpu.fyi.json b/infra/config/generated/builders/try/gpu-fyi-try-win10-nvidia-dbg-64/targets/chromium.gpu.fyi.json index 1133709..51144ae5 100644 --- a/infra/config/generated/builders/try/gpu-fyi-try-win10-nvidia-dbg-64/targets/chromium.gpu.fyi.json +++ b/infra/config/generated/builders/try/gpu-fyi-try-win10-nvidia-dbg-64/targets/chromium.gpu.fyi.json
@@ -432,7 +432,7 @@ "--stable-jobs", "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc", "--enforce-browser-version", - "--jobs=1" + "--jobs=4" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-win10-nvidia-exp-64/targets/chromium.gpu.fyi.json b/infra/config/generated/builders/try/gpu-fyi-try-win10-nvidia-exp-64/targets/chromium.gpu.fyi.json index 2778b654..babe764 100644 --- a/infra/config/generated/builders/try/gpu-fyi-try-win10-nvidia-exp-64/targets/chromium.gpu.fyi.json +++ b/infra/config/generated/builders/try/gpu-fyi-try-win10-nvidia-exp-64/targets/chromium.gpu.fyi.json
@@ -696,7 +696,7 @@ "--stable-jobs", "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc", "--enforce-browser-version", - "--jobs=1" + "--jobs=4" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-win10-nvidia-rel-32/targets/chromium.gpu.fyi.json b/infra/config/generated/builders/try/gpu-fyi-try-win10-nvidia-rel-32/targets/chromium.gpu.fyi.json index e1721f2..c187760 100644 --- a/infra/config/generated/builders/try/gpu-fyi-try-win10-nvidia-rel-32/targets/chromium.gpu.fyi.json +++ b/infra/config/generated/builders/try/gpu-fyi-try-win10-nvidia-rel-32/targets/chromium.gpu.fyi.json
@@ -651,7 +651,7 @@ "--stable-jobs", "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc", "--enforce-browser-version", - "--jobs=1" + "--jobs=4" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
diff --git a/infra/config/generated/builders/try/gpu-fyi-try-win10-nvidia-rel-64/targets/chromium.gpu.fyi.json b/infra/config/generated/builders/try/gpu-fyi-try-win10-nvidia-rel-64/targets/chromium.gpu.fyi.json index e33bda9..59a494b 100644 --- a/infra/config/generated/builders/try/gpu-fyi-try-win10-nvidia-rel-64/targets/chromium.gpu.fyi.json +++ b/infra/config/generated/builders/try/gpu-fyi-try-win10-nvidia-rel-64/targets/chromium.gpu.fyi.json
@@ -651,7 +651,7 @@ "--stable-jobs", "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc", "--enforce-browser-version", - "--jobs=1" + "--jobs=4" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
diff --git a/infra/config/generated/builders/try/gpu-try-win-nvidia-dbg/targets/chromium.gpu.json b/infra/config/generated/builders/try/gpu-try-win-nvidia-dbg/targets/chromium.gpu.json index 14e8987..489d25d 100644 --- a/infra/config/generated/builders/try/gpu-try-win-nvidia-dbg/targets/chromium.gpu.json +++ b/infra/config/generated/builders/try/gpu-try-win-nvidia-dbg/targets/chromium.gpu.json
@@ -425,7 +425,7 @@ "--stable-jobs", "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc", "--enforce-browser-version", - "--jobs=1" + "--jobs=4" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
diff --git a/infra/config/generated/builders/try/win-rel/targets/chromium.gpu.json b/infra/config/generated/builders/try/win-rel/targets/chromium.gpu.json index 290c5d5..5433f51a 100644 --- a/infra/config/generated/builders/try/win-rel/targets/chromium.gpu.json +++ b/infra/config/generated/builders/try/win-rel/targets/chromium.gpu.json
@@ -425,7 +425,7 @@ "--stable-jobs", "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc", "--enforce-browser-version", - "--jobs=1" + "--jobs=4" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
diff --git a/infra/config/lib/targets-internal/magic_args.star b/infra/config/lib/targets-internal/magic_args.star index ed99878..3980529 100644 --- a/infra/config/lib/targets-internal/magic_args.star +++ b/infra/config/lib/targets-internal/magic_args.star
@@ -317,14 +317,6 @@ if gpu.startswith("10de"): return ["--jobs=1"] - # trace_test flakily hangs Win NVIDIA GTX 1660 machines crbug.com/406454932. - # Speculatively disable parallelism to check if it is related. - is_trace_test = test_name == "trace_test" or suite == "trace_test" - if settings.os_type == common.os_type.WINDOWS and is_trace_test: - for gpu in _get_gpus(spec_value): - if gpu.startswith("10de:2184"): - return ["--jobs=1"] - if settings.os_type in ( common.os_type.LACROS, common.os_type.LINUX,
diff --git a/infra/inclusive_language_presubmit_exempt_dirs.txt b/infra/inclusive_language_presubmit_exempt_dirs.txt index 5f73e2a..6372ace4 100644 --- a/infra/inclusive_language_presubmit_exempt_dirs.txt +++ b/infra/inclusive_language_presubmit_exempt_dirs.txt
@@ -5,6 +5,7 @@ ash/webui/camera_app_ui/resources/js/lib 8 1 base 1 1 base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base 1 1 +base/allocator/partition_allocator/src/partition_alloc/partition_alloc_base/containers 1 1 base/android 1 1 base/android/java/src/org/chromium/base 2 2 base/containers 1 1 @@ -189,7 +190,7 @@ docs/mac 1 1 docs/media/capture 1 1 docs/memory-infra 1 1 -docs/security 8 6 +docs/security 12 8 docs/security/research/graphics 2 1 docs/security/url_display_guidelines 1 1 docs/speed 6 5 @@ -291,7 +292,7 @@ third_party/abseil-cpp/absl/random 3 1 third_party/abseil-cpp/absl/random/internal 1 1 third_party/abseil-cpp/absl/status 2 1 -third_party/abseil-cpp/ci 12 10 +third_party/abseil-cpp/ci 5 4 third_party/abseil-cpp/CMake 2 1 third_party/abseil-cpp/CMake/Googletest 2 1 third_party/abseil-cpp/.github 1 1 @@ -484,15 +485,13 @@ third_party/expat 2 2 third_party/fdlibm 1 1 third_party/fusejs/dist 3 1 -third_party/google-closure-library 5 3 -third_party/google-closure-library/closure/bin/generate_closure_unit_tests 1 1 -third_party/google-closure-library/closure-deps 4 1 +third_party/google-closure-library 1 1 +third_party/google-closure-library/closure-deps 3 1 third_party/google-closure-library/closure-deps/lib 1 1 -third_party/google-closure-library/closure/goog 1 1 third_party/google-closure-library/closure/goog/crypt 1 1 third_party/google-closure-library/closure/goog/editor/plugins 6 2 third_party/google-closure-library/closure/goog/html 1 1 -third_party/google-closure-library/closure/goog/html/sanitizer 39 8 +third_party/google-closure-library/closure/goog/html/sanitizer 37 7 third_party/google-closure-library/closure/goog/labs/net 4 1 third_party/google-closure-library/closure/goog/locale 2 2 third_party/google-closure-library/closure/goog/messaging 7 1 @@ -500,7 +499,7 @@ third_party/google-closure-library/doc/develop 1 1 third_party/google-closure-library/doc/js 1 1 third_party/google-closure-library/scripts 1 1 -third_party/google-closure-library/scripts/ci 9 6 +third_party/google-closure-library/scripts/ci 4 3 third_party/google_input_tools/src/chrome/os/sounds 1 1 third_party/google_input_tools/third_party/closure_library/closure/goog/html 1 1 third_party/google-java-format 2 1 @@ -623,7 +622,7 @@ third_party/polymer/v3_0/components-chromium/polymer/lib/elements 4 1 third_party/private-join-and-compute 1 1 third_party/private_membership 1 1 -third_party/protobuf 2 1 +third_party/protobuf 4 2 third_party/protobuf/bazel/toolchains 1 1 third_party/protobuf/build_defs 1 1 third_party/protobuf/docs 3 2 @@ -645,8 +644,6 @@ third_party/rust/chromium_crates_io/vendor/anstyle-v1 1 1 third_party/rust/chromium_crates_io/vendor/anyhow-v1 2 1 third_party/rust/chromium_crates_io/vendor/anyhow-v1/.github/workflows 3 1 -third_party/rust/chromium_crates_io/vendor/arrayvec-v0_7 1 1 -third_party/rust/chromium_crates_io/vendor/arrayvec-v0_7/.github/workflows 3 1 third_party/rust/chromium_crates_io/vendor/autocfg-v1 1 1 third_party/rust/chromium_crates_io/vendor/base64-v0_22 1 1 third_party/rust/chromium_crates_io/vendor/bytes-v1/.github/workflows 3 1 @@ -694,10 +691,6 @@ third_party/rust/chromium_crates_io/vendor/qr_code-v2 1 1 third_party/rust/chromium_crates_io/vendor/quote-v1 1 1 third_party/rust/chromium_crates_io/vendor/quote-v1/.github/workflows 2 1 -third_party/rust/chromium_crates_io/vendor/rand_core-v0_6 4 1 -third_party/rust/chromium_crates_io/vendor/rand_core-v0_6/src 3 1 -third_party/rust/chromium_crates_io/vendor/rand_core-v0_9 4 1 -third_party/rust/chromium_crates_io/vendor/rand_core-v0_9/src 3 1 third_party/rust/chromium_crates_io/vendor/read-fonts-v0_27/src/tables 3 2 third_party/rust/chromium_crates_io/vendor/regex-automata-v0_4 2 2 third_party/rust/chromium_crates_io/vendor/regex-automata-v0_4/src/util 1 1 @@ -706,8 +699,6 @@ third_party/rust/chromium_crates_io/vendor/regex-automata-v0_4/tests/meta 6 1 third_party/rust/chromium_crates_io/vendor/regex-automata-v0_4/tests/nfa/thompson/backtrack 2 1 third_party/rust/chromium_crates_io/vendor/regex-syntax-v0_8 2 2 -third_party/rust/chromium_crates_io/vendor/rust_decimal-v1 3 2 -third_party/rust/chromium_crates_io/vendor/rust_decimal-v1/.github/workflows 1 1 third_party/rust/chromium_crates_io/vendor/rustversion-v1 2 1 third_party/rust/chromium_crates_io/vendor/rustversion-v1/.github/workflows 2 1 third_party/rust/chromium_crates_io/vendor/rustversion-v1/src 1 1 @@ -744,7 +735,7 @@ third_party/rust/chromium_crates_io/vendor/windows-sys-v0_52 1 1 third_party/rust/chromium_crates_io/vendor/windows-sys-v0_52/src/Windows/Wdk/System/SystemServices 1 1 third_party/rust/chromium_crates_io/vendor/windows-sys-v0_52/src/Windows/Win32/Networking/Clustering 2 1 -third_party/screen-ai 2 1 +third_party/screen-ai 1 1 third_party/sentencepiece/src 2 2 third_party/sentencepiece/src/doc 3 1 third_party/sentencepiece/src/src 1 1 @@ -845,7 +836,6 @@ tools/web_bluetooth 1 1 tools/win/RetrieveSymbols 1 1 ui/base/cocoa/constrained_window 1 1 -ui/base/linux 2 1 ui/base/prediction 1 1 ui/base/x 3 3 ui/events/devices/x11 18 4
diff --git a/internal b/internal index e613517..d177ab1 160000 --- a/internal +++ b/internal
@@ -1 +1 @@ -Subproject commit e613517431480bcf7c7a0b6fbad281a1b4f6b26e +Subproject commit d177ab19a801ad5337736483002b4c7a2ca6c5c4
diff --git a/ios/chrome/browser/intelligence/glic/coordinator/BUILD.gn b/ios/chrome/browser/intelligence/glic/coordinator/BUILD.gn index 0f2590d..9a55f4b 100644 --- a/ios/chrome/browser/intelligence/glic/coordinator/BUILD.gn +++ b/ios/chrome/browser/intelligence/glic/coordinator/BUILD.gn
@@ -17,6 +17,7 @@ deps = [ "//base", "//components/prefs:prefs", + "//ios/chrome/browser/intelligence/features", "//ios/chrome/browser/intelligence/glic/metrics", "//ios/chrome/browser/intelligence/glic/ui", "//ios/chrome/browser/promos_manager/model", @@ -27,3 +28,28 @@ "//ios/chrome/browser/shared/model/profile", ] } + +source_set("unit_tests") { + testonly = true + sources = [ "glic_promo_scene_agent_unittest.mm" ] + + deps = [ + ":coordinator", + "//base/test:test_support", + "//ios/chrome/app:app_internal", + "//ios/chrome/app/application_delegate:app_state", + "//ios/chrome/app/application_delegate:test_support", + "//ios/chrome/browser/intelligence/features", + "//ios/chrome/browser/promos_manager/model:constants", + "//ios/chrome/browser/promos_manager/model:features", + "//ios/chrome/browser/promos_manager/model:test_support", + "//ios/chrome/browser/shared/coordinator/scene:scene_state_header", + "//ios/chrome/browser/shared/model/application_context", + "//ios/chrome/browser/shared/model/browser", + "//ios/chrome/browser/shared/model/browser/test:test_support", + "//ios/chrome/browser/shared/model/prefs:pref_names", + "//ios/chrome/browser/shared/model/profile/test", + "//ios/web/public/test", + "//third_party/ocmock", + ] +}
diff --git a/ios/chrome/browser/intelligence/glic/coordinator/glic_promo_scene_agent.mm b/ios/chrome/browser/intelligence/glic/coordinator/glic_promo_scene_agent.mm index 1a11385f..c4365d4b 100644 --- a/ios/chrome/browser/intelligence/glic/coordinator/glic_promo_scene_agent.mm +++ b/ios/chrome/browser/intelligence/glic/coordinator/glic_promo_scene_agent.mm
@@ -5,6 +5,7 @@ #import "ios/chrome/browser/intelligence/glic/coordinator/glic_promo_scene_agent.h" #import "base/memory/raw_ptr.h" +#import "ios/chrome/browser/intelligence/features/features.h" #import "ios/chrome/browser/promos_manager/model/constants.h" #import "ios/chrome/browser/promos_manager/model/promos_manager.h" @@ -26,7 +27,9 @@ transitionedToActivationLevel:(SceneActivationLevel)level { switch (level) { case SceneActivationLevelForegroundActive: { - [self registerPromoForSingleDisplay]; + if (IsPageActionMenuEnabled()) { + [self registerPromoForSingleDisplay]; + } break; } case SceneActivationLevelUnattached:
diff --git a/ios/chrome/browser/intelligence/glic/coordinator/glic_promo_scene_agent_unittest.mm b/ios/chrome/browser/intelligence/glic/coordinator/glic_promo_scene_agent_unittest.mm new file mode 100644 index 0000000..31b9424 --- /dev/null +++ b/ios/chrome/browser/intelligence/glic/coordinator/glic_promo_scene_agent_unittest.mm
@@ -0,0 +1,71 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import "ios/chrome/browser/intelligence/glic/coordinator/glic_promo_scene_agent.h" + +#import "base/test/scoped_feature_list.h" +#import "ios/chrome/app/application_delegate/app_state.h" +#import "ios/chrome/app/application_delegate/fake_startup_information.h" +#import "ios/chrome/browser/intelligence/features/features.h" +#import "ios/chrome/browser/promos_manager/model/constants.h" +#import "ios/chrome/browser/promos_manager/model/features.h" +#import "ios/chrome/browser/promos_manager/model/mock_promos_manager.h" +#import "ios/chrome/browser/shared/coordinator/scene/scene_state.h" +#import "ios/chrome/browser/shared/model/browser/browser.h" +#import "ios/chrome/browser/shared/model/browser/test/test_browser.h" +#import "ios/chrome/browser/shared/model/profile/test/test_profile_ios.h" +#import "ios/web/public/test/web_task_environment.h" +#import "testing/platform_test.h" +#import "third_party/ocmock/OCMock/OCMock.h" +#import "third_party/ocmock/gtest_support.h" + +class GLICPromoSceneAgentTest : public PlatformTest { + public: + GLICPromoSceneAgentTest() : PlatformTest() { + scene_state_ = [[SceneState alloc] initWithAppState:app_state_]; + scene_state_.activationLevel = SceneActivationLevelForegroundInactive; + scene_state_.scene = static_cast<UIWindowScene*>( + [[[UIApplication sharedApplication] connectedScenes] anyObject]); + std::unique_ptr<TestProfileIOS> profile_ = + TestProfileIOS::Builder().Build(); + std::unique_ptr<Browser> browser_ = + std::make_unique<TestBrowser>(profile_.get(), scene_state_); + FakeStartupInformation* startup_information_ = + [[FakeStartupInformation alloc] init]; + app_state_ = + [[AppState alloc] initWithStartupInformation:startup_information_]; + promos_manager_ = std::make_unique<MockPromosManager>(); + agent_ = [[GLICPromoSceneAgent alloc] + initWithPromosManager:promos_manager_.get()]; + + agent_.sceneState = scene_state_; + } + + protected: + GLICPromoSceneAgent* agent_; + // SceneState only weakly holds AppState, so keep it alive here. + AppState* app_state_; + base::test::ScopedFeatureList feature_list_; + SceneState* scene_state_; + web::WebTaskEnvironment task_environment_; + std::unique_ptr<MockPromosManager> promos_manager_; +}; + +// Tests that the GLIC promo single registers in the promo manager. +TEST_F(GLICPromoSceneAgentTest, TestGLICPromoRegistration) { + feature_list_.InitAndEnableFeature(kPageActionMenu); + EXPECT_CALL(*promos_manager_.get(), + RegisterPromoForSingleDisplay(promos_manager::Promo::GLICPromo)) + .Times(1); + scene_state_.activationLevel = SceneActivationLevelForegroundActive; +} + +// Tests that the GLIC promo is not registered in the promo +// manager when the eligibility criteria is not met. +TEST_F(GLICPromoSceneAgentTest, TestGLICPromoNoRegistration) { + EXPECT_CALL(*promos_manager_.get(), + RegisterPromoForSingleDisplay(promos_manager::Promo::GLICPromo)) + .Times(0); + scene_state_.activationLevel = SceneActivationLevelForegroundActive; +}
diff --git a/ios/chrome/browser/overlays/ui_bundled/overlay_presentation_context_view_controller_unittest.mm b/ios/chrome/browser/overlays/ui_bundled/overlay_presentation_context_view_controller_unittest.mm index 543d083..38cac95f 100644 --- a/ios/chrome/browser/overlays/ui_bundled/overlay_presentation_context_view_controller_unittest.mm +++ b/ios/chrome/browser/overlays/ui_bundled/overlay_presentation_context_view_controller_unittest.mm
@@ -75,8 +75,7 @@ // Tests that `view_controller_`'s frame is CGRectZero when there is no overlay // UI presented upon it. -// TODO(crbug.com/409942614): Fix this flaky test. -TEST_F(OverlayPresentationContextViewControllerTest, FLAKY_NoPresentedUI) { +TEST_F(OverlayPresentationContextViewControllerTest, NoPresentedUI) { CGRect container_view_frame = view_controller_.presentationController.containerView.frame; EXPECT_TRUE(CGRectEqualToRect(container_view_frame, CGRectZero)); @@ -88,13 +87,6 @@ // showing overlay UI presented over its context. TEST_F(OverlayPresentationContextViewControllerTest, PresentedOverCurrentContext) { - if (@available(iOS 15.7.1, *)) { - if (@available(iOS 15.7.2, *)) { - } else { - // TODO(crbug.com/40254110): Failing on a few 15.7.1 devices. - return; - } - } // Create a fake overlay coordinator that presents its UI over // `view_controller_`. std::unique_ptr<OverlayRequest> request = @@ -146,16 +138,7 @@ // Tests that `view_controller_`'s frame is the same as its presented view's // container view if it is shown using custom UIViewController presentation that // resizes the contianer view. -// TODO(crbug.com/409942614): Fix this flaky test. -TEST_F(OverlayPresentationContextViewControllerTest, - FLAKY_ResizingPresentedOverlay) { - if (@available(iOS 15.7.1, *)) { - if (@available(iOS 15.7.2, *)) { - } else { - // TODO(crbug.com/40254110): Failing on a few 15.7.1 devices. - return; - } - } +TEST_F(OverlayPresentationContextViewControllerTest, ResizingPresentedOverlay) { // Create a fake overlay coordinator that presents its UI over // `view_controller_` and resizes its presentation container view to // kWindowFrame.
diff --git a/ios/chrome/test/BUILD.gn b/ios/chrome/test/BUILD.gn index 8aeb527..c20b740001 100644 --- a/ios/chrome/test/BUILD.gn +++ b/ios/chrome/test/BUILD.gn
@@ -319,6 +319,7 @@ "//ios/chrome/browser/infobars/model/overlays/browser_agent/interaction_handlers/confirm:unit_tests", "//ios/chrome/browser/infobars/ui_bundled/banners:unit_tests", "//ios/chrome/browser/infobars/ui_bundled/modals/autofill_address_profile:unit_tests", + "//ios/chrome/browser/intelligence/glic/coordinator:unit_tests", "//ios/chrome/browser/intents/model:unit_tests", "//ios/chrome/browser/itunes_urls/model:unit_tests", "//ios/chrome/browser/keyboard/ui_bundled:unit_tests",
diff --git a/media/audio/alsa/audio_manager_alsa.cc b/media/audio/alsa/audio_manager_alsa.cc index 7b02042..af2bd83 100644 --- a/media/audio/alsa/audio_manager_alsa.cc +++ b/media/audio/alsa/audio_manager_alsa.cc
@@ -54,7 +54,7 @@ AudioManagerAlsa::AudioManagerAlsa(std::unique_ptr<AudioThread> audio_thread, AudioLogFactory* audio_log_factory) : AudioManagerBase(std::move(audio_thread), audio_log_factory), - wrapper_(new AlsaWrapper()) { + wrapper_(std::make_unique<AlsaWrapper>()) { SetMaxOutputStreamsAllowed(kMaxOutputStreams); }
diff --git a/media/base/android/java/src/org/chromium/media/AudioManagerAndroid.java b/media/base/android/java/src/org/chromium/media/AudioManagerAndroid.java index c141af2b..2680d9e 100644 --- a/media/base/android/java/src/org/chromium/media/AudioManagerAndroid.java +++ b/media/base/android/java/src/org/chromium/media/AudioManagerAndroid.java
@@ -91,7 +91,7 @@ private @Nullable ContentObserver mSettingsObserver; private @Nullable HandlerThread mSettingsObserverThread; - private CommunicationDeviceSelector mCommunicationDeviceSelector; + private final CommunicationDeviceSelector mCommunicationDeviceSelector; /** Construction */ @CalledByNative
diff --git a/media/base/android/java/src/org/chromium/media/AudioTrackOutputStream.java b/media/base/android/java/src/org/chromium/media/AudioTrackOutputStream.java index c1ef2f3..3b0eb50 100644 --- a/media/base/android/java/src/org/chromium/media/AudioTrackOutputStream.java +++ b/media/base/android/java/src/org/chromium/media/AudioTrackOutputStream.java
@@ -67,7 +67,7 @@ private static final int CHANNEL_ALIGNMENT = 16; private long mNativeAudioTrackOutputStream; - private Callback mCallback; + private final Callback mCallback; private @Nullable AudioTrack mAudioTrack; private int mBufferSizeInBytes; private @Nullable WorkerThread mWorkerThread;
diff --git a/media/base/android/java/src/org/chromium/media/CommunicationDeviceSelectorPreS.java b/media/base/android/java/src/org/chromium/media/CommunicationDeviceSelectorPreS.java index bfdc489..7f8de71 100644 --- a/media/base/android/java/src/org/chromium/media/CommunicationDeviceSelectorPreS.java +++ b/media/base/android/java/src/org/chromium/media/CommunicationDeviceSelectorPreS.java
@@ -41,7 +41,7 @@ private boolean mHasBluetoothPermission; - private boolean[] mDeviceExistence = new boolean[Devices.DEVICE_COUNT]; + private final boolean[] mDeviceExistence = new boolean[Devices.DEVICE_COUNT]; public CommunicationDeviceSelectorPreS(AudioManager audioManager) { super(audioManager);
diff --git a/media/base/android/java/src/org/chromium/media/MediaCodecBridge.java b/media/base/android/java/src/org/chromium/media/MediaCodecBridge.java index b205051..7c2d60d 100644 --- a/media/base/android/java/src/org/chromium/media/MediaCodecBridge.java +++ b/media/base/android/java/src/org/chromium/media/MediaCodecBridge.java
@@ -45,7 +45,7 @@ private static final String KEY_CROP_TOP = "crop-top"; protected MediaCodec mMediaCodec; - private @BitrateAdjuster.Type int mBitrateAdjuster; + private final @BitrateAdjuster.Type int mBitrateAdjuster; private String mMediaCodecName = "unknown"; @@ -60,7 +60,7 @@ // Once the callback has been set on MediaCodec, these variables must only // be accessed from synchronized(this) blocks since MediaCodecCallback may // execute on an arbitrary thread. - private boolean mUseAsyncApi; + private final boolean mUseAsyncApi; private Queue<MediaFormatWrapper> mPendingFormat; private @Nullable MediaFormatWrapper mCurrentFormat; private boolean mPendingError; @@ -572,7 +572,7 @@ if (mPendingError) return false; class CompletePendingStartTask implements Runnable { - private int mThisSequence; + private final int mThisSequence; CompletePendingStartTask(int sequence) { mThisSequence = sequence;
diff --git a/media/base/android/java/src/org/chromium/media/MediaCodecEncoder.java b/media/base/android/java/src/org/chromium/media/MediaCodecEncoder.java index dbed247..b9f835a 100644 --- a/media/base/android/java/src/org/chromium/media/MediaCodecEncoder.java +++ b/media/base/android/java/src/org/chromium/media/MediaCodecEncoder.java
@@ -28,7 +28,7 @@ private static final String TAG = "MediaCodecEncoder"; // Output buffers mapping with MediaCodec output buffers for the possible frame-merging. - private SparseArray<ByteBuffer> mOutputBuffers = new SparseArray<>(); + private final SparseArray<ByteBuffer> mOutputBuffers = new SparseArray<>(); // SPS and PPS NALs (Config frame). private @Nullable ByteBuffer mConfigData;
diff --git a/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java b/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java index ad421bb..44fbfce4 100644 --- a/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java +++ b/media/base/android/java/src/org/chromium/media/MediaDrmBridge.java
@@ -119,7 +119,7 @@ private MediaDrmSessionManager mSessionManager; // The persistent storage to record origin provisioning information. - private MediaDrmStorageBridge mStorage; + private final MediaDrmStorageBridge mStorage; // Whether the current MediaDrmBridge instance is waiting for provisioning response. private boolean mProvisioningPending;
diff --git a/media/base/android/java/src/org/chromium/media/MediaDrmSessionManager.java b/media/base/android/java/src/org/chromium/media/MediaDrmSessionManager.java index 8d8e7a2..465e8df9 100644 --- a/media/base/android/java/src/org/chromium/media/MediaDrmSessionManager.java +++ b/media/base/android/java/src/org/chromium/media/MediaDrmSessionManager.java
@@ -214,12 +214,12 @@ // 3. Get EME/DRM session ID from DRM/EME session ID. // SessionId always has a valid EME session ID, so all opened session should // have an entry in mEmeSessionInfoMap. - private HashMap<ByteBuffer, SessionInfo> mEmeSessionInfoMap; - private HashMap<ByteBuffer, SessionInfo> mDrmSessionInfoMap; + private final HashMap<ByteBuffer, SessionInfo> mEmeSessionInfoMap; + private final HashMap<ByteBuffer, SessionInfo> mDrmSessionInfoMap; // The persistent storage to record map from EME session ID to key set ID // for persistent license. - private MediaDrmStorageBridge mStorage; + private final MediaDrmStorageBridge mStorage; public MediaDrmSessionManager(MediaDrmStorageBridge storage) { mEmeSessionInfoMap = new HashMap<>();
diff --git a/media/base/android/java/src/org/chromium/media/MediaDrmStorageBridge.java b/media/base/android/java/src/org/chromium/media/MediaDrmStorageBridge.java index 0a649b1..526c10f 100644 --- a/media/base/android/java/src/org/chromium/media/MediaDrmStorageBridge.java +++ b/media/base/android/java/src/org/chromium/media/MediaDrmStorageBridge.java
@@ -21,7 +21,7 @@ class MediaDrmStorageBridge { private static final long INVALID_NATIVE_MEDIA_DRM_STORAGE_BRIDGE = -1; - private long mNativeMediaDrmStorageBridge; + private final long mNativeMediaDrmStorageBridge; /** Information that need to be persistent on the device. Exposed to JNI. */ static class PersistentInfo {
diff --git a/media/base/android/java/src/org/chromium/media/MediaServerCrashListener.java b/media/base/android/java/src/org/chromium/media/MediaServerCrashListener.java index 22647ea4..86643078 100644 --- a/media/base/android/java/src/org/chromium/media/MediaServerCrashListener.java +++ b/media/base/android/java/src/org/chromium/media/MediaServerCrashListener.java
@@ -32,7 +32,7 @@ // The last time we reported a failure to create the watchdog as a server crash. private long mLastReportedWatchdogCreationFailure = UNKNOWN_TIME; - private long mNativeMediaServerCrashListener; + private final long mNativeMediaServerCrashListener; @CalledByNative private static MediaServerCrashListener create(long nativeMediaServerCrashListener) {
diff --git a/media/base/android/java/src/org/chromium/media/VideoAcceleratorUtil.java b/media/base/android/java/src/org/chromium/media/VideoAcceleratorUtil.java index b6c7702..2e179eb 100644 --- a/media/base/android/java/src/org/chromium/media/VideoAcceleratorUtil.java +++ b/media/base/android/java/src/org/chromium/media/VideoAcceleratorUtil.java
@@ -72,8 +72,8 @@ }; private static class Resolution { - private int mWidth; - private int mHeight; + private final int mWidth; + private final int mHeight; public Resolution(int width, int height) { mWidth = width;
diff --git a/media/base/android/java/src/test/org/chromium/media/AudioTrackOutputStreamTest.java b/media/base/android/java/src/test/org/chromium/media/AudioTrackOutputStreamTest.java index b51f7cb..72096d8 100644 --- a/media/base/android/java/src/test/org/chromium/media/AudioTrackOutputStreamTest.java +++ b/media/base/android/java/src/test/org/chromium/media/AudioTrackOutputStreamTest.java
@@ -33,7 +33,7 @@ @Config(manifest = Config.NONE, sdk = Build.VERSION_CODES.Q) public class AudioTrackOutputStreamTest { static class ObservableAudioTrack extends AudioTrack { - private List<Byte> mReceivedData = new ArrayList<Byte>(); + private final List<Byte> mReceivedData = new ArrayList<Byte>(); private boolean mPartialWrite = true; public ObservableAudioTrack( @@ -81,7 +81,7 @@ static class DataProvider implements AudioTrackOutputStream.Callback { private static final int MIN_BUFFER_SIZE = 800; - private List<Byte> mGeneratedData = new ArrayList<Byte>(); + private final List<Byte> mGeneratedData = new ArrayList<Byte>(); private CountDownLatch mDoneSignal; private ObservableAudioTrack mAudioTrack;
diff --git a/media/base/pipeline_impl.cc b/media/base/pipeline_impl.cc index 00c415f..e3e7d049 100644 --- a/media/base/pipeline_impl.cc +++ b/media/base/pipeline_impl.cc
@@ -829,18 +829,8 @@ return; } - switch (stream_type) { - case DemuxerStream::AUDIO: - shared_state_.renderer->OnEnabledAudioTracksChanged( - streams, std::move(change_completed_cb)); - break; - case DemuxerStream::VIDEO: - shared_state_.renderer->OnSelectedVideoTracksChanged( - streams, std::move(change_completed_cb)); - break; - case DemuxerStream::UNKNOWN: // Fail on unknown type. - NOTREACHED(); - } + shared_state_.renderer->OnTracksChanged(stream_type, std::move(streams), + std::move(change_completed_cb)); } void PipelineImpl::OnExternalVideoFrameRequest() {
diff --git a/media/base/renderer.cc b/media/base/renderer.cc index 42ffb78..f4eb1c5e 100644 --- a/media/base/renderer.cc +++ b/media/base/renderer.cc
@@ -43,16 +43,9 @@ std::move(cdm_attached_cb).Run(false); } -void Renderer::OnSelectedVideoTracksChanged( - const std::vector<DemuxerStream*>& enabled_tracks, - base::OnceClosure change_completed_cb) { - DLOG(WARNING) << "Track changes are not supported."; - std::move(change_completed_cb).Run(); -} - -void Renderer::OnEnabledAudioTracksChanged( - const std::vector<DemuxerStream*>& enabled_tracks, - base::OnceClosure change_completed_cb) { +void Renderer::OnTracksChanged(DemuxerStream::Type track_type, + std::vector<DemuxerStream*> enabled_tracks, + base::OnceClosure change_completed_cb) { DLOG(WARNING) << "Track changes are not supported."; std::move(change_completed_cb).Run(); }
diff --git a/media/base/renderer.h b/media/base/renderer.h index c20f70db..fe5c98e 100644 --- a/media/base/renderer.h +++ b/media/base/renderer.h
@@ -114,12 +114,9 @@ // type should be flushed and disabled. Any provided Streams should be played // by whatever mechanism the subclass of Renderer choses for managing it's AV // playback. - virtual void OnSelectedVideoTracksChanged( - const std::vector<DemuxerStream*>& enabled_tracks, - base::OnceClosure change_completed_cb); - virtual void OnEnabledAudioTracksChanged( - const std::vector<DemuxerStream*>& enabled_tracks, - base::OnceClosure change_completed_cb); + virtual void OnTracksChanged(DemuxerStream::Type track_type, + std::vector<DemuxerStream*> enabled_tracks, + base::OnceClosure change_completed_cb); // Signal to the renderer that there has been a client request to access a // VideoFrame. This signal may be used by the renderer to ensure it is
diff --git a/media/capture/video/android/java/src/org/chromium/media/CameraAvailabilityObserver.java b/media/capture/video/android/java/src/org/chromium/media/CameraAvailabilityObserver.java index 542fa52..878f5c2 100644 --- a/media/capture/video/android/java/src/org/chromium/media/CameraAvailabilityObserver.java +++ b/media/capture/video/android/java/src/org/chromium/media/CameraAvailabilityObserver.java
@@ -90,8 +90,8 @@ // Lock for guarding |mNativeCameraAvailabilityObserver|. private final Object mNativeCameraAvailabilityObserverLock = new Object(); private long mNativeCameraAvailabilityObserver; - private CameraManager mCameraManager; - private Handler mObservationThreadHandler; + private final CameraManager mCameraManager; + private final Handler mObservationThreadHandler; @NativeMethods interface Natives {
diff --git a/media/capture/video/android/java/src/org/chromium/media/VideoCaptureCamera.java b/media/capture/video/android/java/src/org/chromium/media/VideoCaptureCamera.java index ff3e114b..fab55df4 100644 --- a/media/capture/video/android/java/src/org/chromium/media/VideoCaptureCamera.java +++ b/media/capture/video/android/java/src/org/chromium/media/VideoCaptureCamera.java
@@ -98,7 +98,7 @@ private android.hardware.@Nullable Camera mCamera; // Lock to mutually exclude execution of OnPreviewFrame() and {start/stop}Capture(). - private ReentrantLock mPreviewBufferLock = new ReentrantLock(); + private final ReentrantLock mPreviewBufferLock = new ReentrantLock(); // True when native code has started capture. private boolean mIsRunning;
diff --git a/media/capture/video/android/java/src/org/chromium/media/VideoCaptureCamera2.java b/media/capture/video/android/java/src/org/chromium/media/VideoCaptureCamera2.java index e736219..2d62831 100644 --- a/media/capture/video/android/java/src/org/chromium/media/VideoCaptureCamera2.java +++ b/media/capture/video/android/java/src/org/chromium/media/VideoCaptureCamera2.java
@@ -1112,8 +1112,8 @@ // asynchronous callbacks to. The native thread that calls the constructor // and public API cannot be used for this, because it does not have a // Looper. - private Handler mCameraThreadHandler; - private ConditionVariable mWaitForDeviceClosedConditionVariable = new ConditionVariable(); + private final Handler mCameraThreadHandler; + private final ConditionVariable mWaitForDeviceClosedConditionVariable = new ConditionVariable(); private @Nullable Range<Integer> mAeFpsRange; private @CameraState int mCameraState = CameraState.STOPPED;
diff --git a/media/mojo/clients/win/media_foundation_renderer_client.cc b/media/mojo/clients/win/media_foundation_renderer_client.cc index b46c807..2323590 100644 --- a/media/mojo/clients/win/media_foundation_renderer_client.cc +++ b/media/mojo/clients/win/media_foundation_renderer_client.cc
@@ -178,9 +178,15 @@ return mojo_renderer_->GetMediaTime(); } -void MediaFoundationRendererClient::OnSelectedVideoTracksChanged( - const std::vector<DemuxerStream*>& enabled_tracks, +void MediaFoundationRendererClient::OnTracksChanged( + DemuxerStream::Type track_type, + std::vector<DemuxerStream*> enabled_tracks, base::OnceClosure change_completed_cb) { + if (track_type != DemuxerStream::VIDEO) { + DLOG(WARNING) << "Audio track changes are not supported."; + std::move(change_completed_cb).Run(); + return; + } bool video_track_selected = (enabled_tracks.size() > 0); DVLOG_FUNC(1) << "video_track_selected=" << video_track_selected; renderer_extension_->SetVideoStreamEnabled(video_track_selected);
diff --git a/media/mojo/clients/win/media_foundation_renderer_client.h b/media/mojo/clients/win/media_foundation_renderer_client.h index b818199..629ac11b 100644 --- a/media/mojo/clients/win/media_foundation_renderer_client.h +++ b/media/mojo/clients/win/media_foundation_renderer_client.h
@@ -87,9 +87,9 @@ void SetPlaybackRate(double playback_rate) override; void SetVolume(float volume) override; base::TimeDelta GetMediaTime() override; - void OnSelectedVideoTracksChanged( - const std::vector<DemuxerStream*>& enabled_tracks, - base::OnceClosure change_completed_cb) override; + void OnTracksChanged(DemuxerStream::Type track_type, + std::vector<DemuxerStream*> enabled_tracks, + base::OnceClosure change_completed_cb) override; void OnExternalVideoFrameRequest() override; RendererType GetRendererType() override;
diff --git a/media/remoting/end2end_test_renderer.cc b/media/remoting/end2end_test_renderer.cc index ec30d3b..6b9e4cd 100644 --- a/media/remoting/end2end_test_renderer.cc +++ b/media/remoting/end2end_test_renderer.cc
@@ -445,18 +445,12 @@ controller_->OnMessageFromSink(*message); } -void End2EndTestRenderer::OnSelectedVideoTracksChanged( - const std::vector<DemuxerStream*>& enabled_tracks, +void End2EndTestRenderer::OnTracksChanged( + DemuxerStream::Type track_type, + std::vector<DemuxerStream*> enabled_tracks, base::OnceClosure change_completed_cb) { - courier_renderer_->OnSelectedVideoTracksChanged( - enabled_tracks, std::move(change_completed_cb)); -} - -void End2EndTestRenderer::OnEnabledAudioTracksChanged( - const std::vector<DemuxerStream*>& enabled_tracks, - base::OnceClosure change_completed_cb) { - courier_renderer_->OnEnabledAudioTracksChanged( - enabled_tracks, std::move(change_completed_cb)); + courier_renderer_->OnTracksChanged(track_type, std::move(enabled_tracks), + std::move(change_completed_cb)); } } // namespace remoting
diff --git a/media/remoting/end2end_test_renderer.h b/media/remoting/end2end_test_renderer.h index 8b3046dc..844a175 100644 --- a/media/remoting/end2end_test_renderer.h +++ b/media/remoting/end2end_test_renderer.h
@@ -46,13 +46,9 @@ base::TimeDelta GetMediaTime() override; RendererType GetRendererType() override; - void OnSelectedVideoTracksChanged( - const std::vector<DemuxerStream*>& enabled_tracks, - base::OnceClosure change_completed_cb) override; - - void OnEnabledAudioTracksChanged( - const std::vector<DemuxerStream*>& enabled_tracks, - base::OnceClosure change_completed_cb) override; + void OnTracksChanged(DemuxerStream::Type track_type, + std::vector<DemuxerStream*> enabled_tracks, + base::OnceClosure change_completed_cb) override; private: class TestRemotee;
diff --git a/media/renderers/decrypting_renderer.cc b/media/renderers/decrypting_renderer.cc index e0f1ceb..486aca2 100644 --- a/media/renderers/decrypting_renderer.cc +++ b/media/renderers/decrypting_renderer.cc
@@ -139,18 +139,12 @@ return renderer_->GetMediaTime(); } -void DecryptingRenderer::OnSelectedVideoTracksChanged( - const std::vector<DemuxerStream*>& enabled_tracks, +void DecryptingRenderer::OnTracksChanged( + DemuxerStream::Type track_type, + std::vector<DemuxerStream*> enabled_tracks, base::OnceClosure change_completed_cb) { - renderer_->OnSelectedVideoTracksChanged(enabled_tracks, - std::move(change_completed_cb)); -} - -void DecryptingRenderer::OnEnabledAudioTracksChanged( - const std::vector<DemuxerStream*>& enabled_tracks, - base::OnceClosure change_completed_cb) { - renderer_->OnEnabledAudioTracksChanged(enabled_tracks, - std::move(change_completed_cb)); + renderer_->OnTracksChanged(track_type, std::move(enabled_tracks), + std::move(change_completed_cb)); } RendererType DecryptingRenderer::GetRendererType() {
diff --git a/media/renderers/decrypting_renderer.h b/media/renderers/decrypting_renderer.h index 29f9758f..6581b6f 100644 --- a/media/renderers/decrypting_renderer.h +++ b/media/renderers/decrypting_renderer.h
@@ -58,12 +58,9 @@ void SetPlaybackRate(double playback_rate) override; void SetVolume(float volume) override; base::TimeDelta GetMediaTime() override; - void OnSelectedVideoTracksChanged( - const std::vector<DemuxerStream*>& enabled_tracks, - base::OnceClosure change_completed_cb) override; - void OnEnabledAudioTracksChanged( - const std::vector<DemuxerStream*>& enabled_tracks, - base::OnceClosure change_completed_cb) override; + void OnTracksChanged(DemuxerStream::Type track_type, + std::vector<DemuxerStream*> enabled_tracks, + base::OnceClosure change_completed_cb) override; RendererType GetRendererType() override; bool HasDecryptingMediaResourceForTesting() const;
diff --git a/media/renderers/renderer_impl.cc b/media/renderers/renderer_impl.cc index b49dbad..75ab36be 100644 --- a/media/renderers/renderer_impl.cc +++ b/media/renderers/renderer_impl.cc
@@ -996,79 +996,68 @@ std::move(on_finished).Run(); } -void RendererImpl::OnSelectedVideoTracksChanged( - const std::vector<DemuxerStream*>& enabled_tracks, - base::OnceClosure change_completed_cb) { +void RendererImpl::OnTracksChanged(DemuxerStream::Type track_type, + std::vector<DemuxerStream*> tracks, + base::OnceClosure change_completed_cb) { DCHECK(task_runner_->RunsTasksInCurrentSequence()); - TRACE_EVENT0("media", "RendererImpl::OnSelectedVideoTracksChanged"); + TRACE_EVENT1("media", "RendererImpl::OnTracksChanged", "track_type", + track_type); - DCHECK_LT(enabled_tracks.size(), 2u); - DemuxerStream* stream = enabled_tracks.empty() ? nullptr : enabled_tracks[0]; - - if (!stream && !video_playing_) { - std::move(change_completed_cb).Run(); - return; - } + DCHECK_LT(tracks.size(), 2u); + DemuxerStream* stream = tracks.empty() ? nullptr : tracks[0]; // 'fixing' the stream -> restarting if its the same stream, // reinitializing if it is different. base::OnceClosure fix_stream_cb; - if (stream && stream != current_video_stream_) { - fix_stream_cb = - base::BindOnce(&RendererImpl::ReinitializeVideoRenderer, weak_this_, - stream, GetMediaTime(), std::move(change_completed_cb)); - } else { - fix_stream_cb = base::BindOnce( - &RendererImpl::RestartVideoRenderer, weak_this_, current_video_stream_, - GetMediaTime(), std::move(change_completed_cb)); + switch (track_type) { + case DemuxerStream::AUDIO: { + if (stream && stream != current_audio_stream_) { + fix_stream_cb = base::BindOnce(&RendererImpl::ReinitializeAudioRenderer, + weak_this_, stream, GetMediaTime(), + std::move(change_completed_cb)); + } else { + fix_stream_cb = + base::BindOnce(&RendererImpl::RestartAudioRenderer, weak_this_, + current_audio_stream_, GetMediaTime(), + std::move(change_completed_cb)); + } + + { + base::AutoLock lock(restarting_audio_lock_); + pending_audio_track_change_ = true; + restarting_audio_time_ = time_source_->CurrentMediaTime(); + } + + if (audio_playing_) { + PausePlayback(); + } + + audio_renderer_->Flush(base::BindOnce( + &RendererImpl::CleanUpTrackChange, weak_this_, + std::move(fix_stream_cb), &audio_ended_, &audio_playing_)); + return; + } + case DemuxerStream::VIDEO: { + if (stream && stream != current_video_stream_) { + fix_stream_cb = base::BindOnce(&RendererImpl::ReinitializeVideoRenderer, + weak_this_, stream, GetMediaTime(), + std::move(change_completed_cb)); + } else { + fix_stream_cb = + base::BindOnce(&RendererImpl::RestartVideoRenderer, weak_this_, + current_video_stream_, GetMediaTime(), + std::move(change_completed_cb)); + } + + pending_video_track_change_ = true; + video_renderer_->Flush(base::BindOnce( + &RendererImpl::CleanUpTrackChange, weak_this_, + std::move(fix_stream_cb), &video_ended_, &video_playing_)); + return; + } + default: + NOTREACHED(); } - - pending_video_track_change_ = true; - video_renderer_->Flush(base::BindOnce(&RendererImpl::CleanUpTrackChange, - weak_this_, std::move(fix_stream_cb), - &video_ended_, &video_playing_)); -} - -void RendererImpl::OnEnabledAudioTracksChanged( - const std::vector<DemuxerStream*>& enabled_tracks, - base::OnceClosure change_completed_cb) { - DCHECK(task_runner_->RunsTasksInCurrentSequence()); - TRACE_EVENT0("media", "RendererImpl::OnEnabledAudioTracksChanged"); - - DCHECK_LT(enabled_tracks.size(), 2u); - DemuxerStream* stream = enabled_tracks.empty() ? nullptr : enabled_tracks[0]; - - if (!stream && !audio_playing_) { - std::move(change_completed_cb).Run(); - return; - } - - // 'fixing' the stream -> restarting if its the same stream, - // reinitializing if it is different. - base::OnceClosure fix_stream_cb; - - if (stream && stream != current_audio_stream_) { - fix_stream_cb = - base::BindOnce(&RendererImpl::ReinitializeAudioRenderer, weak_this_, - stream, GetMediaTime(), std::move(change_completed_cb)); - } else { - fix_stream_cb = base::BindOnce( - &RendererImpl::RestartAudioRenderer, weak_this_, current_audio_stream_, - GetMediaTime(), std::move(change_completed_cb)); - } - - { - base::AutoLock lock(restarting_audio_lock_); - pending_audio_track_change_ = true; - restarting_audio_time_ = time_source_->CurrentMediaTime(); - } - - if (audio_playing_) - PausePlayback(); - - audio_renderer_->Flush(base::BindOnce(&RendererImpl::CleanUpTrackChange, - weak_this_, std::move(fix_stream_cb), - &audio_ended_, &audio_playing_)); } RendererType RendererImpl::GetRendererType() {
diff --git a/media/renderers/renderer_impl.h b/media/renderers/renderer_impl.h index 8133139..591317d 100644 --- a/media/renderers/renderer_impl.h +++ b/media/renderers/renderer_impl.h
@@ -67,12 +67,9 @@ void SetPlaybackRate(double playback_rate) final; void SetVolume(float volume) final; base::TimeDelta GetMediaTime() final; - void OnSelectedVideoTracksChanged( - const std::vector<DemuxerStream*>& enabled_tracks, - base::OnceClosure change_completed_cb) final; - void OnEnabledAudioTracksChanged( - const std::vector<DemuxerStream*>& enabled_tracks, - base::OnceClosure change_completed_cb) final; + void OnTracksChanged(DemuxerStream::Type track_type, + std::vector<DemuxerStream*> enabled_tracks, + base::OnceClosure change_completed_cb) final; RendererType GetRendererType() final; // Helper functions for testing purposes. Must be called before Initialize().
diff --git a/media/renderers/renderer_impl_unittest.cc b/media/renderers/renderer_impl_unittest.cc index 6c45edc..4055d73 100644 --- a/media/renderers/renderer_impl_unittest.cc +++ b/media/renderers/renderer_impl_unittest.cc
@@ -312,7 +312,7 @@ void SetAudioTrackSwitchExpectations() { InSequence track_switch_seq; - // Called from within OnEnabledAudioTracksChanged + // Called from within OnTracksChanged EXPECT_CALL(time_source_, CurrentMediaTime()); EXPECT_CALL(time_source_, CurrentMediaTime()); EXPECT_CALL(time_source_, StopTicking()); @@ -855,13 +855,14 @@ base::RunLoop disable_wait; SetAudioTrackSwitchExpectations(); - renderer_impl_->OnEnabledAudioTracksChanged({}, disable_wait.QuitClosure()); + renderer_impl_->OnTracksChanged(DemuxerStream::AUDIO, {}, + disable_wait.QuitClosure()); disable_wait.Run(); base::RunLoop enable_wait; SetAudioTrackSwitchExpectations(); - renderer_impl_->OnEnabledAudioTracksChanged({streams_[0]}, - enable_wait.QuitClosure()); + renderer_impl_->OnTracksChanged(DemuxerStream::AUDIO, {streams_[0]}, + enable_wait.QuitClosure()); enable_wait.Run(); } @@ -872,13 +873,14 @@ base::RunLoop disable_wait; SetVideoTrackSwitchExpectations(); - renderer_impl_->OnSelectedVideoTracksChanged({}, disable_wait.QuitClosure()); + renderer_impl_->OnTracksChanged(DemuxerStream::VIDEO, {}, + disable_wait.QuitClosure()); disable_wait.Run(); base::RunLoop enable_wait; SetVideoTrackSwitchExpectations(); - renderer_impl_->OnSelectedVideoTracksChanged({streams_[1]}, - enable_wait.QuitClosure()); + renderer_impl_->OnTracksChanged(DemuxerStream::VIDEO, {streams_[1]}, + enable_wait.QuitClosure()); enable_wait.Run(); base::RunLoop().RunUntilIdle(); @@ -900,7 +902,7 @@ EXPECT_CALL(time_source_, CurrentMediaTime()).Times(2); std::vector<DemuxerStream*> tracks; - renderer_impl_->OnEnabledAudioTracksChanged({}, loop.QuitClosure()); + renderer_impl_->OnTracksChanged(DemuxerStream::AUDIO, {}, loop.QuitClosure()); EXPECT_CALL(callbacks_, OnBufferingStateChange(BUFFERING_HAVE_ENOUGH, @@ -933,7 +935,7 @@ BUFFERING_CHANGE_REASON_UNKNOWN)); } - renderer_impl_->OnSelectedVideoTracksChanged({}, loop.QuitClosure()); + renderer_impl_->OnTracksChanged(DemuxerStream::VIDEO, {}, loop.QuitClosure()); video_renderer_client_->OnBufferingStateChange( BUFFERING_HAVE_NOTHING, BUFFERING_CHANGE_REASON_UNKNOWN); @@ -954,7 +956,7 @@ EXPECT_CALL(time_source_, CurrentMediaTime()).Times(2); EXPECT_CALL(time_source_, StopTicking()); - renderer_impl_->OnEnabledAudioTracksChanged({}, loop.QuitClosure()); + renderer_impl_->OnTracksChanged(DemuxerStream::AUDIO, {}, loop.QuitClosure()); EXPECT_CALL(*audio_renderer_, StartPlaying()); video_renderer_client_->OnBufferingStateChange( @@ -978,7 +980,7 @@ EXPECT_CALL(*video_renderer_, Flush(_)) .WillOnce(MoveArg(&video_renderer_flush_cb)); - renderer_impl_->OnSelectedVideoTracksChanged({}, loop.QuitClosure()); + renderer_impl_->OnTracksChanged(DemuxerStream::VIDEO, {}, loop.QuitClosure()); EXPECT_CALL(time_source_, StopTicking()); EXPECT_CALL(*video_renderer_, StartPlayingFrom(_)); @@ -1014,7 +1016,8 @@ EXPECT_CALL(*audio_renderer_, Flush(_)) .WillOnce(MoveArg(&audio_renderer_flush_cb)); } - renderer_impl_->OnEnabledAudioTracksChanged({}, track_change.QuitClosure()); + renderer_impl_->OnTracksChanged(DemuxerStream::AUDIO, {}, + track_change.QuitClosure()); // Signal that the renderer has enough data to resume from underflow. // Nothing should bubble up, since we are pending audio track change. @@ -1053,7 +1056,8 @@ EXPECT_CALL(*video_renderer_, Flush(_)) .WillOnce(MoveArg(&video_renderer_flush_cb)); } - renderer_impl_->OnSelectedVideoTracksChanged({}, track_change.QuitClosure()); + renderer_impl_->OnTracksChanged(DemuxerStream::VIDEO, {}, + track_change.QuitClosure()); // Signal that the renderer has enough data to resume from underflow. // Nothing should bubble up, since we are pending audio track change.
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Encoder.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Encoder.java index d805565..d359e5fb6 100644 --- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Encoder.java +++ b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/Encoder.java
@@ -86,7 +86,7 @@ private static final int INITIAL_BUFFER_SIZE = 1024; /** Base offset in the byte buffer for writing. */ - private int mBaseOffset; + private final int mBaseOffset; /** The encoder state shared by the main encoder and all its sub-encoder. */ private final EncoderState mEncoderState;
diff --git a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/RouterImpl.java b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/RouterImpl.java index 88161fae..6eaa9dc 100644 --- a/mojo/public/java/bindings/src/org/chromium/mojo/bindings/RouterImpl.java +++ b/mojo/public/java/bindings/src/org/chromium/mojo/bindings/RouterImpl.java
@@ -92,7 +92,7 @@ private long mNextRequestId = 1; /** The map from request ids to {@link MessageReceiver} of request currently in flight. */ - private Map<Long, MessageReceiver> mResponders = new HashMap<Long, MessageReceiver>(); + private final Map<Long, MessageReceiver> mResponders = new HashMap<Long, MessageReceiver>(); /** * An Executor that will run on the thread associated with the MessagePipe to which
diff --git a/mojo/public/java/system/javatests/src/org/chromium/mojo/bindings/ReadAndDispatchMessageTest.java b/mojo/public/java/system/javatests/src/org/chromium/mojo/bindings/ReadAndDispatchMessageTest.java index f91c41f7..542573f 100644 --- a/mojo/public/java/system/javatests/src/org/chromium/mojo/bindings/ReadAndDispatchMessageTest.java +++ b/mojo/public/java/system/javatests/src/org/chromium/mojo/bindings/ReadAndDispatchMessageTest.java
@@ -39,8 +39,8 @@ private ByteBuffer mData; private Pair<MessagePipeHandle, MessagePipeHandle> mHandles; - private List<Handle> mHandlesToSend = new ArrayList<Handle>(); - private List<Handle> mHandlesToClose = new ArrayList<Handle>(); + private final List<Handle> mHandlesToSend = new ArrayList<Handle>(); + private final List<Handle> mHandlesToClose = new ArrayList<Handle>(); private RecordingMessageReceiver mMessageReceiver; /**
diff --git a/mojo/public/java/system/javatests/src/org/chromium/mojo/system/impl/CoreImplTest.java b/mojo/public/java/system/javatests/src/org/chromium/mojo/system/impl/CoreImplTest.java index 57ad47e..3ebaf568 100644 --- a/mojo/public/java/system/javatests/src/org/chromium/mojo/system/impl/CoreImplTest.java +++ b/mojo/public/java/system/javatests/src/org/chromium/mojo/system/impl/CoreImplTest.java
@@ -38,7 +38,7 @@ public class CoreImplTest { @Rule public MojoTestRule mTestRule = new MojoTestRule(); - private List<Handle> mHandlesToClose = new ArrayList<Handle>(); + private final List<Handle> mHandlesToClose = new ArrayList<Handle>(); /** * @see MojoTestCase#tearDown()
diff --git a/mojo/public/java/system/javatests/src/org/chromium/mojo/system/impl/WatcherImplTest.java b/mojo/public/java/system/javatests/src/org/chromium/mojo/system/impl/WatcherImplTest.java index 98dbc3c..8c283fa 100644 --- a/mojo/public/java/system/javatests/src/org/chromium/mojo/system/impl/WatcherImplTest.java +++ b/mojo/public/java/system/javatests/src/org/chromium/mojo/system/impl/WatcherImplTest.java
@@ -34,7 +34,7 @@ public class WatcherImplTest { @Rule public MojoTestRule mTestRule = new MojoTestRule(); - private List<Handle> mHandlesToClose = new ArrayList<Handle>(); + private final List<Handle> mHandlesToClose = new ArrayList<Handle>(); private Watcher mWatcher; private Core mCore; @@ -75,7 +75,7 @@ private static class WatcherResult implements Callback { private int mResult = Integer.MIN_VALUE; - private MessagePipeHandle mReadPipe; + private final MessagePipeHandle mReadPipe; /** * @param readPipe A MessagePipeHandle to read from when onResult triggers success.
diff --git a/mojo/public/java/system/src/org/chromium/mojo/system/DataPipe.java b/mojo/public/java/system/src/org/chromium/mojo/system/DataPipe.java index 2230e24..b1901f7 100644 --- a/mojo/public/java/system/src/org/chromium/mojo/system/DataPipe.java +++ b/mojo/public/java/system/src/org/chromium/mojo/system/DataPipe.java
@@ -44,7 +44,7 @@ public static class CreateOptions { /** Used to specify different modes of operation, see |DataPipe.CreateFlags|. */ - private CreateFlags mFlags = CreateFlags.none(); + private final CreateFlags mFlags = CreateFlags.none(); /** * The size of an element, in bytes. All transactions and buffers will consist of an
diff --git a/mojo/public/java/system/src/org/chromium/mojo/system/MessagePipeHandle.java b/mojo/public/java/system/src/org/chromium/mojo/system/MessagePipeHandle.java index 5271408..3e712b3c 100644 --- a/mojo/public/java/system/src/org/chromium/mojo/system/MessagePipeHandle.java +++ b/mojo/public/java/system/src/org/chromium/mojo/system/MessagePipeHandle.java
@@ -43,7 +43,7 @@ /** Used to specify creation parameters for a message pipe to |Core#createMessagePipe()|. */ public static class CreateOptions { - private CreateFlags mFlags = CreateFlags.NONE; + private final CreateFlags mFlags = CreateFlags.NONE; /** * @return the flags
diff --git a/mojo/public/java/system/src/org/chromium/mojo/system/SharedBufferHandle.java b/mojo/public/java/system/src/org/chromium/mojo/system/SharedBufferHandle.java index a03848b..72226691 100644 --- a/mojo/public/java/system/src/org/chromium/mojo/system/SharedBufferHandle.java +++ b/mojo/public/java/system/src/org/chromium/mojo/system/SharedBufferHandle.java
@@ -38,7 +38,7 @@ /** Used to specify creation parameters for a shared buffer to |Core#createSharedBuffer()|. */ public static class CreateOptions { - private CreateFlags mFlags = CreateFlags.NONE; + private final CreateFlags mFlags = CreateFlags.NONE; /** * @return the flags @@ -77,7 +77,7 @@ * |SharedBufferHandle#duplicate| */ public static class DuplicateOptions { - private DuplicateFlags mFlags = DuplicateFlags.NONE; + private final DuplicateFlags mFlags = DuplicateFlags.NONE; /** * @return the flags
diff --git a/net/BUILD.gn b/net/BUILD.gn index 07a7c20..3f87e3df 100644 --- a/net/BUILD.gn +++ b/net/BUILD.gn
@@ -232,6 +232,8 @@ "base/net_info_source_list.h", "base/net_module.cc", "base/net_module.h", + "base/net_platform_api_util.cc", + "base/net_platform_api_util.h", "base/net_string_util.h", "base/network_activity_monitor.cc", "base/network_activity_monitor.h", @@ -2694,6 +2696,7 @@ "base/mime_sniffer_unittest.cc", "base/mime_util_unittest.cc", "base/net_errors_unittest.cc", + "base/net_platform_api_util_unittest.cc", "base/net_string_util_unittest.cc", "base/network_activity_monitor_unittest.cc", "base/network_anonymization_key_unittest.cc",
diff --git a/net/android/java/src/org/chromium/net/MimeTypeFilter.java b/net/android/java/src/org/chromium/net/MimeTypeFilter.java index 7beb383..298ffbb 100644 --- a/net/android/java/src/org/chromium/net/MimeTypeFilter.java +++ b/net/android/java/src/org/chromium/net/MimeTypeFilter.java
@@ -25,12 +25,12 @@ */ @NullMarked public class MimeTypeFilter implements FileFilter { - private HashSet<String> mExtensions = new HashSet<>(); - private HashSet<String> mMimeTypes = new HashSet<>(); - private HashSet<String> mMimeSupertypes = new HashSet<>(); - private MimeTypeMap mMimeTypeMap; + private final HashSet<String> mExtensions = new HashSet<>(); + private final HashSet<String> mMimeTypes = new HashSet<>(); + private final HashSet<String> mMimeSupertypes = new HashSet<>(); + private final MimeTypeMap mMimeTypeMap; private boolean mAcceptAllMimeTypes; - private boolean mAcceptDirectory; + private final boolean mAcceptDirectory; /** * Contructs a MimeTypeFilter object.
diff --git a/net/android/java/src/org/chromium/net/NetworkChangeNotifierAutoDetect.java b/net/android/java/src/org/chromium/net/NetworkChangeNotifierAutoDetect.java index e2abe61c..15dd657 100644 --- a/net/android/java/src/org/chromium/net/NetworkChangeNotifierAutoDetect.java +++ b/net/android/java/src/org/chromium/net/NetworkChangeNotifierAutoDetect.java
@@ -971,7 +971,7 @@ // mNetworkCallback and mNetworkRequest are only non-null in Android L and above. // mNetworkCallback will be null if ConnectivityManager.registerNetworkCallback() ever fails. private @Nullable MyNetworkCallback mNetworkCallback; - private NetworkRequest mNetworkRequest; + private final NetworkRequest mNetworkRequest; private boolean mRegistered; private NetworkState mNetworkState;
diff --git a/net/android/javatests/src/org/chromium/net/ProxyChangeListenerTest.java b/net/android/javatests/src/org/chromium/net/ProxyChangeListenerTest.java index 519a4c2..e3281b2 100644 --- a/net/android/javatests/src/org/chromium/net/ProxyChangeListenerTest.java +++ b/net/android/javatests/src/org/chromium/net/ProxyChangeListenerTest.java
@@ -59,7 +59,7 @@ } } - private List<RegisteredReceiver> mReceivers = new ArrayList<>(); + private final List<RegisteredReceiver> mReceivers = new ArrayList<>(); FakeContext() { super(
diff --git a/net/base/address_tracker_linux.cc b/net/base/address_tracker_linux.cc index a8edaab..ff0a77f 100644 --- a/net/base/address_tracker_linux.cc +++ b/net/base/address_tracker_linux.cc
@@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/390223051): Remove C-library calls to fix the errors. -#pragma allow_unsafe_libc_calls -#endif - #include "net/base/address_tracker_linux.h" #include <errno.h> @@ -15,6 +10,8 @@ #include <sys/ioctl.h> #include <optional> +#include <string> +#include <string_view> #include <utility> #include <vector> @@ -29,10 +26,12 @@ #include "base/memory/page_size.h" #include "base/posix/eintr_wrapper.h" #include "base/sequence_checker.h" +#include "base/strings/string_util.h" #include "base/task/current_thread.h" #include "base/threading/scoped_blocking_call.h" #include "base/threading/thread_restrictions.h" #include "build/build_config.h" +#include "net/base/net_platform_api_util.h" #include "net/base/network_interfaces_linux.h" #if BUILDFLAG(IS_ANDROID) @@ -151,18 +150,24 @@ } // namespace // static -char* AddressTrackerLinux::GetInterfaceName(int interface_index, char* buf) { - memset(buf, 0, IFNAMSIZ); +std::string AddressTrackerLinux::GetInterfaceName(int interface_index) { base::ScopedFD ioctl_socket = GetSocketForIoctl(); if (!ioctl_socket.is_valid()) - return buf; + return std::string(); struct ifreq ifr = {}; ifr.ifr_ifindex = interface_index; - if (ioctl(ioctl_socket.get(), SIOCGIFNAME, &ifr) == 0) - strncpy(buf, ifr.ifr_name, IFNAMSIZ - 1); - return buf; + if (ioctl(ioctl_socket.get(), SIOCGIFNAME, &ifr) != 0) { + return std::string(); + } + + // `ifr.ifr_name` should be nul terminated, but for safety, remove the final + // character and return SpanMaybeWithNulToStringView(), which will ensure the + // returned string will fit within `ifr_name`, with a terminating null added, + // in a future query. + return std::string(SpanMaybeWithNulToStringView( + base::span(ifr.ifr_name).first(sizeof(ifr.ifr_name) - 1))); } AddressTrackerLinux::AddressTrackerLinux() @@ -314,8 +319,7 @@ if (ignored_interfaces_.empty()) return false; - char buf[IFNAMSIZ] = {}; - const char* interface_name = get_interface_name_(interface_index, buf); + std::string interface_name = get_interface_name_(interface_index); return ignored_interfaces_.find(interface_name) != ignored_interfaces_.end(); } @@ -513,7 +517,10 @@ if (it == address_map_.end()) { address_map_.insert(it, std::pair(address, msg_copy)); *address_changed = true; - } else if (memcmp(&it->second, &msg_copy, sizeof(msg_copy))) { + // Unfortunately, `ifaddrmsg` has no equality operator, so have to + // either do this, or compare every field individually. + } else if (base::byte_span_from_ref(it->second) != + base::byte_span_from_ref(msg_copy)) { it->second = msg_copy; *address_changed = true; } @@ -618,14 +625,13 @@ } bool AddressTrackerLinux::IsTunnelInterface(int interface_index) const { - char buf[IFNAMSIZ] = {}; - return IsTunnelInterfaceName(get_interface_name_(interface_index, buf)); + return IsTunnelInterfaceName(get_interface_name_(interface_index)); } // static -bool AddressTrackerLinux::IsTunnelInterfaceName(const char* name) { +bool AddressTrackerLinux::IsTunnelInterfaceName(std::string_view name) { // Linux kernel drivers/net/tun.c uses "tun" name prefix. - return strncmp(name, "tun", 3) == 0; + return base::StartsWith(name, "tun"); } void AddressTrackerLinux::UpdateCurrentConnectionType() {
diff --git a/net/base/address_tracker_linux.h b/net/base/address_tracker_linux.h index 181a7dc..0a5de0f 100644 --- a/net/base/address_tracker_linux.h +++ b/net/base/address_tracker_linux.h
@@ -17,6 +17,7 @@ #include <map> #include <memory> #include <string> +#include <string_view> #include <unordered_set> #include "base/compiler_specific.h" @@ -131,15 +132,14 @@ // Safe to call from any thread, but will block until Init() has completed. NetworkChangeNotifier::ConnectionType GetCurrentConnectionType(); - // Returns the name for the interface with interface index |interface_index|. - // |buf| should be a pointer to an array of size IFNAMSIZ. The returned - // pointer will point to |buf|. This function acts like if_indextoname which - // cannot be used as net/if.h cannot be mixed with linux/if.h. We'll stick - // with exclusively talking to the kernel and not the C library. - static char* GetInterfaceName(int interface_index, char* buf); + // Returns the name for the interface with interface index `interface_index`. + // This function acts like if_indextoname which cannot be used as net/if.h + // cannot be mixed with linux/if.h. We'll stick with exclusively talking to + // the kernel and not the C library. + static std::string GetInterfaceName(int interface_index); // Does |name| refer to a tunnel interface? - static bool IsTunnelInterfaceName(const char* name); + static bool IsTunnelInterfaceName(std::string_view name); private: friend class net::test::AddressTrackerLinuxTest; @@ -167,7 +167,7 @@ // A function that returns the name of an interface given the interface index // in |interface_index|. |ifname| should be a buffer of size IFNAMSIZ. The // function should return a pointer to |ifname|. - typedef char* (*GetInterfaceNameFunction)(int interface_index, char* ifname); + using GetInterfaceNameFunction = std::string (*)(int interface_index); // Retrieves a dump of the current AddressMap and set of online links as part // of initialization. Expects |netlink_fd_| to exist already.
diff --git a/net/base/address_tracker_linux_unittest.cc b/net/base/address_tracker_linux_unittest.cc index 4a3970ab..7cb6963 100644 --- a/net/base/address_tracker_linux_unittest.cc +++ b/net/base/address_tracker_linux_unittest.cc
@@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/390223051): Remove C-library calls to fix the errors. -#pragma allow_unsafe_libc_calls -#endif - #include "net/base/address_tracker_linux.h" #include <linux/if.h> @@ -59,17 +54,17 @@ const char kIgnoredInterfaceName[] = "uap0"; -char* TestGetInterfaceName(int interface_index, char* buf) { - if (interface_index == kTestInterfaceEth) { - snprintf(buf, IFNAMSIZ, "%s", "eth0"); - } else if (interface_index == kTestInterfaceTun) { - snprintf(buf, IFNAMSIZ, "%s", "tun0"); - } else if (interface_index == kTestInterfaceAp) { - snprintf(buf, IFNAMSIZ, "%s", kIgnoredInterfaceName); - } else { - snprintf(buf, IFNAMSIZ, "%s", ""); +std::string TestGetInterfaceName(int interface_index) { + switch (interface_index) { + case kTestInterfaceEth: + return "eth0"; + case kTestInterfaceTun: + return "tun0"; + case kTestInterfaceAp: + return kIgnoredInterfaceName; + default: + return std::string(); } - return buf; } } // namespace @@ -590,13 +585,12 @@ } // Check AddressTrackerLinux::get_interface_name_ original implementation -// doesn't crash or return NULL. +// doesn't crash. TEST_F(AddressTrackerLinuxTest, GetInterfaceName) { InitializeAddressTracker(true); for (int i = 0; i < 10; i++) { - char buf[IFNAMSIZ] = {}; - EXPECT_NE((const char*)nullptr, original_get_interface_name_(i, buf)); + original_get_interface_name_(i); } }
diff --git a/net/base/net_platform_api_util.cc b/net/base/net_platform_api_util.cc new file mode 100644 index 0000000..6a0dba0 --- /dev/null +++ b/net/base/net_platform_api_util.cc
@@ -0,0 +1,27 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "net/base/net_platform_api_util.h" + +#include <string_view> + +#include "base/check.h" +#include "base/containers/span.h" + +namespace net { + +void CopyStringAndNulToSpan(std::string_view src, base::span<char> dest) { + dest.copy_prefix_from(base::span(src)); + dest[src.size()] = '\0'; +} + +std::string_view SpanMaybeWithNulToStringView(base::span<const char> span) { + size_t length = base::as_string_view(span).find('\0'); + if (length == std::string_view::npos) { + length = span.size(); + } + return base::as_string_view(span.first(length)); +} + +} // namespace net
diff --git a/net/base/net_platform_api_util.h b/net/base/net_platform_api_util.h new file mode 100644 index 0000000..d40f5561 --- /dev/null +++ b/net/base/net_platform_api_util.h
@@ -0,0 +1,36 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef NET_BASE_NET_PLATFORM_API_UTIL_H_ +#define NET_BASE_NET_PLATFORM_API_UTIL_H_ + +#include <string_view> + +#include "base/containers/span.h" +#include "net/base/net_export.h" + +namespace net { + +// Copies a string_view to the provided span, adding a terminating '\0'. Does +// not zero-fill the rest of the span. `dest` must be long enough. `span` does +// not need to be null terminated. CHECKs if the provided span, including the +// nul, won't fit in `dest`. This is useful to use with platform APIs that take +// C-style strings in struct fields. To use this in that case: +// `CopyStringToSpanWithNul(string, std::span(struct.c_string_field))` +NET_EXPORT_PRIVATE void CopyStringAndNulToSpan(std::string_view src, + base::span<char> dest); + +// Does the opposite of the above method, for extracting strings from platform +// structs. Finds the first nul in `span`, and returns a string_view containing +// all characters up to (but not including) the nul. If there is no nul at the +// end of the span, returns the entire span, as a string_view. +// +// To use this with a platform API that returns a struct with a C-string: +// `SpanWithNulToString(std::span(struct.c_string_field))` +NET_EXPORT_PRIVATE std::string_view SpanMaybeWithNulToStringView( + base::span<const char> span); + +} // namespace net + +#endif // NET_BASE_NET_PLATFORM_API_UTIL_H_
diff --git a/net/base/net_platform_api_util_unittest.cc b/net/base/net_platform_api_util_unittest.cc new file mode 100644 index 0000000..fb9ee3c --- /dev/null +++ b/net/base/net_platform_api_util_unittest.cc
@@ -0,0 +1,79 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "net/base/net_platform_api_util.h" + +#include <string_view> + +#include "base/containers/span.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace net { + +TEST(NetPlatformApiUtilTest, CopyStringAndNulToSpan) { + constexpr std::string_view kTestCases[] = { + "", + "1", + "1234", + }; + + for (const auto& test_case : kTestCases) { + char dest[5] = {'a', 'a', 'a', 'a', 'a'}; + CopyStringAndNulToSpan(test_case, dest); + + // A string_view that includes all of `dest`, including the terminating nul + // and any characters after that. + auto dest_string = base::as_string_view(base::span(dest)); + + EXPECT_EQ(dest_string.substr(0u, test_case.size()), test_case); + EXPECT_EQ(dest_string[test_case.size()], '\0'); + for (auto unmodified_char : dest_string.substr(test_case.size() + 1)) { + EXPECT_EQ(unmodified_char, 'a'); + } + } +} + +TEST(NetPlatformApiUtilTest, SpanWithNulToStringView) { + // Test span representation of an empty string, with and without a terminating + // null. + const char kTest1[] = ""; + EXPECT_EQ(kTest1, SpanMaybeWithNulToStringView( + base::span_with_nul_from_cstring(kTest1))); + EXPECT_EQ(kTest1, + SpanMaybeWithNulToStringView(base::span_from_cstring(kTest1))); + + // Test span representation of a string, with and without a terminating null. + const char kTest2[] = "1234"; + EXPECT_EQ(kTest2, SpanMaybeWithNulToStringView( + base::span_with_nul_from_cstring(kTest2))); + EXPECT_EQ(kTest2, + SpanMaybeWithNulToStringView(base::span_from_cstring(kTest2))); + + // base::span() constructor that esctracts a length from an array refuses to + // take string literals, due to ambiguity around the nul. In these cases, we + // want not just the terminating null, but everything after it as well, so + // have to use the pointer+length constructor, and use UNSAFE_BUFFERS to avoid + // a compile error. + const char kTest3[] = "1234\0"; + EXPECT_EQ("1234", SpanMaybeWithNulToStringView( + UNSAFE_BUFFERS(base::span(kTest3, sizeof(kTest3))))); + + const char kTest4[] = + "1234" + "\0" + "5678"; + EXPECT_EQ("1234", SpanMaybeWithNulToStringView( + UNSAFE_BUFFERS(base::span(kTest4, sizeof(kTest4))))); + + const char kTest5[] = + "1234" + "\0" + "5" + "\0\0" + "678"; + EXPECT_EQ("1234", SpanMaybeWithNulToStringView( + UNSAFE_BUFFERS(base::span(kTest5, sizeof(kTest5))))); +} + +} // namespace net
diff --git a/net/base/network_interfaces_linux.cc b/net/base/network_interfaces_linux.cc index d121d10..34c59bb 100644 --- a/net/base/network_interfaces_linux.cc +++ b/net/base/network_interfaces_linux.cc
@@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/390223051): Remove C-library calls to fix the errors. -#pragma allow_unsafe_libc_calls -#endif - #include "net/base/network_interfaces_linux.h" #include <memory> @@ -20,10 +15,11 @@ #include <linux/if.h> #include <linux/sockios.h> #include <linux/wireless.h> -#include <set> #include <sys/ioctl.h> #include <sys/types.h> +#include <set> + #include "base/feature_list.h" #include "base/files/file_path.h" #include "base/files/scoped_file.h" @@ -38,6 +34,7 @@ #include "net/base/features.h" #include "net/base/ip_endpoint.h" #include "net/base/net_errors.h" +#include "net/base/net_platform_api_util.h" #include "net/base/network_interfaces_posix.h" #include "url/gurl.h" @@ -90,14 +87,17 @@ // Gets the connection type for interface |ifname| by checking for wireless // or ethtool extensions. NetworkChangeNotifier::ConnectionType GetInterfaceConnectionType( - const std::string& ifname) { + std::string_view ifname) { base::ScopedFD s = GetSocketForIoctl(); if (!s.is_valid()) return NetworkChangeNotifier::CONNECTION_UNKNOWN; // Test wireless extensions for CONNECTION_WIFI struct iwreq pwrq = {}; - strncpy(pwrq.ifr_name, ifname.c_str(), IFNAMSIZ - 1); + + // This should never CHECK, since `ifname` came from a call to + // GetInterfaceName(), which never returns anything longer than will fit. + CopyStringAndNulToSpan(ifname, base::span(pwrq.ifr_name)); if (ioctl(s.get(), SIOCGIWNAME, &pwrq) != -1) return NetworkChangeNotifier::CONNECTION_WIFI; @@ -107,7 +107,7 @@ ecmd.cmd = ETHTOOL_GSET; struct ifreq ifr = {}; ifr.ifr_data = &ecmd; - strncpy(ifr.ifr_name, ifname.c_str(), IFNAMSIZ - 1); + CopyStringAndNulToSpan(ifname, base::span(ifr.ifr_name)); if (ioctl(s.get(), SIOCETHTOOL, &ifr) != -1) return NetworkChangeNotifier::CONNECTION_ETHERNET; #endif // !BUILDFLAG(IS_ANDROID) @@ -120,13 +120,15 @@ if (!ioctl_socket.is_valid()) return std::string(); struct iwreq wreq = {}; - strncpy(wreq.ifr_name, ifname.c_str(), IFNAMSIZ - 1); + // This should never CHECK, since `ifname` came from a call to + // GetInterfaceName(), which never returns anything longer than will fit. + CopyStringAndNulToSpan(ifname, base::span(wreq.ifr_name)); char ssid[IW_ESSID_MAX_SIZE + 1] = {}; wreq.u.essid.pointer = ssid; wreq.u.essid.length = IW_ESSID_MAX_SIZE; if (ioctl(ioctl_socket.get(), SIOCGIWESSID, &wreq) != -1) - return ssid; + return std::string(SpanMaybeWithNulToStringView(ssid)); return std::string(); } @@ -171,8 +173,7 @@ ifnames.find(it.second.ifa_index); std::string ifname; if (itname == ifnames.end()) { - char buffer[IFNAMSIZ] = {}; - ifname.assign(get_interface_name(it.second.ifa_index, buffer)); + ifname = get_interface_name(it.second.ifa_index); // Ignore addresses whose interface name can't be retrieved. if (ifname.empty()) continue; @@ -189,9 +190,8 @@ NetworkChangeNotifier::ConnectionType type = GetInterfaceConnectionType(ifname); - networks->push_back( - NetworkInterface(ifname, ifname, it.second.ifa_index, type, it.first, - it.second.ifa_prefixlen, ip_attributes)); + networks->emplace_back(ifname, ifname, it.second.ifa_index, type, it.first, + it.second.ifa_prefixlen, ip_attributes); } return true;
diff --git a/net/base/network_interfaces_linux.h b/net/base/network_interfaces_linux.h index 4b9ba9e..9374480 100644 --- a/net/base/network_interfaces_linux.h +++ b/net/base/network_interfaces_linux.h
@@ -18,9 +18,9 @@ namespace net::internal { -typedef char* (*GetInterfaceNameFunction)(int interface_index, char* ifname); +using GetInterfaceNameFunction = std::string (*)(int interface_index); -typedef std::string (*GetInterfaceSSIDFunction)(const std::string& ifname); +using GetInterfaceSSIDFunction = std::string (*)(const std::string& ifname); NET_EXPORT bool GetNetworkListImpl( NetworkInterfaceList* networks,
diff --git a/net/base/network_interfaces_linux_unittest.cc b/net/base/network_interfaces_linux_unittest.cc index 6770d990..b91a60e 100644 --- a/net/base/network_interfaces_linux_unittest.cc +++ b/net/base/network_interfaces_linux_unittest.cc
@@ -2,11 +2,6 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifdef UNSAFE_BUFFERS_BUILD -// TODO(crbug.com/390223051): Remove C-library calls to fix the errors. -#pragma allow_unsafe_libc_calls -#endif - #include "net/base/network_interfaces_linux.h" #include <net/if.h> @@ -35,17 +30,15 @@ 0x10, 0x00, 0xbe, 0x30, 0x5b, 0xff, 0xfe, 0xe5, 0x00, 0xc3}; -char* GetInterfaceName(int interface_index, char* ifname) { +std::string GetInterfaceName(int interface_index) { static_assert(std::size(kIfnameEm1) < IF_NAMESIZE, "Invalid interface name"); - memcpy(ifname, kIfnameEm1, std::size(kIfnameEm1)); - return ifname; + return kIfnameEm1; } -char* GetInterfaceNameVM(int interface_index, char* ifname) { +std::string GetInterfaceNameVM(int interface_index) { static_assert(std::size(kIfnameVmnet) < IF_NAMESIZE, "Invalid interface name"); - memcpy(ifname, kIfnameVmnet, std::size(kIfnameVmnet)); - return ifname; + return kIfnameVmnet; } TEST(NetworkInterfacesTest, NetworkListTrimmingLinux) {
diff --git a/net/cookies/cookie_partition_key.cc b/net/cookies/cookie_partition_key.cc index 0b3f9f7f..a1447e5 100644 --- a/net/cookies/cookie_partition_key.cc +++ b/net/cookies/cookie_partition_key.cc
@@ -89,10 +89,18 @@ const SchemefulSite& site, std::optional<base::UnguessableToken> nonce, AncestorChainBit ancestor_chain_bit) - : site_(site), nonce_(nonce), ancestor_chain_bit_(ancestor_chain_bit) {} + : site_(site), nonce_(nonce), ancestor_chain_bit_(ancestor_chain_bit) { +#if BUILDFLAG(IS_ANDROID) + g_constructor_called_ = true; +#endif // BUILDFLAG(IS_ANDROID) +} CookiePartitionKey::CookiePartitionKey(bool from_script) - : from_script_(from_script) {} + : from_script_(from_script) { +#if BUILDFLAG(IS_ANDROID) + g_constructor_called_ = true; +#endif // BUILDFLAG(IS_ANDROID) +} CookiePartitionKey::CookiePartitionKey(const CookiePartitionKey& other) = default;
diff --git a/net/test/android/javatests/src/org/chromium/net/test/EmbeddedTestServer.java b/net/test/android/javatests/src/org/chromium/net/test/EmbeddedTestServer.java index aa7fbd8..b2d6687 100644 --- a/net/test/android/javatests/src/org/chromium/net/test/EmbeddedTestServer.java +++ b/net/test/android/javatests/src/org/chromium/net/test/EmbeddedTestServer.java
@@ -57,7 +57,7 @@ @GuardedBy("mImplMonitor") private IEmbeddedTestServerImpl mImpl; - private ServiceConnection mConn = + private final ServiceConnection mConn = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder service) {
diff --git a/net/test/android/javatests/src/org/chromium/net/test/EmbeddedTestServerImpl.java b/net/test/android/javatests/src/org/chromium/net/test/EmbeddedTestServerImpl.java index 9a561ee..10ba3f778 100644 --- a/net/test/android/javatests/src/org/chromium/net/test/EmbeddedTestServerImpl.java +++ b/net/test/android/javatests/src/org/chromium/net/test/EmbeddedTestServerImpl.java
@@ -35,7 +35,7 @@ public class EmbeddedTestServerImpl extends IEmbeddedTestServerImpl.Stub { private static final String TAG = "TestServer"; - private static AtomicInteger sCount = new AtomicInteger(); + private static final AtomicInteger sCount = new AtomicInteger(); private final Context mContext; private Handler mHandler;
diff --git a/net/test/android/javatests/src/org/chromium/net/test/util/WebServer.java b/net/test/android/javatests/src/org/chromium/net/test/util/WebServer.java index 238fb0d2..13a1d22 100644 --- a/net/test/android/javatests/src/org/chromium/net/test/util/WebServer.java +++ b/net/test/android/javatests/src/org/chromium/net/test/util/WebServer.java
@@ -41,8 +41,8 @@ public class WebServer implements AutoCloseable { private static final String TAG = "WebServer"; - private static Set<WebServer> sInstances = new HashSet<>(); - private static Set<WebServer> sSecureInstances = new HashSet<>(); + private static final Set<WebServer> sInstances = new HashSet<>(); + private static final Set<WebServer> sSecureInstances = new HashSet<>(); private final ServerThread mServerThread; private String mServerUri; @@ -421,7 +421,7 @@ } private class ServerThread extends Thread { - private final boolean mIsSsl; + private ServerSocket mSocket; private SSLContext mSslContext; @@ -514,7 +514,7 @@ public ServerThread(int port, boolean ssl) throws Exception { super("ServerThread"); - mIsSsl = ssl; + boolean mIsSsl = ssl; // If tests are run back-to-back, it may take time for the port to become available. // Retry a few times with a sleep to wait for the port. int retry = 3;
diff --git a/pdf/pdf_ink_module_unittest.cc b/pdf/pdf_ink_module_unittest.cc index 418125a..67e30cc 100644 --- a/pdf/pdf_ink_module_unittest.cc +++ b/pdf/pdf_ink_module_unittest.cc
@@ -44,6 +44,7 @@ #include "third_party/ink/src/ink/strokes/input/stroke_input_batch.h" #include "third_party/ink/src/ink/strokes/input/type_matchers.h" #include "third_party/skia/include/core/SkBitmap.h" +#include "third_party/skia/include/core/SkColor.h" #include "ui/base/cursor/cursor.h" #include "ui/base/cursor/mojom/cursor_type.mojom.h" #include "ui/gfx/geometry/point_f.h" @@ -146,11 +147,15 @@ {kTwoPageVerticalLayoutHorzLinePoint1Canonical, base::Seconds(0)}, }); -// Commonly used test brush message params. The color corresponds to "Red1" for +// Commonly used test brush color. The color corresponds to "Yellow 1" for pen +// brushes and "Light Yellow" for highlighter brushes. +constexpr SkColor kYellow = SkColorSetRGB(0xFD, 0xD6, 0x63); + +// Commonly used test brush message params. The color corresponds to "Red 1" for // pen brushes and "Light Red" for highlighter brushes. constexpr TestAnnotationBrushMessageParams kRedBrushParams{ - /*color_r=*/0xF2, /*color_g=*/0x8B, - /*color_b=*/0x82, /*size=*/6.0f}; + SkColorSetRGB(0xF2, 0x8B, 0x82), + /*size=*/6.0}; // Matcher for ink::Stroke objects against their expected brush and inputs. MATCHER_P(InkStrokeEq, expected_brush, "") { @@ -593,10 +598,9 @@ TEST_P(PdfInkModuleTest, HandleSetAnnotationBrushMessagePen) { EnableAnnotationMode(); - TestAnnotationBrushMessageParams message_params{/*color_r=*/0x0A, - /*color_g=*/0xFF, - /*color_b=*/0x32, - /*size=*/8.0f}; + // Select the "Yellow 1" color. + TestAnnotationBrushMessageParams message_params{kYellow, + /*size=*/8.0}; base::Value::Dict message = CreateSetAnnotationBrushMessageForTesting("pen", &message_params); EXPECT_TRUE(ink_module().OnMessage(message)); @@ -605,7 +609,7 @@ ASSERT_TRUE(brush); const ink::Brush& ink_brush = brush->ink_brush(); - EXPECT_EQ(SkColorSetRGB(0x0A, 0xFF, 0x32), GetSkColorFromInkBrush(ink_brush)); + EXPECT_EQ(kYellow, GetSkColorFromInkBrush(ink_brush)); EXPECT_EQ(8.0f, ink_brush.GetSize()); ASSERT_EQ(1u, ink_brush.CoatCount()); const ink::BrushCoat& coat = ink_brush.GetCoats()[0]; @@ -618,10 +622,9 @@ TEST_P(PdfInkModuleTest, HandleSetAnnotationBrushMessageHighlighter) { EnableAnnotationMode(); - TestAnnotationBrushMessageParams message_params{/*color_r=*/0xF0, - /*color_g=*/0x85, - /*color_b=*/0x00, - /*size=*/4.5f}; + // Select the "Light Yellow" color. + TestAnnotationBrushMessageParams message_params{kYellow, + /*size=*/4.5}; base::Value::Dict message = CreateSetAnnotationBrushMessageForTesting("highlighter", &message_params); EXPECT_TRUE(ink_module().OnMessage(message)); @@ -630,7 +633,7 @@ ASSERT_TRUE(brush); const ink::Brush& ink_brush = brush->ink_brush(); - EXPECT_EQ(SkColorSetRGB(0xF0, 0x85, 0x00), GetSkColorFromInkBrush(ink_brush)); + EXPECT_EQ(kYellow, GetSkColorFromInkBrush(ink_brush)); EXPECT_EQ(4.5f, ink_brush.GetSize()); ASSERT_EQ(1u, ink_brush.CoatCount()); const ink::BrushCoat& coat = ink_brush.GetCoats()[0]; @@ -644,8 +647,8 @@ EnableAnnotationMode(); TestAnnotationBrushMessageParams message_params{ - /*color_r=*/0x00, /*color_g=*/0x00, - /*color_b=*/0x00, /*size=*/4.5f}; + SkColorSetRGB(0x00, 0x00, 0x00), + /*size=*/4.5}; base::Value::Dict message = CreateSetAnnotationBrushMessageForTesting("pen", &message_params); EXPECT_TRUE(ink_module().OnMessage(message)); @@ -747,10 +750,9 @@ EnableAnnotationMode(); - TestAnnotationBrushMessageParams message_params{/*color_r=*/0x00, - /*color_g=*/0xFF, - /*color_b=*/0x00, - /*size=*/16.0f}; + TestAnnotationBrushMessageParams message_params{ + SkColorSetRGB(0x00, 0xFF, 0x00), + /*size=*/16.0}; base::Value::Dict message = CreateSetAnnotationBrushMessageForTesting("pen", &message_params); EXPECT_TRUE(ink_module().OnMessage(message)); @@ -787,10 +789,9 @@ EnableAnnotationMode(); - TestAnnotationBrushMessageParams message_params{/*color_r=*/0x00, - /*color_g=*/0xFF, - /*color_b=*/0x00, - /*size=*/16.0f}; + TestAnnotationBrushMessageParams message_params{ + SkColorSetRGB(0x00, 0xFF, 0x00), + /*size=*/16.0}; base::Value::Dict message = CreateSetAnnotationBrushMessageForTesting("pen", &message_params); EXPECT_TRUE(ink_module().OnMessage(message)); @@ -1951,10 +1952,9 @@ // Start drawing a stroke with a black pen. The stroke will not finish // until the mouse-up event. EXPECT_CALL(client(), StrokeAdded(_, _, _)).Times(0); - TestAnnotationBrushMessageParams black_pen_message_params{/*color_r=*/0x00, - /*color_g=*/0x00, - /*color_b=*/0x00, - /*size=*/3.0f}; + TestAnnotationBrushMessageParams black_pen_message_params{ + SkColorSetRGB(0x00, 0x00, 0x00), + /*size=*/3.0}; SelectBrushTool(PdfInkBrush::Type::kPen, black_pen_message_params); blink::WebMouseEvent mouse_down_event = @@ -1965,10 +1965,9 @@ // While the stroke is still in progress, change the pen color. This has no // immediate effect on the in-progress stroke. - TestAnnotationBrushMessageParams red_pen_message_params{/*color_r=*/0xF2, - /*color_g=*/0x8B, - /*color_b=*/0x82, - /*size=*/3.0f}; + TestAnnotationBrushMessageParams red_pen_message_params{ + SkColorSetRGB(0xF2, 0x8B, 0x82), + /*size=*/3.0}; SelectBrushTool(PdfInkBrush::Type::kPen, red_pen_message_params); VerifyAndClearExpectations(); @@ -2007,10 +2006,9 @@ EXPECT_CALL(client(), StrokeAdded(_, _, _)).Times(0); EXPECT_CALL(client(), UpdateInkCursor(CursorBitmapImageSizeEq(SkISize(6, 6)))); - TestAnnotationBrushMessageParams message_params{/*color_r=*/0x00, - /*color_g=*/0x00, - /*color_b=*/0x00, - /*size=*/2.0f}; + TestAnnotationBrushMessageParams message_params{ + SkColorSetRGB(0x00, 0x00, 0x00), + /*size=*/2.0}; SelectBrushTool(PdfInkBrush::Type::kPen, message_params); blink::WebMouseEvent mouse_down_event = @@ -2134,10 +2132,9 @@ // While the stroke is still in progress, change the input tool type to a // pen. Note that this causes the in-progress erase stroke to finish even // before the mouse-up event. - TestAnnotationBrushMessageParams message_params{/*color_r=*/0x00, - /*color_g=*/0x00, - /*color_b=*/0x00, - /*size=*/8.0f}; + TestAnnotationBrushMessageParams message_params{ + SkColorSetRGB(0x00, 0x00, 0x00), + /*size=*/8.0}; SelectBrushTool(PdfInkBrush::Type::kPen, message_params); VerifyAndClearExpectations(); @@ -2174,10 +2171,9 @@ EXPECT_CALL(client(), StrokeAdded(_, _, _)).Times(0); EXPECT_CALL(client(), UpdateInkCursor(CursorBitmapImageSizeEq(SkISize(6, 6)))); - TestAnnotationBrushMessageParams pen_message_params{/*color_r=*/0x00, - /*color_g=*/0x00, - /*color_b=*/0x00, - /*size=*/2.0f}; + TestAnnotationBrushMessageParams pen_message_params{ + SkColorSetRGB(0x00, 0x00, 0x00), + /*size=*/2.0}; SelectBrushTool(PdfInkBrush::Type::kPen, pen_message_params); blink::WebMouseEvent mouse_down_event = @@ -2188,10 +2184,9 @@ // While the stroke is still in progress, change the input tool type to a // highlighter. The entire stroke changes to this new type. - TestAnnotationBrushMessageParams highlighter_message_params{/*color_r=*/0xDD, - /*color_g=*/0xF3, - /*color_b=*/0x00, - /*size=*/8.0f}; + TestAnnotationBrushMessageParams highlighter_message_params{ + SkColorSetRGB(0xDD, 0xF3, 0x00), + /*size=*/8.0}; SelectBrushTool(PdfInkBrush::Type::kHighlighter, highlighter_message_params); VerifyAndClearExpectations(); @@ -2848,9 +2843,7 @@ histograms.ExpectTotalCount(kPenColorMetric, 2); // Draw a stroke with "Tan 3" color. - params.color_r = 0x88; - params.color_g = 0x59; - params.color_b = 0x45; + params.color = SkColorSetRGB(0x88, 0x59, 0x45); SelectBrushTool(PdfInkBrush::Type::kPen, params); ApplyStrokeWithMouseAtMouseDownPoint(); @@ -2874,9 +2867,7 @@ histograms.ExpectTotalCount(kHighlighterColorMetric, 1); // Draw a stroke with "Orange" color. - params.color_r = 0xFF; - params.color_g = 0x63; - params.color_b = 0x0C; + params.color = SkColorSetRGB(0xFF, 0x63, 0x0C); SelectBrushTool(PdfInkBrush::Type::kHighlighter, params); ApplyStrokeWithMouseAtMouseDownPoint(); @@ -2896,8 +2887,8 @@ histograms.ExpectUniqueSample(kPenSizeMetric, StrokeMetricBrushSize::kMedium, 1); - TestAnnotationBrushMessageParams params = {/*color_r=*/0xF2, /*color_g=*/0x8B, - /*color_b=*/0x82, /*size=*/1.0f}; + TestAnnotationBrushMessageParams params = {SkColorSetRGB(0xF2, 0x8B, 0x82), + /*size=*/1.0}; SelectBrushTool(PdfInkBrush::Type::kPen, params); ApplyStrokeWithMouseAtMouseDownPoint(); @@ -2921,8 +2912,8 @@ base::HistogramTester histograms; // Draw a stroke with medium size. - TestAnnotationBrushMessageParams params = {/*color_r=*/0xF2, /*color_g=*/0x8B, - /*color_b=*/0x82, /*size=*/8.0f}; + TestAnnotationBrushMessageParams params = {SkColorSetRGB(0xF2, 0x8B, 0x82), + /*size=*/8.0}; SelectBrushTool(PdfInkBrush::Type::kHighlighter, params); ApplyStrokeWithMouseAtMouseDownPoint(); @@ -3092,9 +3083,8 @@ class PdfInkModuleTextHighlightTest : public PdfInkModuleStrokeTest { public: static constexpr TestAnnotationBrushMessageParams kOrangeBrushParams{ - /*color_r=*/0xFF, - /*color_g=*/0x63, - /*color_b=*/0x0C, /*size=*/6.0f}; + SkColorSetRGB(0xFF, 0x63, 0x0C), + /*size=*/6.0}; static constexpr gfx::Rect kHorizontalSelection{10, 15, 30, 10}; static constexpr gfx::Rect kVerticalSelection{10, 15, 6, 10}; static constexpr gfx::PointF kStartPointInsidePage0{10.0, 10.0}; @@ -3117,7 +3107,24 @@ VerifySingleSelectionTest(expected_inputs, expected_size); } - // Set up single selection test expectations before text selection strokes + // Sets the selection rects that will be given by the client. + void SetSelectionRects(base::span<const gfx::Rect> selection_rects) { + EXPECT_CALL(client(), GetSelectionRects()) + .WillRepeatedly(Return(base::ToVector(selection_rects))); + } + + // Sets `points` as selectable text areas. Any points not included will be + // considered non-selectable. + void SetTextAreaPoints(base::span<const gfx::PointF> points) { + EXPECT_CALL(client(), IsSelectableTextOrLinkArea(_)) + .WillRepeatedly(Return(false)); + for (const auto& point : points) { + EXPECT_CALL(client(), IsSelectableTextOrLinkArea(point)) + .WillRepeatedly(Return(true)); + } + } + + // Sets up single selection test expectations before text selection strokes // have been applied. void SetUpSingleSelectionTest(const gfx::Rect& selection_rect) { EnableAnnotationMode(); @@ -3125,20 +3132,16 @@ SelectBrushTool(PdfInkBrush::Type::kHighlighter, kOrangeBrushParams); - std::vector<gfx::Rect> selection_rects{selection_rect}; - EXPECT_CALL(client(), GetSelectionRects()) - .WillRepeatedly(Return(selection_rects)); - EXPECT_CALL(client(), IsSelectableTextOrLinkArea(kStartPointInsidePage0)) - .WillRepeatedly(Return(true)); - EXPECT_CALL(client(), IsSelectableTextOrLinkArea(kEndPointInsidePage0)) - .WillRepeatedly(Return(true)); + SetSelectionRects(base::span_from_ref(selection_rect)); + SetTextAreaPoints(base::span_from_ref(kStartPointInsidePage0)); EXPECT_CALL(client(), OnTextOrLinkAreaClick(kStartPointInsidePage0, /*click_count=*/1)); EXPECT_CALL(client(), ExtendSelectionByPoint(kEndPointInsidePage0)); } - // Verify single selection test results after applying text selection strokes. + // Verifies single selection test results after applying text selection + // strokes. void VerifySingleSelectionTest( base::span<const PdfInkInputData> expected_inputs, float expected_size) { @@ -3171,9 +3174,6 @@ } void ClickTextAtPoint(const gfx::PointF& point, int click_count) { - EXPECT_CALL(client(), IsSelectableTextOrLinkArea(_)) - .WillRepeatedly(Return(true)); - blink::WebMouseEvent mouse_down_event = MouseEventBuilder() .CreateLeftClickAtPosition(point) @@ -3197,8 +3197,7 @@ SelectBrushTool(PdfInkBrush::Type::kPen, kRedBrushParams); EXPECT_CALL(client(), GetSelectionRects()).Times(0); - EXPECT_CALL(client(), IsSelectableTextOrLinkArea(kStartPointInsidePage0)) - .WillRepeatedly(Return(true)); + SetTextAreaPoints(base::span_from_ref(kStartPointInsidePage0)); EXPECT_CALL(client(), OnTextOrLinkAreaClick(_, _)).Times(0); EXPECT_CALL(client(), ExtendSelectionByPoint(_)).Times(0); @@ -3352,16 +3351,9 @@ SelectBrushTool(PdfInkBrush::Type::kHighlighter, kOrangeBrushParams); - constexpr gfx::Rect kHorizontalSelection2{15, 25, 10, 5}; - std::vector<gfx::Rect> selection_rects{kHorizontalSelection, - kHorizontalSelection2}; - EXPECT_CALL(client(), GetSelectionRects()) - .WillRepeatedly(Return(selection_rects)); - EXPECT_CALL(client(), IsSelectableTextOrLinkArea(kStartPointInsidePage0)) - .WillRepeatedly(Return(true)); + SetSelectionRects({kHorizontalSelection, gfx::Rect(15, 25, 10, 5)}); constexpr gfx::PointF kEndPoint2InsidePage0{25.0, 30.0}; - EXPECT_CALL(client(), IsSelectableTextOrLinkArea(kEndPoint2InsidePage0)) - .WillRepeatedly(Return(true)); + SetTextAreaPoints({kStartPointInsidePage0, kEndPoint2InsidePage0}); EXPECT_CALL(client(), OnTextOrLinkAreaClick(kStartPointInsidePage0, /*click_count=*/1)); @@ -3417,10 +3409,8 @@ SelectBrushTool(PdfInkBrush::Type::kHighlighter, kOrangeBrushParams); // There will be no text selection rects. - std::vector<gfx::Rect> selection_rects; - EXPECT_CALL(client(), GetSelectionRects()).WillOnce(Return(selection_rects)); - EXPECT_CALL(client(), IsSelectableTextOrLinkArea(kStartPointInsidePage0)) - .WillRepeatedly(Return(true)); + SetSelectionRects({}); + SetTextAreaPoints(base::span_from_ref(kStartPointInsidePage0)); EXPECT_CALL(client(), OnTextOrLinkAreaClick(kStartPointInsidePage0, /*click_count=*/1)); @@ -3441,14 +3431,12 @@ InitializeSimpleSinglePageBasicLayout(); SelectBrushTool(PdfInkBrush::Type::kHighlighter, kOrangeBrushParams); + SetTextAreaPoints(base::span_from_ref(kStartPointInsidePage0)); ClickTextAtPoint(kStartPointInsidePage0, /*click_count=*/1); // The second text click will select the word. - std::vector<gfx::Rect> selection_rects{kHorizontalSelection}; - EXPECT_CALL(client(), GetSelectionRects()).WillOnce(Return(selection_rects)); - EXPECT_CALL(client(), IsSelectableTextOrLinkArea(kStartPointInsidePage0)) - .WillRepeatedly(Return(true)); + SetSelectionRects(base::span_from_ref(kHorizontalSelection)); EXPECT_CALL(client(), OnTextOrLinkAreaClick(kStartPointInsidePage0, /*click_count=*/2)); @@ -3480,21 +3468,16 @@ InitializeSimpleSinglePageBasicLayout(); SelectBrushTool(PdfInkBrush::Type::kHighlighter, kOrangeBrushParams); + SetTextAreaPoints(base::span_from_ref(kStartPointInsidePage0)); ClickTextAtPoint(kStartPointInsidePage0, /*click_count=*/1); - std::vector<gfx::Rect> two_click_selection_rects{kHorizontalSelection}; - EXPECT_CALL(client(), GetSelectionRects()) - .WillOnce(Return(two_click_selection_rects)); + SetSelectionRects(base::span_from_ref(kHorizontalSelection)); ClickTextAtPoint(kStartPointInsidePage0, /*click_count=*/2); // The third text click will remove the original word text highlight and // select the line. - std::vector<gfx::Rect> three_click_selection_rects{gfx::Rect(5, 15, 45, 12)}; - EXPECT_CALL(client(), GetSelectionRects()) - .WillOnce(Return(three_click_selection_rects)); - EXPECT_CALL(client(), IsSelectableTextOrLinkArea(kStartPointInsidePage0)) - .WillRepeatedly(Return(true)); + SetSelectionRects(base::span_from_ref(gfx::Rect(5, 15, 45, 12))); EXPECT_CALL(client(), OnTextOrLinkAreaClick(kStartPointInsidePage0, /*click_count=*/3)); @@ -3532,7 +3515,7 @@ SelectBrushTool(PdfInkBrush::Type::kHighlighter, kOrangeBrushParams); // Start in a text area. - EXPECT_CALL(client(), IsSelectableTextOrLinkArea(_)).WillOnce(Return(true)); + SetTextAreaPoints(base::span_from_ref(kStartPointInsidePage0)); EXPECT_CALL(client(), OnTextOrLinkAreaClick(kStartPointInsidePage0, /*click_count=*/1)); @@ -3547,12 +3530,7 @@ // Move and end in a non-text area. Make the mock selection rect smaller than // the distance between the mousedown and mouseup points. - constexpr gfx::Rect kSmallHorizontalSelection{10, 15, 2, 10}; - std::vector<gfx::Rect> selection_rects{kSmallHorizontalSelection}; - EXPECT_CALL(client(), GetSelectionRects()) - .WillRepeatedly(Return(selection_rects)); - EXPECT_CALL(client(), IsSelectableTextOrLinkArea(kEndPointInsidePage0)) - .WillRepeatedly(Return(false)); + SetSelectionRects(base::span_from_ref(gfx::Rect(10, 15, 2, 10))); EXPECT_CALL(client(), ExtendSelectionByPoint(kEndPointInsidePage0)); @@ -3591,10 +3569,10 @@ SelectBrushTool(PdfInkBrush::Type::kHighlighter, kOrangeBrushParams); - // Start on page 0. - EXPECT_CALL(client(), IsSelectableTextOrLinkArea(_)) - .WillRepeatedly(Return(true)); + SetTextAreaPoints( + {kStartPointInsidePage0, kTwoPageVerticalLayoutPoint1InsidePage1}); + // Start on page 0. EXPECT_CALL(client(), OnTextOrLinkAreaClick(kStartPointInsidePage0, /*click_count=*/1)); @@ -3606,10 +3584,7 @@ // Move to page 1. Select rects from both pages. constexpr gfx::Rect kHorizontalSelectionInPage1{10, 75, 15, 14}; - std::vector<gfx::Rect> selection_rects{kHorizontalSelection, - kHorizontalSelectionInPage1}; - EXPECT_CALL(client(), GetSelectionRects()) - .WillRepeatedly(Return(selection_rects)); + SetSelectionRects({kHorizontalSelection, kHorizontalSelectionInPage1}); EXPECT_CALL(client(), PageIndexFromPoint(gfx::PointF(kHorizontalSelection.origin()))) .WillRepeatedly(Return(0)); @@ -3667,9 +3642,7 @@ SelectBrushTool(PdfInkBrush::Type::kHighlighter, kOrangeBrushParams); - std::vector<gfx::Rect> selection_rects{gfx::Rect(9, 14, 5, 10)}; - EXPECT_CALL(client(), GetSelectionRects()) - .WillRepeatedly(Return(selection_rects)); + SetSelectionRects(base::span_from_ref(gfx::Rect(9, 14, 5, 10))); EXPECT_CALL(client(), IsSelectableTextOrLinkArea(_)) .WillRepeatedly(Return(true)); @@ -3701,10 +3674,8 @@ SelectBrushTool(PdfInkBrush::Type::kHighlighter, kOrangeBrushParams); // There will be no text selection rects. - std::vector<gfx::Rect> selection_rects; - EXPECT_CALL(client(), GetSelectionRects()).WillOnce(Return(selection_rects)); - EXPECT_CALL(client(), IsSelectableTextOrLinkArea(kStartPointInsidePage0)) - .WillRepeatedly(Return(true)); + SetSelectionRects({}); + SetTextAreaPoints(base::span_from_ref(kStartPointInsidePage0)); EXPECT_CALL(client(), OnTextOrLinkAreaClick(kStartPointInsidePage0, /*click_count=*/1)); @@ -3762,10 +3733,8 @@ SelectBrushTool(PdfInkBrush::Type::kHighlighter, kOrangeBrushParams); // There will be no text selection rects. - std::vector<gfx::Rect> selection_rects; - EXPECT_CALL(client(), GetSelectionRects()).WillOnce(Return(selection_rects)); - EXPECT_CALL(client(), IsSelectableTextOrLinkArea(kStartPointInsidePage0)) - .WillRepeatedly(Return(true)); + SetSelectionRects({}); + SetTextAreaPoints(base::span_from_ref(kStartPointInsidePage0)); EXPECT_CALL(client(), OnTextOrLinkAreaClick(kStartPointInsidePage0, /*click_count=*/1)); @@ -3800,12 +3769,7 @@ TestAnnotationBrushMessageParams params = kRedBrushParams; SelectBrushTool(PdfInkBrush::Type::kPen, params); - // `kStartPointInsidePage0` will be the selectable text area position, while - // all other positions will be non-text areas. - EXPECT_CALL(client(), IsSelectableTextOrLinkArea(_)) - .WillRepeatedly(Return(false)); - EXPECT_CALL(client(), IsSelectableTextOrLinkArea(kStartPointInsidePage0)) - .WillRepeatedly(Return(true)); + SetTextAreaPoints(base::span_from_ref(kStartPointInsidePage0)); // Move to a text position. The cursor should remain as the custom pen cursor. blink::WebMouseEvent mouse_move_event = @@ -3857,12 +3821,7 @@ VerifyAndClearExpectations(); - // `kStartPointInsidePage0` will be the selectable text area position, while - // all other positions will be non-text areas. - EXPECT_CALL(client(), IsSelectableTextOrLinkArea(_)) - .WillRepeatedly(Return(false)); - EXPECT_CALL(client(), IsSelectableTextOrLinkArea(kStartPointInsidePage0)) - .WillRepeatedly(Return(true)); + SetTextAreaPoints(base::span_from_ref(kStartPointInsidePage0)); // Move to a text position. The cursor should be an I-beam. EXPECT_CALL(client(), @@ -3910,12 +3869,7 @@ VerifyAndClearExpectations(); - // `kEndPointInsidePage0` will be the selectable text area position, while - // all other positions will be non-text areas. - EXPECT_CALL(client(), IsSelectableTextOrLinkArea(_)) - .WillRepeatedly(Return(false)); - EXPECT_CALL(client(), IsSelectableTextOrLinkArea(kEndPointInsidePage0)) - .WillRepeatedly(Return(true)); + SetTextAreaPoints(base::span_from_ref(kEndPointInsidePage0)); // Move to a non-text position. The cursor should remain as the custom // highlighter cursor.
diff --git a/pdf/pdf_view_web_plugin_unittest.cc b/pdf/pdf_view_web_plugin_unittest.cc index d4331a5..767da03 100644 --- a/pdf/pdf_view_web_plugin_unittest.cc +++ b/pdf/pdf_view_web_plugin_unittest.cc
@@ -95,7 +95,6 @@ #include "pdf/pdf_ink_metrics_handler.h" #include "pdf/pdf_ink_module_client.h" #include "pdf/test/pdf_ink_test_helpers.h" -#include "pdf/test/test_helpers.h" #include "third_party/ink/src/ink/strokes/stroke.h" #endif @@ -3307,6 +3306,9 @@ class PdfViewWebPluginInkTextHighlightTest : public PdfViewWebPluginInkTest { public: + static constexpr TestAnnotationBrushMessageParams kLightGreenBrushParams{ + SkColorSetRGB(0x34, 0xA8, 0x53), + /*size=*/4.5}; static constexpr gfx::PointF kStartTextPosition{55.0f, 60.0f}; static constexpr gfx::PointF kEndTextPosition{75.0f, 65.0f}; @@ -3316,8 +3318,10 @@ // The start position and end position are in screen coordinates, while the // values passed to and returned from PDFiumEngine are in device // coordinates. - EXPECT_CALL(*engine_ptr_, OnTextOrLinkAreaClick(gfx::PointF(5, 60), 1)); - EXPECT_CALL(*engine_ptr_, ExtendSelectionByPoint(gfx::PointF(25, 65))); + EXPECT_CALL(*engine_ptr_, + OnTextOrLinkAreaClick(gfx::PointF(5.0f, 60.0f), 1)); + EXPECT_CALL(*engine_ptr_, + ExtendSelectionByPoint(gfx::PointF(25.0f, 65.0f))); std::vector<gfx::Rect> mock_selection_rects = {gfx::Rect(5, 60, 20, 5)}; ON_CALL(*engine_ptr_, GetSelectionRects()) .WillByDefault(Return(mock_selection_rects)); @@ -3333,12 +3337,8 @@ // Enter annotation mode and select the highlighter. plugin_->OnMessage(CreateSetAnnotationModeMessageForTesting(/*enable=*/true)); - TestAnnotationBrushMessageParams message_params{/*color_r=*/0xF0, - /*color_g=*/0x85, - /*color_b=*/0x00, - /*size=*/4.5f}; plugin_->OnMessage(CreateSetAnnotationBrushMessageForTesting( - "highlighter", &message_params)); + "highlighter", &kLightGreenBrushParams)); SetUpMouseDownMoveTextTestExpectations(); TestSendInputEvent( @@ -3364,19 +3364,15 @@ TEST_P(PdfViewWebPluginInkTextHighlightTest, DrawInProgressTextHighlight) { // Enter annotation mode and select the highlighter. plugin_->OnMessage(CreateSetAnnotationModeMessageForTesting(/*enable=*/true)); - TestAnnotationBrushMessageParams message_params{/*color_r=*/0xF0, - /*color_g=*/0x85, - /*color_b=*/0x00, - /*size=*/4.5f}; plugin_->OnMessage(CreateSetAnnotationBrushMessageForTesting( - "highlighter", &message_params)); + "highlighter", &kLightGreenBrushParams)); SetUpMouseDownMoveTextTestExpectations(); TestInProgressDraw( /*expected_filename=*/FILE_PATH_LITERAL("text_highlight_stroke.png"), - /*start_position=*/gfx::PointF(55, 60), - /*end_position=*/gfx::PointF(75, 65)); + /*start_position=*/gfx::PointF(55.0f, 60.0f), + /*end_position=*/gfx::PointF(75.0f, 65.0f)); } class PdfViewWebPluginInk2SaveTest : public PdfViewWebPluginSaveTest {
diff --git a/pdf/test/data/ink/text_highlight_stroke.png b/pdf/test/data/ink/text_highlight_stroke.png index ac7f3d8..69e58fe 100644 --- a/pdf/test/data/ink/text_highlight_stroke.png +++ b/pdf/test/data/ink/text_highlight_stroke.png Binary files differ
diff --git a/pdf/test/pdf_ink_test_helpers.cc b/pdf/test/pdf_ink_test_helpers.cc index f47751c6..3971287 100644 --- a/pdf/test/pdf_ink_test_helpers.cc +++ b/pdf/test/pdf_ink_test_helpers.cc
@@ -64,11 +64,11 @@ base::Value::Dict data; data.Set("type", type); if (params) { - base::Value::Dict color; - color.Set("r", params->color_r); - color.Set("g", params->color_g); - color.Set("b", params->color_b); - data.Set("color", std::move(color)); + data.Set("color", + base::Value::Dict() + .Set("r", static_cast<int>(SkColorGetR(params->color))) + .Set("g", static_cast<int>(SkColorGetG(params->color))) + .Set("b", static_cast<int>(SkColorGetB(params->color)))); data.Set("size", params->size); } message.Set("data", std::move(data));
diff --git a/pdf/test/pdf_ink_test_helpers.h b/pdf/test/pdf_ink_test_helpers.h index c817dee5..54b4dcda 100644 --- a/pdf/test/pdf_ink_test_helpers.h +++ b/pdf/test/pdf_ink_test_helpers.h
@@ -5,6 +5,8 @@ #ifndef PDF_TEST_PDF_INK_TEST_HELPERS_H_ #define PDF_TEST_PDF_INK_TEST_HELPERS_H_ +#include <stdint.h> + #include <optional> #include <string_view> @@ -17,6 +19,8 @@ #include "third_party/ink/src/ink/strokes/input/stroke_input_batch.h" #include "ui/gfx/geometry/point_f.h" +using SkColor = uint32_t; + namespace chrome_pdf { // A possible configuration of Ink feature parameters. @@ -33,9 +37,7 @@ // Optional parameters that the `setAnnotationBrushMessage` may have, depending // on the brush type. struct TestAnnotationBrushMessageParams { - int color_r; - int color_g; - int color_b; + SkColor color; double size; };
diff --git a/printing/android/java/src/org/chromium/printing/PrintDocumentAdapterWrapper.java b/printing/android/java/src/org/chromium/printing/PrintDocumentAdapterWrapper.java index f04b0af..fd791a0 100644 --- a/printing/android/java/src/org/chromium/printing/PrintDocumentAdapterWrapper.java +++ b/printing/android/java/src/org/chromium/printing/PrintDocumentAdapterWrapper.java
@@ -26,7 +26,7 @@ */ @NullMarked public class PrintDocumentAdapterWrapper extends PrintDocumentAdapter { - private PdfGenerator mPdfGenerator; + private final PdfGenerator mPdfGenerator; public PrintDocumentAdapterWrapper(PdfGenerator pdfGenerator) { mPdfGenerator = pdfGenerator; @@ -68,7 +68,7 @@ } public static class LayoutResultCallbackWrapperImpl implements LayoutResultCallbackWrapper { - private LayoutResultCallback mCallback; + private final LayoutResultCallback mCallback; public LayoutResultCallbackWrapperImpl(LayoutResultCallback callback) { assert callback != null; @@ -92,7 +92,7 @@ } public static class WriteResultCallbackWrapperImpl implements WriteResultCallbackWrapper { - private WriteResultCallback mCallback; + private final WriteResultCallback mCallback; public WriteResultCallbackWrapperImpl(WriteResultCallback callback) { assert callback != null;
diff --git a/printing/android/java/src/org/chromium/printing/PrintingControllerImpl.java b/printing/android/java/src/org/chromium/printing/PrintingControllerImpl.java index 2f938210..e4ec3da9 100644 --- a/printing/android/java/src/org/chromium/printing/PrintingControllerImpl.java +++ b/printing/android/java/src/org/chromium/printing/PrintingControllerImpl.java
@@ -93,7 +93,7 @@ private @Nullable Printable mPrintable; /** The object through which the framework will make calls for generating PDF. */ - private PrintDocumentAdapterWrapper mPrintDocumentAdapterWrapper; + private final PrintDocumentAdapterWrapper mPrintDocumentAdapterWrapper; private int mPrintingState = PRINTING_STATE_READY;
diff --git a/services/device/battery/android/java/src/org/chromium/device/battery/BatteryStatusManager.java b/services/device/battery/android/java/src/org/chromium/device/battery/BatteryStatusManager.java index 38b2d7cb4..cba10a72 100644 --- a/services/device/battery/android/java/src/org/chromium/device/battery/BatteryStatusManager.java +++ b/services/device/battery/android/java/src/org/chromium/device/battery/BatteryStatusManager.java
@@ -48,7 +48,7 @@ BatteryStatusManager.this.onReceive(intent); } }; - private @Nullable AndroidBatteryManagerWrapper mAndroidBatteryManager; + private final @Nullable AndroidBatteryManagerWrapper mAndroidBatteryManager; private volatile boolean mEnabled; private static final TaskRunner sSequencedTaskRunner =
diff --git a/services/device/geolocation/android/java/src/org/chromium/device/geolocation/LocationProviderAdapter.java b/services/device/geolocation/android/java/src/org/chromium/device/geolocation/LocationProviderAdapter.java index c125985..080751d 100644 --- a/services/device/geolocation/android/java/src/org/chromium/device/geolocation/LocationProviderAdapter.java +++ b/services/device/geolocation/android/java/src/org/chromium/device/geolocation/LocationProviderAdapter.java
@@ -24,7 +24,7 @@ private static final String TAG = "LocationProvider"; // Delegate handling the real work in the main thread. - private LocationProvider mImpl; + private final LocationProvider mImpl; private LocationProviderAdapter() { mImpl = LocationProviderFactory.create();
diff --git a/services/device/nfc/android/java/src/org/chromium/device/nfc/NfcImpl.java b/services/device/nfc/android/java/src/org/chromium/device/nfc/NfcImpl.java index c90903b..143d4f54 100644 --- a/services/device/nfc/android/java/src/org/chromium/device/nfc/NfcImpl.java +++ b/services/device/nfc/android/java/src/org/chromium/device/nfc/NfcImpl.java
@@ -111,7 +111,7 @@ private final List<Integer> mWatchIds = new ArrayList<Integer>(); /** Vibrator. @see android.os.Vibrator */ - private Vibrator mVibrator; + private final Vibrator mVibrator; /** Last time in milliseconds when a Tag was discovered. */ private long mTagDiscoveredLastTimeMs = -1;
diff --git a/services/device/nfc/android/java/src/org/chromium/device/nfc/NfcProviderImpl.java b/services/device/nfc/android/java/src/org/chromium/device/nfc/NfcProviderImpl.java index 594830bf..db32b007 100644 --- a/services/device/nfc/android/java/src/org/chromium/device/nfc/NfcProviderImpl.java +++ b/services/device/nfc/android/java/src/org/chromium/device/nfc/NfcProviderImpl.java
@@ -16,7 +16,7 @@ @NullMarked public class NfcProviderImpl implements NfcProvider { private static final String TAG = "NfcProviderImpl"; - private NfcDelegate mDelegate; + private final NfcDelegate mDelegate; private @Nullable NfcImpl mNfcImpl; public NfcProviderImpl(NfcDelegate delegate) { @@ -70,7 +70,7 @@ /** A factory for implementations of the NfcProvider interface. */ public static class Factory implements InterfaceFactory<NfcProvider> { - private NfcDelegate mDelegate; + private final NfcDelegate mDelegate; public Factory(NfcDelegate delegate) { mDelegate = delegate;
diff --git a/services/device/nfc/android/junit/src/org/chromium/device/nfc/NFCTest.java b/services/device/nfc/android/junit/src/org/chromium/device/nfc/NFCTest.java index 63da379..fe17bf62 100644 --- a/services/device/nfc/android/junit/src/org/chromium/device/nfc/NFCTest.java +++ b/services/device/nfc/android/junit/src/org/chromium/device/nfc/NFCTest.java
@@ -110,7 +110,7 @@ } private static class TestNfcDelegate implements NfcDelegate { - Activity mActivity; + final Activity mActivity; Callback<Activity> mCallback; public TestNfcDelegate(Activity activity) {
diff --git a/services/media_session/public/cpp/android/java/src/org/chromium/services/media_session/MediaPosition.java b/services/media_session/public/cpp/android/java/src/org/chromium/services/media_session/MediaPosition.java index 1d948496..ae88d82 100644 --- a/services/media_session/public/cpp/android/java/src/org/chromium/services/media_session/MediaPosition.java +++ b/services/media_session/public/cpp/android/java/src/org/chromium/services/media_session/MediaPosition.java
@@ -18,13 +18,13 @@ @JNINamespace("media_session") @NullMarked public final class MediaPosition { - private Long mDuration; + private final Long mDuration; - private Long mPosition; + private final Long mPosition; - private Float mPlaybackRate; + private final Float mPlaybackRate; - private Long mLastUpdatedTime; + private final Long mLastUpdatedTime; /** Creates a new MediaPosition. */ public MediaPosition(long duration, long position, float playbackRate, long lastUpdatedTime) {
diff --git a/services/service_manager/public/java/src/org/chromium/services/service_manager/Connector.java b/services/service_manager/public/java/src/org/chromium/services/service_manager/Connector.java index d86c092..95f156a 100644 --- a/services/service_manager/public/java/src/org/chromium/services/service_manager/Connector.java +++ b/services/service_manager/public/java/src/org/chromium/services/service_manager/Connector.java
@@ -16,7 +16,7 @@ /** This class exposes the ability to bind interfaces from other services in the system. */ @NullMarked public class Connector implements ConnectionErrorHandler { - private org.chromium.service_manager.mojom.Connector.Proxy mConnector; + private final org.chromium.service_manager.mojom.Connector.Proxy mConnector; private static class ConnectorBindInterfaceResponseImpl implements org.chromium.service_manager.mojom.Connector.BindInterface_Response {
diff --git a/services/service_manager/public/java/src/org/chromium/services/service_manager/InterfaceProvider.java b/services/service_manager/public/java/src/org/chromium/services/service_manager/InterfaceProvider.java index 2fa8832a..c77fff7 100644 --- a/services/service_manager/public/java/src/org/chromium/services/service_manager/InterfaceProvider.java +++ b/services/service_manager/public/java/src/org/chromium/services/service_manager/InterfaceProvider.java
@@ -16,8 +16,8 @@ /** Provides access to interfaces exposed by an InterfaceProvider mojo interface. */ @NullMarked public class InterfaceProvider implements ConnectionErrorHandler { - private Core mCore; - private org.chromium.service_manager.mojom.InterfaceProvider.Proxy mInterfaceProvider; + private final Core mCore; + private final org.chromium.service_manager.mojom.InterfaceProvider.Proxy mInterfaceProvider; public InterfaceProvider(MessagePipeHandle pipe) { Core core = pipe.getCore();
diff --git a/services/service_manager/public/java/src/org/chromium/services/service_manager/InterfaceRegistry.java b/services/service_manager/public/java/src/org/chromium/services/service_manager/InterfaceRegistry.java index 8b83961..3ff29f24 100644 --- a/services/service_manager/public/java/src/org/chromium/services/service_manager/InterfaceRegistry.java +++ b/services/service_manager/public/java/src/org/chromium/services/service_manager/InterfaceRegistry.java
@@ -59,8 +59,8 @@ InterfaceRegistry() {} private static class InterfaceBinder<I extends Interface> { - private Interface.Manager<I, ? extends Interface.Proxy> mManager; - private InterfaceFactory<I> mFactory; + private final Interface.Manager<I, ? extends Interface.Proxy> mManager; + private final InterfaceFactory<I> mFactory; public InterfaceBinder( Interface.Manager<I, ? extends Interface.Proxy> manager,
diff --git a/services/shape_detection/android/java/src/org/chromium/shape_detection/BarcodeDetectionImpl.java b/services/shape_detection/android/java/src/org/chromium/shape_detection/BarcodeDetectionImpl.java index f4c2f11..7d4fd14 100644 --- a/services/shape_detection/android/java/src/org/chromium/shape_detection/BarcodeDetectionImpl.java +++ b/services/shape_detection/android/java/src/org/chromium/shape_detection/BarcodeDetectionImpl.java
@@ -3,7 +3,6 @@ // found in the LICENSE file. package org.chromium.shape_detection; -import org.chromium.build.annotations.NullMarked; import android.graphics.Point; import android.graphics.Rect; @@ -15,6 +14,7 @@ import org.chromium.base.ContextUtils; import org.chromium.base.Log; +import org.chromium.build.annotations.NullMarked; import org.chromium.gfx.mojom.PointF; import org.chromium.gfx.mojom.RectF; import org.chromium.mojo.system.MojoException; @@ -28,7 +28,7 @@ public class BarcodeDetectionImpl implements BarcodeDetection { private static final String TAG = "BarcodeDetectionImpl"; - private BarcodeDetector mBarcodeDetector; + private final BarcodeDetector mBarcodeDetector; public BarcodeDetectionImpl(BarcodeDetectorOptions options) { int formats = Barcode.ALL_FORMATS;
diff --git a/services/shape_detection/android/java/src/org/chromium/shape_detection/TextDetectionImpl.java b/services/shape_detection/android/java/src/org/chromium/shape_detection/TextDetectionImpl.java index 4e2a322..fa03d673 100644 --- a/services/shape_detection/android/java/src/org/chromium/shape_detection/TextDetectionImpl.java +++ b/services/shape_detection/android/java/src/org/chromium/shape_detection/TextDetectionImpl.java
@@ -3,7 +3,6 @@ // found in the LICENSE file. package org.chromium.shape_detection; -import org.chromium.build.annotations.NullMarked; import android.graphics.Point; import android.graphics.Rect; @@ -15,20 +14,21 @@ import org.chromium.base.ContextUtils; import org.chromium.base.Log; +import org.chromium.build.annotations.NullMarked; +import org.chromium.build.annotations.Nullable; import org.chromium.gfx.mojom.PointF; import org.chromium.gfx.mojom.RectF; import org.chromium.gms.ChromiumPlayServicesAvailability; import org.chromium.mojo.system.MojoException; import org.chromium.shape_detection.mojom.TextDetection; import org.chromium.shape_detection.mojom.TextDetectionResult; -import org.chromium.build.annotations.Nullable; /** Implementation of mojo TextDetection, using Google Play Services vision package. */ @NullMarked public class TextDetectionImpl implements TextDetection { private static final String TAG = "TextDetectionImpl"; - private TextRecognizer mTextRecognizer; + private final TextRecognizer mTextRecognizer; public TextDetectionImpl() { mTextRecognizer = new TextRecognizer.Builder(ContextUtils.getApplicationContext()).build();
diff --git a/services/shape_detection/android/javatests/src/org/chromium/shape_detection/BarcodeDetectionImplTest.java b/services/shape_detection/android/javatests/src/org/chromium/shape_detection/BarcodeDetectionImplTest.java index 384cd91e..8246af50c 100644 --- a/services/shape_detection/android/javatests/src/org/chromium/shape_detection/BarcodeDetectionImplTest.java +++ b/services/shape_detection/android/javatests/src/org/chromium/shape_detection/BarcodeDetectionImplTest.java
@@ -126,7 +126,7 @@ } public static class BarcodeExampleParams implements ParameterProvider { - private static List<ParameterSet> sBarcodeExampleParams = + private static final List<ParameterSet> sBarcodeExampleParams = Arrays.asList( // TODO(crbug.com/40159200): AZTEC format is failing. // new ParameterSet()
diff --git a/services/viz/public/cpp/compositing/begin_frame_args_mojom_traits.cc b/services/viz/public/cpp/compositing/begin_frame_args_mojom_traits.cc index e721278..4258290 100644 --- a/services/viz/public/cpp/compositing/begin_frame_args_mojom_traits.cc +++ b/services/viz/public/cpp/compositing/begin_frame_args_mojom_traits.cc
@@ -84,15 +84,6 @@ out->frame_id.sequence_number = data.sequence_number(); out->trace_id = data.trace_id(); out->has_damage = data.has_damage(); - - if (!data.ReadPreferredFrameInterval(&out->preferred_frame_interval)) { - return false; - } - // Preferred_frame_interval must be nullopt or non-negative. - if (out->preferred_frame_interval && - out->preferred_frame_interval->is_negative()) { - return false; - } return true; }
diff --git a/services/viz/public/cpp/compositing/begin_frame_args_mojom_traits.h b/services/viz/public/cpp/compositing/begin_frame_args_mojom_traits.h index 8c16a7a..5ffe6e2 100644 --- a/services/viz/public/cpp/compositing/begin_frame_args_mojom_traits.h +++ b/services/viz/public/cpp/compositing/begin_frame_args_mojom_traits.h
@@ -103,13 +103,6 @@ return ack.has_damage; } - static std::optional<base::TimeDelta> preferred_frame_interval( - const viz::BeginFrameAck& ack) { - DCHECK(!ack.preferred_frame_interval || - ack.preferred_frame_interval.value() >= base::TimeDelta()); - return ack.preferred_frame_interval; - } - static bool Read(viz::mojom::BeginFrameAckDataView data, viz::BeginFrameAck* out); };
diff --git a/services/viz/public/cpp/compositing/compositor_frame_metadata_mojom_traits.cc b/services/viz/public/cpp/compositing/compositor_frame_metadata_mojom_traits.cc index 2c73f897..6627771 100644 --- a/services/viz/public/cpp/compositing/compositor_frame_metadata_mojom_traits.cc +++ b/services/viz/public/cpp/compositing/compositor_frame_metadata_mojom_traits.cc
@@ -64,6 +64,16 @@ data.top_controls_visible_height()); } + if (!data.ReadPreferredFrameInterval(&out->preferred_frame_interval)) { + return false; + } + + // Preferred_frame_interval must be nullopt or non-negative. + if (out->preferred_frame_interval && + out->preferred_frame_interval->is_negative()) { + return false; + } + if (!data.ReadScreenshotDestination(&out->screenshot_destination)) { return false; }
diff --git a/services/viz/public/cpp/compositing/compositor_frame_metadata_mojom_traits.h b/services/viz/public/cpp/compositing/compositor_frame_metadata_mojom_traits.h index 378d4858..984d9c3c 100644 --- a/services/viz/public/cpp/compositing/compositor_frame_metadata_mojom_traits.h +++ b/services/viz/public/cpp/compositing/compositor_frame_metadata_mojom_traits.h
@@ -129,6 +129,13 @@ return metadata.min_page_scale_factor; } + static std::optional<base::TimeDelta> preferred_frame_interval( + const viz::CompositorFrameMetadata& metadata) { + DCHECK(!metadata.preferred_frame_interval || + metadata.preferred_frame_interval.value() >= base::TimeDelta()); + return metadata.preferred_frame_interval; + } + static bool top_controls_visible_height_set( const viz::CompositorFrameMetadata& metadata) { return metadata.top_controls_visible_height.has_value();
diff --git a/services/viz/public/mojom/compositing/begin_frame_args.mojom b/services/viz/public/mojom/compositing/begin_frame_args.mojom index 21906c18..c53c00a 100644 --- a/services/viz/public/mojom/compositing/begin_frame_args.mojom +++ b/services/viz/public/mojom/compositing/begin_frame_args.mojom
@@ -39,10 +39,4 @@ uint64 sequence_number; int64 trace_id; bool has_damage; - - // Specifies the interval at which the client's content is updated. This can - // be used to configure the display to the optimal vsync interval available. - // If unspecified, or set to BeginFrameArgs::MinInterval, it is assumed that - // the client can animate at the maximum frame rate supported by the Display. - mojo_base.mojom.TimeDelta? preferred_frame_interval; };
diff --git a/services/viz/public/mojom/compositing/compositor_frame_metadata.mojom b/services/viz/public/mojom/compositing/compositor_frame_metadata.mojom index 95c491ee..0f259d9 100644 --- a/services/viz/public/mojom/compositing/compositor_frame_metadata.mojom +++ b/services/viz/public/mojom/compositing/compositor_frame_metadata.mojom
@@ -50,6 +50,12 @@ float min_page_scale_factor; + // Specifies the interval at which the client's content is updated. This can + // be used to configure the display to the optimal vsync interval available. + // If unspecified, or set to BeginFrameArgs::MinInterval, it is assumed that + // the client can animate at the maximum frame rate supported by the Display. + mojo_base.mojom.TimeDelta? preferred_frame_interval; + gfx.mojom.OverlayTransform display_transform_hint; // Contains the metadata required for drawing a delegated ink trail onto the
diff --git a/services/viz/public/mojom/compositing/internal/singleplanar_format.mojom b/services/viz/public/mojom/compositing/internal/singleplanar_format.mojom index 4c3d6499..5b8a08c 100644 --- a/services/viz/public/mojom/compositing/internal/singleplanar_format.mojom +++ b/services/viz/public/mojom/compositing/internal/singleplanar_format.mojom
@@ -11,7 +11,6 @@ RGBA_4444, BGRA_8888, ALPHA_8, - LUMINANCE_8, RGB_565, BGR_565, ETC1,
diff --git a/services/webnn/tflite/graph_builder_tflite.cc b/services/webnn/tflite/graph_builder_tflite.cc index 8643822..63f789f 100644 --- a/services/webnn/tflite/graph_builder_tflite.cc +++ b/services/webnn/tflite/graph_builder_tflite.cc
@@ -1152,10 +1152,7 @@ break; } case mojom::Operation::Tag::kReshape: { - const mojom::Reshape& reshape = *op.get_reshape(); - ASSIGN_OR_RETURN(operator_offset, - SerializeReshape(reshape.input_operand_id, - reshape.output_operand_id)); + ASSIGN_OR_RETURN(operator_offset, SerializeReshape(*op.get_reshape())); break; } case mojom::Operation::Tag::kReverse: { @@ -1731,6 +1728,54 @@ } std::optional<GraphBuilderTflite::TensorInfo> +GraphBuilderTflite::CanFuseQuantizeAndGetOutput(const mojom::Reshape& reshape) { + if (!IsDequantizeOutput(reshape.input_operand_id)) { + return std::nullopt; + } + + // TODO(crbug.com/413083273): Consider the restriction in GPU delegate. + // For XNNPack delegate, the scale and zero point of input and output have to + // be scaler, and the scale and zero point of output must be the same as + // input. + // https://source.chromium.org/chromium/chromium/src/+/main:third_party/tflite/src/tensorflow/lite/delegates/xnnpack/xnnpack_delegate.cc;l=5199;drc=1379ddb0f0535ff846ce0fbad8ee49af303140c4 + const mojom::DequantizeLinear& input_dequantize = + GetDequantizeOp(reshape.input_operand_id); + if (!IsInts8AndScalarScale(input_dequantize)) { + return std::nullopt; + } + + std::optional<size_t> next_op = IsNextOpQuantize( + reshape.output_operand_id, + {GetOperand(input_dequantize.input_operand_id).descriptor.data_type()}); + if (!next_op) { + return std::nullopt; + } + + const mojom::QuantizeLinear& output_quantize = GetQuantizeOp(*next_op); + if (!IsInts8AndScalarScale(output_quantize)) { + return std::nullopt; + } + + base::span<const float> input_scale_values = + GetConstantValue<float>(input_dequantize.scale_operand_id); + base::span<const float> output_scale_values = + GetConstantValue<float>(output_quantize.scale_operand_id); + if (input_scale_values[0] != output_scale_values[0]) { + return std::nullopt; + } + + base::FixedArray<int64_t> input_zero_point_values = + GetConstantInt64Value(input_dequantize.zero_point_operand_id); + base::FixedArray<int64_t> output_zero_point_values = + GetConstantInt64Value(output_quantize.zero_point_operand_id); + if (input_zero_point_values[0] != output_zero_point_values[0]) { + return std::nullopt; + } + + return TrySerializeQuantizedOutput(*next_op); +} + +std::optional<GraphBuilderTflite::TensorInfo> GraphBuilderTflite::CanFuseQuantizeAndGetOutput( const mojom::Transpose& transpose) { if (!IsDequantizeOutput(transpose.input_operand_id)) { @@ -6232,24 +6277,36 @@ builtin_options); } -auto GraphBuilderTflite::SerializeReshape(OperandId input_operand_id, - OperandId output_operand_id) +auto GraphBuilderTflite::SerializeReshape(const mojom::Reshape& reshape) -> base::expected<OperatorOffset, std::string> { CHECK(context_properties_.data_type_limits.reshape_input.Supports( - GetOperand(input_operand_id).descriptor)); - ASSIGN_OR_RETURN( - const TensorInfo& input_tensor_info, - SerializeInputTensorInfo(input_operand_id, /*quantize_params=*/0, - /*operation_supports_float16=*/true)); - ASSIGN_OR_RETURN( - const TensorInfo& output_tensor_info, - SerializeOutputTensorInfo(output_operand_id, /*quantize_params=*/0, - /*operation_supports_float16=*/true, - input_tensor_info.data_type)); + GetOperand(reshape.input_operand_id).descriptor)); - return SerializeReshapeOperation(input_tensor_info.index, - output_tensor_info.index, - output_tensor_info.dimensions); + std::optional<TensorInfo> quantized_output = + CanFuseQuantizeAndGetOutput(reshape); + const bool fuse_dequantize = quantized_output.has_value(); + ASSIGN_OR_RETURN(const TensorInfo& input_tensor_info, + SerializeInputTensorInfo( + reshape.input_operand_id, /*quantize_params=*/0, + /*operation_supports_float16=*/true, fuse_dequantize)); + + TensorIndex output_tensor_index; + std::vector<int32_t> output_tensor_shape; + if (fuse_dequantize) { + output_tensor_index = quantized_output->index; + output_tensor_shape = std::move(quantized_output->dimensions); + } else { + ASSIGN_OR_RETURN( + TensorInfo output_tensor_info, + SerializeOutputTensorInfo( + reshape.output_operand_id, /*quantize_params=*/0, + /*operation_supports_float16=*/true, input_tensor_info.data_type)); + output_tensor_index = output_tensor_info.index; + output_tensor_shape = std::move(output_tensor_info.dimensions); + } + + return SerializeReshapeOperation(input_tensor_info.index, output_tensor_index, + output_tensor_shape); } auto GraphBuilderTflite::SerializeReverse(const mojom::Reverse& reverse)
diff --git a/services/webnn/tflite/graph_builder_tflite.h b/services/webnn/tflite/graph_builder_tflite.h index 12e3d69..48f63fe 100644 --- a/services/webnn/tflite/graph_builder_tflite.h +++ b/services/webnn/tflite/graph_builder_tflite.h
@@ -678,8 +678,7 @@ base::expected<OperatorOffset, std::string> SerializeResample2d( const mojom::Resample2d& resample2d); base::expected<OperatorOffset, std::string> SerializeReshape( - OperandId input_operand_id, - OperandId output_operand_id); + const mojom::Reshape& reshape); base::expected<OperatorOffset, std::string> SerializeReverse( const mojom::Reverse& reverse); base::expected<OperatorOffset, std::string> SerializeScatterElements( @@ -726,6 +725,8 @@ std::optional<TensorInfo> CanFuseQuantizeAndGetOutput( const mojom::Pool2d& pool2d); std::optional<TensorInfo> CanFuseQuantizeAndGetOutput( + const mojom::Reshape& reshape); + std::optional<TensorInfo> CanFuseQuantizeAndGetOutput( const mojom::Transpose& transpose); std::optional<TensorInfo> CanFuseQuantizeAndGetOutput( const mojom::Tanh& tanh);
diff --git a/testing/android/junit/java/src/org/chromium/testing/local/ChromiumAndroidConfigurer.java b/testing/android/junit/java/src/org/chromium/testing/local/ChromiumAndroidConfigurer.java index b3ebd18..94a2b03 100644 --- a/testing/android/junit/java/src/org/chromium/testing/local/ChromiumAndroidConfigurer.java +++ b/testing/android/junit/java/src/org/chromium/testing/local/ChromiumAndroidConfigurer.java
@@ -28,7 +28,7 @@ } private static JSONObject sConfigJson; - private Optional<ExtraConfiguration> mExtraConfig; + private final Optional<ExtraConfiguration> mExtraConfig; static void setJsonConfig(JSONObject root) { sConfigJson = root;
diff --git a/testing/android/native_test/java/src/org/chromium/native_test/NativeBrowserTestActivity.java b/testing/android/native_test/java/src/org/chromium/native_test/NativeBrowserTestActivity.java index 1bedb20..05f9701 100644 --- a/testing/android/native_test/java/src/org/chromium/native_test/NativeBrowserTestActivity.java +++ b/testing/android/native_test/java/src/org/chromium/native_test/NativeBrowserTestActivity.java
@@ -14,7 +14,7 @@ public abstract class NativeBrowserTestActivity extends FragmentActivity { private static final String TAG = "NativeTest"; - private NativeTest mTest = new NativeTest(); + private final NativeTest mTest = new NativeTest(); private boolean mStarted; @Override
diff --git a/testing/android/native_test/java/src/org/chromium/native_test/NativeTest.java b/testing/android/native_test/java/src/org/chromium/native_test/NativeTest.java index 69f91048..f0c7a91 100644 --- a/testing/android/native_test/java/src/org/chromium/native_test/NativeTest.java +++ b/testing/android/native_test/java/src/org/chromium/native_test/NativeTest.java
@@ -30,7 +30,7 @@ private static final String TAG = "NativeTest"; private String mCommandLineFilePath; - private StringBuilder mCommandLineFlags = new StringBuilder(); + private final StringBuilder mCommandLineFlags = new StringBuilder(); private TestStatusReporter mReporter; private boolean mRunInSubThread; private String mStdoutFilePath; @@ -38,8 +38,8 @@ private static class ReportingUncaughtExceptionHandler implements Thread.UncaughtExceptionHandler { - private TestStatusReporter mReporter; - private Thread.UncaughtExceptionHandler mWrappedHandler; + private final TestStatusReporter mReporter; + private final Thread.UncaughtExceptionHandler mWrappedHandler; public ReportingUncaughtExceptionHandler( TestStatusReporter reporter, Thread.UncaughtExceptionHandler wrappedHandler) {
diff --git a/testing/android/native_test/java/src/org/chromium/native_test/NativeUnitTestActivity.java b/testing/android/native_test/java/src/org/chromium/native_test/NativeUnitTestActivity.java index 1c8c019..91c7ee3 100644 --- a/testing/android/native_test/java/src/org/chromium/native_test/NativeUnitTestActivity.java +++ b/testing/android/native_test/java/src/org/chromium/native_test/NativeUnitTestActivity.java
@@ -7,12 +7,9 @@ import android.app.Activity; import android.os.Bundle; -/** - * An {@link android.app.Activity} for running native unit tests. - * (i.e., not browser tests) - */ +/** An {@link android.app.Activity} for running native unit tests. (i.e., not browser tests) */ public class NativeUnitTestActivity extends Activity { - private NativeUnitTest mTest = new NativeUnitTest(); + private final NativeUnitTest mTest = new NativeUnitTest(); @Override public void onCreate(Bundle savedInstanceState) {
diff --git a/testing/android/native_test/java/src/org/chromium/native_test/NativeUnitTestNativeActivity.java b/testing/android/native_test/java/src/org/chromium/native_test/NativeUnitTestNativeActivity.java index 33165ef..c389d911 100644 --- a/testing/android/native_test/java/src/org/chromium/native_test/NativeUnitTestNativeActivity.java +++ b/testing/android/native_test/java/src/org/chromium/native_test/NativeUnitTestNativeActivity.java
@@ -7,12 +7,9 @@ import android.app.NativeActivity; import android.os.Bundle; -/** - * A {@link android.app.NativeActivity} for running native unit tests. - * (i.e., not browser tests) - */ +/** A {@link android.app.NativeActivity} for running native unit tests. (i.e., not browser tests) */ public class NativeUnitTestNativeActivity extends NativeActivity { - private NativeUnitTest mTest = new NativeUnitTest(); + private final NativeUnitTest mTest = new NativeUnitTest(); @Override public void onCreate(Bundle savedInstanceState) {
diff --git a/testing/buildbot/buildbot_json_magic_substitutions.py b/testing/buildbot/buildbot_json_magic_substitutions.py index 702f257..37f93be 100644 --- a/testing/buildbot/buildbot_json_magic_substitutions.py +++ b/testing/buildbot/buildbot_json_magic_substitutions.py
@@ -357,15 +357,6 @@ if gpu.startswith('10de'): return ['--jobs=1'] - # trace_test flakily hangs Win NVIDIA GTX 1660 machines crbug.com/406454932. - # Speculatively disable parallelism to check if it is related. - is_trace_test = (test_name == 'trace_test' - or test_config.get('telemetry_test_name') == 'trace_test') - if os_type == 'win' and is_trace_test: - for gpu in _GetGpusFromTestConfig(test_config): - if gpu.startswith('10de:2184'): - return ['--jobs=1'] - if os_type in ['lacros', 'linux', 'mac', 'win']: return ['--jobs=4'] return ['--jobs=1']
diff --git a/testing/buildbot/client.v8.fyi.json b/testing/buildbot/client.v8.fyi.json index 015fb02..8b8a989 100644 --- a/testing/buildbot/client.v8.fyi.json +++ b/testing/buildbot/client.v8.fyi.json
@@ -2929,7 +2929,7 @@ "--stable-jobs", "--extra-browser-args=--enable-logging=stderr --js-flags=--expose-gc", "--enforce-browser-version", - "--jobs=1" + "--jobs=4" ], "merge": { "script": "//testing/merge_scripts/standard_isolated_script_merge.py"
diff --git a/testing/buildbot/filters/trees_in_viz.content_browsertests.filter b/testing/buildbot/filters/trees_in_viz.content_browsertests.filter index cb89cf51..9b2b7f5d 100644 --- a/testing/buildbot/filters/trees_in_viz.content_browsertests.filter +++ b/testing/buildbot/filters/trees_in_viz.content_browsertests.filter
@@ -1,12 +1,3 @@ --All/CompositedScrollingMetricTest.BlockingEventHandlers/Composited --All/CompositedScrollingMetricTest.BlockingEventHandlers/Composited_RasterInducingScroll --All/CompositedScrollingMetricTest.BlockingEventHandlers/NonComposited_RasterInducingScroll --All/CompositedScrollingMetricTest.PassiveEventHandlers/Composited --All/CompositedScrollingMetricTest.PassiveEventHandlers/Composited_RasterInducingScroll --All/CompositedScrollingMetricTest.PassiveEventHandlers/NonComposited_RasterInducingScroll --All/CompositedScrollingMetricTest.RecordCorrectScrollingThread/Composited --All/CompositedScrollingMetricTest.RecordCorrectScrollingThread/Composited_RasterInducingScroll --All/CompositedScrollingMetricTest.RecordCorrectScrollingThread/NonComposited_RasterInducingScroll -All/NavigationBrowserTestPaintHoldingSubframe.BasicInProcessIframe/0 -All/NavigationBrowserTestPaintHoldingSubframe.BasicInProcessIframe/1 -PrerenderBrowserDeathTest.PrerenderCannotHaveInnerContents
diff --git a/testing/scripts/run_performance_tests.py b/testing/scripts/run_performance_tests.py index 28a73aeb..60bccaf 100755 --- a/testing/scripts/run_performance_tests.py +++ b/testing/scripts/run_performance_tests.py
@@ -893,7 +893,7 @@ env = os.environ.copy() env['CHROME_HEADLESS'] = '1' - env['PATH'] = f'{GSUTIL_DIR}:' + env['PATH'] + env['PATH'] = f"{GSUTIL_DIR}{';' if IsWindows() else ':'}{env['PATH']}" return_code = 1 output_paths = OutputFilePaths(self.isolated_out_dir, display_name).SetUp()
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index b8ab29f..e969e8d 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -14584,6 +14584,21 @@ ] } ], + "NimbleCollisionAvoidanceV1": [ + { + "platforms": [ + "ios" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "NotificationCollisionManagement" + ] + } + ] + } + ], "NoPasswordSuggestionFiltering": [ { "platforms": [
diff --git a/third_party/android_media/java/src/org/chromium/third_party/android/media/MediaController.java b/third_party/android_media/java/src/org/chromium/third_party/android/media/MediaController.java index 4bf72b31..310cc29 100644 --- a/third_party/android_media/java/src/org/chromium/third_party/android/media/MediaController.java +++ b/third_party/android_media/java/src/org/chromium/third_party/android/media/MediaController.java
@@ -88,13 +88,13 @@ } private @Nullable Delegate mDelegate; - private Context mContext; + private final Context mContext; private @Nullable ViewGroup mProgressGroup; private @Nullable SeekBar mProgressBar; private @Nullable TextView mEndTime; private @Nullable TextView mCurrentTime; private boolean mDragging; - private boolean mUseFastForward; + private final boolean mUseFastForward; private boolean mListenersSet; private boolean mShowNext; private boolean mShowPrev; @@ -261,12 +261,13 @@ return position; } - private View.OnClickListener mPauseListener = new View.OnClickListener() { - @Override - public void onClick(View v) { - doPauseResume(); - } - }; + private final View.OnClickListener mPauseListener = + new View.OnClickListener() { + @Override + public void onClick(View v) { + doPauseResume(); + } + }; private void updatePausePlay() { if (mDelegate == null || mPauseButton == null) return; @@ -300,35 +301,37 @@ // The second scenario involves the user operating the scroll ball, in this // case there WON'T BE onStartTrackingTouch/onStopTrackingTouch notifications, // we will simply apply the updated position without suspending regular updates. - private SeekBar.OnSeekBarChangeListener mSeekListener = new SeekBar.OnSeekBarChangeListener() { - @Override - public void onStartTrackingTouch(SeekBar bar) { - mDragging = true; - } + private final SeekBar.OnSeekBarChangeListener mSeekListener = + new SeekBar.OnSeekBarChangeListener() { + @Override + public void onStartTrackingTouch(SeekBar bar) { + mDragging = true; + } - @Override - public void onProgressChanged(SeekBar bar, int progress, boolean fromuser) { - if (mDelegate == null) return; + @Override + public void onProgressChanged(SeekBar bar, int progress, boolean fromuser) { + if (mDelegate == null) return; - if (!fromuser) { - // We're not interested in programmatically generated changes to - // the progress bar's position. - return; - } + if (!fromuser) { + // We're not interested in programmatically generated changes to + // the progress bar's position. + return; + } - long duration = mDelegate.getDuration(); - long newposition = (duration * progress) / 1000L; - mDelegate.seekTo(newposition); - if (mCurrentTime != null) mCurrentTime.setText(stringForTime((int) newposition)); - } + long duration = mDelegate.getDuration(); + long newposition = (duration * progress) / 1000L; + mDelegate.seekTo(newposition); + if (mCurrentTime != null) + mCurrentTime.setText(stringForTime((int) newposition)); + } - @Override - public void onStopTrackingTouch(SeekBar bar) { - mDragging = false; - updateProgress(); - updatePausePlay(); - } - }; + @Override + public void onStopTrackingTouch(SeekBar bar) { + mDragging = false; + updateProgress(); + updatePausePlay(); + } + }; @Override public void setEnabled(boolean enabled) { @@ -348,29 +351,31 @@ info.setClassName(MediaController.class.getName()); } - private View.OnClickListener mRewListener = new View.OnClickListener() { - @Override - public void onClick(View v) { - if (mDelegate == null) return; + private final View.OnClickListener mRewListener = + new View.OnClickListener() { + @Override + public void onClick(View v) { + if (mDelegate == null) return; - long pos = mDelegate.getPosition(); - pos -= 5000; // milliseconds - mDelegate.seekTo(pos); - updateProgress(); - } - }; + long pos = mDelegate.getPosition(); + pos -= 5000; // milliseconds + mDelegate.seekTo(pos); + updateProgress(); + } + }; - private View.OnClickListener mFfwdListener = new View.OnClickListener() { - @Override - public void onClick(View v) { - if (mDelegate == null) return; + private final View.OnClickListener mFfwdListener = + new View.OnClickListener() { + @Override + public void onClick(View v) { + if (mDelegate == null) return; - long pos = mDelegate.getPosition(); - pos += 15000; // milliseconds - mDelegate.seekTo(pos); - updateProgress(); - } - }; + long pos = mDelegate.getPosition(); + pos += 15000; // milliseconds + mDelegate.seekTo(pos); + updateProgress(); + } + }; private void installPrevNextListeners() { if (mNextButton != null) {
diff --git a/third_party/angle b/third_party/angle index d221cf4..214b7ce 160000 --- a/third_party/angle +++ b/third_party/angle
@@ -1 +1 @@ -Subproject commit d221cf402b218f6fc3f71cff155f99702f24c713 +Subproject commit 214b7ce20bb6a308c8e929743cd8402f3f5204dd
diff --git a/third_party/blink/common/indexeddb/indexed_db_default_mojom_traits.cc b/third_party/blink/common/indexeddb/indexed_db_default_mojom_traits.cc index b2ab0a1..7e8ec9af 100644 --- a/third_party/blink/common/indexeddb/indexed_db_default_mojom_traits.cc +++ b/third_party/blink/common/indexeddb/indexed_db_default_mojom_traits.cc
@@ -190,8 +190,8 @@ if (!data.ReadLower(&lower) || !data.ReadUpper(&upper)) return false; - *out = blink::IndexedDBKeyRange(lower, upper, data.lower_open(), - data.upper_open()); + *out = blink::IndexedDBKeyRange(std::move(lower), std::move(upper), + data.lower_open(), data.upper_open()); return true; }
diff --git a/third_party/blink/common/indexeddb/indexeddb_key.cc b/third_party/blink/common/indexeddb/indexeddb_key.cc index 2bd89004..907f9e5 100644 --- a/third_party/blink/common/indexeddb/indexeddb_key.cc +++ b/third_party/blink/common/indexeddb/indexeddb_key.cc
@@ -70,10 +70,9 @@ size_estimate_(kOverheadSize + (string_.length() * sizeof(std::u16string::value_type))) {} -IndexedDBKey::IndexedDBKey(const IndexedDBKey& other) = default; IndexedDBKey::IndexedDBKey(IndexedDBKey&& other) = default; +IndexedDBKey& IndexedDBKey::operator=(IndexedDBKey&& other) = default; IndexedDBKey::~IndexedDBKey() = default; -IndexedDBKey& IndexedDBKey::operator=(const IndexedDBKey& other) = default; bool IndexedDBKey::IsValid() const { switch (type_) { @@ -110,25 +109,38 @@ return false; } +IndexedDBKey IndexedDBKey::Clone() const { + IndexedDBKey clone; + clone.type_ = type_; + for (size_t i = 0; i < array_.size(); ++i) { + clone.array_.emplace_back(array_[i].Clone()); + } + clone.binary_ = binary_; + clone.string_ = string_; + clone.number_ = number_; + clone.size_estimate_ = size_estimate_; + return clone; +} + IndexedDBKey IndexedDBKey::FillHoles(const IndexedDBKey& primary_key) const { if (type_ != mojom::IDBKeyType::Array) - return IndexedDBKey(*this); + return Clone(); std::vector<IndexedDBKey> subkeys; subkeys.reserve(array_.size()); - for (const auto& subkey : array_) { + for (const IndexedDBKey& subkey : array_) { if (subkey.type() == mojom::IDBKeyType::None) { - subkeys.push_back(primary_key); + subkeys.emplace_back(primary_key.Clone()); } else { // "Holes" can only exist at the top level of an array key, as (1) they // are produced by an index's array keypath when a member matches the // store's keypath, and (2) array keypaths are flat (no // arrays-of-arrays). DCHECK(!subkey.HasHoles()); - subkeys.push_back(subkey); + subkeys.emplace_back(subkey.Clone()); } } - return IndexedDBKey(subkeys); + return IndexedDBKey(std::move(subkeys)); } std::string IndexedDBKey::DebugString() const {
diff --git a/third_party/blink/common/indexeddb/indexeddb_key_range.cc b/third_party/blink/common/indexeddb/indexeddb_key_range.cc index e2453088..9cf34840 100644 --- a/third_party/blink/common/indexeddb/indexeddb_key_range.cc +++ b/third_party/blink/common/indexeddb/indexeddb_key_range.cc
@@ -8,22 +8,20 @@ IndexedDBKeyRange::IndexedDBKeyRange() = default; -IndexedDBKeyRange::IndexedDBKeyRange(const blink::IndexedDBKey& lower, - const blink::IndexedDBKey& upper, +IndexedDBKeyRange::IndexedDBKeyRange(IndexedDBKey lower, + IndexedDBKey upper, bool lower_open, bool upper_open) - : lower_(lower), - upper_(upper), + : lower_(std::move(lower)), + upper_(std::move(upper)), lower_open_(lower_open), upper_open_(upper_open) {} -IndexedDBKeyRange::IndexedDBKeyRange(const blink::IndexedDBKey& key) - : lower_(key), upper_(key) {} - -IndexedDBKeyRange::IndexedDBKeyRange(const IndexedDBKeyRange& other) = default; IndexedDBKeyRange::~IndexedDBKeyRange() = default; -IndexedDBKeyRange& IndexedDBKeyRange::operator=( - const IndexedDBKeyRange& other) = default; + +IndexedDBKeyRange::IndexedDBKeyRange(IndexedDBKeyRange&& other) = default; +IndexedDBKeyRange& IndexedDBKeyRange::operator=(IndexedDBKeyRange&& other) = + default; bool IndexedDBKeyRange::IsOnlyKey() const { if (lower_open_ || upper_open_) @@ -38,4 +36,9 @@ return !lower_.IsValid() && !upper_.IsValid(); } +IndexedDBKey IndexedDBKeyRange::TakeOnlyKey() && { + CHECK(IsOnlyKey()); + return std::move(lower_); +} + } // namespace blink
diff --git a/third_party/blink/common/navigation/navigation_params.cc b/third_party/blink/common/navigation/navigation_params.cc index 9c09d71..e19878a 100644 --- a/third_party/blink/common/navigation/navigation_params.cc +++ b/third_party/blink/common/navigation/navigation_params.cc
@@ -24,6 +24,7 @@ commit_params->navigation_api_history_entry_arrays = mojom::NavigationApiHistoryEntryArrays::New(); commit_params->content_settings = CreateDefaultRendererContentSettings(); + commit_params->navigation_metrics_token = base::UnguessableToken::Create(); return commit_params; }
diff --git a/third_party/blink/public/common/indexeddb/indexeddb_key.h b/third_party/blink/public/common/indexeddb/indexeddb_key.h index 2d2fda70..50125b6 100644 --- a/third_party/blink/public/common/indexeddb/indexeddb_key.h +++ b/third_party/blink/public/common/indexeddb/indexeddb_key.h
@@ -32,10 +32,18 @@ explicit IndexedDBKey(std::u16string string); IndexedDBKey(double number, mojom::IDBKeyType type); // must be date or number - IndexedDBKey(const IndexedDBKey& other); - IndexedDBKey(IndexedDBKey&& other); ~IndexedDBKey(); - IndexedDBKey& operator=(const IndexedDBKey& other); + + // Move allowed. + IndexedDBKey(IndexedDBKey&& other); + IndexedDBKey& operator=(IndexedDBKey&& other); + + // "Subtle" copy not allowed, as it's most often a mistake. + IndexedDBKey(const IndexedDBKey& other) = delete; + IndexedDBKey& operator=(const IndexedDBKey& other) = delete; + + // Explicit copy OK. + IndexedDBKey Clone() const; bool IsValid() const;
diff --git a/third_party/blink/public/common/indexeddb/indexeddb_key_range.h b/third_party/blink/public/common/indexeddb/indexeddb_key_range.h index eadb5f93..09374f4 100644 --- a/third_party/blink/public/common/indexeddb/indexeddb_key_range.h +++ b/third_party/blink/public/common/indexeddb/indexeddb_key_range.h
@@ -13,26 +13,30 @@ class BLINK_COMMON_EXPORT IndexedDBKeyRange { public: IndexedDBKeyRange(); - explicit IndexedDBKeyRange(const blink::IndexedDBKey& key); - IndexedDBKeyRange(const blink::IndexedDBKey& lower, - const blink::IndexedDBKey& upper, + IndexedDBKeyRange(IndexedDBKey lower, + IndexedDBKey upper, bool lower_open, bool upper_open); - IndexedDBKeyRange(const IndexedDBKeyRange& other); ~IndexedDBKeyRange(); - IndexedDBKeyRange& operator=(const IndexedDBKeyRange& other); + IndexedDBKeyRange& operator=(IndexedDBKeyRange&& other); + IndexedDBKeyRange(IndexedDBKeyRange&& other); - const blink::IndexedDBKey& lower() const { return lower_; } - const blink::IndexedDBKey& upper() const { return upper_; } + IndexedDBKeyRange(const IndexedDBKeyRange& other) = delete; + IndexedDBKeyRange& operator=(const IndexedDBKeyRange& other) = delete; + + const IndexedDBKey& lower() const { return lower_; } + const IndexedDBKey& upper() const { return upper_; } + bool lower_open() const { return lower_open_; } bool upper_open() const { return upper_open_; } bool IsOnlyKey() const; bool IsEmpty() const; + IndexedDBKey TakeOnlyKey() &&; private: - blink::IndexedDBKey lower_ = blink::IndexedDBKey(mojom::IDBKeyType::None); - blink::IndexedDBKey upper_ = blink::IndexedDBKey(mojom::IDBKeyType::None); + IndexedDBKey lower_{mojom::IDBKeyType::None}; + IndexedDBKey upper_{mojom::IDBKeyType::None}; bool lower_open_ = false; bool upper_open_ = false; };
diff --git a/third_party/blink/public/mojom/BUILD.gn b/third_party/blink/public/mojom/BUILD.gn index 41cbf30..0ed3524 100644 --- a/third_party/blink/public/mojom/BUILD.gn +++ b/third_party/blink/public/mojom/BUILD.gn
@@ -30,6 +30,7 @@ "ai/ai_common.mojom", "ai/ai_language_model.mojom", "ai/ai_manager.mojom", + "ai/ai_proofreader.mojom", "ai/ai_rewriter.mojom", "ai/ai_summarizer.mojom", "ai/ai_writer.mojom", @@ -1738,6 +1739,7 @@ { mojom = "blink.mojom.IDBIndexKeys" cpp = "::blink::IndexedDBIndexKeys" + move_only = true }, { @@ -1748,6 +1750,7 @@ { mojom = "blink.mojom.IDBKey" cpp = "::blink::IndexedDBKey" + move_only = true }, { @@ -1758,6 +1761,7 @@ { mojom = "blink.mojom.IDBKeyRange" cpp = "::blink::IndexedDBKeyRange" + move_only = true }, {
diff --git a/third_party/blink/public/mojom/ai/ai_manager.mojom b/third_party/blink/public/mojom/ai/ai_manager.mojom index 31fc7cc..3b48d427 100644 --- a/third_party/blink/public/mojom/ai/ai_manager.mojom +++ b/third_party/blink/public/mojom/ai/ai_manager.mojom
@@ -6,6 +6,7 @@ import "third_party/blink/public/mojom/ai/ai_common.mojom"; import "third_party/blink/public/mojom/ai/ai_language_model.mojom"; +import "third_party/blink/public/mojom/ai/ai_proofreader.mojom"; import "third_party/blink/public/mojom/ai/ai_rewriter.mojom"; import "third_party/blink/public/mojom/ai/ai_summarizer.mojom"; import "third_party/blink/public/mojom/ai/ai_writer.mojom"; @@ -104,6 +105,16 @@ OnError(AIManagerCreateClientError error); }; +// The client interface that receives an AIProofreader from an AIManager. +interface AIManagerCreateProofreaderClient { + // Called with a created proofreader's mojo interface as a result for the + // CreateProofreader() method of the AIManager. + OnResult(pending_remote<blink.mojom.AIProofreader> proofreader); + + // Called when the manager cannot create an AIProofreader. + OnError(AIManagerCreateClientError error); +}; + // The manager that could create a new session for the model. interface AIManager { // Returns language model availability info from the underlying service.
diff --git a/third_party/blink/public/mojom/ai/ai_proofreader.mojom b/third_party/blink/public/mojom/ai/ai_proofreader.mojom new file mode 100644 index 0000000..e4665e6 --- /dev/null +++ b/third_party/blink/public/mojom/ai/ai_proofreader.mojom
@@ -0,0 +1,28 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +module blink.mojom; + +import "third_party/blink/public/mojom/ai/ai_common.mojom"; +import "third_party/blink/public/mojom/ai/model_streaming_responder.mojom"; + +// The enumerations and struct follows the explainer in +// https://github.com/explainers-by-googlers/proofreader-api/blob/main/README.md + +// This is used when creating a new AIProofreader. +struct AIProofreaderCreateOptions { + bool include_correction_types; + bool include_correction_explanations; + + // Creation fails if a model is not available for specified languages. + AILanguageCode correction_explanation_language; + array<AILanguageCode> expected_input_languages; +}; + +// A proofreader to proofread a given text +interface AIProofreader { + // Proofreads the given input. + Proofread(string input, + pending_remote<ModelStreamingResponder> pending_responder); +};
diff --git a/third_party/blink/public/mojom/frame/remote_frame.mojom b/third_party/blink/public/mojom/frame/remote_frame.mojom index c3e451b4..055e80b 100644 --- a/third_party/blink/public/mojom/frame/remote_frame.mojom +++ b/third_party/blink/public/mojom/frame/remote_frame.mojom
@@ -483,7 +483,11 @@ // at the root (see https://crbug.com/1393697). // // `params`: An array of the root's immediate children. - CreateRemoteChildren(array<CreateRemoteChildParams> params); + // `navigation_metrics_token`: Identifies the navigation responsible for + // creating these RemoteFrames, if any, for tracing/metrics purposes. + CreateRemoteChildren( + array<CreateRemoteChildParams> params, + mojo_base.mojom.UnguessableToken? navigation_metrics_token); // Propagates a censored version of the event from a fenced frame to its // embedder that omits privacy-sensitive information like mouse coordinates or
diff --git a/third_party/blink/public/mojom/navigation/navigation_params.mojom b/third_party/blink/public/mojom/navigation/navigation_params.mojom index 1b90b3c..aa5e97c 100644 --- a/third_party/blink/public/mojom/navigation/navigation_params.mojom +++ b/third_party/blink/public/mojom/navigation/navigation_params.mojom
@@ -685,6 +685,10 @@ // matters for cross-origin navigations (apart from error pages with the same // precursor origin). bool force_new_document_sequence_number = false; + + // A token used for associated various events/IPCs together to a particular + // navigation, for the purposes of tracing and metrics collection. + mojo_base.mojom.UnguessableToken navigation_metrics_token; }; // Parameters used to dispatch the `pageswap` event on the old Document for
diff --git a/third_party/blink/public/mojom/page/page.mojom b/third_party/blink/public/mojom/page/page.mojom index 4614f84..b6a4e36 100644 --- a/third_party/blink/public/mojom/page/page.mojom +++ b/third_party/blink/public/mojom/page/page.mojom
@@ -146,12 +146,15 @@ // Must not be used to look up a RenderFrameHostImpl or // RenderFrameProxyHost in the browser process, as the token is shared, // making the mapping ambiguous and non-authoritative. + // `navigation_metrics_token`: Identifies the navigation responsible for + // creating this RemoteFrame, if any, for tracing/metrics purposes. CreateRemoteMainFrame( RemoteFrameToken token, FrameToken? opener_frame_token, FrameReplicationState replication_state, bool is_loading, mojo_base.mojom.UnguessableToken devtools_frame_token, + mojo_base.mojom.UnguessableToken? navigation_metrics_token, RemoteFrameInterfacesFromBrowser remote_frame_interfaces, RemoteMainFrameInterfaces remote_main_frame_interfaces);
diff --git a/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom b/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom index e082ae8..6d828c85 100644 --- a/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom +++ b/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom
@@ -4861,6 +4861,14 @@ kIntegrityPolicyInServiceWorkerResponse = 5557, kEditContextTextFormatUnderlineStyle = 5558, kEditContextTextFormatUnderlineThickness = 5559, + kProofreader_IncludeCorrectionTypes = 5560, + kProofreader_IncludeCorrectionExplanations = 5561, + kProofreader_ExpectedInputLanguages = 5562, + kProofreader_CorrectionExplanationLanguage = 5563, + kProofreader_Destroy = 5564, + kProofreader_Proofread = 5565, + kProofreader_Availability = 5566, + kProofreader_Create = 5567, // Add new features immediately above this line. Don't change assigned // numbers of any item, and don't reuse removed slots. Also don't add extra
diff --git a/third_party/blink/public/web/web_element.h b/third_party/blink/public/web/web_element.h index 5fef138..75e28e8 100644 --- a/third_party/blink/public/web/web_element.h +++ b/third_party/blink/public/web/web_element.h
@@ -135,11 +135,16 @@ // Returns the open shadow root or the closed shadow root. WebNode OpenOrClosedShadowRoot(); - // Returns the bounds of the element in Visual Viewport. The bounds - // have been adjusted to include any transformations, including page scale. - // This function will update the layout if required. + // Returns the bounds of the element relative to the RenderWidget (local root + // frame + viewport transform in the main frame). The bounds have been + // adjusted to include any transformations, including page scale. This + // function will update the layout if required. gfx::Rect BoundsInWidget() const; + // Same as above but this method will clip the bounds based on any of the + // element's ancestor overflow or frame boxes. + gfx::Rect VisibleBoundsInWidget() const; + // Returns the image contents of this element or a null SkBitmap // if there isn't any. SkBitmap ImageContents();
diff --git a/third_party/blink/renderer/bindings/generated_in_modules.gni b/third_party/blink/renderer/bindings/generated_in_modules.gni index c5089cb..89a2f93 100644 --- a/third_party/blink/renderer/bindings/generated_in_modules.gni +++ b/third_party/blink/renderer/bindings/generated_in_modules.gni
@@ -1008,6 +1008,14 @@ "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_private_attribution_network.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_private_attribution_options.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_private_attribution_options.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_proofreader_create_core_options.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_proofreader_create_core_options.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_proofreader_create_options.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_proofreader_create_options.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_proofread_correction.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_proofread_correction.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_proofread_result.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_proofread_result.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_protected_audience_private_aggregation_config.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_protected_audience_private_aggregation_config.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_public_key_credential_creation_options.cc", @@ -1764,6 +1772,8 @@ "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_presentation_connection_state.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_private_attribution_event.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_private_attribution_event.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_correction_type.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_correction_type.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_push_encryption_key_name.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_push_encryption_key_name.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_recording_state.cc", @@ -2700,6 +2710,8 @@ "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_private_aggregation.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_private_attribution.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_private_attribution.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_proofreader.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_proofreader.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_protected_audience.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_protected_audience.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_public_key_credential.cc",
diff --git a/third_party/blink/renderer/bindings/idl_in_modules.gni b/third_party/blink/renderer/bindings/idl_in_modules.gni index 51109d8..ea5b584 100644 --- a/third_party/blink/renderer/bindings/idl_in_modules.gni +++ b/third_party/blink/renderer/bindings/idl_in_modules.gni
@@ -26,6 +26,7 @@ "//third_party/blink/renderer/modules/ai/language_model_params.idl", "//third_party/blink/renderer/modules/ai/on_device_translation/language_detector.idl", "//third_party/blink/renderer/modules/ai/on_device_translation/translator.idl", + "//third_party/blink/renderer/modules/ai/proofreader.idl", "//third_party/blink/renderer/modules/ai/rewriter.idl", "//third_party/blink/renderer/modules/ai/summarizer.idl", "//third_party/blink/renderer/modules/ai/window_or_worker_global_scope_ai.idl",
diff --git a/third_party/blink/renderer/core/dom/element.cc b/third_party/blink/renderer/core/dom/element.cc index fd9d0c26..eb2604a 100644 --- a/third_party/blink/renderer/core/dom/element.cc +++ b/third_party/blink/renderer/core/dom/element.cc
@@ -2873,6 +2873,29 @@ return ToPixelSnappedRect(rect); } +gfx::Rect Element::VisibleBoundsRespectingClipsInLocalRoot() const { + if (!GetLayoutObject()) { + return gfx::Rect(); + } + + gfx::RectF rect_in_viewport = + GetLayoutObject()->LocalBoundingBoxRectForAccessibility(); + + GetLayoutObject()->MapToVisualRectInAncestorSpace(/*ancestor=*/nullptr, + rect_in_viewport); + + PhysicalRect rect_in_local_root = + GetDocument() + .GetFrame() + ->LocalFrameRoot() + .ContentLayoutObject() + ->AbsoluteToLocalRect( + PhysicalRect::EnclosingRect(rect_in_viewport), + kTraverseDocumentBoundaries | kApplyRemoteMainFrameTransform); + + return ToPixelSnappedRect(rect_in_local_root); +} + void Element::ClientQuads(Vector<gfx::QuadF>& quads) const { LayoutObject* element_layout_object = GetLayoutObject(); if (!element_layout_object) { @@ -10999,7 +11022,9 @@ auto* target_popover = DynamicTo<HTMLElement>(target); bool might_need_partial_interest = source == InterestTargetSource::kFocusElementChain && - target_popover && target_popover->HasPopoverAttribute(); + target_popover && target_popover->HasPopoverAttribute() && + !RuntimeEnabledFeatures::HTMLInterestTargetNoPartialInterestEnabled( + GetExecutionContext()); ScheduleInterestGainedTask(might_need_partial_interest ? InterestState::kPotentialPartialInterest : InterestState::kFullInterest);
diff --git a/third_party/blink/renderer/core/dom/element.h b/third_party/blink/renderer/core/dom/element.h index 205f548..4c29e55a 100644 --- a/third_party/blink/renderer/core/dom/element.h +++ b/third_party/blink/renderer/core/dom/element.h
@@ -531,9 +531,12 @@ // origin. While the rect is relative to the local root, it is intersected // with all ancestor frame clips, including the visual viewport transform and // clip in the main frame. While this applies ancestor frame clipping, it - // does not (yet) apply (overflow) element clipping (crbug.com/889840). + // does not (yet) apply (overflow) element clipping (crbug.com/41417572). gfx::Rect VisibleBoundsInLocalRoot() const; + // TODO(crbug.com/41417572): This method should replace the above method. + gfx::Rect VisibleBoundsRespectingClipsInLocalRoot() const; + DOMRectList* getClientRects(); // Returns a rectangle in zoomed pixel units. gfx::RectF GetBoundingClientRectNoLifecycleUpdateNoAdjustment() const;
diff --git a/third_party/blink/renderer/core/exported/web_element.cc b/third_party/blink/renderer/core/exported/web_element.cc index 2ec717a..6859e19 100644 --- a/third_party/blink/renderer/core/exported/web_element.cc +++ b/third_party/blink/renderer/core/exported/web_element.cc
@@ -48,6 +48,7 @@ #include "third_party/blink/renderer/core/events/text_event.h" #include "third_party/blink/renderer/core/frame/local_dom_window.h" #include "third_party/blink/renderer/core/frame/local_frame.h" +#include "third_party/blink/renderer/core/frame/visual_viewport.h" #include "third_party/blink/renderer/core/html/custom/custom_element.h" #include "third_party/blink/renderer/core/html/forms/html_label_element.h" #include "third_party/blink/renderer/core/html/forms/text_control_element.h" @@ -55,6 +56,7 @@ #include "third_party/blink/renderer/core/html_names.h" #include "third_party/blink/renderer/core/layout/layout_box.h" #include "third_party/blink/renderer/core/layout/layout_view.h" +#include "third_party/blink/renderer/core/page/page.h" #include "third_party/blink/renderer/platform/bindings/exception_state.h" #include "third_party/blink/renderer/platform/graphics/image.h" #include "third_party/blink/renderer/platform/runtime_enabled_features.h" @@ -312,6 +314,32 @@ return ConstUnwrap<Element>()->BoundsInWidget(); } +gfx::Rect WebElement::VisibleBoundsInWidget() const { + const Element* element = ConstUnwrap<Element>(); + LocalFrame* frame = element->GetDocument().GetFrame(); + if (!frame || !frame->View()) { + return gfx::Rect(); + } + + gfx::Rect bounds_in_local_root = + element->VisibleBoundsRespectingClipsInLocalRoot(); + + if (!frame->IsOutermostMainFrame()) { + return bounds_in_local_root; + } + + // In the outermost main frame the widget includes the viewport transform + // (i.e. pinch-zoom). VisibleBoundsRespectingClipsInLocalRoot should already + // have clipped to the visual viewport (but then transforms back into local + // root space). + VisualViewport& visual_viewport = + element->GetDocument().GetPage()->GetVisualViewport(); + gfx::Rect bounds_in_viewport = + visual_viewport.RootFrameToViewport(bounds_in_local_root); + bounds_in_viewport.Intersect(gfx::Rect(visual_viewport.Size())); + return bounds_in_viewport; +} + SkBitmap WebElement::ImageContents() { Image* image = GetImage(); if (!image)
diff --git a/third_party/blink/renderer/core/exported/web_view_impl.cc b/third_party/blink/renderer/core/exported/web_view_impl.cc index 6b056de..73f25b18 100644 --- a/third_party/blink/renderer/core/exported/web_view_impl.cc +++ b/third_party/blink/renderer/core/exported/web_view_impl.cc
@@ -4141,6 +4141,7 @@ mojom::blink::FrameReplicationStatePtr replicated_state, bool is_loading, const base::UnguessableToken& devtools_frame_token, + const std::optional<base::UnguessableToken>& navigation_metrics_token, mojom::blink::RemoteFrameInterfacesFromBrowserPtr remote_frame_interfaces, mojom::blink::RemoteMainFrameInterfacesPtr remote_main_frame_interfaces) { blink::WebFrame* opener = nullptr;
diff --git a/third_party/blink/renderer/core/exported/web_view_impl.h b/third_party/blink/renderer/core/exported/web_view_impl.h index aff99e7..eaa593b 100644 --- a/third_party/blink/renderer/core/exported/web_view_impl.h +++ b/third_party/blink/renderer/core/exported/web_view_impl.h
@@ -315,6 +315,7 @@ mojom::blink::FrameReplicationStatePtr replicated_state, bool is_loading, const base::UnguessableToken& devtools_frame_token, + const std::optional<base::UnguessableToken>& navigation_metrics_token, mojom::blink::RemoteFrameInterfacesFromBrowserPtr remote_frame_interfaces, mojom::blink::RemoteMainFrameInterfacesPtr remote_main_frame_interfaces) override;
diff --git a/third_party/blink/renderer/core/frame/remote_frame.cc b/third_party/blink/renderer/core/frame/remote_frame.cc index 96b0b13d..05ea2284 100644 --- a/third_party/blink/renderer/core/frame/remote_frame.cc +++ b/third_party/blink/renderer/core/frame/remote_frame.cc
@@ -1165,7 +1165,8 @@ } void RemoteFrame::CreateRemoteChildren( - Vector<mojom::blink::CreateRemoteChildParamsPtr> params) { + Vector<mojom::blink::CreateRemoteChildParamsPtr> params, + const std::optional<base::UnguessableToken>& navigation_metrics_token) { Client()->CreateRemoteChildren(params); }
diff --git a/third_party/blink/renderer/core/frame/remote_frame.h b/third_party/blink/renderer/core/frame/remote_frame.h index 8fdfa33..769d94d 100644 --- a/third_party/blink/renderer/core/frame/remote_frame.h +++ b/third_party/blink/renderer/core/frame/remote_frame.h
@@ -230,7 +230,9 @@ mojom::blink::RemoteFrameInterfacesFromBrowserPtr remote_frame_interfaces) override; void CreateRemoteChildren( - Vector<mojom::blink::CreateRemoteChildParamsPtr> params) override; + Vector<mojom::blink::CreateRemoteChildParamsPtr> params, + const std::optional<base::UnguessableToken>& navigation_metrics_token) + override; void ForwardFencedFrameEventToEmbedder( const WTF::String& event_type) override;
diff --git a/third_party/blink/renderer/core/paint/box_fragment_painter.cc b/third_party/blink/renderer/core/paint/box_fragment_painter.cc index 78c4e1c..c40c04f 100644 --- a/third_party/blink/renderer/core/paint/box_fragment_painter.cc +++ b/third_party/blink/renderer/core/paint/box_fragment_painter.cc
@@ -1472,8 +1472,8 @@ }; LayoutUnit cross_gutter_width = track_direction == kForRows - ? gap_geometry.GetBlockGapSize() - : gap_geometry.GetInlineGapSize(); + ? gap_geometry.GetInlineGapSize() + : gap_geometry.GetBlockGapSize(); const auto gaps = gap_geometry.GetGapIntersections(track_direction); for (wtf_size_t gap_index = 0; gap_index < gaps.size(); ++gap_index) {
diff --git a/third_party/blink/renderer/modules/ai/BUILD.gn b/third_party/blink/renderer/modules/ai/BUILD.gn index c917b75..82858971 100644 --- a/third_party/blink/renderer/modules/ai/BUILD.gn +++ b/third_party/blink/renderer/modules/ai/BUILD.gn
@@ -42,6 +42,8 @@ "on_device_translation/resolver_with_abort_signal.h", "on_device_translation/translator.cc", "on_device_translation/translator.h", + "proofreader.cc", + "proofreader.h", "rewriter.cc", "rewriter.h", "summarizer.cc",
diff --git a/third_party/blink/renderer/modules/ai/ai_metrics.cc b/third_party/blink/renderer/modules/ai/ai_metrics.cc index 8d38008..ea2052e 100644 --- a/third_party/blink/renderer/modules/ai/ai_metrics.cc +++ b/third_party/blink/renderer/modules/ai/ai_metrics.cc
@@ -26,6 +26,8 @@ return "Translator"; case AIMetrics::AISessionType::kLanguageDetector: return "LanguageDetector"; + case AIMetrics::AISessionType::kProofreader: + return "Proofreader"; } NOTREACHED(); }
diff --git a/third_party/blink/renderer/modules/ai/ai_metrics.h b/third_party/blink/renderer/modules/ai/ai_metrics.h index cdce205..6d93a65 100644 --- a/third_party/blink/renderer/modules/ai/ai_metrics.h +++ b/third_party/blink/renderer/modules/ai/ai_metrics.h
@@ -20,7 +20,8 @@ kSummarizer = 3, kTranslator = 4, kLanguageDetector = 5, - kMaxValue = kLanguageDetector, + kProofreader = 6, + kMaxValue = kProofreader, }; // LINT.ThenChange(//tools/metrics/histograms/metadata/ai/histograms.xml:SessionType) @@ -50,8 +51,11 @@ kSummarizerCreate = 16, kSummarizerDestroy = 17, kSessionCountPromptTokens = 18, + kProofreaderProofread = 19, + kProofreaderCreate = 20, + kProofreaderDestroy = 21, - kMaxValue = kSessionCountPromptTokens, + kMaxValue = kProofreaderDestroy, }; // LINT.ThenChange(//tools/metrics/histograms/metadata/ai/enums.xml:AIAPI)
diff --git a/third_party/blink/renderer/modules/ai/ai_utils.cc b/third_party/blink/renderer/modules/ai/ai_utils.cc index b820143..59df63f 100644 --- a/third_party/blink/renderer/modules/ai/ai_utils.cc +++ b/third_party/blink/renderer/modules/ai/ai_utils.cc
@@ -151,6 +151,16 @@ options->getOutputLanguageOr(g_empty_string))); } +mojom::blink::AIProofreaderCreateOptionsPtr ToMojoProofreaderCreateOptionsImpl( + const ProofreaderCreateCoreOptions* options) { + return mojom::blink::AIProofreaderCreateOptions::New( + options->includeCorrectionTypes(), + options->includeCorrectionExplanations(), + mojom::blink::AILanguageCode::New( + options->getCorrectionExplanationLanguageOr(g_empty_string)), + ToMojoLanguageCodes(options->getExpectedInputLanguagesOr({}))); +} + } // namespace Vector<mojom::blink::AILanguageCodePtr> ToMojoLanguageCodes( @@ -226,6 +236,16 @@ return ToMojoRewriterCreateOptionsImpl(core_options, g_empty_string); } +mojom::blink::AIProofreaderCreateOptionsPtr ToMojoProofreaderCreateOptions( + const ProofreaderCreateOptions* options) { + return ToMojoProofreaderCreateOptionsImpl(options); +} + +mojom::blink::AIProofreaderCreateOptionsPtr ToMojoProofreaderCreateOptions( + const ProofreaderCreateCoreOptions* core_options) { + return ToMojoProofreaderCreateOptionsImpl(core_options); +} + std::optional<Vector<String>> ValidateAndCanonicalizeBCP47Languages( v8::Isolate* isolate, const Vector<String>& languages) {
diff --git a/third_party/blink/renderer/modules/ai/ai_utils.h b/third_party/blink/renderer/modules/ai/ai_utils.h index e3d2fb2..4ae7bd39 100644 --- a/third_party/blink/renderer/modules/ai/ai_utils.h +++ b/third_party/blink/renderer/modules/ai/ai_utils.h
@@ -8,9 +8,11 @@ #include "base/types/expected.h" #include "third_party/blink/public/mojom/ai/ai_common.mojom-blink.h" #include "third_party/blink/public/mojom/ai/ai_language_model.mojom-blink.h" +#include "third_party/blink/public/mojom/ai/ai_proofreader.mojom-blink.h" #include "third_party/blink/public/mojom/ai/ai_rewriter.mojom-blink.h" #include "third_party/blink/public/mojom/ai/ai_summarizer.mojom-blink.h" #include "third_party/blink/public/mojom/ai/ai_writer.mojom-blink.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_proofreader_create_options.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_rewriter_create_options.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_summarizer_create_options.h" #include "third_party/blink/renderer/bindings/modules/v8/v8_writer_create_options.h" @@ -50,6 +52,10 @@ const RewriterCreateOptions* options); mojom::blink::AIRewriterCreateOptionsPtr ToMojoRewriterCreateOptions( const RewriterCreateCoreOptions* core_options); +mojom::blink::AIProofreaderCreateOptionsPtr ToMojoProofreaderCreateOptions( + const ProofreaderCreateOptions* options); +mojom::blink::AIProofreaderCreateOptionsPtr ToMojoProofreaderCreateOptions( + const ProofreaderCreateCoreOptions* core_options); // Implementation of LookupMatchingLocaleByBestFit // (https://tc39.es/ecma402/#sec-lookupmatchinglocalebybestfit) as
diff --git a/third_party/blink/renderer/modules/ai/on_device_translation/create_translator_client.cc b/third_party/blink/renderer/modules/ai/on_device_translation/create_translator_client.cc index 4180ba7..5e93cb9 100644 --- a/third_party/blink/renderer/modules/ai/on_device_translation/create_translator_client.cc +++ b/third_party/blink/renderer/modules/ai/on_device_translation/create_translator_client.cc
@@ -136,9 +136,17 @@ void CreateTranslatorClient::OnGotAvailability( CanCreateTranslatorResult result) { - LocalDOMWindow* const window = LocalDOMWindow::From(GetScriptState()); + ScriptState* script_state = GetScriptState(); + ExecutionContext* context = ExecutionContext::From(script_state); + LocalDOMWindow* const window = LocalDOMWindow::From(script_state); + + // The Translator API is only available within a window or extension + // service worker context. User activation is not consumed by workers, as + // they lack the ability to do so. + CHECK(window != nullptr || context->IsServiceWorkerGlobalScope()); if (RuntimeEnabledFeatures::TranslationAPIV1Enabled() && + !context->IsServiceWorkerGlobalScope() && RequiresUserActivation(result) && !LocalFrame::ConsumeTransientUserActivation(window->GetFrame())) { GetResolver()->RejectWithDOMException(
diff --git a/third_party/blink/renderer/modules/ai/proofreader.cc b/third_party/blink/renderer/modules/ai/proofreader.cc new file mode 100644 index 0000000..541674a --- /dev/null +++ b/third_party/blink/renderer/modules/ai/proofreader.cc
@@ -0,0 +1,174 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "third_party/blink/renderer/modules/ai/proofreader.h" + +#include "base/metrics/histogram_functions.h" +#include "third_party/blink/public/mojom/ai/model_streaming_responder.mojom-blink.h" +#include "third_party/blink/renderer/modules/ai/ai_interface_proxy.h" +#include "third_party/blink/renderer/modules/ai/ai_metrics.h" +#include "third_party/blink/renderer/modules/ai/ai_writing_assistance_create_client.h" + +namespace blink { + +template <> +void AIWritingAssistanceCreateClient< + mojom::blink::AIProofreader, + mojom::blink::AIManagerCreateProofreaderClient, + ProofreaderCreateOptions, + Proofreader>:: + RemoteCreate( + mojo::PendingRemote<mojom::blink::AIManagerCreateProofreaderClient> + client_remote) { + // TODO(crbug.com/413766815): make actual call to mojo interface in a followup CL to + // implement the browser/mojo side. + // HeapMojoRemote<mojom::blink::AIManager>& ai_manager_remote = + // AIInterfaceProxy::GetAIManagerRemote(GetExecutionContext()); + // ai_manager_remote->CreateProofreader(std::move(client_remote), + // ToMojoProofreaderCreateOptions( + // options_)); +} + +Proofreader::Proofreader( + ExecutionContext* execution_context, + scoped_refptr<base::SequencedTaskRunner> task_runner, + mojo::PendingRemote<mojom::blink::AIProofreader> pending_remote, + ProofreaderCreateOptions* options) + : ExecutionContextClient(execution_context), + remote_(execution_context), + options_(std::move(options)), + task_runner_(std::move(task_runner)) { + remote_.Bind(std::move(pending_remote), task_runner_); +} + +void Proofreader::Trace(Visitor* visitor) const { + ScriptWrappable::Trace(visitor); + ExecutionContextClient::Trace(visitor); + visitor->Trace(remote_); + visitor->Trace(options_); +} + +ScriptPromise<V8Availability> Proofreader::availability( + ScriptState* script_state, + ProofreaderCreateCoreOptions* options, + ExceptionState& exception_state) { + if (!script_state->ContextIsValid()) { + ThrowInvalidContextException(exception_state); + return ScriptPromise<V8Availability>(); + } + + auto* resolver = + MakeGarbageCollected<ScriptPromiseResolver<V8Availability>>( + script_state); + auto promise = resolver->Promise(); + + ExecutionContext* execution_context = ExecutionContext::From(script_state); + HeapMojoRemote<mojom::blink::AIManager>& ai_manager_remote = + AIInterfaceProxy::GetAIManagerRemote(execution_context); + + if (!ai_manager_remote.is_connected()) { + RejectPromiseWithInternalError(resolver); + return promise; + } + + auto callback = WTF::BindOnce( + [](ScriptPromiseResolver<V8Availability>* resolver, + ExecutionContext* execution_context, + mojom::blink::ModelAvailabilityCheckResult result) { + Availability availability = HandleModelAvailabilityCheckResult( + execution_context, AIMetrics::AISessionType::kProofreader, result); + resolver->Resolve(AvailabilityToV8(availability)); + }, + WrapPersistent(resolver), WrapPersistent(execution_context)); + + return promise; +} + +ScriptPromise<Proofreader> Proofreader::create( + ScriptState* script_state, + ProofreaderCreateOptions* options, + ExceptionState& exception_state) { + if (!script_state->ContextIsValid()) { + ThrowInvalidContextException(exception_state); + return ScriptPromise<Proofreader>(); + } + CHECK(options); + auto* resolver = + MakeGarbageCollected<ScriptPromiseResolver<Proofreader>>(script_state); + auto promise = resolver->Promise(); + AbortSignal* signal = options->getSignalOr(nullptr); + if (signal && signal->aborted()) { + resolver->Reject(signal->reason(script_state)); + return promise; + } + + ExecutionContext* execution_context = ExecutionContext::From(script_state); + HeapMojoRemote<mojom::blink::AIManager>& ai_manager_remote = + AIInterfaceProxy::GetAIManagerRemote(execution_context); + + if (!ai_manager_remote.is_connected()) { + RejectPromiseWithInternalError(resolver); + return promise; + } + + MakeGarbageCollected<AIWritingAssistanceCreateClient< + mojom::blink::AIProofreader, + mojom::blink::AIManagerCreateProofreaderClient, + ProofreaderCreateOptions, + Proofreader>>(script_state, resolver, options)->Create(); + return promise; +} + +ScriptPromise<ProofreadResult> Proofreader::proofread( + ScriptState* script_state, + const String& proofread_task, + ExceptionState& exception_state) { + if (!script_state->ContextIsValid()) { + ThrowInvalidContextException(exception_state); + return ScriptPromise<ProofreadResult>(); + } + if (!remote_) { + ThrowSessionDestroyedException(exception_state); + return ScriptPromise<ProofreadResult>(); + } + + base::UmaHistogramEnumeration( + AIMetrics::GetAIAPIUsageMetricName(AIMetrics::AISessionType::kProofreader), + AIMetrics::AIAPI::kProofreaderProofread); + base::UmaHistogramCounts1M( + AIMetrics::GetAISessionRequestSizeMetricName( + AIMetrics::AISessionType::kProofreader), + static_cast<int>(proofread_task.CharactersSizeInBytes())); + + auto* resolver = MakeGarbageCollected<ScriptPromiseResolver<ProofreadResult>>( + script_state); + auto promise = resolver->Promise(); + + AbortSignal* signal = options_->getSignalOr(nullptr); + if (signal && signal->aborted()) { + resolver->Reject(signal->reason(script_state)); + return promise; + } + + // TODO(crbug.com/413767898): Implement the proofread logic. + auto* result = MakeGarbageCollected<ProofreadResult>(); + resolver->Resolve(result); + return promise; +} + +void Proofreader::destroy(ScriptState* script_state, + ExceptionState& exception_state) { + if (!script_state->ContextIsValid()) { + ThrowInvalidContextException(exception_state); + return; + } + + base::UmaHistogramEnumeration( + AIMetrics::GetAIAPIUsageMetricName(AIMetrics::AISessionType::kProofreader), + AIMetrics::AIAPI::kSessionDestroy); + + remote_.reset(); +} + +} // namespace blink
diff --git a/third_party/blink/renderer/modules/ai/proofreader.h b/third_party/blink/renderer/modules/ai/proofreader.h new file mode 100644 index 0000000..a86e6d86 --- /dev/null +++ b/third_party/blink/renderer/modules/ai/proofreader.h
@@ -0,0 +1,80 @@ +// Copyright 2025 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef THIRD_PARTY_BLINK_RENDERER_MODULES_AI_PROOFREADER_H_ +#define THIRD_PARTY_BLINK_RENDERER_MODULES_AI_PROOFREADER_H_ + +#include "base/functional/callback_helpers.h" +#include "base/task/sequenced_task_runner.h" +#include "third_party/blink/public/mojom/ai/ai_proofreader.mojom-blink.h" +#include "third_party/blink/renderer/bindings/core/v8/script_promise.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_proofread_result.h" +#include "third_party/blink/renderer/bindings/modules/v8/v8_proofreader_create_options.h" +#include "third_party/blink/renderer/core/execution_context/execution_context_lifecycle_observer.h" +#include "third_party/blink/renderer/modules/ai/availability.h" +#include "third_party/blink/renderer/modules/ai/ai_metrics.h" +#include "third_party/blink/renderer/platform/bindings/script_wrappable.h" +#include "third_party/blink/renderer/platform/mojo/heap_mojo_remote.h" + +namespace blink { + +using CanCreateCallback = + base::OnceCallback<void(mojom::blink::ModelAvailabilityCheckResult)>; + +// The class that represents a proofreader object. +class Proofreader final : public ScriptWrappable, + public ExecutionContextClient { + DEFINE_WRAPPERTYPEINFO(); + + public: + Proofreader(ExecutionContext* execution_context, + scoped_refptr<base::SequencedTaskRunner> task_runner, + mojo::PendingRemote<mojom::blink::AIProofreader> pending_remote, + ProofreaderCreateOptions* options); + + void Trace(Visitor* visitor) const override; + + static ScriptPromise<V8Availability> availability( + ScriptState* script_state, + ProofreaderCreateCoreOptions* options, + ExceptionState& exception_state); + + static ScriptPromise<Proofreader> create(ScriptState* script_state, + ProofreaderCreateOptions* options, + ExceptionState& exception_state); + + // proofreader.idl: + ScriptPromise<ProofreadResult> proofread(ScriptState* script_state, + const String& proofread_task, + ExceptionState& exception_state); + void destroy(ScriptState* script_state, ExceptionState& exception_state); + + bool includeCorrectionTypes() const { + return options_->includeCorrectionTypes(); + } + + bool includeCorrectionExplanations() const { + return options_->includeCorrectionExplanations(); + } + + std::optional<Vector<String>> expectedInputLanguages() const { + if (options_->hasExpectedInputLanguages()) { + return options_->expectedInputLanguages(); + } + return std::nullopt; + } + + String correctionExplanationLanguage() const { + return options_->getCorrectionExplanationLanguageOr(g_empty_string); + } + + private: + HeapMojoRemote<mojom::blink::AIProofreader> remote_; + Member<ProofreaderCreateOptions> options_; + scoped_refptr<base::SequencedTaskRunner> task_runner_; +}; + +} // namespace blink + +#endif // THIRD_PARTY_BLINK_RENDERER_MODULES_AI_PROOFREADER_H_
diff --git a/third_party/blink/renderer/modules/ai/proofreader.idl b/third_party/blink/renderer/modules/ai/proofreader.idl new file mode 100644 index 0000000..64ce1df --- /dev/null +++ b/third_party/blink/renderer/modules/ai/proofreader.idl
@@ -0,0 +1,91 @@ +// Copyright 2025 The Chromium Authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// https://github.com/explainers-by-googlers/proofreader-api + +enum CorrectionType { + "spelling", // Misspelled words, i.e. typos. + "punctuation", // Incorrect or missing punctuation marks. + "capitalization", // Incorrect upper/lowercase letters. + "preposition", // Errors in the use of prepositions. + "missing-words", // One or more words are absent from a sentence, + // making it grammatically incorrect or altering + // its intended meaning. + "grammar" // Broad and catch-all category, if no more-specific category + // matches. Encompassing sentence errors in structure + // errors, word order, subject-verb agreement, etc. +}; + +dictionary ProofreaderCreateCoreOptions { + boolean includeCorrectionTypes = false; + boolean includeCorrectionExplanations = false; + sequence<DOMString> expectedInputLanguages; + DOMString correctionExplanationLanguage; +}; + +dictionary ProofreaderCreateOptions : ProofreaderCreateCoreOptions { + AbortSignal signal; + CreateMonitorCallback monitor; +}; + +dictionary ProofreadResult { + DOMString correctedInput; + sequence<ProofreadCorrection> corrections; +}; + +dictionary ProofreadCorrection { + unsigned long long startIndex; + unsigned long long endIndex; + DOMString correction; + CorrectionType type; + DOMString explanation; +}; + +[ + Exposed=(Window,Worker), + RuntimeEnabled=AIProofreadingAPI, + SecureContext +] +interface Proofreader { + [ + MeasureAs=Proofreader_Availability, + CallWith=ScriptState, + RaisesException + ] + static Promise<Availability> availability( + optional ProofreaderCreateCoreOptions options = {} + ); + + [ + MeasureAs=Proofreader_Create, + CallWith=ScriptState, + RaisesException + ] + static Promise<Proofreader> create(optional ProofreaderCreateOptions options = {}); + + [ + MeasureAs=Proofreader_Proofread, + CallWith=ScriptState, + RaisesException + ] + Promise<ProofreadResult> proofread( + DOMString input + ); + + [ + MeasureAs=Proofreader_Destroy, + CallWith=ScriptState, + RaisesException + ] + void destroy(); + + [MeasureAs=Proofreader_IncludeCorrectionTypes] + readonly attribute boolean includeCorrectionTypes; + [MeasureAs=Proofreader_IncludeCorrectionExplanations] + readonly attribute boolean includeCorrectionExplanations; + [MeasureAs=Proofreader_ExpectedInputLanguages] + readonly attribute FrozenArray<DOMString>? expectedInputLanguages; + [MeasureAs=Proofreader_CorrectionExplanationLanguage] + readonly attribute DOMString? correctionExplanationLanguage; +};
diff --git a/third_party/blink/renderer/platform/graphics/video_frame_submitter.cc b/third_party/blink/renderer/platform/graphics/video_frame_submitter.cc index 24a22829..30e6a750 100644 --- a/third_party/blink/renderer/platform/graphics/video_frame_submitter.cc +++ b/third_party/blink/renderer/platform/graphics/video_frame_submitter.cc
@@ -67,17 +67,6 @@ return frame_info; } -// Helper method for creating manual ack with damage and prefered frame -// interval. -viz::BeginFrameAck CreateManualAckWithDamageAndPreferredFrameInterval( - cc::VideoFrameProvider* video_frame_provider) { - auto begin_frame_ack = viz::BeginFrameAck::CreateManualAckWithDamage(); - begin_frame_ack.preferred_frame_interval = - video_frame_provider ? video_frame_provider->GetPreferredRenderInterval() - : viz::BeginFrameArgs::MinInterval(); - return begin_frame_ack; -} - void RecordUmaPreSubmitBufferingDelay(bool is_media_stream, base::TimeDelta delay) { if (is_media_stream) { @@ -506,10 +495,6 @@ // Don't call UpdateCurrentFrame() for MISSED BeginFrames. Also don't call it // after StopRendering() has been called (forbidden by API contract). viz::BeginFrameAck current_begin_frame_ack(args, false); - current_begin_frame_ack.preferred_frame_interval = - video_frame_provider_ - ? video_frame_provider_->GetPreferredRenderInterval() - : viz::BeginFrameArgs::MinInterval(); if (args.type == viz::BeginFrameArgs::MISSED || !is_rendering_) { compositor_frame_sink_->DidNotProduceFrame(current_begin_frame_ack); frame_sorter_.AddFrameResult( @@ -852,8 +837,7 @@ return; last_frame_id_.reset(); - auto begin_frame_ack = - CreateManualAckWithDamageAndPreferredFrameInterval(video_frame_provider_); + auto begin_frame_ack = viz::BeginFrameAck::CreateManualAckWithDamage(); auto frame_token = ++next_frame_token_; auto compositor_frame = CreateCompositorFrame( frame_token, begin_frame_ack, nullptr, media::kNoTransformation); @@ -883,8 +867,7 @@ if (!video_frame) return; - if (SubmitFrame(CreateManualAckWithDamageAndPreferredFrameInterval( - video_frame_provider_), + if (SubmitFrame(viz::BeginFrameAck::CreateManualAckWithDamage(), std::move(video_frame))) { video_frame_provider_->PutCurrentFrame(); } @@ -905,6 +888,10 @@ viz::CompositorFrame compositor_frame; compositor_frame.metadata.begin_frame_ack = begin_frame_ack; compositor_frame.metadata.frame_token = frame_token; + compositor_frame.metadata.preferred_frame_interval = + video_frame_provider_ + ? video_frame_provider_->GetPreferredRenderInterval() + : viz::BeginFrameArgs::MinInterval(); if (video_frame_provider_) { compositor_frame.metadata.frame_interval_inputs.frame_time = last_begin_frame_args_.frame_time;
diff --git a/third_party/blink/renderer/platform/graphics/video_frame_submitter_test.cc b/third_party/blink/renderer/platform/graphics/video_frame_submitter_test.cc index 50807b7..f8d608c 100644 --- a/third_party/blink/renderer/platform/graphics/video_frame_submitter_test.cc +++ b/third_party/blink/renderer/platform/graphics/video_frame_submitter_test.cc
@@ -1029,7 +1029,7 @@ task_environment_.RunUntilIdle(); EXPECT_EQ(sink_->last_submitted_compositor_frame() - .metadata.begin_frame_ack.preferred_frame_interval, + .metadata.preferred_frame_interval, video_frame_provider_->preferred_interval); const auto& frame_interval_inputs = sink_->last_submitted_compositor_frame().metadata.frame_interval_inputs;
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 index c4dd0d8..cf649153 100644 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -357,6 +357,10 @@ implied_by: ["AIPromptAPI"], }, { + name: "AIProofreadingAPI", + status: "test", + }, + { name: "AIRewriterAPI", public: true, status: "experimental", @@ -704,6 +708,7 @@ "AIWriterAPI", "LanguageDetectionAPI", "TranslationAPI", + "AIProofreadingAPI", ] }, { @@ -2522,6 +2527,15 @@ status: "stable", depends_on: ["HTMLInterestTargetAttribute"], }, + // If this flag is enabled, the "partial interest" concept for the + // `interesttarget` API is not used. When an interest invoker is focused, + // the target immediately gets full interest, regardless of whether it + // contains focusable content. This is primarily to test the behavior with + // users, to see which is the best. + { + name: "HTMLInterestTargetNoPartialInterest", + depends_on: ["HTMLInterestTargetAttribute"], + }, { // A flag, just for local testing to make the // HTML parser yield more often and take longer to resume. @@ -2820,12 +2834,13 @@ name: "ListOwnerMustHaveCSSBox", status: "stable", }, - // Enables Local Network Access Permission Policy. Does nothing without - // also enabling network::features::kLocalNetworkAccessChecks. See - // https://crbug.com/394009026. { name: "LocalNetworkAccessPermissionPolicy", - status: "experimental", + base_feature: "none", + // No status because this blink runtime feature doesn't work by itself. + // It's controlled by network::features::kLocalNetworkAccessChecks which + // needs to be enabled to make the whole feature work (see + // crbug.com/394009026). }, { name: "LockedMode", @@ -3483,6 +3498,14 @@ copied_from_base_feature_if: "overridden", }, { + // Tracking bug for the implementation: crbug.com/352249547 + // This flag adds having the option to show an icon in the Permission + // element, if developers want to. + // The flag will enable us to land the feature over multiple CLs, and will + // be enabled after the feature has been fully implemented. + name: "PermissionElementIcon", + }, + { name: "Permissions", public: true, status: "stable",
diff --git a/third_party/blink/renderer/platform/widget/compositing/layer_tree_view.cc b/third_party/blink/renderer/platform/widget/compositing/layer_tree_view.cc index c5b20ad3..3b5406f8 100644 --- a/third_party/blink/renderer/platform/widget/compositing/layer_tree_view.cc +++ b/third_party/blink/renderer/platform/widget/compositing/layer_tree_view.cc
@@ -384,7 +384,9 @@ // unable to be killed after Chrome is closed. // https://issues.chromium.org/336164423 if (!Platform::Current()->IsGpuRemoteDisconnected()) { - layer_tree_host_->GetTaskRunnerProvider()->MainThreadTaskRunner()->PostTask( + // Run this task on a default priority task runner, so we don't starve mojo + // messages while we're in a retry loop. + base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask( FROM_HERE, base::BindOnce(&LayerTreeView::RequestNewLayerTreeFrameSink, weak_factory_.GetWeakPtr())); }
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index 82af4b3..de85812 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -1533,9 +1533,9 @@ # Interesttarget related tests crbug.com/326681249 external/wpt/html/semantics/the-button-element/interest-target/interesttarget-svg-a-event-dispatch.tentative.html [ Failure ] +crbug.com/326681249 [ Mac ] virtual/interest-target-no-partial-interest/external/wpt/html/semantics/the-button-element/interest-target/interesttarget-partial-interest.tentative.html [ Failure Pass ] crbug.com/1107923 inspector-protocol/debugger/wasm-streaming-url.js [ Failure Pass Timeout ] - crbug.com/350730710 inspector-protocol/css/css-get-position-try.js [ Failure Skip ] # Will be re-enabled and rebaselined once we remove the '--enable-file-cookies' flag. @@ -2443,7 +2443,7 @@ crbug.com/626703 external/wpt/webdriver/tests/bidi/input/set_files/invalid.py [ Failure Timeout ] external/wpt/webdriver/tests/bidi/input/set_files/set_files.py [ Timeout ] [ Debug ] external/wpt/webdriver/tests/bidi/network/add_intercept/contexts.py [ Failure Pass Timeout ] -[ Linux Debug ] external/wpt/webdriver/tests/bidi/storage/delete_cookies/filter.py [ Timeout ] +[ Debug Linux ] external/wpt/webdriver/tests/bidi/storage/delete_cookies/filter.py [ Timeout ] [ Debug ] external/wpt/webdriver/tests/bidi/storage/delete_cookies/invalid.py [ Timeout ] [ Debug ] external/wpt/webdriver/tests/bidi/storage/get_cookies/invalid.py [ Timeout ] external/wpt/webdriver/tests/bidi/browsing_context/close/prompt_unload.py [ Timeout ] @@ -2788,7 +2788,12 @@ crbug.com/413411328 external/wpt/css/css-values/urls/referrer-policy/unsafe-url/url-image-referrerpolicy-same-origin.sub.html [ Failure ] # ====== New tests from wpt-importer added here ====== +crbug.com/416615751 external/wpt/css/css-contain/contain-layout-stacking-context-001.html [ Failure ] +crbug.com/416633174 [ Mac ] external/wpt/html/semantics/the-button-element/interest-target/interesttarget-keyboard-invalidation.tentative.html [ Failure Pass ] crbug.com/416129743 [ Mac15-arm64 ] external/wpt/css/css-flexbox/overflow-auto-005.html [ Failure ] +crbug.com/416704402 virtual/not-split-http-cache/external/wpt/fetch/http-cache/pragma-no-cache-with-cache-control.html [ Failure ] +crbug.com/416704402 virtual/split-cache-by-include-credentials/external/wpt/fetch/http-cache/pragma-no-cache-with-cache-control.html [ Failure ] +crbug.com/416704402 virtual/split-http-cache/external/wpt/fetch/http-cache/pragma-no-cache-with-cache-control.html [ Failure ] crbug.com/415669416 [ Mac15 ] external/wpt/css/css-position/sticky/position-sticky-fractional-offset.html [ Failure ] crbug.com/415738357 [ Linux ] external/wpt/webdriver/tests/bidi/emulation/set_geolocation_override/error.py [ Failure ] crbug.com/415738357 [ Linux ] external/wpt/webdriver/tests/bidi/emulation/set_geolocation_override/invalid.py [ Failure ] @@ -9356,19 +9361,22 @@ # This is because the RFHI in the browser process may not be aware that the # renderer has requested (and gotten) permission by the time StorageAccessHandle # tries to bind mojo endpoints. -crbug.com/415223384 external/wpt/partitioned-popins/partitioned-popins.localStorage.tentative.sub.https.window.html [ Failure Pass Crash ] -crbug.com/415223384 external/wpt/storage-access-api/storage-access-beyond-cookies.BlobURLDedicatedWorker.sub.https.tentative.window.html [ Failure Pass Crash ] -crbug.com/415223384 external/wpt/storage-access-api/storage-access-beyond-cookies.BlobURLSharedWorker.sub.https.tentative.window.html [ Failure Pass Crash ] -crbug.com/415223384 external/wpt/storage-access-api/storage-access-beyond-cookies.BroadcastChannel.sub.https.window.html [ Failure Pass Crash ] -crbug.com/415223384 external/wpt/storage-access-api/storage-access-beyond-cookies.SharedWorker.sub.https.window.html [ Failure Pass Crash ] -crbug.com/415223384 external/wpt/storage-access-api/storage-access-beyond-cookies.blobStorage.sub.https.window.html [ Failure Pass Crash ] -crbug.com/415223384 external/wpt/storage-access-api/storage-access-beyond-cookies.caches.sub.https.window.html [ Failure Pass Crash ] -crbug.com/415223384 external/wpt/storage-access-api/storage-access-beyond-cookies.estimate.sub.https.window.html [ Failure Pass Crash ] -crbug.com/415223384 external/wpt/storage-access-api/storage-access-beyond-cookies.getDirectory.sub.https.window.html [ Failure Pass Crash ] -crbug.com/415223384 external/wpt/storage-access-api/storage-access-beyond-cookies.indexedDB.sub.https.window.html [ Failure Pass Crash ] -crbug.com/415223384 external/wpt/storage-access-api/storage-access-beyond-cookies.locks.sub.https.window.html [ Failure Pass Crash ] -crbug.com/415223384 external/wpt/storage-access-api/storage-access-beyond-cookies.none.sub.https.window.html [ Failure Pass Crash Timeout ] -crbug.com/415223384 external/wpt/storage-access-api/storage-access-beyond-cookies.thirdPartyBlobStorage.sub.https.window.html [ Failure Pass Crash Timeout ] +crbug.com/415223384 external/wpt/partitioned-popins/partitioned-popins.localStorage.tentative.sub.https.window.html [ Crash Failure Pass Timeout ] +crbug.com/415223384 external/wpt/storage-access-api/storage-access-beyond-cookies.BlobURLDedicatedWorker.sub.https.tentative.window.html [ Crash Failure Pass Timeout ] +crbug.com/415223384 external/wpt/storage-access-api/storage-access-beyond-cookies.BlobURLSharedWorker.sub.https.tentative.window.html [ Crash Failure Pass Timeout ] +crbug.com/415223384 external/wpt/storage-access-api/storage-access-beyond-cookies.BroadcastChannel.sub.https.window.html [ Crash Failure Pass Timeout ] +crbug.com/415223384 external/wpt/storage-access-api/storage-access-beyond-cookies.SharedWorker.sub.https.window.html [ Crash Failure Pass Timeout ] +crbug.com/415223384 external/wpt/storage-access-api/storage-access-beyond-cookies.blobStorage.sub.https.window.html [ Crash Failure Pass Timeout ] +crbug.com/415223384 external/wpt/storage-access-api/storage-access-beyond-cookies.caches.sub.https.window.html [ Crash Failure Pass Timeout ] +crbug.com/415223384 external/wpt/storage-access-api/storage-access-beyond-cookies.estimate.sub.https.window.html [ Crash Failure Pass Timeout ] +crbug.com/415223384 external/wpt/storage-access-api/storage-access-beyond-cookies.getDirectory.sub.https.window.html [ Crash Failure Pass Timeout ] +crbug.com/415223384 external/wpt/storage-access-api/storage-access-beyond-cookies.indexedDB.sub.https.window.html [ Crash Failure Pass Timeout ] +crbug.com/415223384 external/wpt/storage-access-api/storage-access-beyond-cookies.localStorage.sub.https.window.html [ Crash Failure Pass Timeout ] +crbug.com/415223384 external/wpt/storage-access-api/storage-access-beyond-cookies.locks.sub.https.window.html [ Crash Failure Pass Timeout ] +crbug.com/415223384 external/wpt/storage-access-api/storage-access-beyond-cookies.none.sub.https.window.html [ Crash Failure Pass Timeout ] +crbug.com/415223384 external/wpt/storage-access-api/storage-access-beyond-cookies.sessionStorage.sub.https.window.html [ Crash Failure Pass Timeout ] +crbug.com/415223384 external/wpt/storage-access-api/storage-access-beyond-cookies.thirdPartyBlobStorage.sub.https.window.html [ Crash Failure Pass Timeout ] +crbug.com/415223384 external/wpt/storage-access-api/storage-access-beyond-cookies.unpartitioned.sub.https.window.html [ Crash Failure Pass Timeout ] # Gardener 2025-05-05 crbug.com/413289778 [ Mac12 ] wpt_internal/fedcm/fedcm-cache-manifest.https.html [ Failure ]
diff --git a/third_party/blink/web_tests/VirtualTestSuites b/third_party/blink/web_tests/VirtualTestSuites index 82ec477..0c5635b 100644 --- a/third_party/blink/web_tests/VirtualTestSuites +++ b/third_party/blink/web_tests/VirtualTestSuites
@@ -1306,6 +1306,16 @@ "expires": "Jun 1, 2025" }, { + "prefix": "interest-target-no-partial-interest", + "owners": ["masonf@chromium.org"], + "platforms": ["Linux", "Mac", "Win"], + "bases": [ + "external/wpt/html/semantics/the-button-element/interest-target" + ], + "args": ["--enable-blink-features=HTMLInterestTargetNoPartialInterest"], + "expires": "Dec 1, 2025" + }, + { "prefix": "dialog-close-when-open-removed-disabled", "owners": ["masonf@chromium.org"], "platforms": ["Linux"],
diff --git a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json index 981d3b34..3eb77f29 100644 --- a/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json +++ b/third_party/blink/web_tests/external/WPT_BASE_MANIFEST_8.json
@@ -594,6 +594,13 @@ {} ] ], + "root-element-background-image-opaque-crash.html": [ + "d380310d0968c3ad63eb6adc52acd929b3b43b14", + [ + null, + {} + ] + ], "root-element-filter-background-clip-text-crash.html": [ "e12e4bb80f40e09e189f7f239486be246ea67ade", [ @@ -4790,6 +4797,13 @@ {} ] ], + "table-col-and-dead-row-group-crash.html": [ + "e6e90a63a345fe2bb9499b729d2cf2df6ed65d9d", + [ + null, + {} + ] + ], "table-collapsed-borders-crash.html": [ "aa699317e2734fece3d662ad102fdd2772680e25", [ @@ -108825,7 +108839,7 @@ ] ], "contain-paint-stacking-context-001a.html": [ - "71102b6c73a3d88cdd953ecf82c69602ff87baa2", + "5e588cb61742ca406b23f573dd3609a52a191a1e", [ null, [ @@ -108838,7 +108852,7 @@ ] ], "contain-paint-stacking-context-001b.html": [ - "0c4d3323bf7cb28b5a31de8aac41563013b2ecd4", + "e03323782a7fbfbb924184fa71b0ab1031381671", [ null, [ @@ -149684,6 +149698,45 @@ {} ] ], + "linear-gradient-body-sibling-index.html": [ + "299b86d464ad54f383ce8f384ec6677b3d3e305b", + [ + null, + [ + [ + "/css/css-images/linear-gradient-body-sibling-index-ref.html", + "==" + ] + ], + {} + ] + ], + "linear-gradient-calc-em-units.html": [ + "e764e62890dad81adfda9d60d50d82a1e07c5de5", + [ + null, + [ + [ + "/css/css-images/linear-gradient-calc-em-units-ref.html", + "==" + ] + ], + {} + ] + ], + "linear-gradient-sibling-index.html": [ + "b92897e0697441df6876b88e53daa148a5edb009", + [ + null, + [ + [ + "/css/css-images/linear-gradient-sibling-index-ref.html", + "==" + ] + ], + {} + ] + ], "multiple-position-color-stop-conic-2.html": [ "f3171bf3fb9823095312ab080ee3d0481a8545f6", [ @@ -228643,6 +228696,35 @@ {} ] ], + "scale-transform-filtered-text.html": [ + "a479b12528a0bb6903d58d46a4b2a0d073b9ee97", + [ + null, + [ + [ + "/css/css-transforms/scale-transform-filtered-text-ref.html", + "==" + ] + ], + { + "fuzzy": [ + [ + null, + [ + [ + 0, + 25 + ], + [ + 0, + 500 + ] + ] + ] + ] + } + ] + ], "scale-transform-overlap.html": [ "0cb8db40b66accf337babe82d281d0a77c0ffa0d", [ @@ -275733,6 +275815,19 @@ {} ] ], + "backdrop-filter-scale-transform.html": [ + "813fb95d5ad3b5e4844e480980b4c712d6b8f28d", + [ + null, + [ + [ + "/css/filter-effects/backdrop-filter-scale-transform-ref.html", + "==" + ] + ], + {} + ] + ], "backdrop-filter-svg-background-image-blur.html": [ "9cd18b0542c86911b3a0b774fe892a61102c8b85", [ @@ -303592,7 +303687,7 @@ "the-button-element": { "interest-target": { "interesttarget-keyboard-invalidation.tentative.html": [ - "8c0ebd7a2cdcbab16e13618dbd5b8e36c58359f8", + "b6d0ff10932f1717fb038efb28c42c2bbf57cbf8", [ null, [ @@ -303606,19 +303701,6 @@ } ] ], - "interesttarget-outline-appearance.tentative.html": [ - "28cb2052a8d430b5dfadd31171b17d32a567d073", - [ - null, - [ - [ - "/html/semantics/the-button-element/interest-target/interesttarget-outline-appearance-ref.html", - "!=" - ] - ], - {} - ] - ], "interesttarget-plain-inline-element.tentative.html": [ "68ce00193f70c021cc392e0e2460662d7eb38ad9", [ @@ -320888,6 +320970,10 @@ "840e187cbad1cca4ea09e144c88df2a14032136a", [] ], + "WEB_FEATURES.yml": [ + "3c4f69200f67b3cd856f56913025c14de17a0e73", + [] + ], "idlharness.https.any.worker-expected.txt": [ "f78b54274e1c595034df625a5bccb74855e28c7a", [] @@ -321290,6 +321376,10 @@ "43d9342cfdaa131674e4fe7ea96bea4dc25f4e8f", [] ], + "WEB_FEATURES.yml": [ + "d55b5faaf11be9aa92df01f814d5ce165b23025f", + [] + ], "support": { "clear-cache-helper.sub.js": [ "5db0caf834cbf6a598f02761beda267dc8f1bcf8", @@ -337482,7 +337572,7 @@ [] ], "contain-paint-stacking-context-001-ref.html": [ - "c7553716ab6c257bb0d9407582eed186bd763369", + "e2516f3d3788fd7f28356d266ee73e6b7ec0a4e3", [] ], "contain-size-block-001-ref.html": [ @@ -352739,10 +352829,22 @@ "a80236dcf75c22ecd8e43935d004f1fddf0550cb", [] ], + "linear-gradient-body-sibling-index-ref.html": [ + "7325685511a542964859c34a359b107823db18df", + [] + ], + "linear-gradient-calc-em-units-ref.html": [ + "be13be8e260ef8d89be878d811edf83411dd2cee", + [] + ], "linear-gradient-ref.html": [ "033f1767799d718f072b48b6a99a4eaf7070f90e", [] ], + "linear-gradient-sibling-index-ref.html": [ + "eea8518d95b9393a5c1e1d34afc20744b8834c34", + [] + ], "multiple-position-color-stop-conic-2-ref.html": [ "2ee92a11ee43a60031302ecb24b5a1e2865590ec", [] @@ -369433,6 +369535,10 @@ ] } }, + "scale-transform-filtered-text-ref.html": [ + "e8b564ce3ddd6560299d91f347b4407fe6a5db6b", + [] + ], "scale-transform-overlap-ref.html": [ "4750764ae93092e7b7e9f7d151eb1b7904c32ca8", [] @@ -377773,6 +377879,10 @@ "c92741df4300e5416cbe26339d52b819ec35347c", [] ], + "backdrop-filter-scale-transform-ref.html": [ + "d7faa0e97a175fc5dabf6f2d89ce71ba0fd498e1", + [] + ], "backdrop-filter-transform-ref.html": [ "1af8776cf0dc663ec7bac1f83ba361ccb8b2b5d4", [] @@ -378539,6 +378649,10 @@ "bf8bf7ef91a3c5c8db4c2bb317a7f28be4db6cae", [] ], + "DOMMatrix-001-expected.txt": [ + "eb6bb23fb4c48cffcbab544c259d45a67d908fa8", + [] + ], "DOMMatrix-invertSelf-expected.txt": [ "10488ad89e056e27596f6b304fadcb3bdf1ec731", [] @@ -378568,7 +378682,7 @@ [] ], "WEB_FEATURES.yml": [ - "24027360aab4a27b72975f0d77062ffe8fb1a060", + "7f15b7fa475230b42981a3f92f60f434e9ccf1af", [] ], "dynamic-range-expected.txt": [ @@ -383091,7 +383205,7 @@ [] ], "OWNERS": [ - "4392ef47220b8ea697837bcd0339e2d8b48e84ae", + "4a32e24dea92b2c74e431987c86ab899111a58c6", [] ], "bom-handling.html.headers": [ @@ -384494,7 +384608,7 @@ [] ], "event-timing-test-utils.js": [ - "59c78ebf39c8a8e0f31aafa1eccd0809bea54376", + "afad67bb6fc2d90e02bf7b40633be891bb2fe3d0", [] ], "slow-image.py": [ @@ -386426,6 +386540,10 @@ ] }, "request": { + "WEB_FEATURES.yml": [ + "69b2ea582a2281403c4899e122343262e43976db", + [] + ], "destination": { "fetch-destination.https-expected.txt": [ "ec3b5ba00e023b90bbaf0d60b1865d4289c3e9d9", @@ -387488,6 +387606,10 @@ [] ], "resources": { + "cached_pragma_rand.py": [ + "18c7d25159fa3041b8aa278c8ac022003eee0e36", + [] + ], "http-cache.py": [ "3ab610dd1421cea5289ad14a8ef472ade27f07f1", [] @@ -387516,12 +387638,16 @@ [] ], "resources": { + "fetch-private-permission-denied.html": [ + "7368cf5fcb0b854d4f0eaaed95fa5c3169d572c7", + [] + ], "fetch-private.html": [ "ede16badf338dc50defad0251f83f8b02f1d3fec", [] ], "support.sub.js": [ - "299f004ecc362e29202b80b68d8e47b1300b8604", + "ef343b956fe2007089acccc4c6bffe5876ad364a", [] ], "target.py": [ @@ -388447,7 +388573,7 @@ [] ], "WEB_FEATURES.yml": [ - "45e40acba1dcb6b4abe11d1478c682264a4c1e90", + "7faf67952b5b82107a2797706e41dfdc780ef041", [] ], "resources": { @@ -394616,6 +394742,10 @@ [] ], "wide-gamut-canvas": { + "WEB_FEATURES.yml": [ + "b4d11212a6c677339784cdab33e0e31b0b948379", + [] + ], "canvas-display-p3-drawImage-ImageBitmap-Blob-expected.txt": [ "59b1e327503c5d052e22790a5ff64be3fa508a9e", [] @@ -395010,6 +395140,10 @@ "2d.path.stroke.prune.line-expected.txt": [ "7bd4ef9f49930d0268374f204580d962021e26ed", [] + ], + "WEB_FEATURES.yml": [ + "1bbef5e88d6630d820e2206f283ac38cffceb67d", + [] ] }, "pixel-manipulation": { @@ -395205,6 +395339,12 @@ [] ] } + }, + "wide-gamut-canvas": { + "WEB_FEATURES.yml": [ + "b4d11212a6c677339784cdab33e0e31b0b948379", + [] + ] } }, "offscreen": { @@ -395684,6 +395824,12 @@ "fc7265a48c393566ad8c9fe7b73281e4f5137b21", [] ] + }, + "wide-gamut-canvas": { + "WEB_FEATURES.yml": [ + "b4d11212a6c677339784cdab33e0e31b0b948379", + [] + ] } }, "path-objects": { @@ -395698,6 +395844,10 @@ "2d.path.stroke.prune.line-expected.txt": [ "7bd4ef9f49930d0268374f204580d962021e26ed", [] + ], + "WEB_FEATURES.yml": [ + "1bbef5e88d6630d820e2206f283ac38cffceb67d", + [] ] }, "reset": { @@ -395827,6 +395977,12 @@ "00ecdccad3743db0d0a1ec99850f80ea7964d512", [] ] + }, + "wide-gamut-canvas": { + "WEB_FEATURES.yml": [ + "b4d11212a6c677339784cdab33e0e31b0b948379", + [] + ] } }, "resources": { @@ -400620,6 +400776,14 @@ } } }, + "embedded-content": { + "the-img-element": { + "WEB_FEATURES.yml": [ + "5716baa5def9bd2af6813751aa7a93ffba64c4cd", + [] + ] + } + }, "iana": { "application-x-www-form-urlencoded": { "original-id.json": [ @@ -402458,6 +402622,10 @@ }, "scripting": { "the-script-element": { + "WEB_FEATURES.yml": [ + "864bd3398ee21fb62665a2d5c259a52acdd04232", + [] + ], "resources": { "script.js": [ "e69de29bb2d1d6434b8b29ae775ad8c2e48c5391", @@ -407048,11 +407216,7 @@ }, "interest-target": { "interesttarget-keyboard-invalidation-ref.html": [ - "0ba07b16f497203f231d03cc7908453c6ccc43c4", - [] - ], - "interesttarget-outline-appearance-ref.html": [ - "33b0cf668587f182caf87dfb98665a9301fca19a", + "9d520943d5f542a2aeb45ac6cb1417eb20c25477", [] ], "resources": { @@ -407064,6 +407228,10 @@ } }, "the-link-element": { + "WEB_FEATURES.yml": [ + "6a444ee171ad29c442d573fb2131b544820b6cad", + [] + ], "resources": { "stylesheet.css": [ "9d9d772fb468756d1a90f72325f89cd372f812ef", @@ -419640,6 +419808,10 @@ "da9bbc387f41ab069c27edc055962f72036b96f2", [] ], + "WEB_FEATURES.yml": [ + "f59321971a7668545949ee3212e54420e424c7ae", + [] + ], "prepare-device.js": [ "a12dbaf28717cf3776d9e34f5a12e4adaa7bae18", [] @@ -425389,7 +425561,7 @@ [] ], "basic-service-worker.js": [ - "17fccd448d2412287515f6176b0731189eb8eede", + "59d7d8bae9ee4d46d8a0bb12bcc3377d041280f4", [] ], "conditional-status.py": [ @@ -425401,7 +425573,7 @@ [] ], "counting-executor.py": [ - "cbcbc8eccb9bd8cf536c56cf576a4b5ea73ca44a", + "3511fe4905e2d8962175f0e4bc318a13c41c35f5", [] ], "executor.sub.html": [ @@ -426781,6 +426953,10 @@ } }, "embedded": { + "WEB_FEATURES.yml": [ + "8482e555584bf205a6afa11836b35d046976e0df", + [] + ], "attr-image-fetchpriority-expected.txt": [ "dfd64b1bf5e1a8f8c34ebf4a8f3868be9477e971", [] @@ -426949,7 +427125,7 @@ [] ], "idlharness.window-expected.txt": [ - "ddd140bc40e04997ad5bcc9f4d145d79a7717097", + "191a03bedf69fa49bd21ec18106df7854f8edc15", [] ], "interact": { @@ -427589,6 +427765,10 @@ } }, "scripted": { + "WEB_FEATURES.yml": [ + "864bd3398ee21fb62665a2d5c259a52acdd04232", + [] + ], "attr-script-fetchpriority-expected.txt": [ "c43e356287843b06e3429fe574c7eacb562b29e4", [] @@ -427822,7 +428002,7 @@ [] ], "presentation-attributes-special-cases-expected.txt": [ - "99f70997660ea4a116dcad52e1ac6cc2e6311a6f", + "7eedacbf2b3de581c7d282a03c7ce0689a91bb5a", [] ], "presentation-attributes-unknown-expected.txt": [ @@ -432949,7 +433129,7 @@ [] ], "__init__.py": [ - "955335ea87e7fc427104a9a4eab5ba7c9e338558", + "587dc91a9387d3047fa56fa85ad80612637b24fd", [] ], "browser": { @@ -434351,14 +434531,6 @@ "0d558a5a209158ebeaae5371e9af9560e9675900", [] ], - "builtin-function-properties.any-expected.txt": [ - "4dfe1fa6f9a310c7f4c02b1d8939262a9001a8c4", - [] - ], - "builtin-function-properties.any.worker-expected.txt": [ - "4dfe1fa6f9a310c7f4c02b1d8939262a9001a8c4", - [] - ], "constructors-expected.txt": [ "3494e660b555d60dc89398a704eac2b0fe8ac081", [] @@ -434409,10 +434581,6 @@ "f2bd10ae6ee5767c4a7311fba2596ddf0d954d51", [] ], - "legacy-factory-function-builtin-properties.window-expected.txt": [ - "7dc3162dab336d534e140a3dc8bf9e375aca61e5", - [] - ], "legacy-platform-object": { "OwnPropertyKeys-expected.txt": [ "ae36722d0c67d003c77448e6c4c3f72d949e7e8a", @@ -434650,7 +434818,7 @@ }, "resources": { "utils.js": [ - "50d7911a9181a5139d9e16f7c866112dc54d6d01", + "9d5cfc70c10187743807096421975a099f22afc9", [] ], "utils_validation.js": [ @@ -435130,7 +435298,7 @@ [] ], "RTCPeerConnection-insertable-streams.js": [ - "0bf820acde48058711163708b05d02e89501546b", + "f3873e1de4b12aa668f711dfbbf41cb9b2d0ac66", [] ], "RTCPeerConnection-sender-worker-single-frame.js": [ @@ -444460,7 +444628,7 @@ ] ], "idbcursor-request-source.any.js": [ - "2fe8c66f2e590b170a1456648e1dca74077464d8", + "8e1b34ee798a69c3d61386c5ae1f9adaeba6f21a", [ "IndexedDB/idbcursor-request-source.any.html", { @@ -485188,7 +485356,7 @@ ] ], "icon-blocked.sub.html": [ - "cc882347a1ac7b595275c2263ef266826e6f07bd", + "4c39e5dec735c10635a603356367610d3aad3fa2", [ null, {} @@ -485243,6 +485411,13 @@ {} ] ], + "img-src-targeting.html": [ + "3b4fe7c690b0b980a9626de0deb02c8950f5d4a0", + [ + null, + {} + ] + ], "img-src-wildcard-allowed.html": [ "050a4d14100bb1ef719d6700bfbd37a97424af59", [ @@ -488456,7 +488631,7 @@ ] ], "cookieListItem_attributes.https.any.js": [ - "6716d91788db746765593a2a95d34e1ecbb4e3a5", + "542bd6c53870b5baaa9ac0f75c2235079b7bfe88", [ "cookie-store/cookieListItem_attributes.https.any.html", { @@ -489210,7 +489385,7 @@ ] ], "httponly_cookies.https.window.js": [ - "8a10e358ef6de72d5476ae8dc8a571482881d7ef", + "605e94e67440aaedbcaa39f185270fe77b316ad3", [ "cookie-store/httponly_cookies.https.window.html", { @@ -528921,7 +529096,7 @@ ] ], "sibling-function-descriptors.tentative.html": [ - "d31d4acf499fb62f777817f24186e394626d507e", + "4987eff9b8d4ce6b662cabd0b7729499d7b3e704", [ null, {} @@ -533432,6 +533607,13 @@ {} ] ], + "css-filters-opacity-hit-testing.html": [ + "3b288fca4df13fcad7cfe0104c0f333aec73e45c", + [ + null, + {} + ] + ], "filter-sign-function.html": [ "97e5a26073b097728cf4571712bb9bd472ed69fd", [ @@ -533627,7 +533809,7 @@ }, "geometry": { "DOMMatrix-001.html": [ - "f578da076cbe6d7d7eb69b2cf438aa6f11a5c060", + "3436e17ced00de235f23117ed3a2bf8eba828a03", [ null, {} @@ -562305,6 +562487,15 @@ } ] ], + "orphan-keydown.html": [ + "0ab105d4d7284c19513a92241a9e16976fadefd0", + [ + null, + { + "testdriver": true + } + ] + ], "pointerdown.html": [ "2eb6ae898ccd006da1633a7f812dbcfc0fcbe9f1", [ @@ -564225,7 +564416,7 @@ ] ], "fedcm-disconnect.sub.https.html": [ - "2ea2d4a2599751cad941552964c700ced2f1b7cc", + "04fcd272dcf261a19cf71abb049e41c8b41abbbf", [ null, { @@ -577876,6 +578067,13 @@ } ] ], + "pragma-no-cache-with-cache-control.html": [ + "19a80fe5edc6fcfdaad36219bc608312f5d15a3b", + [ + null, + {} + ] + ], "split-cache.html": [ "c822abba3acee8db1079ad08dd7fbcbf38d9e3b9", [ @@ -578157,7 +578355,7 @@ }, "local-network-access": { "fetch.tentative.https.html": [ - "a01bad6a420d61e13188fda314232c6a31332623", + "649dd2309596fe38e650aa9dbaf661c845dc7f9c", [ null, { @@ -607820,6 +608018,13 @@ }, "windows": { "auxiliary-browsing-contexts": { + "named-lookup-noopener.html": [ + "91cf6ae6ee24611856b1a5eeb87f60b99cb82d64", + [ + null, + {} + ] + ], "named-lookup-scoped-to-browsing-context-group.html": [ "0450d479196a19535419c286fa2447580b344b25", [ @@ -637237,6 +637442,15 @@ } ] ], + "pointerdown-add-display-none.html": [ + "653944e155b71055761ab900f9f485ba812b46d2", + [ + null, + { + "testdriver": true + } + ] + ], "pointerdown-add-overflow-hidden.html": [ "ac953adfd874b19ab42379039dc26ac0efb67b7b", [ @@ -655735,6 +655949,15 @@ } ] ], + "interesttarget-partial-interest.tentative.html": [ + "bc7184d42d2528fe8e027e7af51463a796177ca9", + [ + null, + { + "testdriver": true + } + ] + ], "interesttarget-popover-focus.tentative.html": [ "9dfc39a37a60d438ecf9287d0ddffc0212e7a21c", [ @@ -699967,7 +700190,7 @@ ] ], "sanitizer-basic-filtering.tentative.html": [ - "0b6924b0980d8295d02a5ed3d552ba4e58beb212", + "38c764ae181418014488cf86126398158e653157", [ null, {} @@ -699994,6 +700217,13 @@ {} ] ], + "sanitizer-parseHTML.tentative.html": [ + "c4a31e2eb0365f67479968f4ce08117d04384889", + [ + null, + {} + ] + ], "sanitizer-removeUnsafe.tentative.html": [ "7ad8253ad5fdec29b79c590e50e9c0d211d17031", [ @@ -711453,7 +711683,7 @@ ] ], "interaction-with-paint-before-back.tentative.html": [ - "7b884f2bdb38945a346c3b5a8b178c04e88989ad", + "5961a6ebcdfdd2b10bf16173d3f0cece2733fa1c", [ null, { @@ -712687,6 +712917,75 @@ "timeout": "long" } ] + ], + "redirect.sub.https.html": [ + "f56f6bf09b9f61956e9297f8098677b846270d49", + [ + "speculation-rules/prefetch/tentative/service-worker/redirect.sub.https.html?origin=same-site&sc=in-in&sw=fetch-handler", + { + "timeout": "long" + } + ], + [ + "speculation-rules/prefetch/tentative/service-worker/redirect.sub.https.html?origin=same-site&sc=in-in&sw=fetch-handler-synthetic", + { + "timeout": "long" + } + ], + [ + "speculation-rules/prefetch/tentative/service-worker/redirect.sub.https.html?origin=same-site&sc=in-in&sw=fetch-handler-to-fallback", + { + "timeout": "long" + } + ], + [ + "speculation-rules/prefetch/tentative/service-worker/redirect.sub.https.html?origin=same-site&sc=in-in&sw=no-fetch-handler", + { + "timeout": "long" + } + ], + [ + "speculation-rules/prefetch/tentative/service-worker/redirect.sub.https.html?origin=same-site&sc=in-out&sw=fetch-handler", + { + "timeout": "long" + } + ], + [ + "speculation-rules/prefetch/tentative/service-worker/redirect.sub.https.html?origin=same-site&sc=in-out&sw=fetch-handler-synthetic", + { + "timeout": "long" + } + ], + [ + "speculation-rules/prefetch/tentative/service-worker/redirect.sub.https.html?origin=same-site&sc=in-out&sw=fetch-handler-to-fallback", + { + "timeout": "long" + } + ], + [ + "speculation-rules/prefetch/tentative/service-worker/redirect.sub.https.html?origin=same-site&sc=in-out&sw=no-fetch-handler", + { + "timeout": "long" + } + ], + [ + "speculation-rules/prefetch/tentative/service-worker/redirect.sub.https.html?origin=same-site&sc=out-in&sw=fetch-handler", + { + "timeout": "long" + } + ], + [ + "speculation-rules/prefetch/tentative/service-worker/redirect.sub.https.html?origin=same-site&sc=out-in&sw=fetch-handler-to-fallback", + { + "timeout": "long" + } + ], + [ + "speculation-rules/prefetch/tentative/service-worker/redirect.sub.https.html?origin=same-site&sc=out-in&sw=no-fetch-handler", + { + "timeout": "long" + } + ] ] } }, @@ -721461,7 +721760,7 @@ ], "crashtests": { "garbage-collection.any.js": [ - "cf10f7f2e8317ed16dd5fe3a967c6f26efd0a335", + "6e9d80c41425b13800717f9e27184f64f1514752", [ "streams/readable-streams/crashtests/garbage-collection.any.html", { @@ -726658,6 +726957,71 @@ } ] ], + "crashtests": { + "garbage-collection.any.js": [ + "a3796881c9fb544a0b446db39af233b3866ae2b9", + [ + "streams/writable-streams/crashtests/garbage-collection.any.html", + { + "script_metadata": [ + [ + "global", + "window,worker" + ], + [ + "script", + "/common/gc.js" + ] + ] + } + ], + [ + "streams/writable-streams/crashtests/garbage-collection.any.serviceworker.html", + { + "script_metadata": [ + [ + "global", + "window,worker" + ], + [ + "script", + "/common/gc.js" + ] + ] + } + ], + [ + "streams/writable-streams/crashtests/garbage-collection.any.sharedworker.html", + { + "script_metadata": [ + [ + "global", + "window,worker" + ], + [ + "script", + "/common/gc.js" + ] + ] + } + ], + [ + "streams/writable-streams/crashtests/garbage-collection.any.worker.html", + { + "script_metadata": [ + [ + "global", + "window,worker" + ], + [ + "script", + "/common/gc.js" + ] + ] + } + ] + ] + }, "error.any.js": [ "d08c8a54863bb9693e76116946bd118592d6928c", [ @@ -730321,7 +730685,7 @@ ] ], "idlharness.window.js": [ - "a26fa2bef6d71efea2981f1122b3455ffbac25cd", + "57beca77fd45b83f40fcdf378103d6f1c1c0940d", [ "svg/idlharness.window.html", { @@ -731485,7 +731849,7 @@ ] ], "presentation-attributes-special-cases.html": [ - "7bfa001030a0e0969d845e353a9d721d9ce940a0", + "9a5da751ce1ace3c277bfce3bf9b99352ac7786f", [ null, {} @@ -766353,7 +766717,7 @@ ] ], "conv2d.https.any.js": [ - "9fe246c9395c6cacf7e2f5245dac420e295707be", + "45fecb2b40cc399ace227264e881d2009d467cd2", [ "webnn/conformance_tests/conv2d.https.any.html?cpu", { @@ -766464,7 +766828,7 @@ ] ], "conv_transpose2d.https.any.js": [ - "67ce5dbaf65cc99ba7f2fdd02aaf2d9b3e9022ce", + "a17df911e4482de7e49874d84f5818694515e722", [ "webnn/conformance_tests/conv_transpose2d.https.any.html?cpu", { @@ -770553,7 +770917,7 @@ ] ], "log.https.any.js": [ - "011beef53aca200f5916dc51152fe745866989ec", + "8ed807b3401330e961f2ae9721f6378147580ddd", [ "webnn/conformance_tests/log.https.any.html?cpu", { @@ -772542,7 +772906,7 @@ ] ], "pooling.https.any.js": [ - "f385aab1f154387bbe35b171927d29684c8d5120", + "8f81ff565d232dec427381dfdae638cffceb0d91", [ "webnn/conformance_tests/pooling.https.any.html?cpu", { @@ -772875,7 +773239,7 @@ ] ], "qdq_subgraph.https.any.js": [ - "3b59c3bb49d6441a77e83309f48a97dd982aea74", + "5ec9ff80a22ce74bb9492b5bca747ce717c1ba46", [ "webnn/conformance_tests/qdq_subgraph.https.any.html?cpu", { @@ -776217,7 +776581,7 @@ ] ], "sign.https.any.js": [ - "4c3a330f850ca591bcc5a1b9c8fc784469ee821e", + "004c03bdf1339d74a84c95d5b03b31b56876d0fe", [ "webnn/conformance_tests/sign.https.any.html?cpu", { @@ -795947,7 +796311,7 @@ ], "tentative": { "RTCEncodedAudioFrame-clone.https.html": [ - "9f07713d4439c676fd7a5cc2f7d32af92a350e19", + "c93f8b3e54150b94334c33f30031d0b9f3afcd19", [ null, { @@ -795956,7 +796320,7 @@ ] ], "RTCEncodedAudioFrame-metadata.https.html": [ - "435e1c067834fe2050fd5c510f95516c5e6aeb61", + "df4577c5614a82afd7b02d988d0f15caa3b9e848", [ null, { @@ -834382,7 +834746,7 @@ ] ], "user_contexts.py": [ - "64c261637342868e90ee67a2332503e00fa96b0d", + "fa1e748d6b2a91addeb6c0569ebd271c00865fb8", [ null, {}
diff --git a/third_party/blink/web_tests/external/wpt/badging/WEB_FEATURES.yml b/third_party/blink/web_tests/external/wpt/badging/WEB_FEATURES.yml new file mode 100644 index 0000000..3c4f692 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/badging/WEB_FEATURES.yml
@@ -0,0 +1,3 @@ +features: +- name: badging + files: "**"
diff --git a/third_party/blink/web_tests/external/wpt/clear-site-data/WEB_FEATURES.yml b/third_party/blink/web_tests/external/wpt/clear-site-data/WEB_FEATURES.yml new file mode 100644 index 0000000..d55b5fa --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/clear-site-data/WEB_FEATURES.yml
@@ -0,0 +1,3 @@ +features: +- name: clear-site-data + files: "**"
diff --git a/third_party/blink/web_tests/external/wpt/content-security-policy/img-src/icon-blocked.sub.html b/third_party/blink/web_tests/external/wpt/content-security-policy/img-src/icon-blocked.sub.html index cc88234..4c39e5d 100644 --- a/third_party/blink/web_tests/external/wpt/content-security-policy/img-src/icon-blocked.sub.html +++ b/third_party/blink/web_tests/external/wpt/content-security-policy/img-src/icon-blocked.sub.html
@@ -12,6 +12,7 @@ var t_spv = async_test("Test that spv event is fired"); window.addEventListener("securitypolicyviolation", t_spv.step_func_done(function(e) { assert_equals(e.violatedDirective, 'img-src'); + assert_equals(e.target, document); assert_true(e.blockedURI.endsWith('/support/fail.png')); }));
diff --git a/third_party/blink/web_tests/external/wpt/content-security-policy/img-src/img-src-targeting.html b/third_party/blink/web_tests/external/wpt/content-security-policy/img-src/img-src-targeting.html new file mode 100644 index 0000000..3b4fe7c6 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/content-security-policy/img-src/img-src-targeting.html
@@ -0,0 +1,24 @@ +<!DOCTYPE html> +<html> +<head> + <meta http-equiv="Content-Security-Policy" content="img-src 'none';"> + <script src='/resources/testharness.js'></script> + <script src='/resources/testharnessreport.js'></script> +</head> +<body> +<p>Check that img-src sets correct target</p> + <script> + var t = async_test("Test that image does not load"); + var t_spv = async_test("Test that spv event is fired"); + window.addEventListener("securitypolicyviolation", t_spv.step_func_done(function(e) { + assert_equals(e.violatedDirective, 'img-src'); + assert_equals(e.target, document); + assert_true(e.blockedURI.endsWith('/support/fail.png')); + })); + </script> + <img src='/content-security-policy/support/fail.png' + onload='t.step(function() { assert_unreached("Image should not have loaded"); t.done(); });' + onerror='t.done();'> +</body> + +</html>
diff --git a/third_party/blink/web_tests/external/wpt/cookie-store/cookieListItem_attributes.https.any.js b/third_party/blink/web_tests/external/wpt/cookie-store/cookieListItem_attributes.https.any.js index 6716d91..542bd6c5 100644 --- a/third_party/blink/web_tests/external/wpt/cookie-store/cookieListItem_attributes.https.any.js +++ b/third_party/blink/web_tests/external/wpt/cookie-store/cookieListItem_attributes.https.any.js
@@ -207,3 +207,20 @@ const cookie = await cookieStore.get('cookie-name'); assert_equals(cookie.secure, true); }, 'CookieListItem - secure defaults to true'); + +promise_test(async testCase => { + await cookieStore.delete('cookie-name'); + testCase.add_cleanup(async () => { + await cookieStore.delete('cookie-name'); + }); + + let encodedCookie = encodeURIComponent(JSON.stringify("cookie-name=1; max-age=99999999999999999999999999999; path=/")); + await fetch(`/cookies/resources/cookie.py?set=${encodedCookie}`); + + assert_equals(document.cookie, "cookie-name=1", 'The cookie was set as expected.'); + + const cookie = await cookieStore.get('cookie-name'); + assert_equals(cookie.name, 'cookie-name'); + assert_equals(cookie.value, '1'); + assert_approx_equals(cookie.expires, kFourHundredDaysFromNow, kOneDay); +}, "Test max-age attribute over the 400 days");
diff --git a/third_party/blink/web_tests/external/wpt/cookie-store/httponly_cookies.https.window.js b/third_party/blink/web_tests/external/wpt/cookie-store/httponly_cookies.https.window.js index 8a10e35..605e94e 100644 --- a/third_party/blink/web_tests/external/wpt/cookie-store/httponly_cookies.https.window.js +++ b/third_party/blink/web_tests/external/wpt/cookie-store/httponly_cookies.https.window.js
@@ -67,3 +67,33 @@ 'cookie1=value1; cookie2=value2; cookie3=value3', 'httpOnly is not an option for CookieStore.set()'); }, 'HttpOnly cookies can not be set by CookieStore'); + +cookie_test(async t => { + await setCookieStringHttp('HTTPONLY-cookie=value; path=/; httponly'); + assert_equals( + await getCookieString(), + undefined, + 'HttpOnly cookie we wrote using HTTP in cookie jar' + + ' is invisible to script'); + assert_equals( + await getCookieStringHttp(), + 'HTTPONLY-cookie=value', + 'HttpOnly cookie we wrote using HTTP in HTTP cookie jar'); + + try { + await cookieStore.set('HTTPONLY-cookie', 'dummy'); + } catch(e) {} + + assert_equals( + await getCookieString(), + undefined, + 'HttpOnly cookie is not overwritten'); + + try { + await cookieStore.delete('HTTPONLY-cookie'); + } catch(e) {} + + assert_equals(await getCookieString(), undefined, 'HttpOnly cookie is not overwritten'); + + assert_equals(await getCookieStringHttp(), 'HTTPONLY-cookie=value', 'HttpOnly cookie is not deleted'); +}, 'HttpOnly cookies are not deleted/overwritten');
diff --git a/third_party/blink/web_tests/external/wpt/css/compositing/root-element-background-image-opaque-crash.html b/third_party/blink/web_tests/external/wpt/css/compositing/root-element-background-image-opaque-crash.html new file mode 100644 index 0000000..d380310 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/compositing/root-element-background-image-opaque-crash.html
@@ -0,0 +1,9 @@ +<!doctype html> +<style> + :root { + background-color: rgba(255, 255, 255, 0.98); + background-image: url(/images/computer.jpg); /* opaque */ + background-position: top left; + background-repeat: repeat; + } +</style>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-paint-stacking-context-001-ref.html b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-paint-stacking-context-001-ref.html index c755371..e2516f3d 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-paint-stacking-context-001-ref.html +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-paint-stacking-context-001-ref.html
@@ -1,62 +1,13 @@ <!DOCTYPE HTML> -<html> -<head> - <meta charset="utf-8"> - <title>CSS Reftest Reference</title> - <link rel="author" title="Yusuf Sermet" href="mailto:ysermet@mozilla.com"> - <style> - div { - position: relative; - width: 100px; - } - #div1, - #div3 { - background-color: #cfc; - } - #div1 { - z-index: 5; - } - #div2 { - z-index: 1; - background-color: #fdd; - height: 100px; - top: -20px; - } - #div2_1 { - background-color: #ffc; - z-index: 6; - top: -10px; - } - #div2_2 { - z-index: 3; - position: absolute; - top: -15px; - width: 40px; - height: 100px; - background-color: #ddf; - } - #div3 { - z-index: 2; - top: -50px; - } - </style> -</head> -<body> - <div id="div1"> - <br/><br/> - </div> - - <div id="div2"> - <div id="div2_1"> - <br/><br/> - </div> - - <div id="div2_2"> - </div> - </div> - - <div id="div3"> - <br/><br/> - </div> -</body> -</html> +<meta charset="utf-8"> +<title>Paint Containment Stacking Context Reference</title> +<link rel="author" title="Psychpsyo" href="mailto:psychpsyo@gmail.com"> +<style> + div { + width: 100px; + height: 100px; + background-color: green; + } +</style> +<div></div> +Test succeeds if there is no red.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-paint-stacking-context-001a.html b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-paint-stacking-context-001a.html index 71102b6..5e588cb 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-paint-stacking-context-001a.html +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-paint-stacking-context-001a.html
@@ -1,66 +1,32 @@ <!DOCTYPE HTML> -<html> -<head> - <meta charset="utf-8"> - <title>CSS Test: 'contain: paint' with stacking contents. Z-index is defined only for siblings and children.</title> - <link rel="author" title="Yusuf Sermet" href="mailto:ysermet@mozilla.com"> - - <link rel="help" href="https://drafts.csswg.org/css2/visuren.html#x43"> - <link rel="help" href="https://drafts.csswg.org/css-contain/#containment-paint"> - <link rel="match" href="contain-paint-stacking-context-001-ref.html"> - <style> - div { - position: relative; - width: 100px; - } - #div1, - #div3 { - background-color: #cfc; - } - #div1 { - z-index: 5; - } - #div2 { - contain: paint; - background-color: #fdd; - height: 100px; - top: -20px; - } - #div2_1 { - background-color: #ffc; - z-index: 6; - top: -10px; - } - #div2_2 { - z-index: 3; - position: absolute; - top: -15px; - width: 40px; - height: 100px; - background-color: #ddf; - } - #div3 { - z-index: 2; - top: -50px; - } - </style> -</head> -<body> - <div id="div1"> - <br/><br/> - </div> - - <div id="div2"> - <div id="div2_1"> - <br/><br/> - </div> - - <div id="div2_2"> - </div> - </div> - - <div id="div3"> - <br/><br/> - </div> -</body> -</html> +<title>'contain: paint' establishes stacking context.</title> +<link rel="author" title="Psychpsyo" href="mailto:psychpsyo@gmail.com"> +<link rel="help" href="https://drafts.csswg.org/css2/visuren.html#x43"> +<link rel="help" href="https://drafts.csswg.org/css-contain/#containment-paint"> +<link rel="match" href="contain-paint-stacking-context-001-ref.html"> +<style> + div { + width: 100px; + height: 100px; + } + #front { + background-color: green; + /* makes a stacking context and puts this on top */ + position: absolute; + z-index: 10; + } + #back { + contain: paint; + } + #notOnTop { + background-color: red; + /* z-index is higher than on #front, but this should still be covered up because it is inside #back, which has 'contain: paint' */ + position: absolute; + z-index: 1000; + } +</style> +<div id="front"></div> +<div id="back"> + <div id="notOnTop"></div> +</div> +Test succeeds if there is no red.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-paint-stacking-context-001b.html b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-paint-stacking-context-001b.html index 0c4d332..e033237 100644 --- a/third_party/blink/web_tests/external/wpt/css/css-contain/contain-paint-stacking-context-001b.html +++ b/third_party/blink/web_tests/external/wpt/css/css-contain/contain-paint-stacking-context-001b.html
@@ -1,66 +1,32 @@ <!DOCTYPE HTML> -<html> -<head> - <meta charset="utf-8"> - <title>CSS Test: 'will-change: contain' with stacking contents. Z-index is defined only for siblings and children.</title> - <link rel="author" title="Yusuf Sermet" href="mailto:ysermet@mozilla.com"> - - <link rel="help" href="https://drafts.csswg.org/css2/visuren.html#x43"> - <link rel="help" href="https://drafts.csswg.org/css-contain/#containment-paint"> - <link rel="match" href="contain-paint-stacking-context-001-ref.html"> - <style> - div { - position: relative; - width: 100px; - } - #div1, - #div3 { - background-color: #cfc; - } - #div1 { - z-index: 5; - } - #div2 { - will-change: contain; - background-color: #fdd; - height: 100px; - top: -20px; - } - #div2_1 { - background-color: #ffc; - z-index: 6; - top: -10px; - } - #div2_2 { - z-index: 3; - position: absolute; - top: -15px; - width: 40px; - height: 100px; - background-color: #ddf; - } - #div3 { - z-index: 2; - top: -50px; - } - </style> -</head> -<body> - <div id="div1"> - <br/><br/> - </div> - - <div id="div2"> - <div id="div2_1"> - <br/><br/> - </div> - - <div id="div2_2"> - </div> - </div> - - <div id="div3"> - <br/><br/> - </div> -</body> -</html> +<title>'will-change: contain' establishes stacking context.</title> +<link rel="author" title="Psychpsyo" href="mailto:psychpsyo@gmail.com"> +<link rel="help" href="https://drafts.csswg.org/css2/visuren.html#x43"> +<link rel="help" href="https://drafts.csswg.org/css-contain/#containment-paint"> +<link rel="match" href="contain-paint-stacking-context-001-ref.html"> +<style> + div { + width: 100px; + height: 100px; + } + #front { + background-color: green; + /* makes a stacking context and puts this on top */ + position: absolute; + z-index: 10; + } + #back { + will-change: contain; + } + #notOnTop { + background-color: red; + /* z-index is higher than on #front, but this should still be covered up because it is inside #back, which has 'will-change: contain' */ + position: absolute; + z-index: 1000; + } +</style> +<div id="front"></div> +<div id="back"> + <div id="notOnTop"></div> +</div> +Test succeeds if there is no red.
diff --git a/third_party/blink/web_tests/external/wpt/css/css-gaps/agnostic/gap-decorations-002-ref.html b/third_party/blink/web_tests/external/wpt/css/css-gaps/agnostic/gap-decorations-002-ref.html new file mode 100644 index 0000000..42c5ef12 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-gaps/agnostic/gap-decorations-002-ref.html
@@ -0,0 +1,51 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com"> +<style> + body { + margin: 0px; + } + + .container { + display: flex; + width: 120px; + height: 110px; + column-gap: 20px; + row-gap: 10px; + flex-wrap: wrap; + } + + .item { + background: skyblue; + height: 50px; + width: 50px; + margin: 0; + } + + .row-gap { + position: absolute; + top: 50px; + background: gold; + width: 120px; + height: 10px; + } + + .column-gap { + position: absolute; + top: 0px; + left: 50px; + background: blue; + height: 110px; + width: 20px; + } + +</style> +<div class="container"> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> + <div class="item"></div> +</div> + +<div class="row-gap"></div> +<div class="column-gap"></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-gaps/flex/flex-gap-decorations-022.html b/third_party/blink/web_tests/external/wpt/css/css-gaps/flex/flex-gap-decorations-022.html new file mode 100644 index 0000000..5f3b512e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-gaps/flex/flex-gap-decorations-022.html
@@ -0,0 +1,46 @@ +<!DOCTYPE html> +<title> + CSS Gap Decorations: flex column gaps are painted with different sized gaps and row-rule-outset 0. +</title> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="match" href="../agnostic/gap-decorations-002-ref.html"> +<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com"> +<style> + body { + margin: 0px; + } + + .flex-container { + height: 110px; + width: 120px; + + display: flex; + + column-gap: 20px; + row-gap: 10px; + + column-rule-color: blue; + column-rule-style: solid; + column-rule-width: 20px; + + row-rule-color: gold; + row-rule-style: solid; + row-rule-width: 10px; + + row-rule-break: intersection; + row-rule-outset: 0; + + flex-wrap: wrap; + } + + .flex-item { + background: skyblue; + width: 50px; + } +</style> +<div class="flex-container"> + <div class="flex-item"></div> + <div class="flex-item"></div> + <div class="flex-item"></div> + <div class="flex-item"></div> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-gaps/grid/grid-gap-decorations-38.html b/third_party/blink/web_tests/external/wpt/css/css-gaps/grid/grid-gap-decorations-38.html new file mode 100644 index 0000000..8b87bcd --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-gaps/grid/grid-gap-decorations-38.html
@@ -0,0 +1,44 @@ +<!DOCTYPE html> +<title> + CSS Gap Decorations: grid column gaps are painted with different sized gaps and column-rule-outset 0. +</title> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="match" href="../agnostic/gap-decorations-002-ref.html"> +<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com"> +<style> + body { + margin: 0px; + } + + .grid-container { + height: 110px; + width: 120px; + + display: grid; + grid-template-columns: repeat(2, 1fr); + + column-gap: 20px; + row-gap: 10px; + + column-rule-color: blue; + column-rule-style: solid; + column-rule-width: 20px; + + row-rule-color: gold; + row-rule-style: solid; + row-rule-width: 10px; + + row-rule-break: intersection; + row-rule-outset: 0; + } + + .grid-item { + background: skyblue; + } +</style> +<div class="grid-container"> + <div class="grid-item"></div> + <div class="grid-item"></div> + <div class="grid-item"></div> + <div class="grid-item"></div> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-gaps/multicol/multicol-gap-decorations-017-ref.html b/third_party/blink/web_tests/external/wpt/css/css-gaps/multicol/multicol-gap-decorations-017-ref.html new file mode 100644 index 0000000..23fd089 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-gaps/multicol/multicol-gap-decorations-017-ref.html
@@ -0,0 +1,49 @@ +<!DOCTYPE html> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com"> +<style> + body { + margin: 0px; + } + + .container { + border: 2px solid rgb(96 139 168); + width: 210px; + height: 130px; + column-gap: 20px; + display: flex; + } + + .items { + background: rgb(96 139 168 / 0.2); + height: 130px; + margin: 0px; + width: 56.666px; + } + + .row-gap { + position: absolute; + height: 10px; + width: 210px; + background: gold; + left: 2px; + top: 62px; + } + + .column-gap { + position: absolute; + height: 130px; + width: 20px; + background: blue; + top: 2px; + } +</style> + +<div class="container"> + <div class="items"></div> + <div class="items"></div> + <div class="items"></div> +</div> +<div class="row-gap"></div> +<div class="column-gap" style="left:58.666px;"></div> +<div class="column-gap" style="left:135.332px;"></div>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-gaps/multicol/multicol-gap-decorations-017.html b/third_party/blink/web_tests/external/wpt/css/css-gaps/multicol/multicol-gap-decorations-017.html new file mode 100644 index 0000000..c7d1fe42 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-gaps/multicol/multicol-gap-decorations-017.html
@@ -0,0 +1,48 @@ +<!DOCTYPE html> +<title> + CSS Gap Decorations: Multicolumn gap decorations painted with column-wrap and with different sized gaps and row-rule-outset 0. +</title> +<link rel="help" href="https://drafts.csswg.org/css-gaps-1/"> +<link rel="match" href="multicol-gap-decorations-017-ref.html"> +<link rel="author" title="Javier Contreras" href="mailto:javiercon@microsoft.com"> +<style> + body { + margin: 0px; + } + + .container { + border: 2px solid rgb(96 139 168); + width: 210px; + height: 130px; + column-count: 3; + column-width: 56.666px; + column-height: 60px; + column-gap: 20px; + row-gap: 10px; + column-rule-width: 20px; + column-rule-style: solid; + column-rule-color: blue; + row-rule-width: 10px; + row-rule-style: solid; + row-rule-color: gold; + column-wrap: wrap; + + row-rule-break: intersection; + row-rule-outset: 0; + } + + p { + background: rgb(96 139 168 / 0.2); + height: 60px; + margin: 0px; + } +</style> + +<div class="container"> + <p></p> + <p></p> + <p></p> + <p></p> + <p></p> + <p></p> +</div>
diff --git a/third_party/blink/web_tests/external/wpt/css/filter-effects/css-filters-opacity-hit-testing.html b/third_party/blink/web_tests/external/wpt/css/filter-effects/css-filters-opacity-hit-testing.html new file mode 100644 index 0000000..3b288fca --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/filter-effects/css-filters-opacity-hit-testing.html
@@ -0,0 +1,19 @@ +<!DOCTYPE html> +<title>Elements with 'opacity: 0' should respond to hit testing.</title> +<link rel="author" title="Psychpsyo" href="psychpsyo@gmail.com"> +<link rel="help" href="https://drafts.fxtf.org/filter-effects/#FilterProperty"> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<style> + div { + width: 100px; + height: 100px; + opacity: 0; + } +</style> +<div></div> +<script> + test(() => { + assert_equals(document.elementFromPoint(50, 50).tagName, "DIV", "element with 'opacity: 0' doesn't respond to hit testing"); + }); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/css/mediaqueries/WEB_FEATURES.yml b/third_party/blink/web_tests/external/wpt/css/mediaqueries/WEB_FEATURES.yml index 24027360..7f15b7f 100644 --- a/third_party/blink/web_tests/external/wpt/css/mediaqueries/WEB_FEATURES.yml +++ b/third_party/blink/web_tests/external/wpt/css/mediaqueries/WEB_FEATURES.yml
@@ -25,3 +25,7 @@ - name: update files: - update-media-feature.html +- name: scripting + files: + - scripting.html + - scripting-*
diff --git a/third_party/blink/web_tests/external/wpt/event-timing/orphan-keydown.html b/third_party/blink/web_tests/external/wpt/event-timing/orphan-keydown.html new file mode 100644 index 0000000..0ab105d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/event-timing/orphan-keydown.html
@@ -0,0 +1,34 @@ +<!DOCTYPE html> +<html> +<meta charset=utf-8 /> +<title>Event Timing: orphan keydown.</title> +<script src=/resources/testharness.js></script> +<script src=/resources/testharnessreport.js></script> +<script src=/resources/testdriver.js></script> +<script src=/resources/testdriver-actions.js></script> +<script src=/resources/testdriver-vendor.js></script> +<script src=resources/event-timing-test-utils.js></script> + +<body> + <button id='target'>Click me</button> + + <script> + let observedEntries = []; + const map = new Map(); + const events = ['keydown']; + + promise_test(async t => { + assert_implements(window.PerformanceEventTiming, 'Event Timing is not supported.'); + + const callback = (entryList) => {observedEntries = observedEntries.concat(entryList.getEntries().filter(filterAndAddToMap(events, map))); }; + const readyToResolve = () => { return observedEntries.length >= 1; }; + const observerPromise = createPerformanceObserverPromise(['event'], callback, readyToResolve); + + await interactAndObserve('orphan-keydown', document.getElementById('target'), observerPromise); + + assert_equals(observedEntries.length, 1, "Keydown without a keyup should be fired properly."); + assert_greater_than(map.get('keydown'), 0, "Should have a non-trivial interactionId.") + }, "Event Timing: Orphan keydown should be measured as an interaction."); + </script> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/event-timing/resources/event-timing-test-utils.js b/third_party/blink/web_tests/external/wpt/event-timing/resources/event-timing-test-utils.js index 59c78ebf..afad67b 100644 --- a/third_party/blink/web_tests/external/wpt/event-timing/resources/event-timing-test-utils.js +++ b/third_party/blink/web_tests/external/wpt/event-timing/resources/event-timing-test-utils.js
@@ -554,6 +554,17 @@ interactionPromise = textSelectionAndBlockMain(target, 30); break; } + case 'orphan-keydown': { + addListeners(target, ['keydown']); + interactionPromise = new test_driver.Actions() + .pointerMove(0, 0, {origin: target}) + .pointerDown() + .pointerUp() + .addTick() + .keyDown('a') + .send(); + break; + } } return Promise.all([interactionPromise, observerPromise]); }
diff --git a/third_party/blink/web_tests/external/wpt/fetch/api/request/WEB_FEATURES.yml b/third_party/blink/web_tests/external/wpt/fetch/api/request/WEB_FEATURES.yml new file mode 100644 index 0000000..69b2ea58 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/api/request/WEB_FEATURES.yml
@@ -0,0 +1,4 @@ +features: +- name: fetch-priority + files: + - request-init-priority.any.js
diff --git a/third_party/blink/web_tests/external/wpt/fetch/http-cache/pragma-no-cache-with-cache-control.html b/third_party/blink/web_tests/external/wpt/fetch/http-cache/pragma-no-cache-with-cache-control.html new file mode 100644 index 0000000..19a80fe --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/http-cache/pragma-no-cache-with-cache-control.html
@@ -0,0 +1,28 @@ +<!DOCTYPE html> +<meta charset="utf-8"> +<title>HTTP Cache: Cache-Control with Pragma: no-cache</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<body> +<script> +promise_test(async t => { + // According to https://www.rfc-editor.org/rfc/rfc9111.html#name-pragma + // the pragma header is deprecated. + // When there's a mismatch between pragma and Cache-Control then the latter + // should be respected, and the resource should be cached. + const url = 'resources/cached_pragma_rand.py' + + // First fetch to populate the cache + const response1 = await fetch(url, { cache: 'default' }); + assert_true(response1.ok, 'First fetch should succeed'); + const text1 = await response1.text(); + + // Second fetch should be served from cache + const response2 = await fetch(url, { cache: 'default' }); + assert_true(response2.ok, 'Second fetch should succeed'); + const text2 = await response2.text(); + + assert_equals(text1, text2, 'Responses should be identical, indicating caching'); +}, 'Response with Cache-Control: max-age=2592000, public and Pragma: no-cache should be cached'); +</script> +</body>
diff --git a/third_party/blink/web_tests/external/wpt/fetch/http-cache/resources/cached_pragma_rand.py b/third_party/blink/web_tests/external/wpt/fetch/http-cache/resources/cached_pragma_rand.py new file mode 100644 index 0000000..18c7d251 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/fetch/http-cache/resources/cached_pragma_rand.py
@@ -0,0 +1,14 @@ +def main(request, response): + # Disable non-standard XSS protection + response.headers.set(b"X-XSS-Protection", b"0") + response.headers.set(b"Content-Type", b"text/html") + + # Set caching headers + # According to rfc9111 Pragma: no-cache is deprecated, so we expect + # Cache-Control to take precedence when there's a mismatch. + response.headers.set(b"Cache-Control", b"max-age=2592000, public") + response.headers.set(b"Pragma", b"no-cache") + + # Include a timestamp to verify caching behavior + import time + response.content = f"Timestamp: {time.time()}".encode('utf-8')
diff --git a/third_party/blink/web_tests/external/wpt/file-system-access/WEB_FEATURES.yml b/third_party/blink/web_tests/external/wpt/file-system-access/WEB_FEATURES.yml index 45e40acb..7faf679 100644 --- a/third_party/blink/web_tests/external/wpt/file-system-access/WEB_FEATURES.yml +++ b/third_party/blink/web_tests/external/wpt/file-system-access/WEB_FEATURES.yml
@@ -1,3 +1,7 @@ features: - name: file-system-access files: "**" +- name: origin-private-file-system + files: + - getDirectory.https.any.js + - opaque-origin.https.window.js
diff --git a/third_party/blink/web_tests/external/wpt/html/browsers/windows/auxiliary-browsing-contexts/named-lookup-noopener.html b/third_party/blink/web_tests/external/wpt/html/browsers/windows/auxiliary-browsing-contexts/named-lookup-noopener.html new file mode 100644 index 0000000..91cf6ae --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/browsers/windows/auxiliary-browsing-contexts/named-lookup-noopener.html
@@ -0,0 +1,49 @@ +<!DOCTYPE html> +<title>Named lookup does not work with noopener</title> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/utils.js"></script> +<script src="/common/dispatcher/dispatcher.js"></script> +<script src="/html/browsers/browsing-the-web/remote-context-helper/resources/remote-context-helper.js"></script> +<link rel="help" href="https://github.com/whatwg/html/issues/11291"> + +<body> +<script> + +promise_test(async t => { + const windowName = 'named-window'; + + const rcHelper = new RemoteContextHelper(); + const rcPopup1 = await rcHelper.addWindow(undefined, { target: windowName, features: 'noopener' }); + const rcPopup2 = await rcHelper.addWindow(undefined, { target: windowName, features: 'noopener' }); + + // If both scripts execute, then the windows are separate, and the test passes. + // If the window is reused, then rcPopup1 will not be able to execute script, and so the test will timeout. + + assert_equals(await rcPopup1.executeScript(() => window.name), windowName); + assert_equals(await rcPopup2.executeScript(() => window.name), windowName); +}, 'Two noopener window.open() calls create separate windows'); + +promise_test(async t => { + const windowName = 'named-window-2'; + + function executorCreator(url) { + const a = document.createElement("a"); + a.href = url; + a.rel = 'noopener'; + a.target = windowName; + document.body.append(a); + a.click(); + } + + const rcHelper = new RemoteContextHelper(); + const rcPopup1 = await rcHelper.createContext({ executorCreator }); + const rcPopup2 = await rcHelper.createContext({ executorCreator }); + + // If both scripts execute, then the windows are separate, and the test passes. + // If the window is reused, then rcPopup1 will not be able to execute script, and so the test will timeout. + + assert_equals(await rcPopup1.executeScript(() => window.name), windowName); + assert_equals(await rcPopup2.executeScript(() => window.name), windowName); +}, 'Two rel=noopener <a href> clicks create separate windows'); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/wide-gamut-canvas/WEB_FEATURES.yml b/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/wide-gamut-canvas/WEB_FEATURES.yml new file mode 100644 index 0000000..b4d11212 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/canvas/element/manual/wide-gamut-canvas/WEB_FEATURES.yml
@@ -0,0 +1,3 @@ +features: +- name: canvas-2d-color-management + files: "**"
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/element/path-objects/WEB_FEATURES.yml b/third_party/blink/web_tests/external/wpt/html/canvas/element/path-objects/WEB_FEATURES.yml new file mode 100644 index 0000000..1bbef5e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/canvas/element/path-objects/WEB_FEATURES.yml
@@ -0,0 +1,4 @@ +features: +- name: canvas-roundrect + files: + - 2d.path.roundrect.*
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/element/wide-gamut-canvas/WEB_FEATURES.yml b/third_party/blink/web_tests/external/wpt/html/canvas/element/wide-gamut-canvas/WEB_FEATURES.yml new file mode 100644 index 0000000..b4d11212 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/canvas/element/wide-gamut-canvas/WEB_FEATURES.yml
@@ -0,0 +1,3 @@ +features: +- name: canvas-2d-color-management + files: "**"
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/manual/wide-gamut-canvas/WEB_FEATURES.yml b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/manual/wide-gamut-canvas/WEB_FEATURES.yml new file mode 100644 index 0000000..b4d11212 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/manual/wide-gamut-canvas/WEB_FEATURES.yml
@@ -0,0 +1,3 @@ +features: +- name: canvas-2d-color-management + files: "**"
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/path-objects/WEB_FEATURES.yml b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/path-objects/WEB_FEATURES.yml new file mode 100644 index 0000000..1bbef5e --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/path-objects/WEB_FEATURES.yml
@@ -0,0 +1,4 @@ +features: +- name: canvas-roundrect + files: + - 2d.path.roundrect.*
diff --git a/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/wide-gamut-canvas/WEB_FEATURES.yml b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/wide-gamut-canvas/WEB_FEATURES.yml new file mode 100644 index 0000000..b4d11212 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/canvas/offscreen/wide-gamut-canvas/WEB_FEATURES.yml
@@ -0,0 +1,3 @@ +features: +- name: canvas-2d-color-management + files: "**"
diff --git a/third_party/blink/web_tests/external/wpt/html/editing/dnd/platform/pointerdown-add-display-none.html b/third_party/blink/web_tests/external/wpt/html/editing/dnd/platform/pointerdown-add-display-none.html new file mode 100644 index 0000000..653944e15 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/editing/dnd/platform/pointerdown-add-display-none.html
@@ -0,0 +1,65 @@ +<!doctype html> +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/resources/testdriver.js"></script> +<script src="/resources/testdriver-vendor.js"></script> +<script src="/resources/testdriver-actions.js"></script> +<head> +<title>Test dragging still occurs when pointerdown adds display:none to the dragged element</title> +<style> +.dragging { + display: none; +} + +#dragBox { + width: 200px; + height: 200px; + background-color: #4CAF50; + color: white; + border-radius: 8px; + cursor: grab; + user-select: none; + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; +} + +.inner { + background: rgba(255, 255, 255, 0.2); + padding: 10px; + margin-top: 10px; + border-radius: 4px; +} +</style> +</head> +<body> +<div id="dragBox" draggable="true"> + Drag me + <div class="inner" id="innerButton">Click or press here</div> +</div> +<script> + +promise_test(function() { + return new Promise(r => { + innerButton.addEventListener("pointerdown", function() { + innerButton.classList.add("dragging"); + }); + + dragBox.addEventListener("dragstart", function(e) { + assert_equals(e.target, dragBox); + r(); + }); + + const buttonRect = innerButton.getBoundingClientRect(); + new test_driver.Actions() + .pointerMove(0, 0, {origin: innerButton}) + .pointerDown() + .pointerMove(buttonRect.left + 10, buttonRect.top + 10) + .pointerUp() + .send(); + }); +}, "dragstart should still fire when the dragged element gets display:none in its pointerdown"); +</script> +</body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/html/embedded-content/the-img-element/WEB_FEATURES.yml b/third_party/blink/web_tests/external/wpt/html/embedded-content/the-img-element/WEB_FEATURES.yml new file mode 100644 index 0000000..5716baa --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/embedded-content/the-img-element/WEB_FEATURES.yml
@@ -0,0 +1,4 @@ +features: +- name: fetch-priority + files: + - attr-img-fetchpriority.html
diff --git a/third_party/blink/web_tests/external/wpt/html/scripting/the-script-element/WEB_FEATURES.yml b/third_party/blink/web_tests/external/wpt/html/scripting/the-script-element/WEB_FEATURES.yml new file mode 100644 index 0000000..864bd33 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/scripting/the-script-element/WEB_FEATURES.yml
@@ -0,0 +1,4 @@ +features: +- name: fetch-priority + files: + - attr-script-fetchpriority.html
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/the-link-element/WEB_FEATURES.yml b/third_party/blink/web_tests/external/wpt/html/semantics/the-link-element/WEB_FEATURES.yml new file mode 100644 index 0000000..6a444ee --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/semantics/the-link-element/WEB_FEATURES.yml
@@ -0,0 +1,4 @@ +features: +- name: fetch-priority + files: + - attr-link-fetchpriority.html
diff --git a/third_party/blink/web_tests/external/wpt/remote-playback/WEB_FEATURES.yml b/third_party/blink/web_tests/external/wpt/remote-playback/WEB_FEATURES.yml new file mode 100644 index 0000000..f593219 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/remote-playback/WEB_FEATURES.yml
@@ -0,0 +1,3 @@ +features: +- name: remote-playback + files: "**"
diff --git a/third_party/blink/web_tests/external/wpt/soft-navigation-heuristics/smoke/tentative/basic.html b/third_party/blink/web_tests/external/wpt/soft-navigation-heuristics/smoke/tentative/basic.html new file mode 100644 index 0000000..9bfedf09 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/soft-navigation-heuristics/smoke/tentative/basic.html
@@ -0,0 +1,67 @@ +<!doctype html> +<html> + <head> + <meta charset="utf-8" /> + <title>Soft Navigation Detection: The Basics.</title> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> + <script src="/resources/testdriver.js"></script> + <script src="/resources/testdriver-vendor.js"></script> + <script> + // The click handler is triggered by user interaction; it modifies + // the DOM, causing a paint, and also changes the URL. + // This constitutes a soft navigation. + function clickHandler() { + const greeting = document.createElement("div"); + greeting.textContent = "Hello, World."; + document.body.appendChild(greeting); + history.pushState({}, "", "/greeting.html"); + } + </script> + </head> + <body> + <div id="click-target" onclick="clickHandler()">Click here!</div> + + <script> + test(() => { + const observer = new PerformanceObserver(() => {}); + observer.observe({ type: "soft-navigation", buffered: true }); + const records = observer.takeRecords(); + observer.disconnect(); + assert_equals(records.length, 0, "Expecting empty list."); + }, "No soft navigation detection without user interaction."); + + promise_test(async (t) => { + const test_origin = new URL(location.href).origin; + + let entries; + new PerformanceObserver((list, observer) => { + entries = list.getEntries(); + observer.disconnect(); + }).observe({ type: "soft-navigation" }); + + // Initiate the user interaction to trigger the soft navigation. + if (test_driver) { + test_driver.click(document.getElementById("click-target")); + } + + await t.step_wait( + () => entries !== undefined, + "Waiting for entries from PerformanceObserver.", + ); + + // Now check there's one entry, and it's fields. + // The SoftNavigationEntry instance is spec'd in + // https://github.com/WICG/soft-navigations/ + assert_equals(entries.length, 1, "Expecting one soft navigation entry."); + + const expected_url = new URL("/greeting.html", test_origin); + assert_equals( + entries[0].name, + expected_url.toString(), + "Soft navigation should record destination URL as its name.", + ); + }, "Detect soft navigation after a click."); + </script> + </body> +</html>
diff --git a/third_party/blink/web_tests/external/wpt/svg/embedded/WEB_FEATURES.yml b/third_party/blink/web_tests/external/wpt/svg/embedded/WEB_FEATURES.yml new file mode 100644 index 0000000..8482e555 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/svg/embedded/WEB_FEATURES.yml
@@ -0,0 +1,4 @@ +features: +- name: fetch-priority + files: + - attr-image-fetchpriority.html
diff --git a/third_party/blink/web_tests/external/wpt/svg/idlharness.window-expected.txt b/third_party/blink/web_tests/external/wpt/svg/idlharness.window-expected.txt index ddd140b..191a03be 100644 --- a/third_party/blink/web_tests/external/wpt/svg/idlharness.window-expected.txt +++ b/third_party/blink/web_tests/external/wpt/svg/idlharness.window-expected.txt
@@ -1,5 +1,5 @@ This is a testharness.js-based test. -Found 173 FAIL, 0 TIMEOUT, 0 NOTRUN. +Found 154 FAIL, 0 TIMEOUT, 0 NOTRUN. [FAIL] SVGElement interface: attribute correspondingElement assert_true: The prototype object must have a property "correspondingElement" expected true got false [FAIL] SVGElement interface: attribute correspondingUseElement @@ -308,43 +308,5 @@ assert_own_property: self does not have own property "SVGDiscardElement" expected property "SVGDiscardElement" missing [FAIL] SVGDiscardElement interface: existence and properties of interface prototype object's @@unscopables property assert_own_property: self does not have own property "SVGDiscardElement" expected property "SVGDiscardElement" missing -[FAIL] SVGDiscardElement must be primary interface of objects.discard - assert_own_property: self does not have own property "SVGDiscardElement" expected property "SVGDiscardElement" missing -[FAIL] Stringification of objects.discard - assert_class_string: class string of objects.discard expected "[object SVGDiscardElement]" but got "[object SVGElement]" -[FAIL] SVGAnimationElement interface: objects.discard must inherit property "targetElement" with the proper type - assert_inherits: property "targetElement" not found in prototype chain -[FAIL] SVGAnimationElement interface: objects.discard must inherit property "onbegin" with the proper type - assert_inherits: property "onbegin" not found in prototype chain -[FAIL] SVGAnimationElement interface: objects.discard must inherit property "onend" with the proper type - assert_inherits: property "onend" not found in prototype chain -[FAIL] SVGAnimationElement interface: objects.discard must inherit property "onrepeat" with the proper type - assert_inherits: property "onrepeat" not found in prototype chain -[FAIL] SVGAnimationElement interface: objects.discard must inherit property "getStartTime()" with the proper type - assert_inherits: property "getStartTime" not found in prototype chain -[FAIL] SVGAnimationElement interface: objects.discard must inherit property "getCurrentTime()" with the proper type - assert_inherits: property "getCurrentTime" not found in prototype chain -[FAIL] SVGAnimationElement interface: objects.discard must inherit property "getSimpleDuration()" with the proper type - assert_inherits: property "getSimpleDuration" not found in prototype chain -[FAIL] SVGAnimationElement interface: objects.discard must inherit property "beginElement()" with the proper type - assert_inherits: property "beginElement" not found in prototype chain -[FAIL] SVGAnimationElement interface: objects.discard must inherit property "beginElementAt(float)" with the proper type - assert_inherits: property "beginElementAt" not found in prototype chain -[FAIL] SVGAnimationElement interface: calling beginElementAt(float) on objects.discard with too few arguments must throw TypeError - assert_inherits: property "beginElementAt" not found in prototype chain -[FAIL] SVGAnimationElement interface: objects.discard must inherit property "endElement()" with the proper type - assert_inherits: property "endElement" not found in prototype chain -[FAIL] SVGAnimationElement interface: objects.discard must inherit property "endElementAt(float)" with the proper type - assert_inherits: property "endElementAt" not found in prototype chain -[FAIL] SVGAnimationElement interface: calling endElementAt(float) on objects.discard with too few arguments must throw TypeError - assert_inherits: property "endElementAt" not found in prototype chain -[FAIL] SVGAnimationElement interface: objects.discard must inherit property "requiredExtensions" with the proper type - assert_inherits: property "requiredExtensions" not found in prototype chain -[FAIL] SVGAnimationElement interface: objects.discard must inherit property "systemLanguage" with the proper type - assert_inherits: property "systemLanguage" not found in prototype chain -[FAIL] SVGElement interface: objects.discard must inherit property "correspondingElement" with the proper type - assert_inherits: property "correspondingElement" not found in prototype chain -[FAIL] SVGElement interface: objects.discard must inherit property "correspondingUseElement" with the proper type - assert_inherits: property "correspondingUseElement" not found in prototype chain Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/external/wpt/svg/idlharness.window.js b/third_party/blink/web_tests/external/wpt/svg/idlharness.window.js index a26fa2be..57beca7 100644 --- a/third_party/blink/web_tests/external/wpt/svg/idlharness.window.js +++ b/third_party/blink/web_tests/external/wpt/svg/idlharness.window.js
@@ -42,7 +42,6 @@ 'script', 'animate', 'set', - 'discard', 'animateMotion', 'mpath', 'animateTransform', @@ -167,7 +166,6 @@ SVGViewElement: ['objects.view'], SVGScriptElement: ['objects.script'], SVGAnimateElement: ['objects.animate'], - SVGDiscardElement: ['objects.discard'], SVGSetElement: ['objects.set'], SVGAnimateMotionElement: ['objects.animateMotion'], SVGMPathElement: ['objects.mpath'],
diff --git a/third_party/blink/web_tests/external/wpt/svg/scripted/WEB_FEATURES.yml b/third_party/blink/web_tests/external/wpt/svg/scripted/WEB_FEATURES.yml new file mode 100644 index 0000000..864bd33 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/svg/scripted/WEB_FEATURES.yml
@@ -0,0 +1,4 @@ +features: +- name: fetch-priority + files: + - attr-script-fetchpriority.html
diff --git a/third_party/blink/web_tests/external/wpt/svg/styling/presentation-attributes-special-cases-expected.txt b/third_party/blink/web_tests/external/wpt/svg/styling/presentation-attributes-special-cases-expected.txt index 99f7099..7eedacb 100644 --- a/third_party/blink/web_tests/external/wpt/svg/styling/presentation-attributes-special-cases-expected.txt +++ b/third_party/blink/web_tests/external/wpt/svg/styling/presentation-attributes-special-cases-expected.txt
@@ -5,7 +5,5 @@ assert_true: Presentation attribute x="1" should be supported on symbol element expected true got false [FAIL] x, y, width, and height presentation attributes supported on use element assert_true: Presentation attribute width="1" should be supported on use element expected true got false -[FAIL] fill presentation attribute not supported on discard - assert_false: Presentation attribute fill="blue" should not be supported on discard element expected false got true Harness: the test ran to completion.
diff --git a/third_party/blink/web_tests/external/wpt/svg/styling/presentation-attributes-special-cases.html b/third_party/blink/web_tests/external/wpt/svg/styling/presentation-attributes-special-cases.html index 7bfa0010..9a5da75 100644 --- a/third_party/blink/web_tests/external/wpt/svg/styling/presentation-attributes-special-cases.html +++ b/third_party/blink/web_tests/external/wpt/svg/styling/presentation-attributes-special-cases.html
@@ -98,7 +98,7 @@ // animation elements. if (CSS.supports("fill", "initial")) { - for (let e of ["animate", "animateMotion", "animateTransform", "discard", "set"]) { + for (let e of ["animate", "animateMotion", "animateTransform", "set"]) { test(function() { assertPresentationAttributeIsNotSupported(e, "fill", "blue", "fill"); }, `fill presentation attribute not supported on ${e}`);
diff --git a/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/__init__.py b/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/__init__.py index 955335e..587dc91 100644 --- a/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/__init__.py +++ b/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/__init__.py
@@ -132,7 +132,7 @@ assert "handle" not in obj, f"Result should not contain `handle`. Actual: {obj}" -async def create_console_api_message(bidi_session, context: str, text: str): +async def create_console_api_message(bidi_session, context: Any, text: str): await bidi_session.script.call_function( function_declaration="""(text) => console.log(text)""", arguments=[{"type": "string", "value": text}], @@ -142,7 +142,7 @@ return text -async def get_device_pixel_ratio(bidi_session, context: str) -> float: +async def get_device_pixel_ratio(bidi_session, context: Any) -> float: result = await bidi_session.script.call_function( function_declaration="""() => { return window.devicePixelRatio; @@ -167,7 +167,7 @@ return remote_mapping_to_dict(result["value"]) -async def get_viewport_dimensions(bidi_session, context: str, +async def get_viewport_dimensions(bidi_session, context: Any, with_scrollbar: bool = True, quirk_mode: bool = False): if with_scrollbar: expression = """ @@ -198,7 +198,7 @@ return remote_mapping_to_dict(result["value"]) -async def get_document_dimensions(bidi_session, context: str): +async def get_document_dimensions(bidi_session, context: Any): expression = """ ({ height: document.documentElement.scrollHeight,
diff --git a/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/browsing_context/set_viewport/user_contexts.py b/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/browsing_context/set_viewport/user_contexts.py index 64c2616..fa1e748 100644 --- a/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/browsing_context/set_viewport/user_contexts.py +++ b/third_party/blink/web_tests/external/wpt/webdriver/tests/bidi/browsing_context/set_viewport/user_contexts.py
@@ -1,11 +1,13 @@ import pytest +from webdriver.bidi.modules.script import ContextTarget from webdriver.bidi.undefined import UNDEFINED from ... import get_device_pixel_ratio, get_viewport_dimensions - pytestmark = pytest.mark.asyncio +CONTEXT_LOAD_EVENT = "browsingContext.load" + async def test_set_to_user_context(bidi_session, new_tab, create_user_context): user_context = await create_user_context() @@ -55,6 +57,48 @@ ) +async def test_set_to_user_context_window_open( + bidi_session, + new_tab, + create_user_context, + inline, + subscribe_events, + wait_for_event, + wait_for_future_safe, +): + user_context = await create_user_context() + context_in_user_context_1 = await bidi_session.browsing_context.create( + user_context=user_context, type_hint="tab" + ) + + test_viewport = {"width": 250, "height": 300} + await bidi_session.browsing_context.set_viewport( + user_contexts=[user_context], viewport=test_viewport + ) + assert ( + await get_viewport_dimensions(bidi_session, context_in_user_context_1) + == test_viewport + ) + + await subscribe_events(events=[CONTEXT_LOAD_EVENT]) + + # Assert that tabs opened via window.open in the same user context + # successfully load and have the right viewport set. + on_load = wait_for_event(CONTEXT_LOAD_EVENT) + result = await bidi_session.script.evaluate( + await_promise=False, + expression=f"""window.open('{inline("popup")}')""", + target=ContextTarget(context_in_user_context_1["context"]), + ) + event = await wait_for_future_safe(on_load) + + contexts = await bidi_session.browsing_context.get_tree(root=event["context"]) + assert len(contexts) == 1 + popup_context = contexts[0] + + assert await get_viewport_dimensions(bidi_session, popup_context) == test_viewport + + async def test_set_to_default_user_context(bidi_session, new_tab, create_user_context): user_context = await create_user_context() context_in_user_context_1 = await bidi_session.browsing_context.create(
diff --git a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.js b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.js index 5ec9ff8..aa816cc 100644 --- a/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.js +++ b/third_party/blink/web_tests/external/wpt/webnn/conformance_tests/qdq_subgraph.https.any.js
@@ -535,12 +535,12 @@ {'input': 'transposeOutput'}, {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'} ], - 'outputs': 'quantizedtransposeOutput' + 'outputs': 'quantizedTransposeOutput' }, { 'name': 'dequantizeLinear', 'arguments': [ - {'input': 'quantizedtransposeOutput'}, + {'input': 'quantizedTransposeOutput'}, {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'} ], 'outputs': 'output' @@ -619,12 +619,12 @@ {'input': 'tanhOutput'}, {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'} ], - 'outputs': 'quantizedtanhOutput' + 'outputs': 'quantizedTanhOutput' }, { 'name': 'dequantizeLinear', 'arguments': [ - {'input': 'quantizedtanhOutput'}, + {'input': 'quantizedTanhOutput'}, {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'} ], 'outputs': 'output' @@ -702,12 +702,12 @@ {'input': 'sigmoidOutput'}, {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'} ], - 'outputs': 'quantizedsigmoidOutput' + 'outputs': 'quantizedSigmoidOutput' }, { 'name': 'dequantizeLinear', 'arguments': [ - {'input': 'quantizedsigmoidOutput'}, + {'input': 'quantizedSigmoidOutput'}, {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'} ], 'outputs': 'output' @@ -788,12 +788,12 @@ {'input': 'leakyReluOutput'}, {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'} ], - 'outputs': 'quantizedleakyReluOutput' + 'outputs': 'quantizedLeakyReluOutput' }, { 'name': 'dequantizeLinear', 'arguments': [ - {'input': 'quantizedleakyReluOutput'}, + {'input': 'quantizedLeakyReluOutput'}, {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'} ], 'outputs': 'output' @@ -985,12 +985,12 @@ {'input': 'eluOutput'}, {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'} ], - 'outputs': 'quantizedeluOutput' + 'outputs': 'quantizedEluOutput' }, { 'name': 'dequantizeLinear', 'arguments': [ - {'input': 'quantizedeluOutput'}, + {'input': 'quantizedEluOutput'}, {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'} ], 'outputs': 'output' @@ -1171,6 +1171,90 @@ } } }, + { + 'name': 'quantized reshape', + 'graph': { + 'inputs': { + 'input': { + 'data': [ + 1.6811466217041016, 0.0479511022567749, 0.33355462551116943, + -0.1988269537687301, -0.0041167140007019, -0.0634240251779556, + ], + 'descriptor': {shape: [2, 3], dataType: 'float32'}, + 'constant': false + }, + 'inputScale': { + 'data': [0.003921568859368563], + 'descriptor': {shape: [1], dataType: 'float32'}, + 'constant': true + }, + 'inputZeroPoint': { + 'data': [16], + 'descriptor': {shape: [1], dataType: 'int8'}, + 'constant': true + }, + 'outputScale': { + 'data': [0.003921568859368563], + 'descriptor': {shape: [1], dataType: 'float32'}, + 'constant': true + }, + 'outputZeroPoint': { + 'data': [16], + 'descriptor': {shape: [1], dataType: 'int8'}, + 'constant': true + }, + }, + 'operators': [ + { + 'name': 'quantizeLinear', + 'arguments': [ + {'input': 'input'}, + {'scale': 'inputScale', 'zeroPoint': 'inputZeroPoint'} + ], + 'outputs': 'quantizedInput' + }, + { + 'name': 'dequantizeLinear', + 'arguments': [ + {'input': 'quantizedInput'}, + {'scale': 'inputScale', 'zeroPoint': 'inputZeroPoint'} + ], + 'outputs': 'dequantizedInput' + }, + { + 'name': 'reshape', + 'arguments': [{'input': 'dequantizedInput'}, {'newShape': [3, 2]}], + 'outputs': 'reshapeOutput' + }, + { + 'name': 'quantizeLinear', + 'arguments': [ + {'input': 'reshapeOutput'}, + {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'} + ], + 'outputs': 'quantizedReshapeOutput' + }, + { + 'name': 'dequantizeLinear', + 'arguments': [ + {'input': 'quantizedReshapeOutput'}, + {'scale': 'outputScale', 'zeroPoint': 'outputZeroPoint'} + ], + 'outputs': 'output' + } + ], + 'expectedOutputs': { + 'output': { + 'data': [ + 0.43529415130615234, 0.0470588281750679, + 0.3333333432674408, -0.20000001788139343, + -0.003921568859368563, -0.062745101749897, + ], + 'descriptor': {shape: [3, 2], dataType: 'float32'} + } + } + } + }, ]; if (navigator.ml) {
diff --git a/third_party/blink/web_tests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt b/third_party/blink/web_tests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt index 5c65975..8cd2e53 100644 --- a/third_party/blink/web_tests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt +++ b/third_party/blink/web_tests/http/tests/serviceworker/webexposed/global-interface-listing-service-worker-expected.txt
@@ -1619,6 +1619,17 @@ getter promise getter reason method constructor +interface Proofreader + static method availability + static method create + attribute @@toStringTag + getter correctionExplanationLanguage + getter expectedInputLanguages + getter includeCorrectionExplanations + getter includeCorrectionTypes + method constructor + method destroy + method proofread interface PushEvent : ExtendableEvent attribute @@toStringTag getter data
diff --git a/third_party/blink/web_tests/platform/linux/external/wpt/cookie-store/cookieListItem_attributes.https.any.serviceworker-expected.txt b/third_party/blink/web_tests/platform/linux/external/wpt/cookie-store/cookieListItem_attributes.https.any.serviceworker-expected.txt new file mode 100644 index 0000000..9f6cfe3 --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/external/wpt/cookie-store/cookieListItem_attributes.https.any.serviceworker-expected.txt
@@ -0,0 +1,5 @@ +This is a testharness.js-based test. +[FAIL] Test max-age attribute over the 400 days + promise_test: Unhandled rejection with value: object "ReferenceError: document is not defined" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/platform/mac/external/wpt/cookie-store/cookieListItem_attributes.https.any.serviceworker-expected.txt b/third_party/blink/web_tests/platform/mac/external/wpt/cookie-store/cookieListItem_attributes.https.any.serviceworker-expected.txt new file mode 100644 index 0000000..9f6cfe3 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac/external/wpt/cookie-store/cookieListItem_attributes.https.any.serviceworker-expected.txt
@@ -0,0 +1,5 @@ +This is a testharness.js-based test. +[FAIL] Test max-age attribute over the 400 days + promise_test: Unhandled rejection with value: object "ReferenceError: document is not defined" +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/virtual/interest-target-no-partial-interest/README.md b/third_party/blink/web_tests/virtual/interest-target-no-partial-interest/README.md new file mode 100644 index 0000000..d1449b7 --- /dev/null +++ b/third_party/blink/web_tests/virtual/interest-target-no-partial-interest/README.md
@@ -0,0 +1,4 @@ +# Overview + +This suite runs a subset of tests with `--enable-features=HTMLInterestTargetNoPartialInterest`, +to test it.
diff --git a/third_party/blink/web_tests/virtual/interest-target-no-partial-interest/external/wpt/html/semantics/the-button-element/interest-target/interesttarget-partial-interest.tentative-expected.txt b/third_party/blink/web_tests/virtual/interest-target-no-partial-interest/external/wpt/html/semantics/the-button-element/interest-target/interesttarget-partial-interest.tentative-expected.txt new file mode 100644 index 0000000..5b13f69 --- /dev/null +++ b/third_party/blink/web_tests/virtual/interest-target-no-partial-interest/external/wpt/html/semantics/the-button-element/interest-target/interesttarget-partial-interest.tentative-expected.txt
@@ -0,0 +1,5 @@ +This is a testharness.js-based test. +[FAIL] Partial interest timing should not be observable + assert_equals: Interest should be partial (before hot key) expected true but got false +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/virtual/interest-target-no-partial-interest/external/wpt/html/semantics/the-button-element/interest-target/interesttarget-popover-focus.tentative-expected.txt b/third_party/blink/web_tests/virtual/interest-target-no-partial-interest/external/wpt/html/semantics/the-button-element/interest-target/interesttarget-popover-focus.tentative-expected.txt new file mode 100644 index 0000000..28bea34 --- /dev/null +++ b/third_party/blink/web_tests/virtual/interest-target-no-partial-interest/external/wpt/html/semantics/the-button-element/interest-target/interesttarget-popover-focus.tentative-expected.txt
@@ -0,0 +1,5 @@ +This is a testharness.js-based test. +[FAIL] It should be possible to move focus into target popover + assert_equals: expected Element node <button id="contained">button</button> but got Element node <button id="el" interesttarget="target">Button</button> +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/virtual/interest-target-no-partial-interest/external/wpt/html/semantics/the-button-element/interest-target/interesttarget-pseudo-classes.tentative-expected.txt b/third_party/blink/web_tests/virtual/interest-target-no-partial-interest/external/wpt/html/semantics/the-button-element/interest-target/interesttarget-pseudo-classes.tentative-expected.txt new file mode 100644 index 0000000..f0f3859 --- /dev/null +++ b/third_party/blink/web_tests/virtual/interest-target-no-partial-interest/external/wpt/html/semantics/the-button-element/interest-target/interesttarget-pseudo-classes.tentative-expected.txt
@@ -0,0 +1,15 @@ +This is a testharness.js-based test. +[FAIL] Basic pseudo class function, with keyboard focus triggering + assert_equals: focusing invoker shows partial interest (and therefore also interest): :has-partial-interest mismatch expected true but got false +[FAIL] Keyboard-triggered partial focus keeps contents from being keyboard focusable + assert_equals: initial: :has-interest mismatch expected false but got true +[FAIL] Show interest hotkey confers "full interest", without any delays + assert_equals: initial: :has-interest mismatch expected false but got true +[FAIL] With full interest, contents are keyboard focusable + assert_equals: initial: :has-interest mismatch expected false but got true +[FAIL] Lose interest hotkey works + assert_equals: initial: :has-interest mismatch expected false but got true +[FAIL] The pseudo classes only match after delays, once interest is shown + assert_equals: initial: :has-interest mismatch expected false but got true +Harness: the test ran to completion. +
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt index 9c8d848..b8d2e17 100644 --- a/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt +++ b/third_party/blink/web_tests/webexposed/global-interface-listing-dedicated-worker-expected.txt
@@ -1716,6 +1716,17 @@ [Worker] getter promise [Worker] getter reason [Worker] method constructor +[Worker] interface Proofreader +[Worker] static method availability +[Worker] static method create +[Worker] attribute @@toStringTag +[Worker] getter correctionExplanationLanguage +[Worker] getter expectedInputLanguages +[Worker] getter includeCorrectionExplanations +[Worker] getter includeCorrectionTypes +[Worker] method constructor +[Worker] method destroy +[Worker] method proofread [Worker] interface PushManager [Worker] static getter supportedContentEncodings [Worker] attribute @@toStringTag
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt index bce2e54c..dacf639 100644 --- a/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt +++ b/third_party/blink/web_tests/webexposed/global-interface-listing-expected.txt
@@ -7654,6 +7654,17 @@ getter promise getter reason method constructor +interface Proofreader + static method availability + static method create + attribute @@toStringTag + getter correctionExplanationLanguage + getter expectedInputLanguages + getter includeCorrectionExplanations + getter includeCorrectionTypes + method constructor + method destroy + method proofread interface ProtectedAudience attribute @@toStringTag method constructor
diff --git a/third_party/blink/web_tests/webexposed/global-interface-listing-shared-worker-expected.txt b/third_party/blink/web_tests/webexposed/global-interface-listing-shared-worker-expected.txt index a8a234dc..798f57cb 100644 --- a/third_party/blink/web_tests/webexposed/global-interface-listing-shared-worker-expected.txt +++ b/third_party/blink/web_tests/webexposed/global-interface-listing-shared-worker-expected.txt
@@ -1551,6 +1551,17 @@ [Worker] getter promise [Worker] getter reason [Worker] method constructor +[Worker] interface Proofreader +[Worker] static method availability +[Worker] static method create +[Worker] attribute @@toStringTag +[Worker] getter correctionExplanationLanguage +[Worker] getter expectedInputLanguages +[Worker] getter includeCorrectionExplanations +[Worker] getter includeCorrectionTypes +[Worker] method constructor +[Worker] method destroy +[Worker] method proofread [Worker] interface PushManager [Worker] static getter supportedContentEncodings [Worker] attribute @@toStringTag
diff --git a/third_party/catapult b/third_party/catapult index 168822b..5255e1a 160000 --- a/third_party/catapult +++ b/third_party/catapult
@@ -1 +1 @@ -Subproject commit 168822b896c38f7d0079a2483c81f3d5cbc1d933 +Subproject commit 5255e1a11a4d0bf747f304816a2523f952be9228
diff --git a/third_party/dawn b/third_party/dawn index 8d9a27a..f4cae4a 160000 --- a/third_party/dawn +++ b/third_party/dawn
@@ -1 +1 @@ -Subproject commit 8d9a27a2cf4483df70ac3a5df515c57a4bb68723 +Subproject commit f4cae4afdd4bca082d36025c66c7c284ed16a67f
diff --git a/third_party/devtools-frontend/src b/third_party/devtools-frontend/src index 0f029e0..4cc0688 160000 --- a/third_party/devtools-frontend/src +++ b/third_party/devtools-frontend/src
@@ -1 +1 @@ -Subproject commit 0f029e02e44f173a3d6ed04cf01c56e90e8c289f +Subproject commit 4cc0688b9538f497ae06e3a0f97431ffc86f4181
diff --git a/third_party/libc++abi/src b/third_party/libc++abi/src index 7ff13dd..1efb5e6 160000 --- a/third_party/libc++abi/src +++ b/third_party/libc++abi/src
@@ -1 +1 @@ -Subproject commit 7ff13dd8c66d5047a3ee1e1ba26ddeb70d3d8740 +Subproject commit 1efb5e6d7c5eee01624f3730a935285405c9cd22
diff --git a/third_party/nearby/BUILD.gn b/third_party/nearby/BUILD.gn index 57093df4..d40099f 100644 --- a/third_party/nearby/BUILD.gn +++ b/third_party/nearby/BUILD.gn
@@ -22,6 +22,14 @@ ] } +# TODO(crbug.com/362502228): Remove upon completion of BleL2capServerSocket. +config("unused_private_field_warning") { + cflags = [] + if (is_clang) { + cflags += [ "-Wno-unused-private-field" ] + } +} + config("nearby_defines") { defines = [ "NEARBY_CHROMIUM=1" ] } @@ -1012,6 +1020,9 @@ public_configs = [ ":nearby_include_config", ":nearby_defines", + + # TODO(crbug.com/362502228): Remove upon completion of BleL2capServerSocket. + ":unused_private_field_warning", ] sources = [ "src/internal/platform/awdl.cc",
diff --git a/third_party/nearby/README.chromium b/third_party/nearby/README.chromium index 7336a17..b4ad4b9 100644 --- a/third_party/nearby/README.chromium +++ b/third_party/nearby/README.chromium
@@ -1,7 +1,7 @@ Name: Nearby Connections Library Short Name: Nearby URL: https://github.com/google/nearby -Version: 541bffc85815c2fb82d3eab05f75d5aac71102c1 +Version: 59e527dbe3326f52bce1bda3dc30e997a68f2443 License: Apache-2.0 License File: LICENSE Security Critical: yes
diff --git a/third_party/nearby/src b/third_party/nearby/src index 541bffc..59e527d 160000 --- a/third_party/nearby/src +++ b/third_party/nearby/src
@@ -1 +1 @@ -Subproject commit 541bffc85815c2fb82d3eab05f75d5aac71102c1 +Subproject commit 59e527dbe3326f52bce1bda3dc30e997a68f2443
diff --git a/third_party/perfetto b/third_party/perfetto index f2e7084..8295644 160000 --- a/third_party/perfetto +++ b/third_party/perfetto
@@ -1 +1 @@ -Subproject commit f2e70843f73b1e17fea3de511344f65b4bc8ad9c +Subproject commit 829564494ca9d7bc1c8b15998c5f1f3536cdacf8
diff --git a/third_party/r8/java/src/org/chromium/build/CustomD8.java b/third_party/r8/java/src/org/chromium/build/CustomD8.java index 20f26dab..1ae2337 100644 --- a/third_party/r8/java/src/org/chromium/build/CustomD8.java +++ b/third_party/r8/java/src/org/chromium/build/CustomD8.java
@@ -51,8 +51,8 @@ } private static class Deps implements DesugarGraphConsumer { - private Map<String, Set<String>> mDeps = new ConcurrentHashMap<>(); - private String mFileTmpPrefix; + private final Map<String, Set<String>> mDeps = new ConcurrentHashMap<>(); + private final String mFileTmpPrefix; private static final String DEP_PREFIX = " <- "; public Deps(String fileTmpPrefix) {
diff --git a/third_party/robolectric/custom_asynctask/java/src/org/chromium/base/task/test/ShadowAsyncTaskBridge.java b/third_party/robolectric/custom_asynctask/java/src/org/chromium/base/task/test/ShadowAsyncTaskBridge.java index 2e9be02b..6a803d0 100644 --- a/third_party/robolectric/custom_asynctask/java/src/org/chromium/base/task/test/ShadowAsyncTaskBridge.java +++ b/third_party/robolectric/custom_asynctask/java/src/org/chromium/base/task/test/ShadowAsyncTaskBridge.java
@@ -1,16 +1,17 @@ package org.chromium.base.task.test; -import org.chromium.base.task.AsyncTask; import org.robolectric.annotation.internal.DoNotInstrument; import org.robolectric.util.ReflectionHelpers; import org.robolectric.util.ReflectionHelpers.ClassParameter; +import org.chromium.base.task.AsyncTask; + /** * Bridge between shadows and {@link org.chromium.base.task.AsyncTask}. */ @DoNotInstrument public class ShadowAsyncTaskBridge<Result> { - private AsyncTask<Result> asyncTask; + private final AsyncTask<Result> asyncTask; public ShadowAsyncTaskBridge(AsyncTask<Result> asyncTask) { this.asyncTask = asyncTask;
diff --git a/third_party/rust/bytemuck/v1/BUILD.gn b/third_party/rust/bytemuck/v1/BUILD.gn index 3b1c725..013c3b7 100644 --- a/third_party/rust/bytemuck/v1/BUILD.gn +++ b/third_party/rust/bytemuck/v1/BUILD.gn
@@ -34,7 +34,7 @@ build_native_rust_unit_tests = false edition = "2018" - cargo_pkg_version = "1.22.0" + cargo_pkg_version = "1.23.0" cargo_pkg_authors = "Lokathor <zefria@gmail.com>" cargo_pkg_name = "bytemuck" cargo_pkg_description = "A crate for mucking around with piles of bytes."
diff --git a/third_party/rust/bytemuck/v1/README.chromium b/third_party/rust/bytemuck/v1/README.chromium index 9179cb3..4c09880f 100644 --- a/third_party/rust/bytemuck/v1/README.chromium +++ b/third_party/rust/bytemuck/v1/README.chromium
@@ -1,7 +1,7 @@ Name: bytemuck URL: https://crates.io/crates/bytemuck -Version: 1.22.0 -Revision: d1d918b2879c62fa946a9534ab8ee0760106b0fa +Version: 1.23.0 +Revision: 028ff3bec68ab9c123dc578b74a7af4a72a37609 License: Apache-2.0 License File: //third_party/rust/chromium_crates_io/vendor/bytemuck-v1/LICENSE-APACHE Shipped: yes
diff --git a/third_party/rust/chromium_crates_io/Cargo.lock b/third_party/rust/chromium_crates_io/Cargo.lock index 4f60c5f..431e575 100644 --- a/third_party/rust/chromium_crates_io/Cargo.lock +++ b/third_party/rust/chromium_crates_io/Cargo.lock
@@ -47,7 +47,7 @@ [[package]] name = "bytemuck" -version = "1.22.0" +version = "1.23.0" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "bytemuck_derive", @@ -79,7 +79,7 @@ [[package]] name = "cc" -version = "1.2.20" +version = "1.2.22" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "shlex", @@ -335,7 +335,7 @@ [[package]] name = "hashbrown" -version = "0.15.2" +version = "0.15.3" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]]
diff --git a/third_party/rust/chromium_crates_io/supply-chain/config.toml b/third_party/rust/chromium_crates_io/supply-chain/config.toml index bb40e66..846f3c0 100644 --- a/third_party/rust/chromium_crates_io/supply-chain/config.toml +++ b/third_party/rust/chromium_crates_io/supply-chain/config.toml
@@ -65,7 +65,7 @@ [policy."bumpalo:3.17.0"] criteria = [] -[policy."bytemuck:1.22.0"] +[policy."bytemuck:1.23.0"] criteria = ["crypto-safe", "safe-to-deploy", "ub-risk-2"] [policy."bytemuck_derive:1.9.3"] @@ -77,7 +77,7 @@ [policy."calendrical_calculations:0.1.3"] criteria = ["crypto-safe", "safe-to-deploy", "ub-risk-2"] -[policy."cc:1.2.20"] +[policy."cc:1.2.22"] criteria = [] [policy."cfg-if:1.0.0"] @@ -155,7 +155,7 @@ [policy."font-types:0.8.4"] criteria = ["crypto-safe", "safe-to-deploy", "ub-risk-2"] -[policy."hashbrown:0.15.2"] +[policy."hashbrown:0.15.3"] criteria = ["crypto-safe", "safe-to-deploy", "ub-risk-2"] [policy."heck:0.5.0"]
diff --git a/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/.cargo/config.toml b/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/.cargo/config.toml index 9d8a446b..7b97093 100644 --- a/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/.cargo/config.toml +++ b/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/.cargo/config.toml
@@ -1,4 +1,4 @@ [alias] # The list of features should be the same as the one under `[package.metadata.docs.rs]` -nightly_docs = "doc --no-deps -F nightly_docs,derive,extern_crate_alloc,extern_crate_std,zeroable_maybe_uninit,zeroable_atomics,min_const_generics,wasm_simd,must_cast" +nightly_docs = "doc --no-deps -F nightly_docs,latest_stable_rust,extern_crate_alloc,extern_crate_std"
diff --git a/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/.cargo_vcs_info.json b/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/.cargo_vcs_info.json index e8c1ef2..43b5df5 100644 --- a/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/.cargo_vcs_info.json +++ b/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/.cargo_vcs_info.json
@@ -1,6 +1,6 @@ { "git": { - "sha1": "d1d918b2879c62fa946a9534ab8ee0760106b0fa" + "sha1": "028ff3bec68ab9c123dc578b74a7af4a72a37609" }, "path_in_vcs": "" } \ No newline at end of file
diff --git a/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/.github/FUNDING.yml b/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/.github/FUNDING.yml index 3509ccc1..d95e9c2 100644 --- a/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/.github/FUNDING.yml +++ b/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/.github/FUNDING.yml
@@ -1,3 +1,3 @@ -# These are supported funding model platforms - -github: [Lokathor] +# These are supported funding model platforms + +github: [Lokathor]
diff --git a/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/.github/workflows/rust.yml b/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/.github/workflows/rust.yml index d9504ba..3a709ad1 100644 --- a/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/.github/workflows/rust.yml +++ b/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/.github/workflows/rust.yml
@@ -1,113 +1,116 @@ -name: Rust - -on: - push: {} - pull_request: {} - -env: - RUST_BACKTRACE: 1 - -jobs: - test: - name: Test Rust ${{ matrix.rust }} on ${{ matrix.os }} - runs-on: ${{ matrix.os }} - strategy: - matrix: - # it's a little tempting to use `matrix` to do a cartesian product with - # our `--feature` config here, but doing so will be very slow, as the - # free tier only supports up to 20 job runners at a time. - include: - # versions (all on linux-x86_64) - - { rust: 1.34.0, os: ubuntu-latest } - - { rust: stable, os: ubuntu-latest } - - { rust: beta, os: ubuntu-latest } - - { rust: nightly, os: ubuntu-latest } - # non-linux platforms (ones which don't require `cross`) - - { rust: stable, os: macos-latest } - - { rust: stable, os: windows-latest } - - { rust: stable-x86_64-gnu, os: windows-latest } - - { rust: stable-i686-msvc, os: windows-latest } - - { rust: stable-i686-gnu, os: windows-latest } - steps: - - uses: hecrj/setup-rust-action@v1 - with: - rust-version: ${{ matrix.rust }} - - uses: actions/checkout@v3 - - run: cargo test --verbose - - run: cargo test --verbose --no-default-features - - run: cargo test --verbose - - run: cargo test --verbose --all-features - if: matrix.rust == 'nightly' - - run: cargo test --verbose --manifest-path=derive/Cargo.toml --all-features - if: matrix.rust == 'nightly' - - cross-test: - name: Test on ${{ matrix.target }} with cross - runs-on: ubuntu-latest - strategy: - matrix: - # we once had mips runners for Big-endian coverage but those got demoted to tier 3. - target: [i686-unknown-linux-gnu] - steps: - - uses: hecrj/setup-rust-action@v1 - with: - rust-version: nightly - - uses: actions/checkout@v3 - - run: cargo install cross - - run: cross test --verbose --target=${{ matrix.target }} --no-default-features - - run: cross test --verbose --target=${{ matrix.target }} - - run: cross test --verbose --target=${{ matrix.target }} --all-features - if: matrix.rust == 'nightly' - - run: cross test --verbose --target=${{ matrix.target }} --manifest-path=derive/Cargo.toml --all-features - if: matrix.rust == 'nightly' - - miri-test: - name: Test with miri - runs-on: ubuntu-latest - steps: - - uses: hecrj/setup-rust-action@v1 - with: - rust-version: nightly - components: miri - - uses: actions/checkout@v3 - # Note(Lokathor): We got some cached json errors, and so we cargo clean for this run. - - run: rm -fr target - - run: cargo miri test --verbose --no-default-features - - run: cargo miri test --verbose --all-features - - run: cd derive && rm -fr target && cargo miri test --verbose --all-features - - sanitizer-test: - name: Test with -Zsanitizer=${{ matrix.sanitizer }} - runs-on: ubuntu-latest - strategy: - fail-fast: false - matrix: - # leak is disabled because the config got outdated - # and bytemuck doesn't really do allocation anyway. - sanitizer: [address, memory] - steps: - - uses: actions/checkout@v3 - - uses: hecrj/setup-rust-action@v1 - with: - rust-version: nightly - components: rust-src - - name: Test with sanitizer - env: - RUSTFLAGS: -Zsanitizer=${{ matrix.sanitizer }} - RUSTDOCFLAGS: -Zsanitizer=${{ matrix.sanitizer }} - ASAN_OPTIONS: detect_stack_use_after_return=1 - # Asan's leak detection occasionally complains about some small leaks if - # backtraces are captured. - RUST_BACKTRACE: 0 - # We don't run `derive`'s unit tests here the way we do elsewhere (for - # example, in `miri-test` above), as at the moment we can't easily build - # the `proc_macro` runtime with sanitizers on. IIUC doing this would - # require a custom rustc build, and... lol nope. - # - # This would mean only part of the code running under the sanitizer would - # actually include the sanitizer's checks, which is a recipe for false - # positives, so we just skip it, the generated code is what we care - # about anyway. - run: | - cargo test -Zbuild-std --verbose --target=x86_64-unknown-linux-gnu --no-default-features - cargo test -Zbuild-std --verbose --target=x86_64-unknown-linux-gnu --all-features +name: Rust + +on: + push: {} + pull_request: {} + +env: + RUST_BACKTRACE: 1 + +jobs: + test: + name: Test Rust ${{ matrix.rust }} on ${{ matrix.os }} + runs-on: ${{ matrix.os }} + strategy: + matrix: + # it's a little tempting to use `matrix` to do a cartesian product with + # our `--feature` config here, but doing so will be very slow, as the + # free tier only supports up to 20 job runners at a time. + include: + # versions (all on linux-x86_64) + - { rust: 1.34.0, os: ubuntu-latest } + - { rust: 1.61.0, os: ubuntu-latest } + - { rust: stable, os: ubuntu-latest } + - { rust: beta, os: ubuntu-latest } + - { rust: nightly, os: ubuntu-latest } + # non-linux platforms (ones which don't require `cross`) + - { rust: stable, os: macos-latest } + - { rust: stable, os: windows-latest } + - { rust: stable-x86_64-gnu, os: windows-latest } + - { rust: stable-i686-msvc, os: windows-latest } + - { rust: stable-i686-gnu, os: windows-latest } + steps: + - uses: hecrj/setup-rust-action@v1 + with: + rust-version: ${{ matrix.rust }} + - uses: actions/checkout@v3 + - run: cargo test --verbose + - run: cargo test --verbose --no-default-features + - run: cargo test --verbose + - run: cargo test --verbose --features derive + if: matrix.rust == '1.61.0' + - run: cargo test --verbose --all-features + if: matrix.rust == 'nightly' + - run: cargo test --verbose --manifest-path=derive/Cargo.toml --all-features + if: matrix.rust == 'nightly' + + cross-test: + name: Test on ${{ matrix.target }} with cross + runs-on: ubuntu-latest + strategy: + matrix: + # we once had mips runners for Big-endian coverage but those got demoted to tier 3. + target: [i686-unknown-linux-gnu] + steps: + - uses: hecrj/setup-rust-action@v1 + with: + rust-version: nightly + - uses: actions/checkout@v3 + - run: cargo install cross + - run: cross test --verbose --target=${{ matrix.target }} --no-default-features + - run: cross test --verbose --target=${{ matrix.target }} + - run: cross test --verbose --target=${{ matrix.target }} --all-features + if: matrix.rust == 'nightly' + - run: cross test --verbose --target=${{ matrix.target }} --manifest-path=derive/Cargo.toml --all-features + if: matrix.rust == 'nightly' + + miri-test: + name: Test with miri + runs-on: ubuntu-latest + steps: + - uses: hecrj/setup-rust-action@v1 + with: + rust-version: nightly + components: miri + - uses: actions/checkout@v3 + # Note(Lokathor): We got some cached json errors, and so we cargo clean for this run. + - run: rm -fr target + - run: cargo miri test --verbose --no-default-features + - run: cargo miri test --verbose --all-features + - run: cd derive && rm -fr target && cargo miri test --verbose --all-features + + sanitizer-test: + name: Test with -Zsanitizer=${{ matrix.sanitizer }} + runs-on: ubuntu-latest + strategy: + fail-fast: false + matrix: + # leak is disabled because the config got outdated + # and bytemuck doesn't really do allocation anyway. + sanitizer: [address, memory] + steps: + - uses: actions/checkout@v3 + - uses: hecrj/setup-rust-action@v1 + with: + rust-version: nightly + components: rust-src + - name: Test with sanitizer + env: + RUSTFLAGS: -Zsanitizer=${{ matrix.sanitizer }} + RUSTDOCFLAGS: -Zsanitizer=${{ matrix.sanitizer }} + ASAN_OPTIONS: detect_stack_use_after_return=1 + # Asan's leak detection occasionally complains about some small leaks if + # backtraces are captured. + RUST_BACKTRACE: 0 + # We don't run `derive`'s unit tests here the way we do elsewhere (for + # example, in `miri-test` above), as at the moment we can't easily build + # the `proc_macro` runtime with sanitizers on. IIUC doing this would + # require a custom rustc build, and... lol nope. + # + # This would mean only part of the code running under the sanitizer would + # actually include the sanitizer's checks, which is a recipe for false + # positives, so we just skip it, the generated code is what we care + # about anyway. + run: | + cargo test -Zbuild-std --verbose --target=x86_64-unknown-linux-gnu --no-default-features + cargo test -Zbuild-std --verbose --target=x86_64-unknown-linux-gnu --all-features
diff --git a/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/Cargo.lock b/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/Cargo.lock index 1c10bf7..0c9ce221 100644 --- a/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/Cargo.lock +++ b/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/Cargo.lock
@@ -4,16 +4,16 @@ [[package]] name = "bytemuck" -version = "1.22.0" +version = "1.23.0" dependencies = [ "bytemuck_derive", ] [[package]] name = "bytemuck_derive" -version = "1.8.1" +version = "1.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fa76293b4f7bb636ab88fd78228235b5248b4d05cc589aed610f954af5d7c7a" +checksum = "7ecc273b49b3205b83d648f0690daa588925572cc5063745bfe547fe7ec8e1a1" dependencies = [ "proc-macro2", "quote", @@ -22,27 +22,27 @@ [[package]] name = "proc-macro2" -version = "1.0.78" +version = "1.0.92" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +checksum = "37d3544b3f2748c54e147655edb5025752e2303145b5aefb3c3ea2c78b973bb0" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.35" +version = "1.0.38" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +checksum = "0e4dccaaaf89514f546c693ddc140f729f958c247918a13380cccc6078391acc" dependencies = [ "proc-macro2", ] [[package]] name = "syn" -version = "2.0.48" +version = "2.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0f3531638e407dfc0814761abb7c00a5b54992b849452a0646b7f65c9f770f3f" +checksum = "46f71c0377baf4ef1cc3e3402ded576dccc315800fbc62dfc7fe04b009773b4a" dependencies = [ "proc-macro2", "quote", @@ -51,6 +51,6 @@ [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.14" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "adb9e6ca4f869e1180728b7950e35922a7fc6397f7b641499e8f3ef06e50dc83"
diff --git a/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/Cargo.toml b/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/Cargo.toml index 9d90334..d92f8ba 100644 --- a/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/Cargo.toml +++ b/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/Cargo.toml
@@ -12,7 +12,7 @@ [package] edition = "2018" name = "bytemuck" -version = "1.22.0" +version = "1.23.0" authors = ["Lokathor <zefria@gmail.com>"] build = false exclude = ["/pedantic.bat"] @@ -59,6 +59,7 @@ derive = ["bytemuck_derive"] extern_crate_alloc = [] extern_crate_std = ["extern_crate_alloc"] +impl_core_error = [] latest_stable_rust = [ "aarch64_simd", "avx512_simd", @@ -66,6 +67,7 @@ "alloc_uninit", "const_zeroed", "derive", + "impl_core_error", "min_const_generics", "must_cast", "must_cast_extra", @@ -75,6 +77,7 @@ "wasm_simd", "zeroable_atomics", "zeroable_maybe_uninit", + "zeroable_unwind_fn", ] min_const_generics = [] must_cast = [] @@ -90,6 +93,7 @@ wasm_simd = [] zeroable_atomics = [] zeroable_maybe_uninit = [] +zeroable_unwind_fn = [] [lib] name = "bytemuck"
diff --git a/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/Cargo.toml.orig b/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/Cargo.toml.orig index bd8e4d01..8766b07 100644 --- a/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/Cargo.toml.orig +++ b/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/Cargo.toml.orig
@@ -1,7 +1,7 @@ [package] name = "bytemuck" description = "A crate for mucking around with piles of bytes." -version = "1.22.0" +version = "1.23.0" authors = ["Lokathor <zefria@gmail.com>"] repository = "https://github.com/Lokathor/bytemuck" readme = "README.md" @@ -61,6 +61,12 @@ # MSRV 1.74.0 Pod/Zeroable implementations for `core::num::Saturating` pod_saturating = [] +# MSRV 1.71: Adds ZeroableInOption impl for fn-ptrs with -unwind +zeroable_unwind_fn = [] + +# MSRV 1.81: Impls core::error:Error for error types +impl_core_error = [] + # Enables all features that are both sound and supported on the latest stable # version of Rust, with the exception of `extern_crate_alloc` and # `extern_crate_std`. @@ -73,6 +79,7 @@ "alloc_uninit", "const_zeroed", "derive", + "impl_core_error", "min_const_generics", "must_cast", "must_cast_extra", @@ -82,6 +89,7 @@ "wasm_simd", "zeroable_atomics", "zeroable_maybe_uninit", + "zeroable_unwind_fn", ] # ALL FEATURES BELOW THIS ARE NOT SEMVER SUPPORTED! TEMPORARY ONLY!
diff --git a/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/LICENSE-APACHE b/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/LICENSE-APACHE index 1d02268d..136d9004 100644 --- a/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/LICENSE-APACHE +++ b/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/LICENSE-APACHE
@@ -1,61 +1,61 @@ -Apache License -Version 2.0, January 2004 -http://www.apache.org/licenses/ - -TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - - 1. Definitions. - - "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. - - "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. - - "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. - - "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. - - "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. - - "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. - - "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). - - "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. - - "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." - - "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. - 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. - 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. - 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: - (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and - (b) You must cause any modified files to carry prominent notices stating that You changed the files; and - (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and - (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. - - You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. - 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. - 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. - 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. - 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. - 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. - -END OF TERMS AND CONDITIONS - -APPENDIX: How to apply the Apache License to your work. - -To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. - -Copyright [yyyy] [name of copyright owner] - -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at - -http://www.apache.org/licenses/LICENSE-2.0 - -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. +Apache License +Version 2.0, January 2004 +http://www.apache.org/licenses/ + +TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION + + 1. Definitions. + + "License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files. + + "Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work. + 2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form. + 3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed. + 4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions: + (a) You must give any other recipients of the Work or Derivative Works a copy of this License; and + (b) You must cause any modified files to carry prominent notices stating that You changed the files; and + (c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and + (d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. + + You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License. + 5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions. + 6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file. + 7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License. + 8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages. + 9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability. + +END OF TERMS AND CONDITIONS + +APPENDIX: How to apply the Apache License to your work. + +To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives. + +Copyright [yyyy] [name of copyright owner] + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + +http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License.
diff --git a/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/LICENSE-MIT b/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/LICENSE-MIT index 0aa88160..164045fa 100644 --- a/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/LICENSE-MIT +++ b/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/LICENSE-MIT
@@ -1,9 +1,9 @@ -MIT License - -Copyright (c) 2019 Daniel "Lokathor" Gee. - -Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: - -The above copyright notice and this permission notice (including the next paragraph) shall be included in all copies or substantial portions of the Software. - -THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. +MIT License + +Copyright (c) 2019 Daniel "Lokathor" Gee. + +Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice (including the next paragraph) shall be included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
diff --git a/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/LICENSE-ZLIB b/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/LICENSE-ZLIB index aa2dabe..d70707c75 100644 --- a/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/LICENSE-ZLIB +++ b/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/LICENSE-ZLIB
@@ -1,11 +1,11 @@ -Copyright (c) 2019 Daniel "Lokathor" Gee. - -This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. - -Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: - -1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. - -2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. - -3. This notice may not be removed or altered from any source distribution. +Copyright (c) 2019 Daniel "Lokathor" Gee. + +This software is provided 'as-is', without any express or implied warranty. In no event will the authors be held liable for any damages arising from the use of this software. + +Permission is granted to anyone to use this software for any purpose, including commercial applications, and to alter it and redistribute it freely, subject to the following restrictions: + +1. The origin of this software must not be misrepresented; you must not claim that you wrote the original software. If you use this software in a product, an acknowledgment in the product documentation would be appreciated but is not required. + +2. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software. + +3. This notice may not be removed or altered from any source distribution.
diff --git a/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/changelog.md b/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/changelog.md index 8f360e0..87de99a 100644 --- a/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/changelog.md +++ b/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/changelog.md
@@ -1,5 +1,10 @@ # `bytemuck` changelog +## 1.23 + +* `impl_core_error` crate feature adds `core::error::Error` impl. +* More `ZeroableInOption` impls. + ## 1.22 * Add the `pod_saturating` feature, which adds `Pod` impls for `Saturating<T>`
diff --git a/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/src/checked.rs b/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/src/checked.rs index 5e89133..7597e0e 100644 --- a/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/src/checked.rs +++ b/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/src/checked.rs
@@ -228,6 +228,10 @@ #[cfg_attr(feature = "nightly_docs", doc(cfg(feature = "extern_crate_std")))] impl std::error::Error for CheckedCastError {} +// Rust 1.81+ +#[cfg(all(feature = "impl_core_error", not(feature = "extern_crate_std")))] +impl core::error::Error for CheckedCastError {} + impl From<crate::PodCastError> for CheckedCastError { fn from(err: crate::PodCastError) -> CheckedCastError { CheckedCastError::PodCastError(err)
diff --git a/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/src/lib.rs b/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/src/lib.rs index 44eef76..5f218a4b 100644 --- a/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/src/lib.rs +++ b/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/src/lib.rs
@@ -267,6 +267,10 @@ #[cfg_attr(feature = "nightly_docs", doc(cfg(feature = "extern_crate_std")))] impl std::error::Error for PodCastError {} +// Rust 1.81+ +#[cfg(all(feature = "impl_core_error", not(feature = "extern_crate_std")))] +impl core::error::Error for PodCastError {} + /// Re-interprets `&T` as `&[u8]`. /// /// Any ZST becomes an empty slice, and in that case the pointer value of that
diff --git a/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/src/zeroable_in_option.rs b/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/src/zeroable_in_option.rs index c4cf158a..ff40fd7 100644 --- a/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/src/zeroable_in_option.rs +++ b/third_party/rust/chromium_crates_io/vendor/bytemuck-v1/src/zeroable_in_option.rs
@@ -33,3 +33,43 @@ #[cfg(feature = "extern_crate_alloc")] #[cfg_attr(feature = "nightly_docs", doc(cfg(feature = "extern_crate_alloc")))] unsafe impl<T: ?Sized> ZeroableInOption for alloc::boxed::Box<T> {} + +#[cfg(feature = "zeroable_unwind_fn")] +macro_rules! impl_for_unwind_fn { + ($($ArgTy:ident),* $(,)?) => { + unsafe impl<$($ArgTy,)* R> ZeroableInOption for extern "C-unwind" fn($($ArgTy,)*) -> R {} + unsafe impl<$($ArgTy,)* R> ZeroableInOption for unsafe extern "C-unwind" fn($($ArgTy,)*) -> R {} + unsafe impl<$($ArgTy,)* R> ZeroableInOption for extern "system-unwind" fn($($ArgTy,)*) -> R {} + unsafe impl<$($ArgTy,)* R> ZeroableInOption for unsafe extern "system-unwind" fn($($ArgTy,)*) -> R {} + }; +} + +macro_rules! impl_for_fn { + ($($ArgTy:ident),* $(,)?) => { + unsafe impl<$($ArgTy,)* R> ZeroableInOption for fn($($ArgTy,)*) -> R {} + unsafe impl<$($ArgTy,)* R> ZeroableInOption for unsafe fn($($ArgTy,)*) -> R {} + unsafe impl<$($ArgTy,)* R> ZeroableInOption for extern "C" fn($($ArgTy,)*) -> R {} + unsafe impl<$($ArgTy,)* R> ZeroableInOption for unsafe extern "C" fn($($ArgTy,)*) -> R {} + unsafe impl<$($ArgTy,)* R> ZeroableInOption for extern "system" fn($($ArgTy,)*) -> R {} + unsafe impl<$($ArgTy,)* R> ZeroableInOption for unsafe extern "system" fn($($ArgTy,)*) -> R {} + #[cfg(feature = "zeroable_unwind_fn")] + impl_for_unwind_fn!($($ArgTy),*); + }; +} + + + +impl_for_fn!(); +impl_for_fn!(A); +impl_for_fn!(A, B); +impl_for_fn!(A, B, C); +impl_for_fn!(A, B, C, D); +impl_for_fn!(A, B, C, D, E); +impl_for_fn!(A, B, C, D, E, F); +impl_for_fn!(A, B, C, D, E, F, G); +impl_for_fn!(A, B, C, D, E, F, G, H); +impl_for_fn!(A, B, C, D, E, F, G, H, I); +impl_for_fn!(A, B, C, D, E, F, G, H, I, J); +impl_for_fn!(A, B, C, D, E, F, G, H, I, J, K); +impl_for_fn!(A, B, C, D, E, F, G, H, I, J, K, L); +impl_for_fn!(A, B, C, D, E, F, G, H, I, J, K, L, M);
diff --git a/third_party/rust/chromium_crates_io/vendor/cc-v1/Cargo.toml b/third_party/rust/chromium_crates_io/vendor/cc-v1/Cargo.toml index b0bb390..c698ea10 100644 --- a/third_party/rust/chromium_crates_io/vendor/cc-v1/Cargo.toml +++ b/third_party/rust/chromium_crates_io/vendor/cc-v1/Cargo.toml
@@ -6,13 +6,13 @@ # by `tools/crates/run_gnrt.py vendor`. Do not edit! # # This is an empty placeholder that has replaced the -# `cc-1.2.20` crate. +# `cc-1.2.22` crate. # # See `//tools/crates/gnrt/removed_crate.md` to learn more. [package] name = "cc" -version = "1.2.20" +version = "1.2.22" [package.metadata.gnrt] is_placeholder = true
diff --git a/third_party/rust/chromium_crates_io/vendor/cc-v1/src/lib.rs b/third_party/rust/chromium_crates_io/vendor/cc-v1/src/lib.rs index 402bd41..f330049 100644 --- a/third_party/rust/chromium_crates_io/vendor/cc-v1/src/lib.rs +++ b/third_party/rust/chromium_crates_io/vendor/cc-v1/src/lib.rs
@@ -6,6 +6,6 @@ // by `tools/crates/run_gnrt.py vendor`. Do not edit! // // This is an empty placeholder that has replaced the -// `cc-1.2.20` crate. +// `cc-1.2.22` crate. // // See `//tools/crates/gnrt/removed_crate.md` to learn more.
diff --git a/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/.cargo_vcs_info.json b/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/.cargo_vcs_info.json index df7d6e4..ce60137 100644 --- a/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/.cargo_vcs_info.json +++ b/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/.cargo_vcs_info.json
@@ -1,6 +1,6 @@ { "git": { - "sha1": "6c17446b6003a3abee8c7909aaf541e504b4a5dd" + "sha1": "631dfed6e9a4f0afd5de3f6799d02f2baa8e7050" }, "path_in_vcs": "" } \ No newline at end of file
diff --git a/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/CHANGELOG.md b/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/CHANGELOG.md index ea702c38..d34f654 100644 --- a/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/CHANGELOG.md +++ b/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/CHANGELOG.md
@@ -1,12 +1,27 @@ -# Change Log +# Changelog All notable changes to this project will be documented in this file. -The format is based on [Keep a Changelog](https://keepachangelog.com/) -and this project adheres to [Semantic Versioning](https://semver.org/). +The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/), +and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html). ## [Unreleased] +## [0.15.3](https://github.com/rust-lang/hashbrown/compare/v0.15.2...v0.15.3) - 2025-04-29 + +### Added + +- SIMD implementation for LoongArch (#592, requires nightly) + +### Changed + +- Optimized insertion path by avoiding an unnecessary `match_empty` (#607) +- Increased minimum table size for small types (#615) +- Dropped FnMut trait bounds from `ExtractIf` data structures (#616) +- Relaxed constraint in `hash_map::EntryRef` insertion methods `K: From<&Q>` to &Q: `Into<K>` (#611) +- Added allocator template argument for `rustc_iter` (#605) +- The `allocator-api2/nightly` feature is no longer enabled by `hashbrown/nightly` (#606) + ## [v0.15.2] - 2024-11-14 ### Added
diff --git a/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/Cargo.lock b/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/Cargo.lock index 92634c9..521f5e5 100644 --- a/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/Cargo.lock +++ b/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/Cargo.lock
@@ -4,15 +4,21 @@ [[package]] name = "allocator-api2" -version = "0.2.16" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0942ffc6dcaadf03badf6e6a2d0228460359d5e34b57ccdc720b7382dfbd5ec5" +checksum = "683d7910e743518b0e34f1186f92494becacb047c7b6bf616c96772180fef923" + +[[package]] +name = "bitflags" +version = "2.9.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" [[package]] name = "bumpalo" -version = "3.15.3" +version = "3.17.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ea184aa71bb362a1157c896979544cc23974e08fd265f29ea96b59f0b4a555b" +checksum = "1628fb46dfa0b37568d12e5edd512553eccf6a22a78e8bde00bb4aed84d5bdbf" dependencies = [ "allocator-api2", ] @@ -25,15 +31,15 @@ [[package]] name = "compiler_builtins" -version = "0.1.108" +version = "0.1.156" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d68bc55329711cd719c2687bb147bc06211b0521f97ef398280108ccb23227e9" +checksum = "c1ffbd2789fe5bb95b96a2e22cbe3128239dc46ff0374e0d38e9f102062d7055" [[package]] name = "crossbeam-deque" -version = "0.8.5" +version = "0.8.6" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "613f8cc01fe9cf1a3eb3d7f488fd2fa8388403e97039e2f73692932e291a770d" +checksum = "9dd111b7b7f7d55b72c0a6ae361660ee5853c9af73f70c3c2ef6858b950e2e51" dependencies = [ "crossbeam-epoch", "crossbeam-utils", @@ -50,9 +56,9 @@ [[package]] name = "crossbeam-utils" -version = "0.8.19" +version = "0.8.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "248e3bacc7dc6baa3b21e405ee045c3047101a49145e7e9eca583ab4c2ca5345" +checksum = "d0a5c400df2834b80a4c3327b3aad3a4c4cd4de0629063962b03235697506a28" [[package]] name = "doc-comment" @@ -62,15 +68,15 @@ [[package]] name = "either" -version = "1.10.0" +version = "1.15.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "11157ac094ffbdde99aa67b23417ebdd801842852b500e395a45a9c0aac03e4a" +checksum = "48c757948c5ede0e46177b7add2e67155f70e33c07fea8284df6576da70b3719" [[package]] name = "equivalent" -version = "1.0.1" +version = "1.0.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" +checksum = "877a4ace8713b0bcf2a4e7eec82529c029f1d0619886d18145fea96c3ffe5c0f" [[package]] name = "fnv" @@ -80,24 +86,25 @@ [[package]] name = "foldhash" -version = "0.1.2" +version = "0.1.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "33d5ac82bdbbd872ce0dfea4e848a678cfcfdc0d210a5b20549b8c659fec0392" +checksum = "d9c4f5dac5e15c24eb999c26181a6ca40b39fe946cbe4c263c7209467bc83af2" [[package]] name = "getrandom" -version = "0.2.12" +version = "0.3.2" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "190092ea657667030ac6a35e305e62fc4dd69fd98ac98631e5d3a2b1575a12b5" +checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" dependencies = [ "cfg-if", "libc", + "r-efi", "wasi", ] [[package]] name = "hashbrown" -version = "0.15.2" +version = "0.15.3" dependencies = [ "allocator-api2", "bumpalo", @@ -117,56 +124,64 @@ [[package]] name = "lazy_static" -version = "1.4.0" +version = "1.5.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646" +checksum = "bbd2bcb4c963f2ddae06a2efc7e9f3591312473c50c6685e1f298068316e66fe" [[package]] name = "libc" -version = "0.2.153" +version = "0.2.172" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd" +checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" [[package]] name = "ppv-lite86" -version = "0.2.17" +version = "0.2.21" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5b40af805b3121feab8a3c29f04d8ad262fa8e0561883e7653e024ae4479e6de" +checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" +dependencies = [ + "zerocopy", +] [[package]] name = "proc-macro2" -version = "1.0.78" +version = "1.0.95" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae" +checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" dependencies = [ "unicode-ident", ] [[package]] name = "quote" -version = "1.0.35" +version = "1.0.40" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "291ec9ab5efd934aaf503a6466c5d5251535d108ee747472c3977cc5acc868ef" +checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" dependencies = [ "proc-macro2", ] [[package]] -name = "rand" -version = "0.8.5" +name = "r-efi" +version = "5.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "34af8d1a0e25924bc5b7c43c079c942339d8f0a8b57c39049bef581b46327404" +checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" + +[[package]] +name = "rand" +version = "0.9.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" dependencies = [ - "libc", "rand_chacha", "rand_core", ] [[package]] name = "rand_chacha" -version = "0.3.1" +version = "0.9.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e6c10a63a0fa32252be49d21e7709d4d4baf8d231c2dbce1eaa8141b9b127d88" +checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" dependencies = [ "ppv-lite86", "rand_core", @@ -174,18 +189,18 @@ [[package]] name = "rand_core" -version = "0.6.4" +version = "0.9.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ec0be4795e2f6a28069bec0b5ff3e2ac9bafc99e6a9a7dc3547996c5c816922c" +checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" dependencies = [ "getrandom", ] [[package]] name = "rayon" -version = "1.9.0" +version = "1.10.0" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e4963ed1bc86e4f3ee217022bd855b297cef07fb9eac5dfa1f788b220b49b3bd" +checksum = "b418a60154510ca1a002a752ca9714984e21e4241e804d32555251faf8b78ffa" dependencies = [ "either", "rayon-core", @@ -203,30 +218,30 @@ [[package]] name = "rustc-std-workspace-alloc" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "ff66d57013a5686e1917ed6a025d54dd591fcda71a41fe07edf4d16726aefa86" +checksum = "f9d441c3b2ebf55cebf796bfdc265d67fa09db17b7bb6bd4be75c509e1e8fec3" [[package]] name = "rustc-std-workspace-core" -version = "1.0.0" +version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1956f5517128a2b6f23ab2dadf1a976f4f5b27962e7724c2bf3d45e539ec098c" +checksum = "aa9c45b374136f52f2d6311062c7146bff20fec063c3f5d46a410bd937746955" [[package]] name = "serde" -version = "1.0.197" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3fb1c873e1b9b056a4dc4c0c198b24c3ffa059243875552b2bd0933b1aee4ce2" +checksum = "5f0e2c6ed6606019b4e29e69dbaba95b11854410e5347d525002456dbbb786b6" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.197" +version = "1.0.219" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "7eb0b34b42edc17f6b7cac84a52a1c5f0e1bb2227e997ca9011ea3dd34e8610b" +checksum = "5b0276cf7f2c73365f7157c8123c21cd9a50fbbd844757af28ca1f5925fc2a00" dependencies = [ "proc-macro2", "quote", @@ -235,18 +250,18 @@ [[package]] name = "serde_test" -version = "1.0.176" +version = "1.0.177" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a2f49ace1498612d14f7e0b8245519584db8299541dfe31a06374a828d620ab" +checksum = "7f901ee573cab6b3060453d2d5f0bae4e6d628c23c0a962ff9b5f1d7c8d4f1ed" dependencies = [ "serde", ] [[package]] name = "syn" -version = "2.0.52" +version = "2.0.101" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "b699d15b36d1f02c3e7c69f8ffef53de37aefae075d8488d4ba1a7788d574a07" +checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" dependencies = [ "proc-macro2", "quote", @@ -255,12 +270,44 @@ [[package]] name = "unicode-ident" -version = "1.0.12" +version = "1.0.18" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "3354b9ac3fae1ff6755cb6db53683adb661634f67557942dea4facebec0fee4b" +checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.14.2+wasi-0.2.4" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" +dependencies = [ + "wit-bindgen-rt", +] + +[[package]] +name = "wit-bindgen-rt" +version = "0.39.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" +dependencies = [ + "bitflags", +] + +[[package]] +name = "zerocopy" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" +dependencies = [ + "zerocopy-derive", +] + +[[package]] +name = "zerocopy-derive" +version = "0.8.25" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" +dependencies = [ + "proc-macro2", + "quote", + "syn", +]
diff --git a/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/Cargo.toml b/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/Cargo.toml index 39552415..71574023 100644 --- a/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/Cargo.toml +++ b/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/Cargo.toml
@@ -13,7 +13,7 @@ edition = "2021" rust-version = "1.65.0" name = "hashbrown" -version = "0.15.2" +version = "0.15.3" authors = ["Amanieu d'Antras <amanieu@gmail.com>"] build = false exclude = [ @@ -49,6 +49,27 @@ ] rustdoc-args = ["--generate-link-to-definition"] +[features] +default = [ + "default-hasher", + "inline-more", + "allocator-api2", + "equivalent", + "raw-entry", +] +default-hasher = ["dep:foldhash"] +inline-more = [] +nightly = ["bumpalo/allocator_api"] +raw-entry = [] +rustc-dep-of-std = [ + "nightly", + "core", + "compiler_builtins", + "alloc", + "rustc-internal-api", +] +rustc-internal-api = [] + [lib] name = "hashbrown" path = "src/lib.rs" @@ -138,7 +159,7 @@ version = "1.4" [dev-dependencies.rand] -version = "0.8.3" +version = "0.9.0" features = ["small_rng"] [dev-dependencies.rayon] @@ -146,28 +167,3 @@ [dev-dependencies.serde_test] version = "1.0" - -[features] -default = [ - "default-hasher", - "inline-more", - "allocator-api2", - "equivalent", - "raw-entry", -] -default-hasher = ["dep:foldhash"] -inline-more = [] -nightly = [ - "allocator-api2?/nightly", - "bumpalo/allocator_api", -] -raw-entry = [] -rustc-dep-of-std = [ - "nightly", - "core", - "compiler_builtins", - "alloc", - "rustc-internal-api", - "raw-entry", -] -rustc-internal-api = []
diff --git a/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/Cargo.toml.orig b/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/Cargo.toml.orig index 7bc1167..70a39010 100644 --- a/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/Cargo.toml.orig +++ b/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/Cargo.toml.orig
@@ -1,6 +1,6 @@ [package] name = "hashbrown" -version = "0.15.2" +version = "0.15.3" authors = ["Amanieu d'Antras <amanieu@gmail.com>"] description = "A Rust port of Google's SwissTable hash map" license = "MIT OR Apache-2.0" @@ -35,7 +35,7 @@ [dev-dependencies] lazy_static = "1.4" -rand = { version = "0.8.3", features = ["small_rng"] } +rand = { version = "0.9.0", features = ["small_rng"] } rayon = "1.2" fnv = "1.0.7" serde_test = "1.0" @@ -47,7 +47,7 @@ # Enables use of nightly features. This is only guaranteed to work on the latest # version of nightly Rust. -nightly = ["allocator-api2?/nightly", "bumpalo/allocator_api"] +nightly = ["bumpalo/allocator_api"] # Enables the RustcEntry API used to provide the standard library's Entry API. rustc-internal-api = [] @@ -59,7 +59,6 @@ "compiler_builtins", "alloc", "rustc-internal-api", - "raw-entry", ] # Enables the deprecated RawEntry API.
diff --git a/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/Cross.toml b/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/Cross.toml new file mode 100644 index 0000000..de63570 --- /dev/null +++ b/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/Cross.toml
@@ -0,0 +1,3 @@ +# FIXME: Drop this config when cross is updated to support loongarch64-linux-gnu +[target.loongarch64-unknown-linux-gnu] +image = "ghcr.io/cross-rs/loongarch64-unknown-linux-gnu:edge"
diff --git a/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/README.md b/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/README.md index cb6dc269..83a5381 100644 --- a/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/README.md +++ b/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/README.md
@@ -4,7 +4,7 @@ [](https://github.com/rust-lang/hashbrown/actions) [](https://crates.io/crates/hashbrown) [](https://docs.rs/hashbrown) -[](https://github.com/rust-lang/hashbrown) +[](https://github.com/rust-lang/hashbrown) This crate is a Rust port of Google's high-performance [SwissTable] hash map, adapted to make it a drop-in replacement for Rust's standard `HashMap`
diff --git a/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/benches/bench.rs b/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/benches/bench.rs index dd55159..111c5d5 100644 --- a/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/benches/bench.rs +++ b/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/benches/bench.rs
@@ -45,9 +45,7 @@ // Just an arbitrary side effect to make the maps not shortcircuit to the non-dropping path // when dropping maps/entries (most real world usages likely have drop in the key or value) -lazy_static::lazy_static! { - static ref SIDE_EFFECT: AtomicUsize = AtomicUsize::new(0); -} +static SIDE_EFFECT: AtomicUsize = AtomicUsize::new(0); #[derive(Clone)] struct DropType(usize);
diff --git a/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/src/control/group/lsx.rs b/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/src/control/group/lsx.rs new file mode 100644 index 0000000..5f45bc8 --- /dev/null +++ b/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/src/control/group/lsx.rs
@@ -0,0 +1,137 @@ +use super::super::{BitMask, Tag}; +use core::mem; +use core::num::NonZeroU16; + +use core::arch::loongarch64::*; +use mem::transmute; + +pub(crate) type BitMaskWord = u16; +pub(crate) type NonZeroBitMaskWord = NonZeroU16; +pub(crate) const BITMASK_STRIDE: usize = 1; +pub(crate) const BITMASK_MASK: BitMaskWord = 0xffff; +pub(crate) const BITMASK_ITER_MASK: BitMaskWord = !0; + +/// Abstraction over a group of control tags which can be scanned in +/// parallel. +/// +/// This implementation uses a 128-bit LSX value. +#[derive(Copy, Clone)] +pub(crate) struct Group(v16i8); + +// FIXME: https://github.com/rust-lang/rust-clippy/issues/3859 +#[allow(clippy::use_self)] +impl Group { + /// Number of bytes in the group. + pub(crate) const WIDTH: usize = mem::size_of::<Self>(); + + /// Returns a full group of empty tags, suitable for use as the initial + /// value for an empty hash table. + /// + /// This is guaranteed to be aligned to the group size. + #[inline] + #[allow(clippy::items_after_statements)] + pub(crate) const fn static_empty() -> &'static [Tag; Group::WIDTH] { + #[repr(C)] + struct AlignedTags { + _align: [Group; 0], + tags: [Tag; Group::WIDTH], + } + const ALIGNED_TAGS: AlignedTags = AlignedTags { + _align: [], + tags: [Tag::EMPTY; Group::WIDTH], + }; + &ALIGNED_TAGS.tags + } + + /// Loads a group of tags starting at the given address. + #[inline] + #[allow(clippy::cast_ptr_alignment)] // unaligned load + pub(crate) unsafe fn load(ptr: *const Tag) -> Self { + Group(lsx_vld::<0>(ptr.cast())) + } + + /// Loads a group of tags starting at the given address, which must be + /// aligned to `mem::align_of::<Group>()`. + #[inline] + #[allow(clippy::cast_ptr_alignment)] + pub(crate) unsafe fn load_aligned(ptr: *const Tag) -> Self { + debug_assert_eq!(ptr.align_offset(mem::align_of::<Self>()), 0); + Group(lsx_vld::<0>(ptr.cast())) + } + + /// Stores the group of tags to the given address, which must be + /// aligned to `mem::align_of::<Group>()`. + #[inline] + #[allow(clippy::cast_ptr_alignment)] + pub(crate) unsafe fn store_aligned(self, ptr: *mut Tag) { + debug_assert_eq!(ptr.align_offset(mem::align_of::<Self>()), 0); + lsx_vst::<0>(self.0, ptr.cast()); + } + + /// Returns a `BitMask` indicating all tags in the group which have + /// the given value. + #[inline] + pub(crate) fn match_tag(self, tag: Tag) -> BitMask { + #[allow(clippy::missing_transmute_annotations)] + unsafe { + let cmp = lsx_vseq_b(self.0, lsx_vreplgr2vr_b(tag.0 as i32)); + BitMask(lsx_vpickve2gr_hu::<0>(transmute(lsx_vmskltz_b(cmp))) as u16) + } + } + + /// Returns a `BitMask` indicating all tags in the group which are + /// `EMPTY`. + #[inline] + pub(crate) fn match_empty(self) -> BitMask { + #[allow(clippy::missing_transmute_annotations)] + unsafe { + let cmp = lsx_vseqi_b::<{ Tag::EMPTY.0 as i8 as i32 }>(self.0); + BitMask(lsx_vpickve2gr_hu::<0>(transmute(lsx_vmskltz_b(cmp))) as u16) + } + } + + /// Returns a `BitMask` indicating all tags in the group which are + /// `EMPTY` or `DELETED`. + #[inline] + pub(crate) fn match_empty_or_deleted(self) -> BitMask { + #[allow(clippy::missing_transmute_annotations)] + unsafe { + // A tag is EMPTY or DELETED iff the high bit is set + BitMask(lsx_vpickve2gr_hu::<0>(transmute(lsx_vmskltz_b(self.0))) as u16) + } + } + + /// Returns a `BitMask` indicating all tags in the group which are full. + #[inline] + pub(crate) fn match_full(&self) -> BitMask { + #[allow(clippy::missing_transmute_annotations)] + unsafe { + // A tag is EMPTY or DELETED iff the high bit is set + BitMask(lsx_vpickve2gr_hu::<0>(transmute(lsx_vmskgez_b(self.0))) as u16) + } + } + + /// Performs the following transformation on all tags in the group: + /// - `EMPTY => EMPTY` + /// - `DELETED => EMPTY` + /// - `FULL => DELETED` + #[inline] + pub(crate) fn convert_special_to_empty_and_full_to_deleted(self) -> Self { + // Map high_bit = 1 (EMPTY or DELETED) to 1111_1111 + // and high_bit = 0 (FULL) to 1000_0000 + // + // Here's this logic expanded to concrete values: + // let special = 0 > tag = 1111_1111 (true) or 0000_0000 (false) + // 1111_1111 | 1000_0000 = 1111_1111 + // 0000_0000 | 1000_0000 = 1000_0000 + #[allow(clippy::missing_transmute_annotations)] + unsafe { + let zero = lsx_vreplgr2vr_b(0); + let special = lsx_vslt_b(self.0, zero); + Group(transmute(lsx_vor_v( + transmute(special), + transmute(lsx_vreplgr2vr_b(Tag::DELETED.0 as i32)), + ))) + } + } +}
diff --git a/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/src/control/group/mod.rs b/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/src/control/group/mod.rs index 61432604..fe2d774 100644 --- a/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/src/control/group/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/src/control/group/mod.rs
@@ -24,6 +24,14 @@ ))] { mod neon; use neon as imp; + } else if #[cfg(all( + feature = "nightly", + target_arch = "loongarch64", + target_feature = "lsx", + not(miri), + ))] { + mod lsx; + use lsx as imp; } else { mod generic; use generic as imp;
diff --git a/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/src/external_trait_impls/serde.rs b/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/src/external_trait_impls/serde.rs index 0a76dbec2..f9eb05f 100644 --- a/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/src/external_trait_impls/serde.rs +++ b/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/src/external_trait_impls/serde.rs
@@ -186,7 +186,7 @@ where A: Allocator; - impl<'a, 'de, T, S, A> Visitor<'de> for SeqInPlaceVisitor<'a, T, S, A> + impl<'de, T, S, A> Visitor<'de> for SeqInPlaceVisitor<'_, T, S, A> where T: Deserialize<'de> + Eq + Hash, S: BuildHasher + Default,
diff --git a/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/src/lib.rs b/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/src/lib.rs index 5b5d185..e79da830f 100644 --- a/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/src/lib.rs +++ b/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/src/lib.rs
@@ -38,7 +38,14 @@ #![warn(missing_docs)] #![warn(rust_2018_idioms)] #![cfg_attr(feature = "nightly", warn(fuzzy_provenance_casts))] -#![cfg_attr(feature = "nightly", allow(internal_features))] +#![cfg_attr( + feature = "nightly", + allow(clippy::incompatible_msrv, internal_features) +)] +#![cfg_attr( + all(feature = "nightly", target_arch = "loongarch64"), + feature(stdarch_loongarch) +)] /// Default hasher for [`HashMap`] and [`HashSet`]. #[cfg(feature = "default-hasher")]
diff --git a/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/src/map.rs b/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/src/map.rs index c373d59..78c0a2e 100644 --- a/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/src/map.rs +++ b/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/src/map.rs
@@ -2596,10 +2596,7 @@ /// assert_eq!(map.len(), 1); /// ``` #[must_use = "Iterators are lazy unless consumed"] -pub struct ExtractIf<'a, K, V, F, A: Allocator = Global> -where - F: FnMut(&K, &mut V) -> bool, -{ +pub struct ExtractIf<'a, K, V, F, A: Allocator = Global> { f: F, inner: RawExtractIf<'a, (K, V), A>, } @@ -4131,7 +4128,8 @@ #[cfg_attr(feature = "inline-more", inline)] pub fn insert(self, value: V) -> OccupiedEntry<'a, K, V, S, A> where - K: Hash + From<&'b Q>, + K: Hash, + &'b Q: Into<K>, S: BuildHasher, { match self { @@ -4164,7 +4162,8 @@ #[cfg_attr(feature = "inline-more", inline)] pub fn or_insert(self, default: V) -> &'a mut V where - K: Hash + From<&'b Q>, + K: Hash, + &'b Q: Into<K>, S: BuildHasher, { match self { @@ -4194,7 +4193,8 @@ #[cfg_attr(feature = "inline-more", inline)] pub fn or_insert_with<F: FnOnce() -> V>(self, default: F) -> &'a mut V where - K: Hash + From<&'b Q>, + K: Hash, + &'b Q: Into<K>, S: BuildHasher, { match self { @@ -4225,7 +4225,8 @@ #[cfg_attr(feature = "inline-more", inline)] pub fn or_insert_with_key<F: FnOnce(&Q) -> V>(self, default: F) -> &'a mut V where - K: Hash + Borrow<Q> + From<&'b Q>, + K: Hash + Borrow<Q>, + &'b Q: Into<K>, S: BuildHasher, { match self { @@ -4320,7 +4321,8 @@ #[cfg_attr(feature = "inline-more", inline)] pub fn or_default(self) -> &'a mut V where - K: Hash + From<&'b Q>, + K: Hash, + &'b Q: Into<K>, S: BuildHasher, { match self { @@ -4368,7 +4370,8 @@ #[cfg_attr(feature = "inline-more", inline)] pub fn insert(self, value: V) -> &'a mut V where - K: Hash + From<&'b Q>, + K: Hash, + &'b Q: Into<K>, S: BuildHasher, { let table = &mut self.table.table; @@ -4399,7 +4402,8 @@ #[cfg_attr(feature = "inline-more", inline)] pub fn insert_entry(self, value: V) -> OccupiedEntry<'a, K, V, S, A> where - K: Hash + From<&'b Q>, + K: Hash, + &'b Q: Into<K>, S: BuildHasher, { let elem = self.table.table.insert( @@ -4690,9 +4694,9 @@ use super::Entry::{Occupied, Vacant}; use super::EntryRef; use super::HashMap; + use crate::raw::{AllocError, Allocator, Global}; use alloc::string::{String, ToString}; use alloc::sync::Arc; - use allocator_api2::alloc::{AllocError, Allocator, Global}; use core::alloc::Layout; use core::ptr::NonNull; use core::sync::atomic::{AtomicI8, Ordering};
diff --git a/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/src/raw/alloc.rs b/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/src/raw/alloc.rs index 15299e7..c01e2a4 100644 --- a/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/src/raw/alloc.rs +++ b/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/src/raw/alloc.rs
@@ -1,3 +1,5 @@ +#[cfg(test)] +pub(crate) use self::inner::AllocError; pub(crate) use self::inner::{do_alloc, Allocator, Global}; // Nightly-case. @@ -6,6 +8,8 @@ // This is used when building for `std`. #[cfg(feature = "nightly")] mod inner { + #[cfg(test)] + pub use crate::alloc::alloc::AllocError; use crate::alloc::alloc::Layout; pub use crate::alloc::alloc::{Allocator, Global}; use core::ptr::NonNull; @@ -28,6 +32,8 @@ #[cfg(all(not(feature = "nightly"), feature = "allocator-api2"))] mod inner { use crate::alloc::alloc::Layout; + #[cfg(test)] + pub use allocator_api2::alloc::AllocError; pub use allocator_api2::alloc::{Allocator, Global}; use core::ptr::NonNull;
diff --git a/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/src/raw/mod.rs b/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/src/raw/mod.rs index 2773b67..c0d82a1b 100644 --- a/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/src/raw/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/src/raw/mod.rs
@@ -12,6 +12,8 @@ use core::{hint, ptr}; mod alloc; +#[cfg(test)] +pub(crate) use self::alloc::AllocError; pub(crate) use self::alloc::{do_alloc, Allocator, Global}; #[inline] @@ -98,16 +100,51 @@ // Workaround for emscripten bug emscripten-core/emscripten-fastcomp#258 #[cfg_attr(target_os = "emscripten", inline(never))] #[cfg_attr(not(target_os = "emscripten"), inline)] -fn capacity_to_buckets(cap: usize) -> Option<usize> { +fn capacity_to_buckets(cap: usize, table_layout: TableLayout) -> Option<usize> { debug_assert_ne!(cap, 0); // For small tables we require at least 1 empty bucket so that lookups are // guaranteed to terminate if an element doesn't exist in the table. - if cap < 8 { + if cap < 15 { + // Consider a small TableLayout like { size: 1, ctrl_align: 16 } on a + // platform with Group::WIDTH of 16 (like x86_64 with SSE2). For small + // bucket sizes, this ends up wasting quite a few bytes just to pad to + // the relatively larger ctrl_align: + // + // | capacity | buckets | bytes allocated | bytes per item | + // | -------- | ------- | --------------- | -------------- | + // | 3 | 4 | 36 | (Yikes!) 12.0 | + // | 7 | 8 | 40 | (Poor) 5.7 | + // | 14 | 16 | 48 | 3.4 | + // | 28 | 32 | 80 | 3.3 | + // + // In general, buckets * table_layout.size >= table_layout.ctrl_align + // must be true to avoid these edges. This is implemented by adjusting + // the minimum capacity upwards for small items. This code only needs + // to handle ctrl_align which are less than or equal to Group::WIDTH, + // because valid layout sizes are always a multiple of the alignment, + // so anything with alignment over the Group::WIDTH won't hit this edge + // case. + + // This is brittle, e.g. if we ever add 32 byte groups, it will select + // 3 regardless of the table_layout.size. + let min_cap = match (Group::WIDTH, table_layout.size) { + (16, 0..=1) => 14, + (16, 2..=3) => 7, + (8, 0..=1) => 7, + _ => 3, + }; + let cap = min_cap.max(cap); // We don't bother with a table size of 2 buckets since that can only - // hold a single element. Instead we skip directly to a 4 bucket table + // hold a single element. Instead, we skip directly to a 4 bucket table // which can hold 3 elements. - return Some(if cap < 4 { 4 } else { 8 }); + return Some(if cap < 4 { + 4 + } else if cap < 8 { + 8 + } else { + 16 + }); } // Otherwise require 1/8 buckets to be empty (87.5% load) @@ -849,7 +886,7 @@ // elements. If the calculation overflows then the requested bucket // count must be larger than what we have right and nothing needs to be // done. - let min_buckets = match capacity_to_buckets(min_size) { + let min_buckets = match capacity_to_buckets(min_size, Self::TABLE_LAYOUT) { Some(buckets) => buckets, None => return, }; @@ -980,14 +1017,8 @@ /// * If `self.table.items != 0`, calling of this function with `capacity` /// equal to 0 (`capacity == 0`) results in [`undefined behavior`]. /// - /// * If `capacity_to_buckets(capacity) < Group::WIDTH` and - /// `self.table.items > capacity_to_buckets(capacity)` - /// calling this function results in [`undefined behavior`]. - /// - /// * If `capacity_to_buckets(capacity) >= Group::WIDTH` and - /// `self.table.items > capacity_to_buckets(capacity)` - /// calling this function are never return (will go into an - /// infinite loop). + /// * If `self.table.items > capacity_to_buckets(capacity, Self::TABLE_LAYOUT)` + /// calling this function are never return (will loop infinitely). /// /// See [`RawTableInner::find_insert_slot`] for more information. /// @@ -1477,8 +1508,8 @@ // SAFETY: We checked that we could successfully allocate the new table, and then // initialized all control bytes with the constant `Tag::EMPTY` byte. unsafe { - let buckets = - capacity_to_buckets(capacity).ok_or_else(|| fallibility.capacity_overflow())?; + let buckets = capacity_to_buckets(capacity, table_layout) + .ok_or_else(|| fallibility.capacity_overflow())?; let mut result = Self::new_uninitialized(alloc, table_layout, buckets, fallibility)?; @@ -1687,18 +1718,20 @@ insert_slot = self.find_insert_slot_in_group(&group, &probe_seq); } - // Only stop the search if the group contains at least one empty element. - // Otherwise, the element that we are looking for might be in a following group. - if likely(group.match_empty().any_bit_set()) { - // We must have found a insert slot by now, since the current group contains at - // least one. For tables smaller than the group width, there will still be an - // empty element in the current (and only) group due to the load factor. - unsafe { - // SAFETY: - // * Caller of this function ensures that the control bytes are properly initialized. - // - // * We use this function with the slot / index found by `self.find_insert_slot_in_group` - return Err(self.fix_insert_slot(insert_slot.unwrap_unchecked())); + if let Some(insert_slot) = insert_slot { + // Only stop the search if the group contains at least one empty element. + // Otherwise, the element that we are looking for might be in a following group. + if likely(group.match_empty().any_bit_set()) { + // We must have found a insert slot by now, since the current group contains at + // least one. For tables smaller than the group width, there will still be an + // empty element in the current (and only) group due to the load factor. + unsafe { + // SAFETY: + // * Caller of this function ensures that the control bytes are properly initialized. + // + // * We use this function with the slot / index found by `self.find_insert_slot_in_group` + return Err(self.fix_insert_slot(insert_slot)); + } } } @@ -4135,6 +4168,26 @@ mod test_map { use super::*; + #[test] + fn test_minimum_capacity_for_small_types() { + #[track_caller] + fn test_t<T>() { + let raw_table: RawTable<T> = RawTable::with_capacity(1); + let actual_buckets = raw_table.buckets(); + let min_buckets = Group::WIDTH / core::mem::size_of::<T>(); + assert!( + actual_buckets >= min_buckets, + "expected at least {min_buckets} buckets, got {actual_buckets} buckets" + ); + } + + test_t::<u8>(); + + // This is only "small" for some platforms, like x86_64 with SSE2, but + // there's no harm in running it on other platforms. + test_t::<u16>(); + } + fn rehash_in_place<T>(table: &mut RawTable<T>, hasher: impl Fn(&T) -> u64) { unsafe { table.table.rehash_in_place( @@ -4238,9 +4291,9 @@ /// ARE ZERO, EVEN IF WE HAVE `FULL` CONTROL BYTES. #[test] fn test_catch_panic_clone_from() { + use super::{AllocError, Allocator, Global}; use ::alloc::sync::Arc; use ::alloc::vec::Vec; - use allocator_api2::alloc::{AllocError, Allocator, Global}; use core::sync::atomic::{AtomicI8, Ordering}; use std::thread;
diff --git a/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/src/rustc_entry.rs b/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/src/rustc_entry.rs index cb48be0..233fe7a 100644 --- a/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/src/rustc_entry.rs +++ b/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/src/rustc_entry.rs
@@ -550,7 +550,7 @@ } } -impl<K, V> IntoIter<K, V> { +impl<K, V, A: Allocator> IntoIter<K, V, A> { /// Returns a iterator of references over the remaining items. #[cfg_attr(feature = "inline-more", inline)] pub fn rustc_iter(&self) -> Iter<'_, K, V> { @@ -558,7 +558,7 @@ } } -impl<K, V> Drain<'_, K, V> { +impl<K, V, A: Allocator> Drain<'_, K, V, A> { /// Returns a iterator of references over the remaining items. #[cfg_attr(feature = "inline-more", inline)] pub fn rustc_iter(&self) -> Iter<'_, K, V> {
diff --git a/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/src/set.rs b/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/src/set.rs index d57390f..d56d7c4f 100644 --- a/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/src/set.rs +++ b/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/src/set.rs
@@ -1678,10 +1678,7 @@ /// [`extract_if`]: struct.HashSet.html#method.extract_if /// [`HashSet`]: struct.HashSet.html #[must_use = "Iterators are lazy unless consumed"] -pub struct ExtractIf<'a, K, F, A: Allocator = Global> -where - F: FnMut(&K) -> bool, -{ +pub struct ExtractIf<'a, K, F, A: Allocator = Global> { f: F, inner: RawExtractIf<'a, (K, ()), A>, }
diff --git a/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/src/table.rs b/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/src/table.rs index 7f665b7..2565f6f 100644 --- a/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/src/table.rs +++ b/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/src/table.rs
@@ -2343,10 +2343,7 @@ /// This `struct` is created by [`HashTable::extract_if`]. See its /// documentation for more. #[must_use = "Iterators are lazy unless consumed"] -pub struct ExtractIf<'a, T, F, A: Allocator = Global> -where - F: FnMut(&mut T) -> bool, -{ +pub struct ExtractIf<'a, T, F, A: Allocator = Global> { f: F, inner: RawExtractIf<'a, T, A>, }
diff --git a/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/tests/set.rs b/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/tests/set.rs index 86ec964..d25f3d4 100644 --- a/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/tests/set.rs +++ b/third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/tests/set.rs
@@ -1,7 +1,7 @@ #![cfg(not(miri))] // FIXME: takes too long use hashbrown::HashSet; -use rand::{distributions::Alphanumeric, rngs::SmallRng, Rng, SeedableRng}; +use rand::{distr::Alphanumeric, rngs::SmallRng, Rng, SeedableRng}; use std::iter; #[test]
diff --git a/third_party/rust/hashbrown/v0_15/BUILD.gn b/third_party/rust/hashbrown/v0_15/BUILD.gn index 8595d7b..2ce2a2d5 100644 --- a/third_party/rust/hashbrown/v0_15/BUILD.gn +++ b/third_party/rust/hashbrown/v0_15/BUILD.gn
@@ -17,6 +17,7 @@ sources = [ "//third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/src/control/bitmask.rs", "//third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/src/control/group/generic.rs", + "//third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/src/control/group/lsx.rs", "//third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/src/control/group/mod.rs", "//third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/src/control/group/neon.rs", "//third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/src/control/group/sse2.rs", @@ -46,7 +47,7 @@ build_native_rust_unit_tests = false edition = "2021" - cargo_pkg_version = "0.15.2" + cargo_pkg_version = "0.15.3" cargo_pkg_authors = "Amanieu d'Antras <amanieu@gmail.com>" cargo_pkg_name = "hashbrown" cargo_pkg_description = "A Rust port of Google's SwissTable hash map"
diff --git a/third_party/rust/hashbrown/v0_15/README.chromium b/third_party/rust/hashbrown/v0_15/README.chromium index ef69f90..22888dc5 100644 --- a/third_party/rust/hashbrown/v0_15/README.chromium +++ b/third_party/rust/hashbrown/v0_15/README.chromium
@@ -1,7 +1,7 @@ Name: hashbrown URL: https://crates.io/crates/hashbrown -Version: 0.15.2 -Revision: 6c17446b6003a3abee8c7909aaf541e504b4a5dd +Version: 0.15.3 +Revision: 631dfed6e9a4f0afd5de3f6799d02f2baa8e7050 License: Apache-2.0 License File: //third_party/rust/chromium_crates_io/vendor/hashbrown-v0_15/LICENSE-APACHE Shipped: yes
diff --git a/third_party/skia b/third_party/skia index 7f75555..12dbc34d 160000 --- a/third_party/skia +++ b/third_party/skia
@@ -1 +1 @@ -Subproject commit 7f7555536e3c71d4404ad82c57fea4ac21102460 +Subproject commit 12dbc34d742ee67f1b267dc276fe7d84631aa856
diff --git a/tools/android/customtabs_benchmark/java/src/org/chromium/customtabs/test/MainActivity.java b/tools/android/customtabs_benchmark/java/src/org/chromium/customtabs/test/MainActivity.java index 7e106d6..03c2d47 100644 --- a/tools/android/customtabs_benchmark/java/src/org/chromium/customtabs/test/MainActivity.java +++ b/tools/android/customtabs_benchmark/java/src/org/chromium/customtabs/test/MainActivity.java
@@ -433,8 +433,8 @@ public long pageLoadFinishedMs = NONE; public long firstContentfulPaintMs = NONE; public long largeContentfulPaintMs = NONE; - public PinInfo pinInfo; - public long extraBriefMemoryMb; + public final PinInfo pinInfo; + public final long extraBriefMemoryMb; public CustomCallback( String packageName,
diff --git a/tools/android/errorprone_plugin/test/src/org/chromium/tools/errorprone/plugin/NoRedundantFieldInitCheckIntTest.java b/tools/android/errorprone_plugin/test/src/org/chromium/tools/errorprone/plugin/NoRedundantFieldInitCheckIntTest.java index c898f8d..4eeec5a 100644 --- a/tools/android/errorprone_plugin/test/src/org/chromium/tools/errorprone/plugin/NoRedundantFieldInitCheckIntTest.java +++ b/tools/android/errorprone_plugin/test/src/org/chromium/tools/errorprone/plugin/NoRedundantFieldInitCheckIntTest.java
@@ -6,6 +6,7 @@ /** |mBar| initialization should cause 'NoRedundantFieldInitCheck' errorprone warning. */ public class NoRedundantFieldInitCheckIntTest { + @SuppressWarnings("FieldCanBeFinal") private int mBar = 0; public void foo() {
diff --git a/tools/android/memconsumer/java/src/org/chromium/memconsumer/MemConsumer.java b/tools/android/memconsumer/java/src/org/chromium/memconsumer/MemConsumer.java index 43678b9..d81a694 100644 --- a/tools/android/memconsumer/java/src/org/chromium/memconsumer/MemConsumer.java +++ b/tools/android/memconsumer/java/src/org/chromium/memconsumer/MemConsumer.java
@@ -30,7 +30,7 @@ private int mMemory; private NumberPicker mMemoryPicker; - private ServiceConnection mServiceConnection = + private final ServiceConnection mServiceConnection = new ServiceConnection() { @Override public void onServiceConnected(ComponentName name, IBinder binder) {
diff --git a/tools/android/nullaway/run_annotator_on_chrome_java.py b/tools/android/nullaway/run_annotator_on_chrome_java.py index aa40bee2..e379056 100755 --- a/tools/android/nullaway/run_annotator_on_chrome_java.py +++ b/tools/android/nullaway/run_annotator_on_chrome_java.py
@@ -22,6 +22,8 @@ _ANNOTATOR_JAR = ('../NullAwayAnnotator/annotator-core/build/libs/' 'annotator-core-1.3.16-SNAPSHOT.jar') _CHROME_JAVA_TURBINE_JAR = 'obj/chrome/android/chrome_java.turbine.jar' +_NULLAWAY_JAR = ( + '../../third_party/android_build_tools/nullaway/cipd/nullaway.jar') def _read_file(path): @@ -70,9 +72,9 @@ 'gen/chrome/android/chrome_java.build_config.json', 'javac_full_interface_classpath') - processor_path = _read_build_config_value( + processor_path = [_NULLAWAY_JAR] + _read_build_config_value( 'gen/tools/android/errorprone_plugin/errorprone_plugin.build_config.json', - 'classpath') + 'host_classpath') if enable_annotator: processor_path.append(_ANNOTATOR_JAR)
diff --git a/tools/crates/gnrt/lib/condition.rs b/tools/crates/gnrt/lib/condition.rs index 19cebdb0d..477a315 100644 --- a/tools/crates/gnrt/lib/condition.rs +++ b/tools/crates/gnrt/lib/condition.rs
@@ -274,8 +274,8 @@ fn get_gn_arch_expr(rust_triple: &RustTargetTriple) -> &'static str { // `RustTargetArch` and `into` come from `target_triples.rs` which is // auto-generated by `gnrt`'s `build.rs`. - let rust_os = (*rust_triple).into(); - match rust_os { + let rust_arch = (*rust_triple).into(); + match rust_arch { RustTargetArch::Aarch64 => "current_cpu == \"arm64\"", RustTargetArch::Arm => "current_cpu == \"arm\"", RustTargetArch::Riscv64 => "current_cpu == \"riscv64\"",
diff --git a/tools/crates/gnrt/lib/config.rs b/tools/crates/gnrt/lib/config.rs index fc22f8e..05685ac 100644 --- a/tools/crates/gnrt/lib/config.rs +++ b/tools/crates/gnrt/lib/config.rs
@@ -179,10 +179,6 @@ /// Whether the crate is permitted to have no license files. #[serde(default)] pub no_license_file_tracked_in_crbug_369075726: bool, - /// Link to a bug that tracks avoiding having multiple versions of a crate - /// in the transitive dependency graph. - #[serde(default)] - pub multiversion_cleanup_bug: Option<String>, } #[cfg(test)]
diff --git a/tools/crates/gnrt/lib/deps.rs b/tools/crates/gnrt/lib/deps.rs index 0148b7a..7f90722 100644 --- a/tools/crates/gnrt/lib/deps.rs +++ b/tools/crates/gnrt/lib/deps.rs
@@ -9,7 +9,7 @@ inherit::find_inherited_privilege_group, }; -use anyhow::{anyhow, bail, Context, Result}; +use anyhow::{bail, Context, Result}; use guppy::{ graph::cargo::{CargoOptions, CargoSet}, graph::feature::{FeatureSet, StandardFeatures}, @@ -327,9 +327,6 @@ }) .collect::<Result<Vec<_>>>()?; - // Complain if the dependency graph contains multiple versions of any crate. - check_multiversion_packages(&packages, extra_config)?; - // Return a flat list of dependencies. packages.sort_unstable_by(|a, b| { a.package_name.cmp(&b.package_name).then(a.version.cmp(&b.version)) @@ -337,55 +334,6 @@ Ok(packages) } -fn check_multiversion_packages(packages: &[Package], extra_config: &BuildConfig) -> Result<()> { - let multiversion_packages = packages - .iter() - .chunk_by(|package| &package.package_name) - .into_iter() - .map(|(package_name, packages)| { - (package_name, packages.map(|p| &p.version).sorted().collect_vec()) - }) - .filter(|(_package_name, package_versions)| package_versions.len() > 1) - .filter(|(package_name, _package_versions)| { - let has_bug = extra_config - .per_crate_config - .get(*package_name) - .and_then(|crate_cfg| crate_cfg.multiversion_cleanup_bug.as_ref()) - .is_some(); - !has_bug - }) - .collect_vec(); - if multiversion_packages.is_empty() { - return Ok(()); - } - - let description = multiversion_packages - .iter() - .map(|(package_name, package_versions)| { - format!("{package_name} ({})", package_versions.iter().join(", ")) - }) - .join(", "); - let fix = multiversion_packages - .iter() - .map(|(package_name, _package_versions)| { - format!( - "[crate.{package_name}]\n\ - multiversion_cleanup_bug = 'https://crbug.com/some-bug-number'\n" - ) - }) - .join("\n"); - Err(anyhow!( - "Transitive dependency graph includes multiple versions of the same crate: \ - {description}. \ - Please open a bug to track removing one of the versions and put a link to \ - the bug into `gnrt_config.toml` like this:\n - \n\ - ```\n\ - {fix} - ```" - )) -} - fn resolve_root_package_set<'g>( graph: &'g PackageGraph, root_package_name: &str, @@ -1181,48 +1129,4 @@ // `gnrt/sample_package3` directory. See the `Cargo.toml` for more // information. static SAMPLE_CARGO_METADATA3: &str = include_str!("test_metadata3.json"); - - /// This test checks that `collect_dependencies` will return an error if - /// multiple versions of a crate are present in the dependency graph - /// (unless `gnrt_config.toml` points out a bug that tracks removing one - /// of the versions). - #[test] - fn collect_dependencies_on_sample_output4() -> Result<()> { - // Error expected if we depend on multiple versions of the same crate. - let mut config = BuildConfig::default(); - let metadata = PackageGraph::from_json(SAMPLE_CARGO_METADATA4)?; - - let err_msg = - collect_dependencies(&metadata, "sample_package4", &config).unwrap_err().to_string(); - assert!(err_msg.contains( - "Transitive dependency graph includes multiple versions of \ - the same crate: getrandom (0.2.16, 0.3.2), zerocopy (0.7.35, 0.8.25)" - )); - assert!(err_msg.contains("[crate.getrandom]\nmultiversion_cleanup_bug = ")); - assert!(err_msg.contains("[crate.zerocopy]\nmultiversion_cleanup_bug = ")); - - // But no error should be reported if the config has `multiversion_cleanup_bug`. - config.per_crate_config.insert( - "getrandom".to_string(), - CrateConfig { - multiversion_cleanup_bug: Some("blah".to_string()), - ..Default::default() - }, - ); - config.per_crate_config.insert( - "zerocopy".to_string(), - CrateConfig { - multiversion_cleanup_bug: Some("blah".to_string()), - ..Default::default() - }, - ); - collect_dependencies(&metadata, "sample_package4", &config)?; - - Ok(()) - } - - // `test_metadata4.json` contains the output of `cargo metadata` run in - // `gnrt/sample_package4` directory. See the `Cargo.toml` for more - // information. - static SAMPLE_CARGO_METADATA4: &str = include_str!("test_metadata4.json"); }
diff --git a/tools/crates/gnrt/lib/test_metadata4.json b/tools/crates/gnrt/lib/test_metadata4.json deleted file mode 100644 index 3c7b66e3..0000000 --- a/tools/crates/gnrt/lib/test_metadata4.json +++ /dev/null
@@ -1 +0,0 @@ -{"packages":[{"name":"ahash","version":"0.8.11","id":"registry+https://github.com/rust-lang/crates.io-index#ahash@0.8.11","license":"MIT OR Apache-2.0","license_file":null,"description":"A non-cryptographic hash function using AES-NI for high performance","source":"registry+https://github.com/rust-lang/crates.io-index","dependencies":[{"name":"atomic-polyfill","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.0.1","kind":null,"rename":null,"optional":true,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"cfg-if","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.0","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"const-random","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.1.17","kind":null,"rename":null,"optional":true,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"getrandom","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.2.7","kind":null,"rename":null,"optional":true,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"serde","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.0.117","kind":null,"rename":null,"optional":true,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"zerocopy","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.7.31","kind":null,"rename":null,"optional":false,"uses_default_features":false,"features":["simd"],"target":null,"registry":null},{"name":"criterion","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.3.2","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":["html_reports"],"target":null,"registry":null},{"name":"fnv","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.0.5","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"fxhash","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.2.1","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"hashbrown","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.14.3","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"hex","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.4.2","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"no-panic","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.1.10","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"pcg-mwc","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.2.1","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"rand","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.8.5","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"seahash","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^4.0","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"serde_json","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.0.59","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"smallvec","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.13.1","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"version_check","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.9.4","kind":"build","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"once_cell","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.18.0","kind":null,"rename":null,"optional":false,"uses_default_features":false,"features":["alloc"],"target":"cfg(not(all(target_arch = \"arm\", target_os = \"none\")))","registry":null}],"targets":[{"kind":["lib"],"crate_types":["lib"],"name":"ahash","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/ahash-0.8.11/src/lib.rs","edition":"2018","doc":true,"doctest":true,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"bench","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/ahash-0.8.11/tests/bench.rs","edition":"2018","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"map_tests","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/ahash-0.8.11/tests/map_tests.rs","edition":"2018","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"nopanic","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/ahash-0.8.11/tests/nopanic.rs","edition":"2018","doc":false,"doctest":false,"test":true},{"kind":["bench"],"crate_types":["bin"],"name":"ahash","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/ahash-0.8.11/tests/bench.rs","edition":"2018","doc":false,"doctest":false,"test":false},{"kind":["bench"],"crate_types":["bin"],"name":"map","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/ahash-0.8.11/tests/map_tests.rs","edition":"2018","doc":false,"doctest":false,"test":false},{"kind":["custom-build"],"crate_types":["bin"],"name":"build-script-build","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/ahash-0.8.11/build.rs","edition":"2018","doc":false,"doctest":false,"test":false}],"features":{"atomic-polyfill":["dep:atomic-polyfill","once_cell/atomic-polyfill"],"compile-time-rng":["const-random"],"const-random":["dep:const-random"],"default":["std","runtime-rng"],"getrandom":["dep:getrandom"],"nightly-arm-aes":[],"no-rng":[],"runtime-rng":["getrandom"],"serde":["dep:serde"],"std":[]},"manifest_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/ahash-0.8.11/Cargo.toml","metadata":{"docs":{"rs":{"features":["std"],"rustc-args":["-C","target-feature=+aes"],"rustdoc-args":["-C","target-feature=+aes"]}}},"publish":null,"authors":["Tom Kaitchuck <Tom.Kaitchuck@gmail.com>"],"categories":["algorithms","data-structures","no-std"],"keywords":["hash","hasher","hashmap","aes","no-std"],"readme":"README.md","repository":"https://github.com/tkaitchuck/ahash","homepage":null,"documentation":"https://docs.rs/ahash","edition":"2018","links":null,"default_run":null,"rust_version":"1.60.0"},{"name":"bitflags","version":"2.9.0","id":"registry+https://github.com/rust-lang/crates.io-index#bitflags@2.9.0","license":"MIT OR Apache-2.0","license_file":null,"description":"A macro to generate structures which behave like bitflags.\n","source":"registry+https://github.com/rust-lang/crates.io-index","dependencies":[{"name":"arbitrary","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.0","kind":null,"rename":null,"optional":true,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"bytemuck","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.12","kind":null,"rename":null,"optional":true,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"compiler_builtins","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.1.2","kind":null,"rename":null,"optional":true,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"rustc-std-workspace-core","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.0.0","kind":null,"rename":"core","optional":true,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"serde","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.0.103","kind":null,"rename":null,"optional":true,"uses_default_features":false,"features":[],"target":null,"registry":null},{"name":"arbitrary","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.0","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":["derive"],"target":null,"registry":null},{"name":"bytemuck","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.12.2","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":["derive"],"target":null,"registry":null},{"name":"rustversion","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.0","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"serde_derive","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.0.103","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"serde_json","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.0","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"serde_test","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.0.19","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"trybuild","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.0.18","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"zerocopy","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.8","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":["derive"],"target":null,"registry":null}],"targets":[{"kind":["lib"],"crate_types":["lib"],"name":"bitflags","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/bitflags-2.9.0/src/lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},{"kind":["example"],"crate_types":["bin"],"name":"custom_bits_type","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/bitflags-2.9.0/examples/custom_bits_type.rs","edition":"2021","doc":false,"doctest":false,"test":false},{"kind":["example"],"crate_types":["bin"],"name":"custom_derive","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/bitflags-2.9.0/examples/custom_derive.rs","edition":"2021","doc":false,"doctest":false,"test":false},{"kind":["example"],"crate_types":["bin"],"name":"fmt","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/bitflags-2.9.0/examples/fmt.rs","edition":"2021","doc":false,"doctest":false,"test":false},{"kind":["example"],"crate_types":["bin"],"name":"macro_free","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/bitflags-2.9.0/examples/macro_free.rs","edition":"2021","doc":false,"doctest":false,"test":false},{"kind":["example"],"crate_types":["bin"],"name":"serde","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/bitflags-2.9.0/examples/serde.rs","edition":"2021","doc":false,"doctest":false,"test":false},{"kind":["bench"],"crate_types":["bin"],"name":"parse","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/bitflags-2.9.0/benches/parse.rs","edition":"2021","doc":false,"doctest":false,"test":false}],"features":{"arbitrary":["dep:arbitrary"],"bytemuck":["dep:bytemuck"],"compiler_builtins":["dep:compiler_builtins"],"core":["dep:core"],"example_generated":[],"rustc-dep-of-std":["core","compiler_builtins"],"serde":["dep:serde"],"std":[]},"manifest_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/bitflags-2.9.0/Cargo.toml","metadata":{"docs":{"rs":{"features":["example_generated"]}}},"publish":null,"authors":["The Rust Project Developers"],"categories":["no-std"],"keywords":["bit","bitmask","bitflags","flags"],"readme":"README.md","repository":"https://github.com/bitflags/bitflags","homepage":"https://github.com/bitflags/bitflags","documentation":"https://docs.rs/bitflags","edition":"2021","links":null,"default_run":null,"rust_version":"1.56.0"},{"name":"cfg-if","version":"1.0.0","id":"registry+https://github.com/rust-lang/crates.io-index#cfg-if@1.0.0","license":"MIT/Apache-2.0","license_file":null,"description":"A macro to ergonomically define an item depending on a large number of #[cfg]\nparameters. Structured like an if-else chain, the first matching branch is the\nitem that gets emitted.\n","source":"registry+https://github.com/rust-lang/crates.io-index","dependencies":[{"name":"compiler_builtins","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.1.2","kind":null,"rename":null,"optional":true,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"rustc-std-workspace-core","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.0.0","kind":null,"rename":"core","optional":true,"uses_default_features":true,"features":[],"target":null,"registry":null}],"targets":[{"kind":["lib"],"crate_types":["lib"],"name":"cfg_if","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/cfg-if-1.0.0/src/lib.rs","edition":"2018","doc":true,"doctest":true,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"xcrate","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/cfg-if-1.0.0/tests/xcrate.rs","edition":"2018","doc":false,"doctest":false,"test":true}],"features":{"compiler_builtins":["dep:compiler_builtins"],"core":["dep:core"],"rustc-dep-of-std":["core","compiler_builtins"]},"manifest_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/cfg-if-1.0.0/Cargo.toml","metadata":null,"publish":null,"authors":["Alex Crichton <alex@alexcrichton.com>"],"categories":[],"keywords":[],"readme":"README.md","repository":"https://github.com/alexcrichton/cfg-if","homepage":"https://github.com/alexcrichton/cfg-if","documentation":"https://docs.rs/cfg-if","edition":"2018","links":null,"default_run":null,"rust_version":null},{"name":"getrandom","version":"0.2.16","id":"registry+https://github.com/rust-lang/crates.io-index#getrandom@0.2.16","license":"MIT OR Apache-2.0","license_file":null,"description":"A small cross-platform library for retrieving random data from system source","source":"registry+https://github.com/rust-lang/crates.io-index","dependencies":[{"name":"cfg-if","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"compiler_builtins","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.1","kind":null,"rename":null,"optional":true,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"rustc-std-workspace-core","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.0","kind":null,"rename":"core","optional":true,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"js-sys","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.3","kind":null,"rename":null,"optional":true,"uses_default_features":true,"features":[],"target":"cfg(all(any(target_arch = \"wasm32\", target_arch = \"wasm64\"), target_os = \"unknown\"))","registry":null},{"name":"wasm-bindgen","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.2.62","kind":null,"rename":null,"optional":true,"uses_default_features":false,"features":[],"target":"cfg(all(any(target_arch = \"wasm32\", target_arch = \"wasm64\"), target_os = \"unknown\"))","registry":null},{"name":"wasm-bindgen-test","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.3.18","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":"cfg(all(any(target_arch = \"wasm32\", target_arch = \"wasm64\"), target_os = \"unknown\"))","registry":null},{"name":"wasi","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.11","kind":null,"rename":null,"optional":false,"uses_default_features":false,"features":[],"target":"cfg(target_os = \"wasi\")","registry":null},{"name":"libc","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.2.154","kind":null,"rename":null,"optional":false,"uses_default_features":false,"features":[],"target":"cfg(unix)","registry":null}],"targets":[{"kind":["lib"],"crate_types":["lib"],"name":"getrandom","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/getrandom-0.2.16/src/lib.rs","edition":"2018","doc":true,"doctest":true,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"custom","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/getrandom-0.2.16/tests/custom.rs","edition":"2018","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"normal","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/getrandom-0.2.16/tests/normal.rs","edition":"2018","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"rdrand","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/getrandom-0.2.16/tests/rdrand.rs","edition":"2018","doc":false,"doctest":false,"test":true},{"kind":["bench"],"crate_types":["bin"],"name":"buffer","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/getrandom-0.2.16/benches/buffer.rs","edition":"2018","doc":false,"doctest":false,"test":false}],"features":{"compiler_builtins":["dep:compiler_builtins"],"core":["dep:core"],"custom":[],"js":["wasm-bindgen","js-sys"],"js-sys":["dep:js-sys"],"linux_disable_fallback":[],"rdrand":[],"rustc-dep-of-std":["compiler_builtins","core","libc/rustc-dep-of-std","wasi/rustc-dep-of-std"],"std":[],"test-in-browser":[],"wasm-bindgen":["dep:wasm-bindgen"]},"manifest_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/getrandom-0.2.16/Cargo.toml","metadata":{"cross":{"target":{"x86_64-unknown-netbsd":{"pre-build":["mkdir -p /tmp/netbsd","curl https://cdn.netbsd.org/pub/NetBSD/NetBSD-9.2/amd64/binary/sets/base.tar.xz -O","tar -C /tmp/netbsd -xJf base.tar.xz","cp /tmp/netbsd/usr/lib/libexecinfo.so /usr/local/x86_64-unknown-netbsd/lib","rm base.tar.xz","rm -rf /tmp/netbsd"]}}},"docs":{"rs":{"features":["std","custom"],"rustdoc-args":["--cfg","docsrs"]}}},"publish":null,"authors":["The Rand Project Developers"],"categories":["os","no-std"],"keywords":[],"readme":"README.md","repository":"https://github.com/rust-random/getrandom","homepage":null,"documentation":"https://docs.rs/getrandom","edition":"2018","links":null,"default_run":null,"rust_version":null},{"name":"getrandom","version":"0.3.2","id":"registry+https://github.com/rust-lang/crates.io-index#getrandom@0.3.2","license":"MIT OR Apache-2.0","license_file":null,"description":"A small cross-platform library for retrieving random data from system source","source":"registry+https://github.com/rust-lang/crates.io-index","dependencies":[{"name":"cfg-if","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"compiler_builtins","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.1","kind":null,"rename":null,"optional":true,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"rustc-std-workspace-core","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.0","kind":null,"rename":"core","optional":true,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"libc","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.2.154","kind":null,"rename":null,"optional":false,"uses_default_features":false,"features":[],"target":"cfg(all(any(target_os = \"linux\", target_os = \"android\"), not(any(all(target_os = \"linux\", target_env = \"\"), getrandom_backend = \"custom\", getrandom_backend = \"linux_raw\", getrandom_backend = \"rdrand\", getrandom_backend = \"rndr\"))))","registry":null},{"name":"wasm-bindgen","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.2.98","kind":null,"rename":null,"optional":true,"uses_default_features":false,"features":[],"target":"cfg(all(target_arch = \"wasm32\", any(target_os = \"unknown\", target_os = \"none\")))","registry":null},{"name":"wasm-bindgen-test","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.3","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":"cfg(all(target_arch = \"wasm32\", any(target_os = \"unknown\", target_os = \"none\")))","registry":null},{"name":"js-sys","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.3.77","kind":null,"rename":null,"optional":true,"uses_default_features":false,"features":[],"target":"cfg(all(target_arch = \"wasm32\", any(target_os = \"unknown\", target_os = \"none\"), target_feature = \"atomics\"))","registry":null},{"name":"wasi","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.14","kind":null,"rename":null,"optional":false,"uses_default_features":false,"features":[],"target":"cfg(all(target_arch = \"wasm32\", target_os = \"wasi\", target_env = \"p2\"))","registry":null},{"name":"r-efi","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^5.1","kind":null,"rename":null,"optional":false,"uses_default_features":false,"features":[],"target":"cfg(all(target_os = \"uefi\", getrandom_backend = \"efi_rng\"))","registry":null},{"name":"libc","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.2.154","kind":null,"rename":null,"optional":false,"uses_default_features":false,"features":[],"target":"cfg(any(target_os = \"dragonfly\", target_os = \"freebsd\", target_os = \"hurd\", target_os = \"illumos\", target_os = \"cygwin\", all(target_os = \"horizon\", target_arch = \"arm\")))","registry":null},{"name":"libc","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.2.154","kind":null,"rename":null,"optional":false,"uses_default_features":false,"features":[],"target":"cfg(any(target_os = \"haiku\", target_os = \"redox\", target_os = \"nto\", target_os = \"aix\"))","registry":null},{"name":"libc","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.2.154","kind":null,"rename":null,"optional":false,"uses_default_features":false,"features":[],"target":"cfg(any(target_os = \"ios\", target_os = \"visionos\", target_os = \"watchos\", target_os = \"tvos\"))","registry":null},{"name":"libc","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.2.154","kind":null,"rename":null,"optional":false,"uses_default_features":false,"features":[],"target":"cfg(any(target_os = \"macos\", target_os = \"openbsd\", target_os = \"vita\", target_os = \"emscripten\"))","registry":null},{"name":"libc","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.2.154","kind":null,"rename":null,"optional":false,"uses_default_features":false,"features":[],"target":"cfg(target_os = \"netbsd\")","registry":null},{"name":"libc","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.2.154","kind":null,"rename":null,"optional":false,"uses_default_features":false,"features":[],"target":"cfg(target_os = \"solaris\")","registry":null},{"name":"libc","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.2.154","kind":null,"rename":null,"optional":false,"uses_default_features":false,"features":[],"target":"cfg(target_os = \"vxworks\")","registry":null}],"targets":[{"kind":["lib"],"crate_types":["lib"],"name":"getrandom","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/getrandom-0.3.2/src/lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"mod","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/getrandom-0.3.2/tests/mod.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["bench"],"crate_types":["bin"],"name":"buffer","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/getrandom-0.3.2/benches/buffer.rs","edition":"2021","doc":false,"doctest":false,"test":false},{"kind":["custom-build"],"crate_types":["bin"],"name":"build-script-build","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/getrandom-0.3.2/build.rs","edition":"2021","doc":false,"doctest":false,"test":false}],"features":{"rustc-dep-of-std":["dep:compiler_builtins","dep:core"],"std":[],"wasm_js":["dep:wasm-bindgen","dep:js-sys"]},"manifest_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/getrandom-0.3.2/Cargo.toml","metadata":{"cross":{"target":{"x86_64-unknown-netbsd":{"pre-build":["mkdir -p /tmp/netbsd","curl -fO https://cdn.netbsd.org/pub/NetBSD/NetBSD-9.3/amd64/binary/sets/base.tar.xz","tar -C /tmp/netbsd -xJf base.tar.xz","cp /tmp/netbsd/usr/lib/libexecinfo.so /usr/local/x86_64-unknown-netbsd/lib","rm base.tar.xz","rm -rf /tmp/netbsd"]}}},"docs":{"rs":{"features":["std"]}}},"publish":null,"authors":["The Rand Project Developers"],"categories":["os","no-std"],"keywords":[],"readme":"README.md","repository":"https://github.com/rust-random/getrandom","homepage":null,"documentation":"https://docs.rs/getrandom","edition":"2021","links":null,"default_run":null,"rust_version":"1.63"},{"name":"libc","version":"0.2.172","id":"registry+https://github.com/rust-lang/crates.io-index#libc@0.2.172","license":"MIT OR Apache-2.0","license_file":null,"description":"Raw FFI bindings to platform libraries like libc.\n","source":"registry+https://github.com/rust-lang/crates.io-index","dependencies":[{"name":"rustc-std-workspace-core","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.0.0","kind":null,"rename":null,"optional":true,"uses_default_features":true,"features":[],"target":null,"registry":null}],"targets":[{"kind":["lib"],"crate_types":["lib"],"name":"libc","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/libc-0.2.172/src/lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"const_fn","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/libc-0.2.172/tests/const_fn.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["custom-build"],"crate_types":["bin"],"name":"build-script-build","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/libc-0.2.172/build.rs","edition":"2021","doc":false,"doctest":false,"test":false}],"features":{"align":[],"const-extern-fn":[],"default":["std"],"extra_traits":[],"rustc-dep-of-std":["align","rustc-std-workspace-core"],"rustc-std-workspace-core":["dep:rustc-std-workspace-core"],"std":[],"use_std":["std"]},"manifest_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/libc-0.2.172/Cargo.toml","metadata":{"docs":{"rs":{"cargo-args":["-Zbuild-std=core"],"default-target":"x86_64-unknown-linux-gnu","features":["extra_traits"],"targets":["aarch64-apple-darwin","aarch64-apple-ios","aarch64-linux-android","aarch64-pc-windows-msvc","aarch64-unknown-freebsd","aarch64-unknown-fuchsia","aarch64-unknown-hermit","aarch64-unknown-linux-gnu","aarch64-unknown-linux-musl","aarch64-unknown-netbsd","aarch64-unknown-openbsd","aarch64-wrs-vxworks","arm-linux-androideabi","arm-unknown-linux-gnueabi","arm-unknown-linux-gnueabihf","arm-unknown-linux-musleabi","arm-unknown-linux-musleabihf","armebv7r-none-eabi","armebv7r-none-eabihf","armv5te-unknown-linux-gnueabi","armv5te-unknown-linux-musleabi","armv7-linux-androideabi","armv7-unknown-linux-gnueabihf","armv7-unknown-linux-musleabihf","armv7-wrs-vxworks-eabihf","armv7r-none-eabi","armv7r-none-eabihf","i586-unknown-linux-gnu","i586-unknown-linux-musl","i686-linux-android","i686-pc-windows-gnu","i686-pc-windows-msvc","i686-pc-windows-msvc","i686-unknown-freebsd","i686-unknown-haiku","i686-unknown-linux-gnu","i686-unknown-linux-musl","i686-unknown-netbsd","i686-unknown-openbsd","i686-wrs-vxworks","mips-unknown-linux-gnu","mips-unknown-linux-musl","mips64-unknown-linux-gnuabi64","mips64-unknown-linux-muslabi64","mips64el-unknown-linux-gnuabi64","mips64el-unknown-linux-muslabi64","mipsel-sony-psp","mipsel-unknown-linux-gnu","mipsel-unknown-linux-musl","nvptx64-nvidia-cuda","powerpc-unknown-linux-gnu","powerpc-unknown-linux-gnuspe","powerpc-unknown-netbsd","powerpc-wrs-vxworks","powerpc-wrs-vxworks-spe","powerpc64-unknown-freebsd","powerpc64-unknown-linux-gnu","powerpc64-wrs-vxworks","powerpc64le-unknown-linux-gnu","riscv32gc-unknown-linux-gnu","riscv32i-unknown-none-elf","riscv32imac-unknown-none-elf","riscv32imc-unknown-none-elf","riscv32-wrs-vxworks","riscv64gc-unknown-freebsd","riscv64gc-unknown-hermit","riscv64gc-unknown-linux-gnu","riscv64gc-unknown-linux-musl","riscv64gc-unknown-none-elf","riscv64imac-unknown-none-elf","riscv64-wrs-vxworks","s390x-unknown-linux-gnu","s390x-unknown-linux-musl","sparc-unknown-linux-gnu","sparc64-unknown-linux-gnu","sparc64-unknown-netbsd","sparcv9-sun-solaris","thumbv6m-none-eabi","thumbv7em-none-eabi","thumbv7em-none-eabihf","thumbv7m-none-eabi","thumbv7neon-linux-androideabi","thumbv7neon-unknown-linux-gnueabihf","wasm32-unknown-emscripten","wasm32-unknown-unknown","x86_64-apple-darwin","x86_64-apple-ios","x86_64-fortanix-unknown-sgx","x86_64-linux-android","x86_64-pc-solaris","x86_64-pc-windows-gnu","x86_64-pc-windows-msvc","x86_64-unknown-dragonfly","x86_64-unknown-freebsd","x86_64-unknown-fuchsia","x86_64-unknown-haiku","x86_64-unknown-hermit","x86_64-unknown-illumos","x86_64-unknown-l4re-uclibc","x86_64-unknown-linux-gnu","x86_64-unknown-linux-gnux32","x86_64-unknown-linux-musl","x86_64-unknown-netbsd","x86_64-unknown-openbsd","x86_64-unknown-redox","x86_64-wrs-vxworks"]}}},"publish":null,"authors":["The Rust Project Developers"],"categories":["external-ffi-bindings","no-std","os"],"keywords":["libc","ffi","bindings","operating","system"],"readme":"README.md","repository":"https://github.com/rust-lang/libc","homepage":"https://github.com/rust-lang/libc","documentation":"https://docs.rs/libc/","edition":"2021","links":null,"default_run":null,"rust_version":"1.63"},{"name":"once_cell","version":"1.21.3","id":"registry+https://github.com/rust-lang/crates.io-index#once_cell@1.21.3","license":"MIT OR Apache-2.0","license_file":null,"description":"Single assignment cells and lazy values.","source":"registry+https://github.com/rust-lang/crates.io-index","dependencies":[{"name":"critical-section","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.1.3","kind":null,"rename":null,"optional":true,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"parking_lot_core","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.9.10","kind":null,"rename":null,"optional":true,"uses_default_features":false,"features":[],"target":null,"registry":null},{"name":"portable-atomic","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.8","kind":null,"rename":null,"optional":true,"uses_default_features":false,"features":[],"target":null,"registry":null},{"name":"critical-section","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.1.3","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":["std"],"target":null,"registry":null},{"name":"regex","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.10.6","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null}],"targets":[{"kind":["lib"],"crate_types":["lib"],"name":"once_cell","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/once_cell-1.21.3/src/lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},{"kind":["example"],"crate_types":["bin"],"name":"bench","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/once_cell-1.21.3/examples/bench.rs","edition":"2021","required-features":["std"],"doc":false,"doctest":false,"test":false},{"kind":["example"],"crate_types":["bin"],"name":"bench_acquire","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/once_cell-1.21.3/examples/bench_acquire.rs","edition":"2021","required-features":["std"],"doc":false,"doctest":false,"test":false},{"kind":["example"],"crate_types":["bin"],"name":"lazy_static","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/once_cell-1.21.3/examples/lazy_static.rs","edition":"2021","required-features":["std"],"doc":false,"doctest":false,"test":false},{"kind":["example"],"crate_types":["bin"],"name":"reentrant_init_deadlocks","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/once_cell-1.21.3/examples/reentrant_init_deadlocks.rs","edition":"2021","required-features":["std"],"doc":false,"doctest":false,"test":false},{"kind":["example"],"crate_types":["bin"],"name":"regex","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/once_cell-1.21.3/examples/regex.rs","edition":"2021","required-features":["std"],"doc":false,"doctest":false,"test":false},{"kind":["example"],"crate_types":["bin"],"name":"test_synchronization","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/once_cell-1.21.3/examples/test_synchronization.rs","edition":"2021","required-features":["std"],"doc":false,"doctest":false,"test":false},{"kind":["test"],"crate_types":["bin"],"name":"it","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/once_cell-1.21.3/tests/it/main.rs","edition":"2021","doc":false,"doctest":false,"test":true}],"features":{"alloc":["race"],"atomic-polyfill":["critical-section"],"critical-section":["dep:critical-section","portable-atomic"],"default":["std"],"parking_lot":["dep:parking_lot_core"],"portable-atomic":["dep:portable-atomic"],"race":[],"std":["alloc"],"unstable":[]},"manifest_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/once_cell-1.21.3/Cargo.toml","metadata":{"docs":{"rs":{"all-features":true,"rustdoc-args":["--generate-link-to-definition"]}}},"publish":null,"authors":["Aleksey Kladov <aleksey.kladov@gmail.com>"],"categories":["rust-patterns","memory-management"],"keywords":["lazy","static"],"readme":"README.md","repository":"https://github.com/matklad/once_cell","homepage":null,"documentation":"https://docs.rs/once_cell","edition":"2021","links":null,"default_run":null,"rust_version":"1.65"},{"name":"ppv-lite86","version":"0.2.21","id":"registry+https://github.com/rust-lang/crates.io-index#ppv-lite86@0.2.21","license":"MIT OR Apache-2.0","license_file":null,"description":"Cross-platform cryptography-oriented low-level SIMD library.","source":"registry+https://github.com/rust-lang/crates.io-index","dependencies":[{"name":"zerocopy","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.8.23","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":["simd"],"target":null,"registry":null}],"targets":[{"kind":["lib"],"crate_types":["lib"],"name":"ppv_lite86","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/ppv-lite86-0.2.21/src/lib.rs","edition":"2021","doc":true,"doctest":true,"test":true}],"features":{"default":["std"],"no_simd":[],"simd":[],"std":[]},"manifest_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/ppv-lite86-0.2.21/Cargo.toml","metadata":null,"publish":null,"authors":["The CryptoCorrosion Contributors"],"categories":["cryptography","no-std"],"keywords":["crypto","simd","x86"],"readme":null,"repository":"https://github.com/cryptocorrosion/cryptocorrosion","homepage":null,"documentation":null,"edition":"2021","links":null,"default_run":null,"rust_version":"1.61"},{"name":"proc-macro2","version":"1.0.95","id":"registry+https://github.com/rust-lang/crates.io-index#proc-macro2@1.0.95","license":"MIT OR Apache-2.0","license_file":null,"description":"A substitute implementation of the compiler's `proc_macro` API to decouple token-based libraries from the procedural macro use case.","source":"registry+https://github.com/rust-lang/crates.io-index","dependencies":[{"name":"unicode-ident","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.0","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"flate2","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.0","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"quote","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.0","kind":"dev","rename":null,"optional":false,"uses_default_features":false,"features":[],"target":null,"registry":null},{"name":"rayon","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.0","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"rustversion","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"tar","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.4","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null}],"targets":[{"kind":["lib"],"crate_types":["lib"],"name":"proc_macro2","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/proc-macro2-1.0.95/src/lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"comments","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/proc-macro2-1.0.95/tests/comments.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"features","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/proc-macro2-1.0.95/tests/features.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"marker","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/proc-macro2-1.0.95/tests/marker.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"test","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/proc-macro2-1.0.95/tests/test.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"test_fmt","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/proc-macro2-1.0.95/tests/test_fmt.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"test_size","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/proc-macro2-1.0.95/tests/test_size.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["custom-build"],"crate_types":["bin"],"name":"build-script-build","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/proc-macro2-1.0.95/build.rs","edition":"2021","doc":false,"doctest":false,"test":false}],"features":{"default":["proc-macro"],"nightly":[],"proc-macro":[],"span-locations":[]},"manifest_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/proc-macro2-1.0.95/Cargo.toml","metadata":{"docs":{"rs":{"rustc-args":["--cfg=procmacro2_semver_exempt"],"rustdoc-args":["--cfg=procmacro2_semver_exempt","--generate-link-to-definition","--extern-html-root-url=core=https://doc.rust-lang.org","--extern-html-root-url=alloc=https://doc.rust-lang.org","--extern-html-root-url=std=https://doc.rust-lang.org","--extern-html-root-url=proc_macro=https://doc.rust-lang.org"],"targets":["x86_64-unknown-linux-gnu"]}},"playground":{"features":["span-locations"]}},"publish":null,"authors":["David Tolnay <dtolnay@gmail.com>","Alex Crichton <alex@alexcrichton.com>"],"categories":["development-tools::procedural-macro-helpers"],"keywords":["macros","syn"],"readme":"README.md","repository":"https://github.com/dtolnay/proc-macro2","homepage":null,"documentation":"https://docs.rs/proc-macro2","edition":"2021","links":null,"default_run":null,"rust_version":"1.56"},{"name":"quote","version":"1.0.40","id":"registry+https://github.com/rust-lang/crates.io-index#quote@1.0.40","license":"MIT OR Apache-2.0","license_file":null,"description":"Quasi-quoting macro quote!(...)","source":"registry+https://github.com/rust-lang/crates.io-index","dependencies":[{"name":"proc-macro2","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.0.80","kind":null,"rename":null,"optional":false,"uses_default_features":false,"features":[],"target":null,"registry":null},{"name":"rustversion","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.0","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"trybuild","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.0.66","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":["diff"],"target":null,"registry":null}],"targets":[{"kind":["lib"],"crate_types":["lib"],"name":"quote","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quote-1.0.40/src/lib.rs","edition":"2018","doc":true,"doctest":true,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"compiletest","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quote-1.0.40/tests/compiletest.rs","edition":"2018","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"test","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quote-1.0.40/tests/test.rs","edition":"2018","doc":false,"doctest":false,"test":true}],"features":{"default":["proc-macro"],"proc-macro":["proc-macro2/proc-macro"]},"manifest_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/quote-1.0.40/Cargo.toml","metadata":{"docs":{"rs":{"rustdoc-args":["--generate-link-to-definition","--extern-html-root-url=core=https://doc.rust-lang.org","--extern-html-root-url=alloc=https://doc.rust-lang.org","--extern-html-root-url=std=https://doc.rust-lang.org"],"targets":["x86_64-unknown-linux-gnu"]}}},"publish":null,"authors":["David Tolnay <dtolnay@gmail.com>"],"categories":["development-tools::procedural-macro-helpers"],"keywords":["macros","syn"],"readme":"README.md","repository":"https://github.com/dtolnay/quote","homepage":null,"documentation":"https://docs.rs/quote/","edition":"2018","links":null,"default_run":null,"rust_version":"1.56"},{"name":"r-efi","version":"5.2.0","id":"registry+https://github.com/rust-lang/crates.io-index#r-efi@5.2.0","license":"MIT OR Apache-2.0 OR LGPL-2.1-or-later","license_file":null,"description":"UEFI Reference Specification Protocol Constants and Definitions","source":"registry+https://github.com/rust-lang/crates.io-index","dependencies":[{"name":"compiler_builtins","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.1.0","kind":null,"rename":null,"optional":true,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"rustc-std-workspace-core","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.0.0","kind":null,"rename":"core","optional":true,"uses_default_features":true,"features":[],"target":null,"registry":null}],"targets":[{"kind":["lib"],"crate_types":["lib"],"name":"r_efi","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/r-efi-5.2.0/src/lib.rs","edition":"2018","doc":true,"doctest":true,"test":true},{"kind":["example"],"crate_types":["bin"],"name":"freestanding","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/r-efi-5.2.0/examples/freestanding.rs","edition":"2018","required-features":["native"],"doc":false,"doctest":false,"test":false},{"kind":["example"],"crate_types":["bin"],"name":"gop-query","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/r-efi-5.2.0/examples/gop-query.rs","edition":"2018","required-features":["native"],"doc":false,"doctest":false,"test":false},{"kind":["example"],"crate_types":["bin"],"name":"hello-world","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/r-efi-5.2.0/examples/hello-world.rs","edition":"2018","required-features":["native"],"doc":false,"doctest":false,"test":false}],"features":{"compiler_builtins":["dep:compiler_builtins"],"core":["dep:core"],"efiapi":[],"examples":["native"],"native":[],"rustc-dep-of-std":["compiler_builtins/rustc-dep-of-std","core"]},"manifest_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/r-efi-5.2.0/Cargo.toml","metadata":null,"publish":null,"authors":[],"categories":["embedded","hardware-support","no-std","os"],"keywords":["boot","efi","firmware","specification","uefi"],"readme":"README.md","repository":"https://github.com/r-efi/r-efi","homepage":"https://github.com/r-efi/r-efi/wiki","documentation":null,"edition":"2018","links":null,"default_run":null,"rust_version":"1.68"},{"name":"rand","version":"0.9.1","id":"registry+https://github.com/rust-lang/crates.io-index#rand@0.9.1","license":"MIT OR Apache-2.0","license_file":null,"description":"Random number generators and other randomness functionality.\n","source":"registry+https://github.com/rust-lang/crates.io-index","dependencies":[{"name":"log","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.4.4","kind":null,"rename":null,"optional":true,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"rand_chacha","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.9.0","kind":null,"rename":null,"optional":true,"uses_default_features":false,"features":[],"target":null,"registry":null},{"name":"rand_core","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.9.0","kind":null,"rename":null,"optional":false,"uses_default_features":false,"features":[],"target":null,"registry":null},{"name":"serde","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.0.103","kind":null,"rename":null,"optional":true,"uses_default_features":true,"features":["derive"],"target":null,"registry":null},{"name":"bincode","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.2.1","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"rand_pcg","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.9.0","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"rayon","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.7","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null}],"targets":[{"kind":["lib"],"crate_types":["lib"],"name":"rand","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rand-0.9.1/src/lib.rs","edition":"2021","doc":true,"doctest":true,"test":true}],"features":{"alloc":[],"default":["std","std_rng","os_rng","small_rng","thread_rng"],"log":["dep:log"],"nightly":[],"os_rng":["rand_core/os_rng"],"serde":["dep:serde","rand_core/serde"],"simd_support":[],"small_rng":[],"std":["rand_core/std","rand_chacha?/std","alloc"],"std_rng":["dep:rand_chacha"],"thread_rng":["std","std_rng","os_rng"],"unbiased":[]},"manifest_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rand-0.9.1/Cargo.toml","metadata":{"docs":{"rs":{"all-features":true,"rustdoc-args":["--generate-link-to-definition"]}},"playground":{"features":["small_rng","serde"]}},"publish":null,"authors":["The Rand Project Developers","The Rust Project Developers"],"categories":["algorithms","no-std"],"keywords":["random","rng"],"readme":"README.md","repository":"https://github.com/rust-random/rand","homepage":"https://rust-random.github.io/book","documentation":"https://docs.rs/rand","edition":"2021","links":null,"default_run":null,"rust_version":"1.63"},{"name":"rand_chacha","version":"0.9.0","id":"registry+https://github.com/rust-lang/crates.io-index#rand_chacha@0.9.0","license":"MIT OR Apache-2.0","license_file":null,"description":"ChaCha random number generator\n","source":"registry+https://github.com/rust-lang/crates.io-index","dependencies":[{"name":"ppv-lite86","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.2.14","kind":null,"rename":null,"optional":false,"uses_default_features":false,"features":["simd"],"target":null,"registry":null},{"name":"rand_core","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.9.0","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"serde","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.0","kind":null,"rename":null,"optional":true,"uses_default_features":true,"features":["derive"],"target":null,"registry":null},{"name":"rand_core","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.9.0","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":["os_rng"],"target":null,"registry":null},{"name":"serde_json","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.0","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null}],"targets":[{"kind":["lib"],"crate_types":["lib"],"name":"rand_chacha","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rand_chacha-0.9.0/src/lib.rs","edition":"2021","doc":true,"doctest":true,"test":true}],"features":{"default":["std"],"os_rng":["rand_core/os_rng"],"serde":["dep:serde"],"std":["ppv-lite86/std","rand_core/std"]},"manifest_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rand_chacha-0.9.0/Cargo.toml","metadata":{"docs":{"rs":{"all-features":true,"rustdoc-args":["--generate-link-to-definition"]}}},"publish":null,"authors":["The Rand Project Developers","The Rust Project Developers","The CryptoCorrosion Contributors"],"categories":["algorithms","no-std"],"keywords":["random","rng","chacha"],"readme":"README.md","repository":"https://github.com/rust-random/rand","homepage":"https://rust-random.github.io/book","documentation":"https://docs.rs/rand_chacha","edition":"2021","links":null,"default_run":null,"rust_version":"1.63"},{"name":"rand_core","version":"0.9.3","id":"registry+https://github.com/rust-lang/crates.io-index#rand_core@0.9.3","license":"MIT OR Apache-2.0","license_file":null,"description":"Core random number generator traits and tools for implementation.\n","source":"registry+https://github.com/rust-lang/crates.io-index","dependencies":[{"name":"getrandom","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.3.0","kind":null,"rename":null,"optional":true,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"serde","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1","kind":null,"rename":null,"optional":true,"uses_default_features":true,"features":["derive"],"target":null,"registry":null}],"targets":[{"kind":["lib"],"crate_types":["lib"],"name":"rand_core","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rand_core-0.9.3/src/lib.rs","edition":"2021","doc":true,"doctest":true,"test":true}],"features":{"os_rng":["dep:getrandom"],"serde":["dep:serde"],"std":["getrandom?/std"]},"manifest_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/rand_core-0.9.3/Cargo.toml","metadata":{"docs":{"rs":{"all-features":true,"rustdoc-args":["--generate-link-to-definition"]}},"playground":{"all-features":true}},"publish":null,"authors":["The Rand Project Developers","The Rust Project Developers"],"categories":["algorithms","no-std"],"keywords":["random","rng"],"readme":"README.md","repository":"https://github.com/rust-random/rand","homepage":"https://rust-random.github.io/book","documentation":"https://docs.rs/rand_core","edition":"2021","links":null,"default_run":null,"rust_version":"1.63"},{"name":"sample_package4","version":"0.1.0","id":"path+file:///usr/local/google/home/lukasza/src/chromium2/src/tools/crates/gnrt/sample_package4#0.1.0","license":null,"license_file":null,"description":null,"source":null,"dependencies":[{"name":"ahash","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.8.11","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":["runtime-rng"],"target":null,"registry":null},{"name":"rand","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.9.1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null}],"targets":[{"kind":["bin"],"crate_types":["bin"],"name":"sample_package4","src_path":"/usr/local/google/home/lukasza/src/chromium2/src/tools/crates/gnrt/sample_package4/src/main.rs","edition":"2021","doc":true,"doctest":false,"test":true}],"features":{},"manifest_path":"/usr/local/google/home/lukasza/src/chromium2/src/tools/crates/gnrt/sample_package4/Cargo.toml","metadata":null,"publish":null,"authors":[],"categories":[],"keywords":[],"readme":"README.md","repository":null,"homepage":null,"documentation":null,"edition":"2021","links":null,"default_run":null,"rust_version":null},{"name":"syn","version":"2.0.101","id":"registry+https://github.com/rust-lang/crates.io-index#syn@2.0.101","license":"MIT OR Apache-2.0","license_file":null,"description":"Parser for Rust source code","source":"registry+https://github.com/rust-lang/crates.io-index","dependencies":[{"name":"proc-macro2","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.0.91","kind":null,"rename":null,"optional":false,"uses_default_features":false,"features":[],"target":null,"registry":null},{"name":"quote","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.0.35","kind":null,"rename":null,"optional":true,"uses_default_features":false,"features":[],"target":null,"registry":null},{"name":"unicode-ident","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"anyhow","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"automod","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"insta","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"ref-cast","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"rustversion","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"syn-test-suite","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"termcolor","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"flate2","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":"cfg(not(miri))","registry":null},{"name":"rayon","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":"cfg(not(miri))","registry":null},{"name":"reqwest","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.12","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":["blocking"],"target":"cfg(not(miri))","registry":null},{"name":"tar","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.4.16","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":"cfg(not(miri))","registry":null},{"name":"walkdir","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^2.3.2","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":"cfg(not(miri))","registry":null}],"targets":[{"kind":["lib"],"crate_types":["lib"],"name":"syn","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/syn-2.0.101/src/lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"regression","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/syn-2.0.101/tests/regression.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"test_asyncness","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/syn-2.0.101/tests/test_asyncness.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"test_attribute","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/syn-2.0.101/tests/test_attribute.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"test_derive_input","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/syn-2.0.101/tests/test_derive_input.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"test_expr","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/syn-2.0.101/tests/test_expr.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"test_generics","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/syn-2.0.101/tests/test_generics.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"test_grouping","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/syn-2.0.101/tests/test_grouping.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"test_ident","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/syn-2.0.101/tests/test_ident.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"test_item","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/syn-2.0.101/tests/test_item.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"test_iterators","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/syn-2.0.101/tests/test_iterators.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"test_lit","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/syn-2.0.101/tests/test_lit.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"test_meta","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/syn-2.0.101/tests/test_meta.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"test_parse_buffer","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/syn-2.0.101/tests/test_parse_buffer.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"test_parse_quote","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/syn-2.0.101/tests/test_parse_quote.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"test_parse_stream","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/syn-2.0.101/tests/test_parse_stream.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"test_pat","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/syn-2.0.101/tests/test_pat.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"test_path","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/syn-2.0.101/tests/test_path.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"test_precedence","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/syn-2.0.101/tests/test_precedence.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"test_receiver","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/syn-2.0.101/tests/test_receiver.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"test_round_trip","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/syn-2.0.101/tests/test_round_trip.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"test_shebang","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/syn-2.0.101/tests/test_shebang.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"test_size","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/syn-2.0.101/tests/test_size.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"test_stmt","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/syn-2.0.101/tests/test_stmt.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"test_token_trees","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/syn-2.0.101/tests/test_token_trees.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"test_ty","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/syn-2.0.101/tests/test_ty.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"test_unparenthesize","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/syn-2.0.101/tests/test_unparenthesize.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"test_visibility","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/syn-2.0.101/tests/test_visibility.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"zzz_stable","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/syn-2.0.101/tests/zzz_stable.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["bench"],"crate_types":["bin"],"name":"file","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/syn-2.0.101/benches/file.rs","edition":"2021","required-features":["full","parsing"],"doc":false,"doctest":false,"test":false},{"kind":["bench"],"crate_types":["bin"],"name":"rust","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/syn-2.0.101/benches/rust.rs","edition":"2021","required-features":["full","parsing"],"doc":false,"doctest":false,"test":false}],"features":{"clone-impls":[],"default":["derive","parsing","printing","clone-impls","proc-macro"],"derive":[],"extra-traits":[],"fold":[],"full":[],"parsing":[],"printing":["dep:quote"],"proc-macro":["proc-macro2/proc-macro","quote?/proc-macro"],"test":["syn-test-suite/all-features"],"visit":[],"visit-mut":[]},"manifest_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/syn-2.0.101/Cargo.toml","metadata":{"docs":{"rs":{"all-features":true,"rustdoc-args":["--generate-link-to-definition","--extend-css=src/gen/token.css","--extern-html-root-url=core=https://doc.rust-lang.org","--extern-html-root-url=alloc=https://doc.rust-lang.org","--extern-html-root-url=std=https://doc.rust-lang.org","--extern-html-root-url=proc_macro=https://doc.rust-lang.org"],"targets":["x86_64-unknown-linux-gnu"]}},"playground":{"features":["full","visit","visit-mut","fold","extra-traits"]}},"publish":null,"authors":["David Tolnay <dtolnay@gmail.com>"],"categories":["development-tools::procedural-macro-helpers","parser-implementations"],"keywords":["macros","syn"],"readme":"README.md","repository":"https://github.com/dtolnay/syn","homepage":null,"documentation":"https://docs.rs/syn","edition":"2021","links":null,"default_run":null,"rust_version":"1.61"},{"name":"unicode-ident","version":"1.0.18","id":"registry+https://github.com/rust-lang/crates.io-index#unicode-ident@1.0.18","license":"(MIT OR Apache-2.0) AND Unicode-3.0","license_file":null,"description":"Determine whether characters have the XID_Start or XID_Continue properties according to Unicode Standard Annex #31","source":"registry+https://github.com/rust-lang/crates.io-index","dependencies":[{"name":"criterion","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.5","kind":"dev","rename":null,"optional":false,"uses_default_features":false,"features":[],"target":null,"registry":null},{"name":"fst","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.4","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"rand","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.9","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"roaring","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.10","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"ucd-trie","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.1","kind":"dev","rename":null,"optional":false,"uses_default_features":false,"features":[],"target":null,"registry":null},{"name":"unicode-xid","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.2.6","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null}],"targets":[{"kind":["lib"],"crate_types":["lib"],"name":"unicode_ident","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/unicode-ident-1.0.18/src/lib.rs","edition":"2018","doc":true,"doctest":true,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"compare","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/unicode-ident-1.0.18/tests/compare.rs","edition":"2018","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"static_size","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/unicode-ident-1.0.18/tests/static_size.rs","edition":"2018","doc":false,"doctest":false,"test":true},{"kind":["bench"],"crate_types":["bin"],"name":"xid","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/unicode-ident-1.0.18/benches/xid.rs","edition":"2018","doc":false,"doctest":false,"test":false}],"features":{},"manifest_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/unicode-ident-1.0.18/Cargo.toml","metadata":{"docs":{"rs":{"rustdoc-args":["--generate-link-to-definition","--extern-html-root-url=core=https://doc.rust-lang.org","--extern-html-root-url=alloc=https://doc.rust-lang.org","--extern-html-root-url=std=https://doc.rust-lang.org"],"targets":["x86_64-unknown-linux-gnu"]}}},"publish":null,"authors":["David Tolnay <dtolnay@gmail.com>"],"categories":["development-tools::procedural-macro-helpers","no-std","no-std::no-alloc"],"keywords":["unicode","xid"],"readme":"README.md","repository":"https://github.com/dtolnay/unicode-ident","homepage":null,"documentation":"https://docs.rs/unicode-ident","edition":"2018","links":null,"default_run":null,"rust_version":"1.31"},{"name":"version_check","version":"0.9.5","id":"registry+https://github.com/rust-lang/crates.io-index#version_check@0.9.5","license":"MIT/Apache-2.0","license_file":null,"description":"Tiny crate to check the version of the installed/running rustc.","source":"registry+https://github.com/rust-lang/crates.io-index","dependencies":[],"targets":[{"kind":["lib"],"crate_types":["lib"],"name":"version_check","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/version_check-0.9.5/src/lib.rs","edition":"2015","doc":true,"doctest":true,"test":true}],"features":{},"manifest_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/version_check-0.9.5/Cargo.toml","metadata":null,"publish":null,"authors":["Sergio Benitez <sb@sergio.bz>"],"categories":[],"keywords":["version","rustc","minimum","check"],"readme":"README.md","repository":"https://github.com/SergioBenitez/version_check","homepage":null,"documentation":"https://docs.rs/version_check/","edition":"2015","links":null,"default_run":null,"rust_version":null},{"name":"wasi","version":"0.11.0+wasi-snapshot-preview1","id":"registry+https://github.com/rust-lang/crates.io-index#wasi@0.11.0+wasi-snapshot-preview1","license":"Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT","license_file":null,"description":"Experimental WASI API bindings for Rust","source":"registry+https://github.com/rust-lang/crates.io-index","dependencies":[{"name":"compiler_builtins","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.1","kind":null,"rename":null,"optional":true,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"rustc-std-workspace-core","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.0","kind":null,"rename":"core","optional":true,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"rustc-std-workspace-alloc","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.0","kind":null,"rename":null,"optional":true,"uses_default_features":true,"features":[],"target":null,"registry":null}],"targets":[{"kind":["lib"],"crate_types":["lib"],"name":"wasi","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/wasi-0.11.0+wasi-snapshot-preview1/src/lib.rs","edition":"2018","doc":true,"doctest":true,"test":true}],"features":{"compiler_builtins":["dep:compiler_builtins"],"core":["dep:core"],"default":["std"],"rustc-dep-of-std":["compiler_builtins","core","rustc-std-workspace-alloc"],"rustc-std-workspace-alloc":["dep:rustc-std-workspace-alloc"],"std":[]},"manifest_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/wasi-0.11.0+wasi-snapshot-preview1/Cargo.toml","metadata":null,"publish":null,"authors":["The Cranelift Project Developers"],"categories":["no-std","wasm"],"keywords":["webassembly","wasm"],"readme":"README.md","repository":"https://github.com/bytecodealliance/wasi","homepage":null,"documentation":"https://docs.rs/wasi","edition":"2018","links":null,"default_run":null,"rust_version":null},{"name":"wasi","version":"0.14.2+wasi-0.2.4","id":"registry+https://github.com/rust-lang/crates.io-index#wasi@0.14.2+wasi-0.2.4","license":"Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT","license_file":null,"description":"WASI API bindings for Rust","source":"registry+https://github.com/rust-lang/crates.io-index","dependencies":[{"name":"compiler_builtins","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.1","kind":null,"rename":null,"optional":true,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"rustc-std-workspace-core","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.0","kind":null,"rename":"core","optional":true,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"rustc-std-workspace-alloc","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.0","kind":null,"rename":null,"optional":true,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"wit-bindgen-rt","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.39.0","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":["bitflags"],"target":null,"registry":null}],"targets":[{"kind":["lib"],"crate_types":["lib"],"name":"wasi","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/wasi-0.14.2+wasi-0.2.4/src/lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},{"kind":["example"],"crate_types":["cdylib"],"name":"cli-command","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/wasi-0.14.2+wasi-0.2.4/examples/cli-command.rs","edition":"2021","required-features":["std"],"doc":false,"doctest":false,"test":false},{"kind":["example"],"crate_types":["cdylib"],"name":"cli-command-no_std","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/wasi-0.14.2+wasi-0.2.4/examples/cli-command-no_std.rs","edition":"2021","doc":false,"doctest":false,"test":false},{"kind":["example"],"crate_types":["bin"],"name":"hello-world","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/wasi-0.14.2+wasi-0.2.4/examples/hello-world.rs","edition":"2021","required-features":["std"],"doc":false,"doctest":false,"test":false},{"kind":["example"],"crate_types":["bin"],"name":"hello-world-no_std","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/wasi-0.14.2+wasi-0.2.4/examples/hello-world-no_std.rs","edition":"2021","doc":false,"doctest":false,"test":false},{"kind":["example"],"crate_types":["cdylib"],"name":"http-proxy","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/wasi-0.14.2+wasi-0.2.4/examples/http-proxy.rs","edition":"2021","required-features":["std"],"doc":false,"doctest":false,"test":false},{"kind":["example"],"crate_types":["cdylib"],"name":"http-proxy-no_std","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/wasi-0.14.2+wasi-0.2.4/examples/http-proxy-no_std.rs","edition":"2021","doc":false,"doctest":false,"test":false}],"features":{"compiler_builtins":["dep:compiler_builtins"],"core":["dep:core"],"default":["std"],"rustc-dep-of-std":["compiler_builtins","core","rustc-std-workspace-alloc"],"rustc-std-workspace-alloc":["dep:rustc-std-workspace-alloc"],"std":[]},"manifest_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/wasi-0.14.2+wasi-0.2.4/Cargo.toml","metadata":null,"publish":null,"authors":["The Cranelift Project Developers"],"categories":["no-std","wasm"],"keywords":["webassembly","wasm"],"readme":"README.md","repository":"https://github.com/bytecodealliance/wasi-rs","homepage":null,"documentation":"https://docs.rs/wasi","edition":"2021","links":null,"default_run":null,"rust_version":null},{"name":"wit-bindgen-rt","version":"0.39.0","id":"registry+https://github.com/rust-lang/crates.io-index#wit-bindgen-rt@0.39.0","license":"Apache-2.0 WITH LLVM-exception OR Apache-2.0 OR MIT","license_file":null,"description":"Runtime support for the `wit-bindgen` crate\n","source":"registry+https://github.com/rust-lang/crates.io-index","dependencies":[{"name":"bitflags","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^2.3.3","kind":null,"rename":null,"optional":true,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"futures","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.3.30","kind":null,"rename":null,"optional":true,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"once_cell","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.19.0","kind":null,"rename":null,"optional":true,"uses_default_features":true,"features":[],"target":null,"registry":null}],"targets":[{"kind":["lib"],"crate_types":["lib"],"name":"wit_bindgen_rt","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/wit-bindgen-rt-0.39.0/src/lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},{"kind":["custom-build"],"crate_types":["bin"],"name":"build-script-build","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/wit-bindgen-rt-0.39.0/build.rs","edition":"2021","doc":false,"doctest":false,"test":false}],"features":{"async":["dep:futures","dep:once_cell"],"bitflags":["dep:bitflags"]},"manifest_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/wit-bindgen-rt-0.39.0/Cargo.toml","metadata":null,"publish":null,"authors":[],"categories":[],"keywords":[],"readme":null,"repository":"https://github.com/bytecodealliance/wit-bindgen","homepage":"https://github.com/bytecodealliance/wit-bindgen","documentation":null,"edition":"2021","links":null,"default_run":null,"rust_version":null},{"name":"zerocopy","version":"0.7.35","id":"registry+https://github.com/rust-lang/crates.io-index#zerocopy@0.7.35","license":"BSD-2-Clause OR Apache-2.0 OR MIT","license_file":null,"description":"Utilities for zero-copy parsing and serialization","source":"registry+https://github.com/rust-lang/crates.io-index","dependencies":[{"name":"byteorder","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.3","kind":null,"rename":null,"optional":true,"uses_default_features":false,"features":[],"target":null,"registry":null},{"name":"zerocopy-derive","source":"registry+https://github.com/rust-lang/crates.io-index","req":"=0.7.35","kind":null,"rename":null,"optional":true,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"assert_matches","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.5","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"elain","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.3.0","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"itertools","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.11","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"rand","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.8.5","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":["small_rng"],"target":null,"registry":null},{"name":"rustversion","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.0","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"static_assertions","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.1","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"trybuild","source":"registry+https://github.com/rust-lang/crates.io-index","req":"=1.0.85","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":["diff"],"target":null,"registry":null},{"name":"zerocopy-derive","source":"registry+https://github.com/rust-lang/crates.io-index","req":"=0.7.35","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"zerocopy-derive","source":"registry+https://github.com/rust-lang/crates.io-index","req":"=0.7.35","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":"cfg(any())","registry":null}],"targets":[{"kind":["lib"],"crate_types":["lib"],"name":"zerocopy","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-0.7.35/src/lib.rs","edition":"2018","doc":true,"doctest":true,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"trybuild","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-0.7.35/tests/trybuild.rs","edition":"2018","doc":false,"doctest":false,"test":true}],"features":{"__internal_use_only_features_that_work_on_stable":["alloc","derive","simd"],"alloc":[],"byteorder":["dep:byteorder"],"default":["byteorder"],"derive":["zerocopy-derive"],"simd":[],"simd-nightly":["simd"],"zerocopy-derive":["dep:zerocopy-derive"]},"manifest_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-0.7.35/Cargo.toml","metadata":{"ci":{"pinned-nightly":"nightly-2024-06-19","pinned-stable":"1.79.0"},"docs":{"rs":{"all-features":true,"rustdoc-args":["--cfg","doc_cfg","--generate-link-to-definition"]}},"playground":{"features":["__internal_use_only_features_that_work_on_stable"]}},"publish":null,"authors":["Joshua Liebow-Feeser <joshlf@google.com>"],"categories":["embedded","encoding","no-std::no-alloc","parsing","rust-patterns"],"keywords":["cast","convert","transmute","transmutation","type-punning"],"readme":"README.md","repository":"https://github.com/google/zerocopy","homepage":null,"documentation":null,"edition":"2018","links":null,"default_run":null,"rust_version":"1.60.0"},{"name":"zerocopy","version":"0.8.25","id":"registry+https://github.com/rust-lang/crates.io-index#zerocopy@0.8.25","license":"BSD-2-Clause OR Apache-2.0 OR MIT","license_file":null,"description":"Zerocopy makes zero-cost memory manipulation effortless. We write \"unsafe\" so you don't have to.","source":"registry+https://github.com/rust-lang/crates.io-index","dependencies":[{"name":"zerocopy-derive","source":"registry+https://github.com/rust-lang/crates.io-index","req":"=0.8.25","kind":null,"rename":null,"optional":true,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"either","source":"registry+https://github.com/rust-lang/crates.io-index","req":"=1.13.0","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"elain","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.3.0","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"itertools","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.11","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"rand","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^0.8.5","kind":"dev","rename":null,"optional":false,"uses_default_features":false,"features":["small_rng"],"target":null,"registry":null},{"name":"rustversion","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.0","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"static_assertions","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.1","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"trybuild","source":"registry+https://github.com/rust-lang/crates.io-index","req":"=1.0.89","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":["diff"],"target":null,"registry":null},{"name":"zerocopy-derive","source":"registry+https://github.com/rust-lang/crates.io-index","req":"=0.8.25","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"zerocopy-derive","source":"registry+https://github.com/rust-lang/crates.io-index","req":"=0.8.25","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":"cfg(any())","registry":null}],"targets":[{"kind":["lib"],"crate_types":["lib"],"name":"zerocopy","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-0.8.25/src/lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"trybuild","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-0.8.25/tests/trybuild.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["custom-build"],"crate_types":["bin"],"name":"build-script-build","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-0.8.25/build.rs","edition":"2021","doc":false,"doctest":false,"test":false}],"features":{"__internal_use_only_features_that_work_on_stable":["alloc","derive","simd","std"],"alloc":[],"derive":["zerocopy-derive"],"float-nightly":[],"simd":[],"simd-nightly":["simd"],"std":["alloc"],"zerocopy-derive":["dep:zerocopy-derive"]},"manifest_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-0.8.25/Cargo.toml","metadata":{"build-rs":{"zerocopy-aarch64-simd-1-59-0":"1.59.0","zerocopy-core-error-1-81-0":"1.81.0","zerocopy-diagnostic-on-unimplemented-1-78-0":"1.78.0","zerocopy-generic-bounds-in-const-fn-1-61-0":"1.61.0","zerocopy-panic-in-const-and-vec-try-reserve-1-57-0":"1.57.0","zerocopy-target-has-atomics-1-60-0":"1.60.0"},"ci":{"pinned-nightly":"nightly-2025-04-23","pinned-stable":"1.86.0"},"docs":{"rs":{"all-features":true,"rustdoc-args":["--cfg","doc_cfg","--generate-link-to-definition"]}},"playground":{"features":["__internal_use_only_features_that_work_on_stable"]}},"publish":null,"authors":["Joshua Liebow-Feeser <joshlf@google.com>","Jack Wrenn <jswrenn@amazon.com>"],"categories":["embedded","encoding","no-std::no-alloc","parsing","rust-patterns"],"keywords":["cast","convert","transmute","transmutation","type-punning"],"readme":"README.md","repository":"https://github.com/google/zerocopy","homepage":null,"documentation":null,"edition":"2021","links":null,"default_run":null,"rust_version":"1.56.0"},{"name":"zerocopy-derive","version":"0.7.35","id":"registry+https://github.com/rust-lang/crates.io-index#zerocopy-derive@0.7.35","license":"BSD-2-Clause OR Apache-2.0 OR MIT","license_file":null,"description":"Custom derive for traits from the zerocopy crate","source":"registry+https://github.com/rust-lang/crates.io-index","dependencies":[{"name":"proc-macro2","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.0.1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"quote","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.0.10","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"syn","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^2.0.31","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"static_assertions","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.1","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"trybuild","source":"registry+https://github.com/rust-lang/crates.io-index","req":"=1.0.85","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":["diff"],"target":null,"registry":null}],"targets":[{"kind":["proc-macro"],"crate_types":["proc-macro"],"name":"zerocopy_derive","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.7.35/src/lib.rs","edition":"2018","doc":true,"doctest":true,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"enum_as_bytes","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.7.35/tests/enum_as_bytes.rs","edition":"2018","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"enum_from_zeroes","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.7.35/tests/enum_from_zeroes.rs","edition":"2018","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"enum_known_layout","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.7.35/tests/enum_known_layout.rs","edition":"2018","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"enum_unaligned","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.7.35/tests/enum_unaligned.rs","edition":"2018","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"hygiene","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.7.35/tests/hygiene.rs","edition":"2018","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"paths_and_modules","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.7.35/tests/paths_and_modules.rs","edition":"2018","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"priv_in_pub","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.7.35/tests/priv_in_pub.rs","edition":"2018","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"struct_as_bytes","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.7.35/tests/struct_as_bytes.rs","edition":"2018","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"struct_from_bytes","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.7.35/tests/struct_from_bytes.rs","edition":"2018","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"struct_from_zeroes","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.7.35/tests/struct_from_zeroes.rs","edition":"2018","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"struct_known_layout","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.7.35/tests/struct_known_layout.rs","edition":"2018","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"struct_unaligned","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.7.35/tests/struct_unaligned.rs","edition":"2018","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"trybuild","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.7.35/tests/trybuild.rs","edition":"2018","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"union_as_bytes","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.7.35/tests/union_as_bytes.rs","edition":"2018","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"union_from_bytes","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.7.35/tests/union_from_bytes.rs","edition":"2018","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"union_from_zeroes","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.7.35/tests/union_from_zeroes.rs","edition":"2018","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"union_known_layout","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.7.35/tests/union_known_layout.rs","edition":"2018","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"union_unaligned","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.7.35/tests/union_unaligned.rs","edition":"2018","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"util","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.7.35/tests/util.rs","edition":"2018","doc":false,"doctest":false,"test":true}],"features":{},"manifest_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.7.35/Cargo.toml","metadata":null,"publish":null,"authors":["Joshua Liebow-Feeser <joshlf@google.com>"],"categories":[],"keywords":[],"readme":null,"repository":"https://github.com/google/zerocopy","homepage":null,"documentation":null,"edition":"2018","links":null,"default_run":null,"rust_version":null},{"name":"zerocopy-derive","version":"0.8.25","id":"registry+https://github.com/rust-lang/crates.io-index#zerocopy-derive@0.8.25","license":"BSD-2-Clause OR Apache-2.0 OR MIT","license_file":null,"description":"Custom derive for traits from the zerocopy crate","source":"registry+https://github.com/rust-lang/crates.io-index","dependencies":[{"name":"proc-macro2","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.0.1","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"quote","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.0.10","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"syn","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^2.0.46","kind":null,"rename":null,"optional":false,"uses_default_features":true,"features":["full"],"target":null,"registry":null},{"name":"dissimilar","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.0.9","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"libc","source":"registry+https://github.com/rust-lang/crates.io-index","req":"=0.2.163","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"once_cell","source":"registry+https://github.com/rust-lang/crates.io-index","req":"=1.9","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"prettyplease","source":"registry+https://github.com/rust-lang/crates.io-index","req":"=0.2.17","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"rustversion","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.0","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"static_assertions","source":"registry+https://github.com/rust-lang/crates.io-index","req":"^1.1","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":[],"target":null,"registry":null},{"name":"trybuild","source":"registry+https://github.com/rust-lang/crates.io-index","req":"=1.0.89","kind":"dev","rename":null,"optional":false,"uses_default_features":true,"features":["diff"],"target":null,"registry":null}],"targets":[{"kind":["proc-macro"],"crate_types":["proc-macro"],"name":"zerocopy_derive","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.8.25/src/lib.rs","edition":"2021","doc":true,"doctest":true,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"crate_path","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.8.25/tests/crate_path.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"deprecated","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.8.25/tests/deprecated.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"enum_from_zeros","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.8.25/tests/enum_from_zeros.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"enum_known_layout","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.8.25/tests/enum_known_layout.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"enum_no_cell","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.8.25/tests/enum_no_cell.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"enum_to_bytes","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.8.25/tests/enum_to_bytes.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"enum_try_from_bytes","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.8.25/tests/enum_try_from_bytes.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"enum_unaligned","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.8.25/tests/enum_unaligned.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"eq","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.8.25/tests/eq.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"hash","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.8.25/tests/hash.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"hygiene","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.8.25/tests/hygiene.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"include","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.8.25/tests/include.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"issue_2117","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.8.25/tests/issue_2117.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"paths_and_modules","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.8.25/tests/paths_and_modules.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"priv_in_pub","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.8.25/tests/priv_in_pub.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"struct_from_bytes","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.8.25/tests/struct_from_bytes.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"struct_from_zeros","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.8.25/tests/struct_from_zeros.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"struct_known_layout","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.8.25/tests/struct_known_layout.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"struct_no_cell","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.8.25/tests/struct_no_cell.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"struct_to_bytes","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.8.25/tests/struct_to_bytes.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"struct_try_from_bytes","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.8.25/tests/struct_try_from_bytes.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"struct_unaligned","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.8.25/tests/struct_unaligned.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"trybuild","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.8.25/tests/trybuild.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"union_from_bytes","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.8.25/tests/union_from_bytes.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"union_from_zeros","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.8.25/tests/union_from_zeros.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"union_known_layout","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.8.25/tests/union_known_layout.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"union_no_cell","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.8.25/tests/union_no_cell.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"union_to_bytes","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.8.25/tests/union_to_bytes.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"union_try_from_bytes","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.8.25/tests/union_try_from_bytes.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"union_unaligned","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.8.25/tests/union_unaligned.rs","edition":"2021","doc":false,"doctest":false,"test":true},{"kind":["test"],"crate_types":["bin"],"name":"unsafe_cell","src_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.8.25/tests/unsafe_cell.rs","edition":"2021","doc":false,"doctest":false,"test":true}],"features":{},"manifest_path":"/usr/local/google/home/lukasza/.cargo/registry/src/index.crates.io-1949cf8c6b5b557f/zerocopy-derive-0.8.25/Cargo.toml","metadata":null,"publish":null,"authors":["Joshua Liebow-Feeser <joshlf@google.com>","Jack Wrenn <jswrenn@amazon.com>"],"categories":[],"keywords":[],"readme":null,"repository":"https://github.com/google/zerocopy","homepage":null,"documentation":null,"edition":"2021","links":null,"default_run":null,"rust_version":null}],"workspace_members":["path+file:///usr/local/google/home/lukasza/src/chromium2/src/tools/crates/gnrt/sample_package4#0.1.0"],"workspace_default_members":["path+file:///usr/local/google/home/lukasza/src/chromium2/src/tools/crates/gnrt/sample_package4#0.1.0"],"resolve":{"nodes":[{"id":"registry+https://github.com/rust-lang/crates.io-index#ahash@0.8.11","dependencies":["registry+https://github.com/rust-lang/crates.io-index#cfg-if@1.0.0","registry+https://github.com/rust-lang/crates.io-index#getrandom@0.2.16","registry+https://github.com/rust-lang/crates.io-index#once_cell@1.21.3","registry+https://github.com/rust-lang/crates.io-index#version_check@0.9.5","registry+https://github.com/rust-lang/crates.io-index#zerocopy@0.7.35"],"deps":[{"name":"cfg_if","pkg":"registry+https://github.com/rust-lang/crates.io-index#cfg-if@1.0.0","dep_kinds":[{"kind":null,"target":null}]},{"name":"getrandom","pkg":"registry+https://github.com/rust-lang/crates.io-index#getrandom@0.2.16","dep_kinds":[{"kind":null,"target":null}]},{"name":"once_cell","pkg":"registry+https://github.com/rust-lang/crates.io-index#once_cell@1.21.3","dep_kinds":[{"kind":null,"target":"cfg(not(all(target_arch = \"arm\", target_os = \"none\")))"}]},{"name":"version_check","pkg":"registry+https://github.com/rust-lang/crates.io-index#version_check@0.9.5","dep_kinds":[{"kind":"build","target":null}]},{"name":"zerocopy","pkg":"registry+https://github.com/rust-lang/crates.io-index#zerocopy@0.7.35","dep_kinds":[{"kind":null,"target":null}]}],"features":["default","getrandom","runtime-rng","std"]},{"id":"registry+https://github.com/rust-lang/crates.io-index#bitflags@2.9.0","dependencies":[],"deps":[],"features":[]},{"id":"registry+https://github.com/rust-lang/crates.io-index#cfg-if@1.0.0","dependencies":[],"deps":[],"features":[]},{"id":"registry+https://github.com/rust-lang/crates.io-index#getrandom@0.2.16","dependencies":["registry+https://github.com/rust-lang/crates.io-index#cfg-if@1.0.0","registry+https://github.com/rust-lang/crates.io-index#libc@0.2.172","registry+https://github.com/rust-lang/crates.io-index#wasi@0.11.0+wasi-snapshot-preview1"],"deps":[{"name":"cfg_if","pkg":"registry+https://github.com/rust-lang/crates.io-index#cfg-if@1.0.0","dep_kinds":[{"kind":null,"target":null}]},{"name":"libc","pkg":"registry+https://github.com/rust-lang/crates.io-index#libc@0.2.172","dep_kinds":[{"kind":null,"target":"cfg(unix)"}]},{"name":"wasi","pkg":"registry+https://github.com/rust-lang/crates.io-index#wasi@0.11.0+wasi-snapshot-preview1","dep_kinds":[{"kind":null,"target":"cfg(target_os = \"wasi\")"}]}],"features":[]},{"id":"registry+https://github.com/rust-lang/crates.io-index#getrandom@0.3.2","dependencies":["registry+https://github.com/rust-lang/crates.io-index#cfg-if@1.0.0","registry+https://github.com/rust-lang/crates.io-index#libc@0.2.172","registry+https://github.com/rust-lang/crates.io-index#r-efi@5.2.0","registry+https://github.com/rust-lang/crates.io-index#wasi@0.14.2+wasi-0.2.4"],"deps":[{"name":"cfg_if","pkg":"registry+https://github.com/rust-lang/crates.io-index#cfg-if@1.0.0","dep_kinds":[{"kind":null,"target":null}]},{"name":"libc","pkg":"registry+https://github.com/rust-lang/crates.io-index#libc@0.2.172","dep_kinds":[{"kind":null,"target":"cfg(all(any(target_os = \"linux\", target_os = \"android\"), not(any(all(target_os = \"linux\", target_env = \"\"), getrandom_backend = \"custom\", getrandom_backend = \"linux_raw\", getrandom_backend = \"rdrand\", getrandom_backend = \"rndr\"))))"},{"kind":null,"target":"cfg(any(target_os = \"dragonfly\", target_os = \"freebsd\", target_os = \"hurd\", target_os = \"illumos\", target_os = \"cygwin\", all(target_os = \"horizon\", target_arch = \"arm\")))"},{"kind":null,"target":"cfg(any(target_os = \"haiku\", target_os = \"redox\", target_os = \"nto\", target_os = \"aix\"))"},{"kind":null,"target":"cfg(any(target_os = \"ios\", target_os = \"visionos\", target_os = \"watchos\", target_os = \"tvos\"))"},{"kind":null,"target":"cfg(any(target_os = \"macos\", target_os = \"openbsd\", target_os = \"vita\", target_os = \"emscripten\"))"},{"kind":null,"target":"cfg(target_os = \"netbsd\")"},{"kind":null,"target":"cfg(target_os = \"solaris\")"},{"kind":null,"target":"cfg(target_os = \"vxworks\")"}]},{"name":"r_efi","pkg":"registry+https://github.com/rust-lang/crates.io-index#r-efi@5.2.0","dep_kinds":[{"kind":null,"target":"cfg(all(target_os = \"uefi\", getrandom_backend = \"efi_rng\"))"}]},{"name":"wasi","pkg":"registry+https://github.com/rust-lang/crates.io-index#wasi@0.14.2+wasi-0.2.4","dep_kinds":[{"kind":null,"target":"cfg(all(target_arch = \"wasm32\", target_os = \"wasi\", target_env = \"p2\"))"}]}],"features":["std"]},{"id":"registry+https://github.com/rust-lang/crates.io-index#libc@0.2.172","dependencies":[],"deps":[],"features":[]},{"id":"registry+https://github.com/rust-lang/crates.io-index#once_cell@1.21.3","dependencies":[],"deps":[],"features":["alloc","race"]},{"id":"registry+https://github.com/rust-lang/crates.io-index#ppv-lite86@0.2.21","dependencies":["registry+https://github.com/rust-lang/crates.io-index#zerocopy@0.8.25"],"deps":[{"name":"zerocopy","pkg":"registry+https://github.com/rust-lang/crates.io-index#zerocopy@0.8.25","dep_kinds":[{"kind":null,"target":null}]}],"features":["simd","std"]},{"id":"registry+https://github.com/rust-lang/crates.io-index#proc-macro2@1.0.95","dependencies":["registry+https://github.com/rust-lang/crates.io-index#unicode-ident@1.0.18"],"deps":[{"name":"unicode_ident","pkg":"registry+https://github.com/rust-lang/crates.io-index#unicode-ident@1.0.18","dep_kinds":[{"kind":null,"target":null}]}],"features":["default","proc-macro"]},{"id":"registry+https://github.com/rust-lang/crates.io-index#quote@1.0.40","dependencies":["registry+https://github.com/rust-lang/crates.io-index#proc-macro2@1.0.95"],"deps":[{"name":"proc_macro2","pkg":"registry+https://github.com/rust-lang/crates.io-index#proc-macro2@1.0.95","dep_kinds":[{"kind":null,"target":null}]}],"features":["default","proc-macro"]},{"id":"registry+https://github.com/rust-lang/crates.io-index#r-efi@5.2.0","dependencies":[],"deps":[],"features":[]},{"id":"registry+https://github.com/rust-lang/crates.io-index#rand@0.9.1","dependencies":["registry+https://github.com/rust-lang/crates.io-index#rand_chacha@0.9.0","registry+https://github.com/rust-lang/crates.io-index#rand_core@0.9.3"],"deps":[{"name":"rand_chacha","pkg":"registry+https://github.com/rust-lang/crates.io-index#rand_chacha@0.9.0","dep_kinds":[{"kind":null,"target":null}]},{"name":"rand_core","pkg":"registry+https://github.com/rust-lang/crates.io-index#rand_core@0.9.3","dep_kinds":[{"kind":null,"target":null}]}],"features":["alloc","default","os_rng","small_rng","std","std_rng","thread_rng"]},{"id":"registry+https://github.com/rust-lang/crates.io-index#rand_chacha@0.9.0","dependencies":["registry+https://github.com/rust-lang/crates.io-index#ppv-lite86@0.2.21","registry+https://github.com/rust-lang/crates.io-index#rand_core@0.9.3"],"deps":[{"name":"ppv_lite86","pkg":"registry+https://github.com/rust-lang/crates.io-index#ppv-lite86@0.2.21","dep_kinds":[{"kind":null,"target":null}]},{"name":"rand_core","pkg":"registry+https://github.com/rust-lang/crates.io-index#rand_core@0.9.3","dep_kinds":[{"kind":null,"target":null}]}],"features":["std"]},{"id":"registry+https://github.com/rust-lang/crates.io-index#rand_core@0.9.3","dependencies":["registry+https://github.com/rust-lang/crates.io-index#getrandom@0.3.2"],"deps":[{"name":"getrandom","pkg":"registry+https://github.com/rust-lang/crates.io-index#getrandom@0.3.2","dep_kinds":[{"kind":null,"target":null}]}],"features":["os_rng","std"]},{"id":"path+file:///usr/local/google/home/lukasza/src/chromium2/src/tools/crates/gnrt/sample_package4#0.1.0","dependencies":["registry+https://github.com/rust-lang/crates.io-index#ahash@0.8.11","registry+https://github.com/rust-lang/crates.io-index#rand@0.9.1"],"deps":[{"name":"ahash","pkg":"registry+https://github.com/rust-lang/crates.io-index#ahash@0.8.11","dep_kinds":[{"kind":null,"target":null}]},{"name":"rand","pkg":"registry+https://github.com/rust-lang/crates.io-index#rand@0.9.1","dep_kinds":[{"kind":null,"target":null}]}],"features":[]},{"id":"registry+https://github.com/rust-lang/crates.io-index#syn@2.0.101","dependencies":["registry+https://github.com/rust-lang/crates.io-index#proc-macro2@1.0.95","registry+https://github.com/rust-lang/crates.io-index#quote@1.0.40","registry+https://github.com/rust-lang/crates.io-index#unicode-ident@1.0.18"],"deps":[{"name":"proc_macro2","pkg":"registry+https://github.com/rust-lang/crates.io-index#proc-macro2@1.0.95","dep_kinds":[{"kind":null,"target":null}]},{"name":"quote","pkg":"registry+https://github.com/rust-lang/crates.io-index#quote@1.0.40","dep_kinds":[{"kind":null,"target":null}]},{"name":"unicode_ident","pkg":"registry+https://github.com/rust-lang/crates.io-index#unicode-ident@1.0.18","dep_kinds":[{"kind":null,"target":null}]}],"features":["clone-impls","default","derive","full","parsing","printing","proc-macro"]},{"id":"registry+https://github.com/rust-lang/crates.io-index#unicode-ident@1.0.18","dependencies":[],"deps":[],"features":[]},{"id":"registry+https://github.com/rust-lang/crates.io-index#version_check@0.9.5","dependencies":[],"deps":[],"features":[]},{"id":"registry+https://github.com/rust-lang/crates.io-index#wasi@0.11.0+wasi-snapshot-preview1","dependencies":[],"deps":[],"features":[]},{"id":"registry+https://github.com/rust-lang/crates.io-index#wasi@0.14.2+wasi-0.2.4","dependencies":["registry+https://github.com/rust-lang/crates.io-index#wit-bindgen-rt@0.39.0"],"deps":[{"name":"wit_bindgen_rt","pkg":"registry+https://github.com/rust-lang/crates.io-index#wit-bindgen-rt@0.39.0","dep_kinds":[{"kind":null,"target":null}]}],"features":[]},{"id":"registry+https://github.com/rust-lang/crates.io-index#wit-bindgen-rt@0.39.0","dependencies":["registry+https://github.com/rust-lang/crates.io-index#bitflags@2.9.0"],"deps":[{"name":"bitflags","pkg":"registry+https://github.com/rust-lang/crates.io-index#bitflags@2.9.0","dep_kinds":[{"kind":null,"target":null}]}],"features":["bitflags"]},{"id":"registry+https://github.com/rust-lang/crates.io-index#zerocopy@0.7.35","dependencies":["registry+https://github.com/rust-lang/crates.io-index#zerocopy-derive@0.7.35"],"deps":[{"name":"zerocopy_derive","pkg":"registry+https://github.com/rust-lang/crates.io-index#zerocopy-derive@0.7.35","dep_kinds":[{"kind":null,"target":"cfg(any())"}]}],"features":["simd"]},{"id":"registry+https://github.com/rust-lang/crates.io-index#zerocopy@0.8.25","dependencies":["registry+https://github.com/rust-lang/crates.io-index#zerocopy-derive@0.8.25"],"deps":[{"name":"zerocopy_derive","pkg":"registry+https://github.com/rust-lang/crates.io-index#zerocopy-derive@0.8.25","dep_kinds":[{"kind":null,"target":"cfg(any())"}]}],"features":["simd"]},{"id":"registry+https://github.com/rust-lang/crates.io-index#zerocopy-derive@0.7.35","dependencies":["registry+https://github.com/rust-lang/crates.io-index#proc-macro2@1.0.95","registry+https://github.com/rust-lang/crates.io-index#quote@1.0.40","registry+https://github.com/rust-lang/crates.io-index#syn@2.0.101"],"deps":[{"name":"proc_macro2","pkg":"registry+https://github.com/rust-lang/crates.io-index#proc-macro2@1.0.95","dep_kinds":[{"kind":null,"target":null}]},{"name":"quote","pkg":"registry+https://github.com/rust-lang/crates.io-index#quote@1.0.40","dep_kinds":[{"kind":null,"target":null}]},{"name":"syn","pkg":"registry+https://github.com/rust-lang/crates.io-index#syn@2.0.101","dep_kinds":[{"kind":null,"target":null}]}],"features":[]},{"id":"registry+https://github.com/rust-lang/crates.io-index#zerocopy-derive@0.8.25","dependencies":["registry+https://github.com/rust-lang/crates.io-index#proc-macro2@1.0.95","registry+https://github.com/rust-lang/crates.io-index#quote@1.0.40","registry+https://github.com/rust-lang/crates.io-index#syn@2.0.101"],"deps":[{"name":"proc_macro2","pkg":"registry+https://github.com/rust-lang/crates.io-index#proc-macro2@1.0.95","dep_kinds":[{"kind":null,"target":null}]},{"name":"quote","pkg":"registry+https://github.com/rust-lang/crates.io-index#quote@1.0.40","dep_kinds":[{"kind":null,"target":null}]},{"name":"syn","pkg":"registry+https://github.com/rust-lang/crates.io-index#syn@2.0.101","dep_kinds":[{"kind":null,"target":null}]}],"features":[]}],"root":"path+file:///usr/local/google/home/lukasza/src/chromium2/src/tools/crates/gnrt/sample_package4#0.1.0"},"target_directory":"/usr/local/google/home/lukasza/src/chromium2/src/tools/crates/gnrt/sample_package4/target","version":1,"workspace_root":"/usr/local/google/home/lukasza/src/chromium2/src/tools/crates/gnrt/sample_package4","metadata":null}
diff --git a/tools/crates/gnrt/sample_package4/Cargo.lock b/tools/crates/gnrt/sample_package4/Cargo.lock deleted file mode 100644 index c427704d..0000000 --- a/tools/crates/gnrt/sample_package4/Cargo.lock +++ /dev/null
@@ -1,220 +0,0 @@ -# This file is automatically @generated by Cargo. -# It is not intended for manual editing. -version = 4 - -[[package]] -name = "ahash" -version = "0.8.11" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "e89da841a80418a9b391ebaea17f5c112ffaaa96f621d2c285b5174da76b9011" -dependencies = [ - "cfg-if", - "getrandom 0.2.16", - "once_cell", - "version_check", - "zerocopy 0.7.35", -] - -[[package]] -name = "bitflags" -version = "2.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5c8214115b7bf84099f1309324e63141d4c5d7cc26862f97a0a857dbefe165bd" - -[[package]] -name = "cfg-if" -version = "1.0.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd" - -[[package]] -name = "getrandom" -version = "0.2.16" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "335ff9f135e4384c8150d6f27c6daed433577f86b4750418338c01a1a2528592" -dependencies = [ - "cfg-if", - "libc", - "wasi 0.11.0+wasi-snapshot-preview1", -] - -[[package]] -name = "getrandom" -version = "0.3.2" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "73fea8450eea4bac3940448fb7ae50d91f034f941199fcd9d909a5a07aa455f0" -dependencies = [ - "cfg-if", - "libc", - "r-efi", - "wasi 0.14.2+wasi-0.2.4", -] - -[[package]] -name = "libc" -version = "0.2.172" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d750af042f7ef4f724306de029d18836c26c1765a54a6a3f094cbd23a7267ffa" - -[[package]] -name = "once_cell" -version = "1.21.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "42f5e15c9953c5e4ccceeb2e7382a716482c34515315f7b03532b8b4e8393d2d" - -[[package]] -name = "ppv-lite86" -version = "0.2.21" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "85eae3c4ed2f50dcfe72643da4befc30deadb458a9b590d720cde2f2b1e97da9" -dependencies = [ - "zerocopy 0.8.25", -] - -[[package]] -name = "proc-macro2" -version = "1.0.95" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "02b3e5e68a3a1a02aad3ec490a98007cbc13c37cbe84a3cd7b8e406d76e7f778" -dependencies = [ - "unicode-ident", -] - -[[package]] -name = "quote" -version = "1.0.40" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1885c039570dc00dcb4ff087a89e185fd56bae234ddc7f056a945bf36467248d" -dependencies = [ - "proc-macro2", -] - -[[package]] -name = "r-efi" -version = "5.2.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "74765f6d916ee2faa39bc8e68e4f3ed8949b48cccdac59983d287a7cb71ce9c5" - -[[package]] -name = "rand" -version = "0.9.1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9fbfd9d094a40bf3ae768db9361049ace4c0e04a4fd6b359518bd7b73a73dd97" -dependencies = [ - "rand_chacha", - "rand_core", -] - -[[package]] -name = "rand_chacha" -version = "0.9.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "d3022b5f1df60f26e1ffddd6c66e8aa15de382ae63b3a0c1bfc0e4d3e3f325cb" -dependencies = [ - "ppv-lite86", - "rand_core", -] - -[[package]] -name = "rand_core" -version = "0.9.3" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "99d9a13982dcf210057a8a78572b2217b667c3beacbf3a0d8b454f6f82837d38" -dependencies = [ - "getrandom 0.3.2", -] - -[[package]] -name = "sample_package4" -version = "0.1.0" -dependencies = [ - "ahash", - "rand", -] - -[[package]] -name = "syn" -version = "2.0.101" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" -dependencies = [ - "proc-macro2", - "quote", - "unicode-ident", -] - -[[package]] -name = "unicode-ident" -version = "1.0.18" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "5a5f39404a5da50712a4c1eecf25e90dd62b613502b7e925fd4e4d19b5c96512" - -[[package]] -name = "version_check" -version = "0.9.5" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "0b928f33d975fc6ad9f86c8f283853ad26bdd5b10b7f1542aa2fa15e2289105a" - -[[package]] -name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" - -[[package]] -name = "wasi" -version = "0.14.2+wasi-0.2.4" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9683f9a5a998d873c0d21fcbe3c083009670149a8fab228644b8bd36b2c48cb3" -dependencies = [ - "wit-bindgen-rt", -] - -[[package]] -name = "wit-bindgen-rt" -version = "0.39.0" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "6f42320e61fe2cfd34354ecb597f86f413484a798ba44a8ca1165c58d42da6c1" -dependencies = [ - "bitflags", -] - -[[package]] -name = "zerocopy" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "1b9b4fd18abc82b8136838da5d50bae7bdea537c574d8dc1a34ed098d6c166f0" -dependencies = [ - "zerocopy-derive 0.7.35", -] - -[[package]] -name = "zerocopy" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a1702d9583232ddb9174e01bb7c15a2ab8fb1bc6f227aa1233858c351a3ba0cb" -dependencies = [ - "zerocopy-derive 0.8.25", -] - -[[package]] -name = "zerocopy-derive" -version = "0.7.35" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "fa4f8080344d4671fb4e831a13ad1e68092748387dfc4f55e356242fae12ce3e" -dependencies = [ - "proc-macro2", - "quote", - "syn", -] - -[[package]] -name = "zerocopy-derive" -version = "0.8.25" -source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "28a6e20d751156648aa063f3800b706ee209a32c0b4d9f24be3d980b01be55ef" -dependencies = [ - "proc-macro2", - "quote", - "syn", -]
diff --git a/tools/crates/gnrt/sample_package4/Cargo.toml b/tools/crates/gnrt/sample_package4/Cargo.toml deleted file mode 100644 index 2f6e095..0000000 --- a/tools/crates/gnrt/sample_package4/Cargo.toml +++ /dev/null
@@ -1,22 +0,0 @@ -# Copyright 2025 The Chromium Authors -# Use of this source code is governed by a BSD-style license that can be -# found in the LICENSE file. - -# This `Cargo.toml` is a test input for some unit tests of `gnrt`. Output of -# `cargo metadata` has been saved in `gnrt/lib/test_metadata2.json`. -# -# The main point of this test it checking if `icu_capi`'s dependencies will -# be trimmed because only a small set of crate features is enabled below. - -[package] -name = "sample_package4" -version = "0.1.0" -edition = "2021" - -[dependencies] -rand = "0.9.1" # Transitively depends on `getrandom-0.3.2` - -# Transitively depends on `getrandom-0.2.16` -[dependencies.ahash] -version = "0.8.11" -features = ["runtime-rng"]
diff --git a/tools/crates/gnrt/sample_package4/README.md b/tools/crates/gnrt/sample_package4/README.md deleted file mode 100644 index 35913de..0000000 --- a/tools/crates/gnrt/sample_package4/README.md +++ /dev/null
@@ -1,6 +0,0 @@ -This is a sample Cargo package to test `gnrt`'s ability to detect and complain -about scenarios where multiple epochs/version of the same crate are present -in the dependency tree. - -`tools/crates/gnrt/lib/test_metadata4.json` is generated by the output of -running `cargo metadata --format-version 1` in this directory.
diff --git a/tools/crates/gnrt/sample_package4/src/main.rs b/tools/crates/gnrt/sample_package4/src/main.rs deleted file mode 100644 index 46a864e..0000000 --- a/tools/crates/gnrt/sample_package4/src/main.rs +++ /dev/null
@@ -1,7 +0,0 @@ -// Copyright 2025 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -fn main() { - println!("Hello, world!"); -}
diff --git a/tools/grit/grit/node/node_io.py b/tools/grit/grit/node/node_io.py index ec5446e..ec265650 100644 --- a/tools/grit/grit/node/node_io.py +++ b/tools/grit/grit/node/node_io.py
@@ -120,10 +120,13 @@ return path.replace(match.group(1), f'{match.group(1)}_{self.GetGender()}') else: # self.GetType() == 'android' - match = ANDROID_FILENAME_RE.search(path) - assert match is not None, f'unrecognized android path: {path}' - return path.replace(match.group(1), - f'{match.group(1)}-{self.GetGender()}') + if self.GetGender() == constants.DEFAULT_GENDER: + return path + else: + match = ANDROID_FILENAME_RE.search(path) + assert match is not None, f'unrecognized android path: {path}' + return path.replace(match.group(1), + f'{match.group(1)}-{self.GetGender()}') def MandatoryAttributes(self): return ['filename', 'type']
diff --git a/tools/grit/grit/node/node_io_unittest.py b/tools/grit/grit/node/node_io_unittest.py index df4814b..e804d9a 100755 --- a/tools/grit/grit/node/node_io_unittest.py +++ b/tools/grit/grit/node/node_io_unittest.py
@@ -229,7 +229,7 @@ 'gender': 'NEUTER' }, { - 'filename': 'java/res/values-en-OTHER/translation.xml', + 'filename': 'java/res/values-en/translation.xml', 'gender': 'OTHER' }, {
diff --git a/tools/grit/grit/tool/build.py b/tools/grit/grit/tool/build.py index d59dd472..9ca3722 100644 --- a/tools/grit/grit/tool/build.py +++ b/tools/grit/grit/tool/build.py
@@ -16,6 +16,7 @@ import re import shutil import sys +import tempfile from grit import grd_reader from grit import shortcuts @@ -394,6 +395,9 @@ if self.allowlist_names: self.AddAllowlistTags(self.res, self.allowlist_names) + if self.android_output_zip_path is not None: + self.android_output_tmp_dir = tempfile.TemporaryDirectory( + ignore_cleanup_errors=True) zippable_android_xml_outputs = [] for output in self.res.GetOutputFiles(): self.VerboseOut('Creating %s...' % output.GetOutputFilename()) @@ -408,16 +412,28 @@ if self.res.GetIdMap() is None: self.res.InitializeIds() - # Make the output directory if it doesn't exist. - self.MakeDirectoriesTo(output.GetOutputFilename()) - # Write the results to a temporary file and only overwrite the original # if the file changed. This avoids unnecessary rebuilds. + # + # TODO(hartmanng): Android xml strings currently bypass this behaviour + # when self.android_output_zip_path is set. We should take another look to + # make sure we avoid unnecessary rebuilds. out_filename = output.GetOutputFilename() tmp_filename = out_filename + '.tmp' - tmpfile = self.fo_create(tmp_filename, 'wb') output_type = output.GetType() + if output_type == 'android' and self.android_output_zip_path is not None: + # if these files are just going to be zipped and then deleted, they + # shouldn't be in the normal `out/...` directory - we'll just store them + # in the system tmp dir instead. + tmp_filename = self.GetTempAndroidOutputPath(tmp_filename) + out_filename = self.GetTempAndroidOutputPath(out_filename) + zippable_android_xml_outputs.append(out_filename) + + # Make the output directory if it doesn't exist. + self.MakeDirectoriesTo(out_filename) + tmpfile = self.fo_create(tmp_filename, 'wb') + if output_type != 'data_package': encoding = self._EncodingForOutputType(output_type) tmpfile = util.WrapOutputStream(tmpfile, encoding) @@ -435,9 +451,6 @@ os.remove(tmp_filename) tmp_filename = gz_filename - if output_type == 'android': - zippable_android_xml_outputs.append(out_filename) - # Now copy from the temp file back to the real output, but on Windows, # only if the real output doesn't exist or the contents of the file # changed. This prevents identical headers from being written and .cc @@ -487,6 +500,28 @@ sys.exit(-1) + # Gets a temporary output path that mirrors the given reference path. + # |out_filename| can be either absolute or relative. + # |self.android_output_tmp_dir| must be set to a tempfile.TemporaryDirectory + # object before calling this function. + # + # Examples (assuming |self.android_output_tmp_dir.name| = + # '/tmp/android_output', and current working directory is + # '/chromium/src/out/Debug'): + # + # GetTempAndroidOutputPath('relative/path') = + # '/tmp/android_output/chromium/src/out/Debug/relative/path' + # + # GetTempAndroidOutputPath('../../relative/path') = + # '/tmp/android_output/chromium/src/relative/path' + # + # GetTempAndroidOutputPath('/absolute/path') = + # '/tmp/android_output/absolute/path' + def GetTempAndroidOutputPath(self, out_filename): + return os.path.join(self.android_output_tmp_dir.name, + os.path.relpath(os.path.abspath(out_filename), '/')) + + # zip_helpers.add_files_to_zip takes in a list of tuples (zip_filename, # fs_filename). We are given a list of fs_filenames, and must construct # zip_filenames. We do so by converting the path to posix-style (ie, replacing @@ -631,4 +666,4 @@ '''Creates directories necessary to contain |file|.''' dir = os.path.split(file)[0] if not os.path.exists(dir): - os.makedirs(dir) + os.makedirs(dir, exist_ok=True)
diff --git a/tools/grit/grit/tool/build_unittest.py b/tools/grit/grit/tool/build_unittest.py index 931f7d7..95ff0ba 100755 --- a/tools/grit/grit/tool/build_unittest.py +++ b/tools/grit/grit/tool/build_unittest.py
@@ -11,6 +11,7 @@ import os import re import sys +import tempfile import zipfile if __name__ == '__main__': sys.path.append(os.path.join(os.path.dirname(__file__), '../..')) @@ -349,6 +350,57 @@ output_dir.CleanUp() + def testGetTempAndroidOutputPath(self): + builder_ok = build.RcBuilder() + builder_ok.android_output_tmp_dir = tempfile.TemporaryDirectory( + ignore_cleanup_errors=True) + + # easy case: an absolute path will just get the root removed and be joined + # to the tmp dir. + self.assertEqual( + builder_ok.GetTempAndroidOutputPath('/absolute/path.zip'), + os.path.join(builder_ok.android_output_tmp_dir.name, + os.path.join('absolute', 'path.zip'))) + + # relative paths are more complicated to test, because they depend on the + # cwd. os.path.splitdrive() removes the drive from the path in a different + # way from the GetTempAndroidOutputPath() implementation, so it should + # verify the behaviour we want. + # + # Note: it would be better to use os.path.splitroot() here, but our vpython3 + # environment is currently too old for that function (it was added in 3.12). + # + # For example, assuming the cwd is 'C:/chromium/src/out/Debug', + # |expected_abspath| should evaluate to + # (f'{builder_ok.android_output_tmp_dir}/chromium/src/out/Debug/relative/' + # 'path.zip'). + original_abspath = os.path.abspath( + 'relative/path.zip' + ) # eg, 'C:/chromium/src/out/Debug/relative/path.zip' + (_, tail) = os.path.splitdrive( + original_abspath) # eg, '/chromium/src/out/Debug/relative/path.zip' + expected_abspath = os.path.join(builder_ok.android_output_tmp_dir.name, + tail[1:]) + self.assertEqual(builder_ok.GetTempAndroidOutputPath('relative/path.zip'), + expected_abspath) + + # similar, but ensures that '..' elements work in relative paths. + # + # again assuming the cwd is '/chromium/src/out/Debug', + # |expected_abspath| should evaluate to + # f'{builder_ok.android_output_tmp_dir}/chromium/src/relative/path.zip'. + # + # eg, '/chromium/src/relative/path.zip' (derived from + # 'chromium/src/out/Debug/../../relative/path.zip') + original_abspath = os.path.abspath('../../relative/path.zip') + (_, tail) = os.path.splitdrive( + original_abspath) # eg, '/chromium/src/relative/path.zip' + expected_abspath = os.path.join(builder_ok.android_output_tmp_dir.name, + tail[1:]) + self.assertEqual( + builder_ok.GetTempAndroidOutputPath('../../relative/path.zip'), + expected_abspath) + def _verifyAllowlistedOutput(self, filename, allowlisted_ids,
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml index 50f1eba..b50aecb1 100644 --- a/tools/metrics/actions/actions.xml +++ b/tools/metrics/actions/actions.xml
@@ -13095,6 +13095,15 @@ <description>User triggered the hotword by saying 'Ok Google'.</description> </action> +<action name="HttpsOnlyModeInterstitial.OpenAdvancedProtectionSettings"> + <owner>pkotwicz@chromium.org</owner> + <owner>chrome-counter-abuse-alerts@google.com</owner> + <description> + User exits HTTPS-only-mode-interstitial by clicking open-advanced-protection + link on the interstitial. + </description> +</action> + <action name="HubSearch.KeyboardEnterPressed"> <owner>wylieb@google.com</owner> <owner>bjfong@google.com</owner>
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 0960d9f..5f246c1 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -2700,6 +2700,7 @@ <int value="134" label="Revoked disruptive notification permissions"/> <int value="135" label="Local network access"/> <int value="136" label="On-device languages downloaded by site"/> + <int value="137" label="Translator API languages initialized by site"/> </enum> <!-- LINT.ThenChange(//components/content_settings/core/browser/content_settings_uma_util.cc:kHistogramValue) -->
diff --git a/tools/metrics/histograms/metadata/ai/enums.xml b/tools/metrics/histograms/metadata/ai/enums.xml index 4da8158..4f2d520a9 100644 --- a/tools/metrics/histograms/metadata/ai/enums.xml +++ b/tools/metrics/histograms/metadata/ai/enums.xml
@@ -48,6 +48,9 @@ <int value="16" label="ai.summarizer.create"/> <int value="17" label="ai.summarizer.destroy"/> <int value="18" label="ai.assistant.countPromptTokens"/> + <int value="19" label="AIProofreader.proofread"/> + <int value="20" label="AIProofreader.create"/> + <int value="21" label="AIProofreader.destroy"/> </enum> <!-- LINT.ThenChange(//third_party/blink/renderer/modules/ai/ai_metrics.h:AIAPI) -->
diff --git a/tools/metrics/histograms/metadata/ai/histograms.xml b/tools/metrics/histograms/metadata/ai/histograms.xml index 727da8ef..5806ae6 100644 --- a/tools/metrics/histograms/metadata/ai/histograms.xml +++ b/tools/metrics/histograms/metadata/ai/histograms.xml
@@ -27,6 +27,7 @@ <variants name="SessionType"> <variant name="LanguageDetector" summary="AI language detector session"/> <variant name="LanguageModel" summary="AI language model session"/> + <variant name="Proofreader" summary="AI proofreader session"/> <variant name="Rewriter" summary="AI rewriter session"/> <variant name="Summarizer" summary="AI summarizer session"/> <variant name="Translator" summary="AI translator session"/>
diff --git a/tools/metrics/histograms/metadata/android/enums.xml b/tools/metrics/histograms/metadata/android/enums.xml index 4a802d6..a566906 100644 --- a/tools/metrics/histograms/metadata/android/enums.xml +++ b/tools/metrics/histograms/metadata/android/enums.xml
@@ -1589,6 +1589,11 @@ <int value="5" label="Exempted"/> </enum> +<enum name="SupportedConfigurationSwitch"> + <int value="0" label="FromSupportedToUnsupported"/> + <int value="1" label="FromUnsupportedToSupported"/> +</enum> + <enum name="SurveyDownloadResponseCodes2"> <summary> Results when download survey response is available. Used by
diff --git a/tools/metrics/histograms/metadata/android/histograms.xml b/tools/metrics/histograms/metadata/android/histograms.xml index 29545385..704cd94 100644 --- a/tools/metrics/histograms/metadata/android/histograms.xml +++ b/tools/metrics/histograms/metadata/android/histograms.xml
@@ -1943,6 +1943,19 @@ </summary> </histogram> +<histogram name="Android.EdgeToEdge.SupportedConfigurationSwitch" + enum="SupportedConfigurationSwitch" expires_after="2025-12-01"> + <owner>clhager@google.com</owner> + <owner>wenyufu@chromium.org</owner> + <owner>edge-to-edge@chromium.org</owner> + <summary> + Records when the EdgeToEdgeControllerImpl notices a change in whether + edge-to-edge is supported by the device configuration when it handles a + change in window insets. This is recorded once every time a change is + detected. + </summary> +</histogram> + <histogram name="Android.Event.ActionDown" enum="InputDeviceSource" expires_after="2025-09-14"> <owner>mvanouwerkerk@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/blink/enums.xml b/tools/metrics/histograms/metadata/blink/enums.xml index cad2fdc6..82e1e9cc 100644 --- a/tools/metrics/histograms/metadata/blink/enums.xml +++ b/tools/metrics/histograms/metadata/blink/enums.xml
@@ -6185,6 +6185,14 @@ <int value="5557" label="IntegrityPolicyInServiceWorkerResponse"/> <int value="5558" label="EditContextTextFormatUnderlineStyle"/> <int value="5559" label="EditContextTextFormatUnderlineThickness"/> + <int value="5560" label="Proofreader_IncludeCorrectionTypes"/> + <int value="5561" label="Proofreader_IncludeCorrectionExplanations"/> + <int value="5562" label="Proofreader_ExpectedInputLanguages"/> + <int value="5563" label="Proofreader_CorrectionExplanationLanguage"/> + <int value="5564" label="Proofreader_Destroy"/> + <int value="5565" label="Proofreader_Proofread"/> + <int value="5566" label="Proofreader_Availability"/> + <int value="5567" label="Proofreader_Create"/> </enum> <!-- LINT.ThenChange(//third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom:WebFeature) --> @@ -6808,7 +6816,7 @@ </enum> <enum name="ImageHasMultipleGeneratorClientIds"> - <int value="0" label="Image decode is requested by at least one client"/> + <int value="0" label="Image decode is requested bfy at least one client"/> <int value="1" label="Image decode is requested by more than one client"/> </enum>
diff --git a/tools/metrics/histograms/metadata/extensions/enums.xml b/tools/metrics/histograms/metadata/extensions/enums.xml index 35d4cdb..0f9c4e75 100644 --- a/tools/metrics/histograms/metadata/extensions/enums.xml +++ b/tools/metrics/histograms/metadata/extensions/enums.xml
@@ -2820,6 +2820,7 @@ <int value="1935" label="EXPERIMENTALACTOR_EXECUTEACTION"/> <int value="1936" label="EXPERIMENTALACTOR_STOPTASK"/> <int value="1937" label="BOOKMARKMANAGERPRIVATE_OPENINNEWTABGROUP"/> + <int value="1938" label="CONTROLLEDFRAMEINTERNAL_CONTEXTMENUSUPDATE"/> </enum> <!-- LINT.ThenChange(//extensions/browser/extension_function_histogram_value.h:HistogramValue) -->
diff --git a/tools/metrics/histograms/metadata/password/histograms.xml b/tools/metrics/histograms/metadata/password/histograms.xml index 850e748..e3ac925 100644 --- a/tools/metrics/histograms/metadata/password/histograms.xml +++ b/tools/metrics/histograms/metadata/password/histograms.xml
@@ -5016,8 +5016,8 @@ </summary> </histogram> -<histogram name="PasswordProtection.CSDCacheSizeAtHit" units="bytes" - expires_after="2026-02-23"> +<histogram name="PasswordProtection.CSDCacheSizeAtHit2" units="bytes" + expires_after="2026-05-09"> <owner>andysjlim@chromium.org</owner> <owner>chrome-counter-abuse-alerts@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/safe_browsing/enums.xml b/tools/metrics/histograms/metadata/safe_browsing/enums.xml index 394605b8..3dfbe85f 100644 --- a/tools/metrics/histograms/metadata/safe_browsing/enums.xml +++ b/tools/metrics/histograms/metadata/safe_browsing/enums.xml
@@ -171,6 +171,8 @@ <int value="2" label="EMPTY_REPORT"/> </enum> +<!-- LINT.IfChange(ClientSafeBrowsingReportType) --> + <enum name="ClientSafeBrowsingReportType"> <int value="0" label="Unknown"/> <int value="1" label="URL phishing"/> @@ -195,8 +197,12 @@ <int value="24" label="Abusive notification permission accepted"/> <int value="25" label="dangerous download auto deleted"/> <int value="26" label="dangerous download canceled on profile closure"/> + <int value="27" label="URL real-time and hash real-time discrepancy"/> + <int value="28" label="External app redirect"/> </enum> +<!-- LINT.ThenChange(//components/safe_browsing/core/common/proto/csd.proto:ClientSafeBrowsingReportType) --> + <enum name="DisplayPersistentNotificationEvents"> <int value="0" label="Request to display persistent notification"/> <int value="1" label="Finished displaying persistent notification"/>
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json index c741b1d..49aa728 100644 --- a/tools/perf/core/perfetto_binary_roller/binary_deps.json +++ b/tools/perf/core/perfetto_binary_roller/binary_deps.json
@@ -5,8 +5,8 @@ "full_remote_path": "perfetto-luci-artifacts/v50.1/linux-arm64/trace_processor_shell" }, "win": { - "hash": "412ece7bc88321398f735f622adea4d26c7810f2", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/993d41d0c39335e35fe577808e8f704e58d9dbfb/trace_processor_shell.exe" + "hash": "b3d955460721019e770ca39601f366f2cf357bff", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/f2e70843f73b1e17fea3de511344f65b4bc8ad9c/trace_processor_shell.exe" }, "linux_arm": { "hash": "99f971ca131f6d11c73f4b918099d434bdd8093c",
diff --git a/tools/utr/README.md b/tools/utr/README.md index 8583245..1f99d75 100644 --- a/tools/utr/README.md +++ b/tools/utr/README.md
@@ -30,9 +30,17 @@ builder, you can re-use the UTR command printed alongside the failure. This will re-compile & re-launch the test locally: -<!-- TODO(crbug.com/349529661): Replace with a SS of repro instructions.-->  +You can also find the corresponding UTR invocation in the "reproduction +instructions" for a test by clicking the 📄 symbol next to its result at the +top of the build page: + + + +You can also click on the same 📄 symbol next to a test suite's step further +down the build page to see the UTR invocation that will run the entire suite. + Alternatively, if you don't have a specific builder name already at hand, you can choose a relevant gardened builder on the [Chromium build console](https://build.chromium.org/) that runs the test suite @@ -46,6 +54,9 @@ - [mac14-tests](https://ci.chromium.org/ui/p/chromium/builders/ci/mac14-tests), runs basic functional test suites on Mac-14 VMs. Use `-B ci -b mac14-tests` on the UTR cmd line. +- [ios-simulator](https://ci.chromium.org/ui/p/chromium/builders/ci/ios-simulator), + runs basic functional test suites on iOS simulators hosted on Mac VMs. Use + `-B ci -b ios-simulator` on the UTR cmd line. - [android-13-x64-rel](https://ci.chromium.org/ui/p/chromium/builders/ci/android-13-x64-rel), runs basic functional test suites on Android-13 emulators on intel. Use `-B ci -b android-13-x64-rel` on the UTR cmd line. @@ -62,11 +73,18 @@ runs basic functional test suites on CrOS VMs running on intel. Use `-B ci -b chromeos-amd64-generic-rel-gtest` on the UTR cmd line. -Note that the names of the above builders may change over time and the links -may eventually break. Navigate the build console to find the current list of -running builders. +*** note +Note the following: +- The names of the above builders may change over time and the links may + eventually break. Navigate [the build console](https://build.chromium.org/) + to find the current list of running builders. +- Not all cross-compilations are supported. The UTR will flag a warning in such + cases (eg compiling a Mac test from a Linux machine). Your mileage may vary + when running the UTR from a platform that differs from the one used on the + builder. +*** -## Command-line Examples +### Command-line Examples Below are some example invocations of the UTR: @@ -160,6 +178,47 @@ See [here](../../infra/config/targets/README.md) for more info about how a builder's tests are configured in starlark. +## Tips/tricks + +### Git bisect + +If you're investigating a regression on a builder that's consistently failing, +it may help to use the UTR to bisect down to the revision that introduced the +regression. For example, +`OpticalCharacterRecognizerResultsTest.PerformOCRLargeImage` in browser_tests +started consistently failing on this builder: + + + +**1.** To bisect it, first open the build of the first red build, navigate to the +blamelist tab, and copy the revision range: + + + +**2.** Then enter those revisions into this git command. (Note: need to swap the +revs on the git command so that the known-bad rev comes first followed by the +known-good rev.) +``` +git bisect start 9743247a 41fcf2a7 +``` + +**3.** Then copy the UTR reproduction command for the failing test: + + + +**4.** And paste that into the following git command to initiate the bisect: +``` +git bisect run bash -c 'gclient sync && vpython3 tools/utr -p chromium -B ci -b "Linux Tests (dbg)(1)" -t browser_tests compile-and-test -- --gtest_filter=OpticalCharacterRecognizerResultsTest.PerformOCRLargeImage' +``` + +**5.** Given the size of the revision range, it may take some time to fully +bisect. But when it's finished, it should hopefully report the revision that +introduced the regression: + + + +**6.** Don't forget to `git bisect reset` when finished bisecting. + ## Questions/feedback If you have any usage questions or suggestions for feedback, feel free to file
diff --git a/tools/utr/docs/bisect_result.png b/tools/utr/docs/bisect_result.png new file mode 100644 index 0000000..e1a76210 --- /dev/null +++ b/tools/utr/docs/bisect_result.png Binary files differ
diff --git a/tools/utr/docs/blamelist.png b/tools/utr/docs/blamelist.png new file mode 100644 index 0000000..b7d29558 --- /dev/null +++ b/tools/utr/docs/blamelist.png Binary files differ
diff --git a/tools/utr/docs/regression_range.png b/tools/utr/docs/regression_range.png new file mode 100644 index 0000000..4fe25e93 --- /dev/null +++ b/tools/utr/docs/regression_range.png Binary files differ
diff --git a/tools/utr/docs/utr_bisect_cmd.png b/tools/utr/docs/utr_bisect_cmd.png new file mode 100644 index 0000000..e2bfb76 --- /dev/null +++ b/tools/utr/docs/utr_bisect_cmd.png Binary files differ
diff --git a/tools/utr/docs/utr_repro_instruction.png b/tools/utr/docs/utr_repro_instruction.png new file mode 100644 index 0000000..87ce217 --- /dev/null +++ b/tools/utr/docs/utr_repro_instruction.png Binary files differ
diff --git a/tools/utr/recipe.py b/tools/utr/recipe.py index 93c10bfd..59ddda6 100644 --- a/tools/utr/recipe.py +++ b/tools/utr/recipe.py
@@ -104,6 +104,7 @@ build_dir, additional_test_args=None, swarming_dimensions=None, + swarming_shards=None, reuse_task=None, skip_coverage=False, no_rbe=False, @@ -122,7 +123,8 @@ skip_prompts: If True, skip Y/N prompts for warnings. build_dir: pathlib.Path to the build dir to build in. additional_test_args: List of additional args to pass to the tests. - dimensions: List of dimensions to overwrite in the tests. + swarming_dimensions: List of dimensions to overwrite in the tests. + swarming_shards: Number of swarming shards to overrite in the tests. reuse_task: String of a swarming task to reuse. skip_coverage: If True, skip code coverage instrumentation. no_rbe: If True, disables RBE during compile. @@ -159,6 +161,8 @@ input_props['additional_test_args'] = additional_test_args if swarming_dimensions: input_props['swarming_dimensions'] = swarming_dimensions + if swarming_shards: + input_props['swarming_shards'] = swarming_shards # The recipe will overwrite this property so we have to put it preserve it # elsewhere if 'recipe' in input_props:
diff --git a/tools/utr/run.py b/tools/utr/run.py index da398d4..eb3b0117 100755 --- a/tools/utr/run.py +++ b/tools/utr/run.py
@@ -115,6 +115,14 @@ 'tests to be run. These should be in the form ' '"{key}={value}". To remove an existing dimension leave ' 'the value empty: "{key}="') + parser.add_argument( + '--shards', + type=int, + help='Shard count override to use for all swarming tests. Increasing ' + 'shard count can make a suite finish more quickly. However, this ' + 'will change the batching of test cases which may expose failures ' + 'caused by test cases that implicitly depend on running in the same ' + 'batch as others.') def add_compile_args(parser): @@ -175,10 +183,15 @@ if args.reuse_task and args.run_mode != 'test': parser.print_help() parser.error('reuse-task is only compatible with "test"') - if args.run_mode == 'compile' and args.dimensions: - parser.error( - 'Dimensions flags (-d) are only applicable to run modes that run ' - 'tests: test or compile-and-test.') + if args.run_mode == 'compile': + if args.dimensions: + parser.error( + 'Dimensions flags (-d) are only applicable to run modes that run ' + 'tests: test or compile-and-test.') + if args.shards: + parser.error( + 'Shards flag (--shards) is only applicable when running tests via ' + '"test" or "compile-and-test" run modes.') if args.dimensions and any(not re.match(r'^[^=]+=.*$', d) for d in args.dimensions): parser.error('Dimensions flags (-d) must be in the format {key}={value} or ' @@ -253,6 +266,7 @@ build_dir, additional_test_args=None if skip_test else args.additional_test_args, swarming_dimensions=args.dimensions, + swarming_shards=args.shards, reuse_task=args.reuse_task, skip_coverage=not skip_compile and args.no_coverage_instrumentation, no_rbe=not skip_compile and args.no_rbe,
diff --git a/ui/accessibility/accessibility_features.cc b/ui/accessibility/accessibility_features.cc index 36520ec..f19aef1 100644 --- a/ui/accessibility/accessibility_features.cc +++ b/ui/accessibility/accessibility_features.cc
@@ -334,6 +334,18 @@ #endif // BUILDFLAG(IS_CHROMEOS) +#if BUILDFLAG(IS_ANDROID) + +BASE_FEATURE(kAccessibilityInlineLineSeparators, + "AccessibilityInlineLineSeparators", + base::FEATURE_DISABLED_BY_DEFAULT); +bool IsAccessibilityInlineLineSeparatorsEnabled() { + return base::FeatureList::IsEnabled( + ::features::kAccessibilityInlineLineSeparators); +} + +#endif // BUILDFLAG(IS_ANDROID) + #if !BUILDFLAG(IS_ANDROID) BASE_FEATURE(kAXTreeFixing, "AXTreeFixing", base::FEATURE_DISABLED_BY_DEFAULT); bool IsAXTreeFixingEnabled() {
diff --git a/ui/accessibility/accessibility_features.h b/ui/accessibility/accessibility_features.h index 301ce75..fb2cd08 100644 --- a/ui/accessibility/accessibility_features.h +++ b/ui/accessibility/accessibility_features.h
@@ -237,6 +237,15 @@ #endif // BUILDFLAG(IS_CHROMEOS) +#if BUILDFLAG(IS_ANDROID) + +// When populating the AccessibilityNodeInfo on Android, Clank will insert Line +// Separator U+2028 characters in the text to denote soft line breaks. +AX_BASE_EXPORT BASE_DECLARE_FEATURE(kAccessibilityInlineLineSeparators); +AX_BASE_EXPORT bool IsAccessibilityInlineLineSeparatorsEnabled(); + +#endif // BUILDFLAG(IS_ANDROID) + #if !BUILDFLAG(IS_ANDROID) // Use the AXTree fixing code, which may be an assortment of different // tools/methods to fix the AXTree. This is not available on Android.
diff --git a/ui/accessibility/android/javatests/src/org/chromium/ui/accessibility/AccessibilityStateTest.java b/ui/accessibility/android/javatests/src/org/chromium/ui/accessibility/AccessibilityStateTest.java index c2e7836..de9bf76 100644 --- a/ui/accessibility/android/javatests/src/org/chromium/ui/accessibility/AccessibilityStateTest.java +++ b/ui/accessibility/android/javatests/src/org/chromium/ui/accessibility/AccessibilityStateTest.java
@@ -417,7 +417,7 @@ public static class BuilderForTests { - private Context mContext; + private final Context mContext; private String mPackageName = "com.example.google"; private String mClassName = "app.accessibility.AccessibilityService"; private int mEventTypes;
diff --git a/ui/android/java/src/org/chromium/ui/AsyncViewStub.java b/ui/android/java/src/org/chromium/ui/AsyncViewStub.java index 0efa95bc..6982d74 100644 --- a/ui/android/java/src/org/chromium/ui/AsyncViewStub.java +++ b/ui/android/java/src/org/chromium/ui/AsyncViewStub.java
@@ -34,7 +34,7 @@ private int mLayoutResource; private @Nullable View mInflatedView; - private AsyncLayoutInflater mAsyncLayoutInflater; + private final AsyncLayoutInflater mAsyncLayoutInflater; private final ObserverList<Callback<View>> mListeners = new ObserverList<>(); private boolean mOnBackground;
diff --git a/ui/android/java/src/org/chromium/ui/DeferredViewStubInflationProvider.java b/ui/android/java/src/org/chromium/ui/DeferredViewStubInflationProvider.java index 85666008..4696ef3 100644 --- a/ui/android/java/src/org/chromium/ui/DeferredViewStubInflationProvider.java +++ b/ui/android/java/src/org/chromium/ui/DeferredViewStubInflationProvider.java
@@ -19,7 +19,7 @@ @NullMarked public class DeferredViewStubInflationProvider<T extends View> implements ViewProvider<T> { private final ViewStub mViewStub; - private Promise<T> mViewPromise = new Promise<>(); + private final Promise<T> mViewPromise = new Promise<>(); @SuppressWarnings("unchecked") public DeferredViewStubInflationProvider(ViewStub viewStub) {
diff --git a/ui/android/java/src/org/chromium/ui/DropdownPopupWindow.java b/ui/android/java/src/org/chromium/ui/DropdownPopupWindow.java index 541ab6c..183b506c 100644 --- a/ui/android/java/src/org/chromium/ui/DropdownPopupWindow.java +++ b/ui/android/java/src/org/chromium/ui/DropdownPopupWindow.java
@@ -20,7 +20,7 @@ /** The dropdown popup window that decides what widget should be used for the popup. */ @NullMarked public class DropdownPopupWindow { - private DropdownPopupWindowInterface mPopup; + private final DropdownPopupWindowInterface mPopup; public DropdownPopupWindow(Context context, View anchorView) { this(context, anchorView, null);
diff --git a/ui/android/java/src/org/chromium/ui/DropdownPopupWindowImpl.java b/ui/android/java/src/org/chromium/ui/DropdownPopupWindowImpl.java index 1d39210..360beff 100644 --- a/ui/android/java/src/org/chromium/ui/DropdownPopupWindowImpl.java +++ b/ui/android/java/src/org/chromium/ui/DropdownPopupWindowImpl.java
@@ -34,14 +34,14 @@ private final View mAnchorView; private boolean mRtl; private int mInitialSelection = -1; - private OnLayoutChangeListener mLayoutChangeListener; + private final OnLayoutChangeListener mLayoutChangeListener; private @Nullable CharSequence mDescription; - private AnchoredPopupWindow mAnchoredPopupWindow; + private final AnchoredPopupWindow mAnchoredPopupWindow; @Nullable ListAdapter mAdapter; private final ListView mListView; - private Drawable mBackground; - private int mHorizontalPadding; + private final Drawable mBackground; + private final int mHorizontalPadding; public DropdownPopupWindowImpl(Context context, View anchorView) { this(context, anchorView, null);
diff --git a/ui/android/java/src/org/chromium/ui/animation/AnimationPerformanceTracker.java b/ui/android/java/src/org/chromium/ui/animation/AnimationPerformanceTracker.java index 7fbea27b..0e4a4ed 100644 --- a/ui/android/java/src/org/chromium/ui/animation/AnimationPerformanceTracker.java +++ b/ui/android/java/src/org/chromium/ui/animation/AnimationPerformanceTracker.java
@@ -18,7 +18,7 @@ public class AnimationPerformanceTracker { /** Tracks metrics about animation performance. */ public static class AnimationMetrics { - private long mStartTimeMs; + private final long mStartTimeMs; private long mLastFrameTimeMs; private long mFirstFrameTimeMs; private long mFirstFrameLatencyMs;
diff --git a/ui/android/java/src/org/chromium/ui/base/ActivityKeyboardVisibilityDelegate.java b/ui/android/java/src/org/chromium/ui/base/ActivityKeyboardVisibilityDelegate.java index 3981e51..355f0d73 100644 --- a/ui/android/java/src/org/chromium/ui/base/ActivityKeyboardVisibilityDelegate.java +++ b/ui/android/java/src/org/chromium/ui/base/ActivityKeyboardVisibilityDelegate.java
@@ -29,7 +29,7 @@ implements View.OnLayoutChangeListener { private final Callback<Integer> mOnKeyboardInsetChanged = this::onKeyboardInsetChanged; - private WeakReference<Activity> mActivity; + private final WeakReference<Activity> mActivity; private @Nullable LazyOneshotSupplier<ObservableSupplier<Integer>> mLazyKeyboardInsetSupplier; private boolean mIsKeyboardShowing; private @Nullable View mContentViewForTesting;
diff --git a/ui/android/java/src/org/chromium/ui/base/SelectFileDialog.java b/ui/android/java/src/org/chromium/ui/base/SelectFileDialog.java index dca1bf635..697d2e6 100644 --- a/ui/android/java/src/org/chromium/ui/base/SelectFileDialog.java +++ b/ui/android/java/src/org/chromium/ui/base/SelectFileDialog.java
@@ -866,9 +866,9 @@ } private class GetCameraIntentTask extends AsyncTask<@Nullable Uri> { - private Boolean mDirectToCamera; - private WindowAndroid mWindow; - private WindowAndroid.IntentCallback mCallback; + private final Boolean mDirectToCamera; + private final WindowAndroid mWindow; + private final WindowAndroid.IntentCallback mCallback; public GetCameraIntentTask( Boolean directToCamera,
diff --git a/ui/android/java/src/org/chromium/ui/base/ViewAndroidDelegate.java b/ui/android/java/src/org/chromium/ui/base/ViewAndroidDelegate.java index be4f0a4..59b49966 100644 --- a/ui/android/java/src/org/chromium/ui/base/ViewAndroidDelegate.java +++ b/ui/android/java/src/org/chromium/ui/base/ViewAndroidDelegate.java
@@ -51,14 +51,15 @@ protected ViewGroup mContainerView; // Temporary storage for use as a parameter of getLocationOnScreen(). - private int[] mTemporaryContainerLocation = new int[2]; + private final int[] mTemporaryContainerLocation = new int[2]; /** Notifies the observer when container view is updated. */ public interface ContainerViewObserver { void onUpdateContainerView(ViewGroup view); } - private ObserverList<ContainerViewObserver> mContainerViewObservers = new ObserverList<>(); + private final ObserverList<ContainerViewObserver> mContainerViewObservers = + new ObserverList<>(); /** Notifies the listener of vertical scroll direction changes. */ public interface VerticalScrollDirectionChangeListener {
diff --git a/ui/android/java/src/org/chromium/ui/base/WindowAndroid.java b/ui/android/java/src/org/chromium/ui/base/WindowAndroid.java index 7cf9236d..28ae5c89 100644 --- a/ui/android/java/src/org/chromium/ui/base/WindowAndroid.java +++ b/ui/android/java/src/org/chromium/ui/base/WindowAndroid.java
@@ -112,11 +112,11 @@ private final ImmutableWeakReference<Context> mContextRef; // We track all animations over content and provide a drawing placeholder for them. - private HashSet<Animator> mAnimationsOverContent = new HashSet<>(); + private final HashSet<Animator> mAnimationsOverContent = new HashSet<>(); private @Nullable View mAnimationPlaceholderView; /** A mechanism for observing and updating the application window's bottom inset. */ - private ApplicationViewportInsetSupplier mApplicationBottomInsetSupplier = + private final ApplicationViewportInsetSupplier mApplicationBottomInsetSupplier = new ApplicationViewportInsetSupplier(); private @Nullable AndroidPermissionDelegate mPermissionDelegate; @@ -186,7 +186,8 @@ default void onActivityDestroyed() {} } - private ObserverList<ActivityStateObserver> mActivityStateObservers = new ObserverList<>(); + private final ObserverList<ActivityStateObserver> mActivityStateObservers = + new ObserverList<>(); /** An interface to notify listeners of the changes in selection handles state. */ public interface SelectionHandlesObserver { @@ -195,7 +196,7 @@ } private boolean mSelectionHandlesActive; - private ObserverList<SelectionHandlesObserver> mSelectionHandlesObservers = + private final ObserverList<SelectionHandlesObserver> mSelectionHandlesObservers = new ObserverList<>(); private final boolean mAllowChangeRefreshRate;
diff --git a/ui/android/java/src/org/chromium/ui/dragdrop/DropDataProviderImpl.java b/ui/android/java/src/org/chromium/ui/dragdrop/DropDataProviderImpl.java index 07a66ee..26ca86e2 100644 --- a/ui/android/java/src/org/chromium/ui/dragdrop/DropDataProviderImpl.java +++ b/ui/android/java/src/org/chromium/ui/dragdrop/DropDataProviderImpl.java
@@ -109,7 +109,7 @@ private long mLastUriClearedTimestamp; private long mLastUriCreatedTimestamp; private boolean mLastUriRecorded; - private DropPipeDataWriter mDropPipeDataWriter = new DropPipeDataWriter(); + private final DropPipeDataWriter mDropPipeDataWriter = new DropPipeDataWriter(); /** Update the delayed time before clearing the image cache. */ public void setClearCachedDataIntervalMs(int milliseconds) {
diff --git a/ui/android/java/src/org/chromium/ui/listmenu/ListMenuHost.java b/ui/android/java/src/org/chromium/ui/listmenu/ListMenuHost.java index 8e7824c..8ac5f34 100644 --- a/ui/android/java/src/org/chromium/ui/listmenu/ListMenuHost.java +++ b/ui/android/java/src/org/chromium/ui/listmenu/ListMenuHost.java
@@ -59,7 +59,7 @@ private @Nullable AnchoredPopupWindow mPopupMenu; private @Nullable ListMenuDelegate mDelegate; - private ObserverList<PopupMenuShownListener> mPopupListeners = new ObserverList<>(); + private final ObserverList<PopupMenuShownListener> mPopupListeners = new ObserverList<>(); private boolean mTryToFitLargestItem; private final boolean mPositionedAtStart; private final boolean mPositionedAtEnd;
diff --git a/ui/android/java/src/org/chromium/ui/modelutil/SimpleRecyclerViewAdapter.java b/ui/android/java/src/org/chromium/ui/modelutil/SimpleRecyclerViewAdapter.java index 7795d4b9..2baa6d0 100644 --- a/ui/android/java/src/org/chromium/ui/modelutil/SimpleRecyclerViewAdapter.java +++ b/ui/android/java/src/org/chromium/ui/modelutil/SimpleRecyclerViewAdapter.java
@@ -38,7 +38,7 @@ mCurrentMcp; /** The view binder that knows how to apply a model to the view this holder owns. */ - private ViewBinder<PropertyModel, View, PropertyKey> mBinder; + private final ViewBinder<PropertyModel, View, PropertyKey> mBinder; /** A handle to the model currently held by this view holder. */ public @Nullable PropertyModel model;
diff --git a/ui/android/java/src/org/chromium/ui/permissions/ActivityAndroidPermissionDelegate.java b/ui/android/java/src/org/chromium/ui/permissions/ActivityAndroidPermissionDelegate.java index a2a1325..a30721f 100644 --- a/ui/android/java/src/org/chromium/ui/permissions/ActivityAndroidPermissionDelegate.java +++ b/ui/android/java/src/org/chromium/ui/permissions/ActivityAndroidPermissionDelegate.java
@@ -13,7 +13,7 @@ /** AndroidPermissionDelegate implementation for Activity. */ @NullMarked public class ActivityAndroidPermissionDelegate extends AndroidPermissionDelegateWithRequester { - private WeakReference<Activity> mActivity; + private final WeakReference<Activity> mActivity; public ActivityAndroidPermissionDelegate(WeakReference<Activity> activity) { mActivity = activity;
diff --git a/ui/android/java/src/org/chromium/ui/permissions/AndroidPermissionDelegateWithRequester.java b/ui/android/java/src/org/chromium/ui/permissions/AndroidPermissionDelegateWithRequester.java index b584bf9e..ab89c58 100644 --- a/ui/android/java/src/org/chromium/ui/permissions/AndroidPermissionDelegateWithRequester.java +++ b/ui/android/java/src/org/chromium/ui/permissions/AndroidPermissionDelegateWithRequester.java
@@ -26,8 +26,8 @@ */ @NullMarked public abstract class AndroidPermissionDelegateWithRequester implements AndroidPermissionDelegate { - private Handler mHandler; - private SparseArray<PermissionRequestInfo> mOutstandingPermissionRequests; + private final Handler mHandler; + private final SparseArray<PermissionRequestInfo> mOutstandingPermissionRequests; private int mNextRequestCode; // Constants used for permission request code bounding.
diff --git a/ui/android/java/src/org/chromium/ui/resources/statics/NinePatchData.java b/ui/android/java/src/org/chromium/ui/resources/statics/NinePatchData.java index c9db346..ac3d4ac 100644 --- a/ui/android/java/src/org/chromium/ui/resources/statics/NinePatchData.java +++ b/ui/android/java/src/org/chromium/ui/resources/statics/NinePatchData.java
@@ -24,7 +24,7 @@ private final int[] mDivX; private final int[] mDivY; - private Rect mAperture; + private final Rect mAperture; /** * Creates a {@link NinePatchData} that stores 9-patch metadata.
diff --git a/ui/android/java/src/org/chromium/ui/util/XrUtils.java b/ui/android/java/src/org/chromium/ui/util/XrUtils.java index 60dbaca..8f7c8da 100644 --- a/ui/android/java/src/org/chromium/ui/util/XrUtils.java +++ b/ui/android/java/src/org/chromium/ui/util/XrUtils.java
@@ -23,14 +23,10 @@ return sInstance; } - /** Set the XR device envornment for testing. */ + /** Set the XR device environment for testing. */ public static void setXrDeviceForTesting(Boolean isXrDevice) { sXrDeviceOverrideForTesting = isXrDevice; - } - - /** Reset the XR device envornment to the default value. */ - public static void resetXrDeviceForTesting() { - sXrDeviceOverrideForTesting = null; + ResettersForTesting.register(() -> sXrDeviceOverrideForTesting = null); } /** Return if the app is running on an immersive XR device. */
diff --git a/ui/android/java/src/org/chromium/ui/widget/AnchoredPopupWindow.java b/ui/android/java/src/org/chromium/ui/widget/AnchoredPopupWindow.java index a93031d..97258fe3 100644 --- a/ui/android/java/src/org/chromium/ui/widget/AnchoredPopupWindow.java +++ b/ui/android/java/src/org/chromium/ui/widget/AnchoredPopupWindow.java
@@ -208,7 +208,7 @@ // Pass through for the internal PopupWindow. This class needs to intercept these for API // purposes, but they are still useful to callers. - private ObserverList<OnDismissListener> mDismissListeners = new ObserverList<>(); + private final ObserverList<OnDismissListener> mDismissListeners = new ObserverList<>(); private @Nullable OnTouchListener mTouchListener; private @Nullable LayoutObserver mLayoutObserver;
diff --git a/ui/android/java/src/org/chromium/ui/widget/ButtonCompat.java b/ui/android/java/src/org/chromium/ui/widget/ButtonCompat.java index 07448d50..23a49cc 100644 --- a/ui/android/java/src/org/chromium/ui/widget/ButtonCompat.java +++ b/ui/android/java/src/org/chromium/ui/widget/ButtonCompat.java
@@ -43,7 +43,7 @@ */ @NullMarked public class ButtonCompat extends AppCompatButton { - private RippleBackgroundHelper mRippleBackgroundHelper; + private final RippleBackgroundHelper mRippleBackgroundHelper; /** * Constructor for programmatically creating a {@link ButtonCompat}.
diff --git a/ui/android/java/src/org/chromium/ui/widget/ChromeBulletSpan.java b/ui/android/java/src/org/chromium/ui/widget/ChromeBulletSpan.java index ba7c0b3..40d4270 100644 --- a/ui/android/java/src/org/chromium/ui/widget/ChromeBulletSpan.java +++ b/ui/android/java/src/org/chromium/ui/widget/ChromeBulletSpan.java
@@ -20,7 +20,7 @@ */ @NullMarked public class ChromeBulletSpan extends BulletSpan { - private int mXOffset; + private final int mXOffset; /** * Construts a new ChromeBuletSpan.
diff --git a/ui/android/java/src/org/chromium/ui/widget/Toast.java b/ui/android/java/src/org/chromium/ui/widget/Toast.java index a92a159..1f69689 100644 --- a/ui/android/java/src/org/chromium/ui/widget/Toast.java +++ b/ui/android/java/src/org/chromium/ui/widget/Toast.java
@@ -57,7 +57,7 @@ int NORMAL = 1; } - private android.widget.Toast mToast; + private final android.widget.Toast mToast; private @Nullable ViewGroup mSWLayout; private @ToastPriority int mPriority; private @Nullable CharSequence mText;
diff --git a/ui/android/java/src/org/chromium/ui/widget/ToastManager.java b/ui/android/java/src/org/chromium/ui/widget/ToastManager.java index 3c09bbc..03fe9813 100644 --- a/ui/android/java/src/org/chromium/ui/widget/ToastManager.java +++ b/ui/android/java/src/org/chromium/ui/widget/ToastManager.java
@@ -42,7 +42,7 @@ private final PriorityQueue<Toast> mToastQueue = new PriorityQueue<>((toast1, toast2) -> toast1.getPriority() - toast2.getPriority()); - private Handler mHandler = new Handler(Looper.getMainLooper()); + private final Handler mHandler = new Handler(Looper.getMainLooper()); // Handles toast events per SDK version. private interface ToastEvent {
diff --git a/ui/android/javatests/src/org/chromium/ui/test/util/NightModeTestUtils.java b/ui/android/javatests/src/org/chromium/ui/test/util/NightModeTestUtils.java index bb280cc..064e65a 100644 --- a/ui/android/javatests/src/org/chromium/ui/test/util/NightModeTestUtils.java +++ b/ui/android/javatests/src/org/chromium/ui/test/util/NightModeTestUtils.java
@@ -17,7 +17,7 @@ public class NightModeTestUtils { /** {@link ParameterProvider} used for parameterized test that provides the night mode state. */ public static class NightModeParams implements ParameterProvider { - private static List<ParameterSet> sNightModeParams = + private static final List<ParameterSet> sNightModeParams = Arrays.asList( new ParameterSet().value(false).name("NightModeDisabled"), new ParameterSet().value(true).name("NightModeEnabled"));
diff --git a/ui/android/javatests/src/org/chromium/ui/test/util/RenderTestRule.java b/ui/android/javatests/src/org/chromium/ui/test/util/RenderTestRule.java index 7f3ec6b..b9208161 100644 --- a/ui/android/javatests/src/org/chromium/ui/test/util/RenderTestRule.java +++ b/ui/android/javatests/src/org/chromium/ui/test/util/RenderTestRule.java
@@ -107,11 +107,11 @@ /** Prefix on the render test images that describes light/dark mode. */ private String mNightModePrefix; - private String mSkiaGoldCorpus; - private int mSkiaGoldRevision; - private String mSkiaGoldRevisionDescription; - private boolean mFailOnUnsupportedConfigs; - private String mBugComponent; + private final String mSkiaGoldCorpus; + private final int mSkiaGoldRevision; + private final String mSkiaGoldRevisionDescription; + private final boolean mFailOnUnsupportedConfigs; + private final String mBugComponent; @StringDef({ Corpus.ANDROID_RENDER_TESTS_PUBLIC,
diff --git a/ui/android/junit/src/org/chromium/ui/base/ActivityKeyboardVisibilityDelegateUnitTest.java b/ui/android/junit/src/org/chromium/ui/base/ActivityKeyboardVisibilityDelegateUnitTest.java index 9c9e6f0..3570d12 100644 --- a/ui/android/junit/src/org/chromium/ui/base/ActivityKeyboardVisibilityDelegateUnitTest.java +++ b/ui/android/junit/src/org/chromium/ui/base/ActivityKeyboardVisibilityDelegateUnitTest.java
@@ -52,7 +52,8 @@ @Captor private ArgumentCaptor<View.OnLayoutChangeListener> mOnLayoutChangeListener; private FrameLayout mRootView; - private ObservableSupplierImpl<Integer> mKeyboardInsetSupplier = new ObservableSupplierImpl<>(); + private final ObservableSupplierImpl<Integer> mKeyboardInsetSupplier = + new ObservableSupplierImpl<>(); private LazyOneshotSupplier<ObservableSupplier<Integer>> mLazyKeyboardInsetSupplier; private ActivityKeyboardVisibilityDelegate mKeyboardVisibilityDelegate;
diff --git a/ui/android/junit/src/org/chromium/ui/base/EventOffsetHandlerTest.java b/ui/android/junit/src/org/chromium/ui/base/EventOffsetHandlerTest.java index 36cfbf5..c7c5ebb 100644 --- a/ui/android/junit/src/org/chromium/ui/base/EventOffsetHandlerTest.java +++ b/ui/android/junit/src/org/chromium/ui/base/EventOffsetHandlerTest.java
@@ -22,7 +22,7 @@ @Config(manifest = Config.NONE) public class EventOffsetHandlerTest { private EventOffsetHandler mHandler; - private EventOffsetHandler.EventOffsetHandlerDelegate mDelegate = + private final EventOffsetHandler.EventOffsetHandlerDelegate mDelegate = new EventOffsetHandler.EventOffsetHandlerDelegate() { @Override public float getTop() {
diff --git a/ui/android/junit/src/org/chromium/ui/dragdrop/DragAndDropDelegateImplUnitTest.java b/ui/android/junit/src/org/chromium/ui/dragdrop/DragAndDropDelegateImplUnitTest.java index b0dc66a..cc31843f 100644 --- a/ui/android/junit/src/org/chromium/ui/dragdrop/DragAndDropDelegateImplUnitTest.java +++ b/ui/android/junit/src/org/chromium/ui/dragdrop/DragAndDropDelegateImplUnitTest.java
@@ -679,8 +679,6 @@ AccessibilityState.setIsPerformGesturesEnabledForTesting(false); Assert.assertTrue( "Drag and drop should start.", calllStartDragAndDrop(shadowImage, dropData)); - - XrUtils.resetXrDeviceForTesting(); } private boolean calllStartDragAndDrop(Bitmap shadowImage, DropDataAndroid dropData) {
diff --git a/ui/android/junit/src/org/chromium/ui/dragdrop/DragDropGlobalStateTest.java b/ui/android/junit/src/org/chromium/ui/dragdrop/DragDropGlobalStateTest.java index 36dc478a..1f1f5155 100644 --- a/ui/android/junit/src/org/chromium/ui/dragdrop/DragDropGlobalStateTest.java +++ b/ui/android/junit/src/org/chromium/ui/dragdrop/DragDropGlobalStateTest.java
@@ -14,7 +14,7 @@ import android.view.DragEvent; import android.view.View.DragShadowBuilder; -import java.util.concurrent.TimeUnit; + import org.junit.Assert; import org.junit.Before; import org.junit.Rule; @@ -27,18 +27,20 @@ import org.chromium.ui.dragdrop.DragDropGlobalState.TrackerToken; +import java.util.concurrent.TimeUnit; + @RunWith(org.chromium.base.test.BaseRobolectricTestRunner.class) public final class DragDropGlobalStateTest { private static final int INSTANCE_ID = 1; private static final int INVALID_INSTANCE_ID = -1; - private final String mText = "text"; + private static final String M_TEXT = "text"; @Rule public MockitoRule mMockitoProcessorRule = MockitoJUnit.rule(); private DropDataAndroid mDropData; private TrackerToken mToken; @Before public void setup() { - mDropData = DropDataAndroid.create(mText, null, null, null, null); + mDropData = DropDataAndroid.create(M_TEXT, null, null, null, null); } @Test @@ -50,7 +52,7 @@ DragDropGlobalState instance = DragDropGlobalState.getState(mToken); assertNotNull("Instance get should not be null", instance); assertTrue("SourceInstanceId should match.", instance.isDragSourceInstance(INSTANCE_ID)); - assertEquals("Text being dragged should match.", mText, mDropData.text); + assertEquals("Text being dragged should match.", M_TEXT, mDropData.text); // Assert release token. DragDropGlobalState.clear(mToken); @@ -69,7 +71,7 @@ DragDropGlobalState instance = DragDropGlobalState.getState(dropEvent); assertNotNull("Instance get should not be null", instance); assertTrue("SourceInstanceId should match.", instance.isDragSourceInstance(INSTANCE_ID)); - assertEquals("Text being dragged should match.", mText, mDropData.text); + assertEquals("Text being dragged should match.", M_TEXT, mDropData.text); assertTrue("Instance should still exists.", DragDropGlobalState.hasValue()); // Assert release token - no-op.
diff --git a/ui/android/junit/src/org/chromium/ui/modaldialog/ModalDialogManagerTest.java b/ui/android/junit/src/org/chromium/ui/modaldialog/ModalDialogManagerTest.java index a929154a..8ef3e63 100644 --- a/ui/android/junit/src/org/chromium/ui/modaldialog/ModalDialogManagerTest.java +++ b/ui/android/junit/src/org/chromium/ui/modaldialog/ModalDialogManagerTest.java
@@ -51,7 +51,7 @@ @Mock private ModalDialogManager.Presenter mTabModalPresenter; private ModalDialogManager mModalDialogManager; - private List<PropertyModel> mDialogModels = new ArrayList<>(); + private final List<PropertyModel> mDialogModels = new ArrayList<>(); @Mock private ModalDialogManagerObserver mObserver;
diff --git a/ui/android/junit/src/org/chromium/ui/modelutil/ModelListAdapterTest.java b/ui/android/junit/src/org/chromium/ui/modelutil/ModelListAdapterTest.java index eba3d9d..a0d921e 100644 --- a/ui/android/junit/src/org/chromium/ui/modelutil/ModelListAdapterTest.java +++ b/ui/android/junit/src/org/chromium/ui/modelutil/ModelListAdapterTest.java
@@ -67,7 +67,7 @@ } private static class TestObject { - private String mId; + private final String mId; public TestObject(String id) { mId = id;
diff --git a/ui/android/junit/src/org/chromium/ui/modelutil/SimpleListObservableTest.java b/ui/android/junit/src/org/chromium/ui/modelutil/SimpleListObservableTest.java index ff2e810a..ea632c1 100644 --- a/ui/android/junit/src/org/chromium/ui/modelutil/SimpleListObservableTest.java +++ b/ui/android/junit/src/org/chromium/ui/modelutil/SimpleListObservableTest.java
@@ -29,7 +29,7 @@ public class SimpleListObservableTest { @Mock private ListObserver<Integer> mObserver; - private ListModelBase<Integer, Integer> mIntegerList = new ListModelBase<>(); + private final ListModelBase<Integer, Integer> mIntegerList = new ListModelBase<>(); @Before public void setUp() {
diff --git a/ui/android/junit/src/org/chromium/ui/util/XrUtilsTest.java b/ui/android/junit/src/org/chromium/ui/util/XrUtilsTest.java index 4ac72ba..c6a3b94 100644 --- a/ui/android/junit/src/org/chromium/ui/util/XrUtilsTest.java +++ b/ui/android/junit/src/org/chromium/ui/util/XrUtilsTest.java
@@ -10,7 +10,6 @@ import android.os.Build.VERSION_CODES; -import org.junit.Before; import org.junit.Test; import org.junit.runner.RunWith; import org.robolectric.annotation.Config; @@ -22,12 +21,6 @@ @Config(sdk = VERSION_CODES.UPSIDE_DOWN_CAKE) public class XrUtilsTest { - /** Resets the environment before each test. */ - @Before - public void beforeTest() { - XrUtils.resetXrDeviceForTesting(); - } - @Test public void getInstanceTest_notNull() { // Verify test the instance is created.
diff --git a/ui/base/prediction/linear_resampling.cc b/ui/base/prediction/linear_resampling.cc index 3a26429..2658827 100644 --- a/ui/base/prediction/linear_resampling.cc +++ b/ui/base/prediction/linear_resampling.cc
@@ -9,6 +9,7 @@ #include "base/feature_list.h" #include "base/metrics/field_trial_params.h" #include "base/strings/string_number_conversions.h" +#include "base/trace_event/trace_event.h" #include "ui/base/ui_base_features.h" namespace ui { @@ -125,12 +126,16 @@ std::string prediction_type = GetFieldTrialParamValueByFeature( ::features::kResamplingScrollEventsExperimentalPrediction, "mode"); + std::string latency_value = GetFieldTrialParamValueByFeature( + ::features::kResamplingScrollEventsExperimentalPrediction, "latency"); + + TRACE_EVENT2("ui", "LatencyCalculator::CalculateLatency", "prediction_type", + prediction_type, "latency_value", latency_value); + if (prediction_type != ::features::kPredictionTypeTimeBased && prediction_type != ::features::kPredictionTypeFramesBased) return kResampleLatency; - std::string latency_value = GetFieldTrialParamValueByFeature( - ::features::kResamplingScrollEventsExperimentalPrediction, "latency"); double latency; if (base::StringToDouble(latency_value, &latency)) { return prediction_type == ::features::kPredictionTypeTimeBased
diff --git a/ui/base/ui_base_features.cc b/ui/base/ui_base_features.cc index 3f35ae4..670f671 100644 --- a/ui/base/ui_base_features.cc +++ b/ui/base/ui_base_features.cc
@@ -367,7 +367,9 @@ const char kPredictionTypeTimeBased[] = "time"; const char kPredictionTypeFramesBased[] = "frames"; const char kPredictionTypeDefaultTime[] = "3.3"; -const char kPredictionTypeDefaultFramesRatio[] = "0.5"; +const char kPredictionTypeDefaultFramesVariation1[] = "0.25"; +const char kPredictionTypeDefaultFramesVariation2[] = "0.375"; +const char kPredictionTypeDefaultFramesVariation3[] = "0.5"; BASE_FEATURE(kSwipeToMoveCursor, "SwipeToMoveCursor",
diff --git a/ui/base/ui_base_features.h b/ui/base/ui_base_features.h index 2c8943f6..fc6cf39 100644 --- a/ui/base/ui_base_features.h +++ b/ui/base/ui_base_features.h
@@ -170,7 +170,11 @@ COMPONENT_EXPORT(UI_BASE_FEATURES) extern const char kPredictionTypeDefaultTime[]; COMPONENT_EXPORT(UI_BASE_FEATURES) -extern const char kPredictionTypeDefaultFramesRatio[]; +extern const char kPredictionTypeDefaultFramesVariation1[]; +COMPONENT_EXPORT(UI_BASE_FEATURES) +extern const char kPredictionTypeDefaultFramesVariation2[]; +COMPONENT_EXPORT(UI_BASE_FEATURES) +extern const char kPredictionTypeDefaultFramesVariation3[]; // The type of filter to use for filtering events. These values are used as the // 'filter' feature param for |blink::features::kFilteringScrollPrediction|.
diff --git a/ui/gl/dcomp_presenter_unittest.cc b/ui/gl/dcomp_presenter_unittest.cc index 9cc0227..eb02b445 100644 --- a/ui/gl/dcomp_presenter_unittest.cc +++ b/ui/gl/dcomp_presenter_unittest.cc
@@ -53,6 +53,30 @@ #include "ui/platform_window/platform_window_delegate.h" #include "ui/platform_window/win/win_window.h" +namespace gfx { +// Used by gtest to print expectation values. +void PrintTo(const SwapResult& swap_result, ::std::ostream* os) { + switch (swap_result) { + case SwapResult::SWAP_ACK: + *os << "SWAP_ACK"; + return; + case SwapResult::SWAP_FAILED: + *os << "SWAP_FAILED"; + return; + case SwapResult::SWAP_SKIPPED: + *os << "SWAP_SKIPPED"; + return; + case SwapResult::SWAP_NAK_RECREATE_BUFFERS: + *os << "SWAP_NAK_RECREATE_BUFFERS"; + return; + case SwapResult::SWAP_NON_SIMPLE_OVERLAYS_FAILED: + *os << "SWAP_NON_SIMPLE_OVERLAYS_FAILED"; + return; + } + NOTREACHED(); +} +} // namespace gfx + namespace gl { namespace { @@ -317,22 +341,26 @@ ScheduleOverlay(std::move(params)); } - // Wait for |presenter_| to present asynchronously check the swap result. - void PresentAndCheckSwapResult(gfx::SwapResult expected_swap_result) { + // Wait for `presenter_` to present asynchronously and return the swap result. + gfx::SwapResult PresentAndGetSwapResult() { presenter_->ScheduleDCLayers(std::move(pending_overlays_)); + std::optional<gfx::SwapResult> result; + base::RunLoop wait_for_present; presenter_->Present( base::BindOnce( [](base::RepeatingClosure quit_closure, - gfx::SwapResult expected_swap_result, + std::optional<gfx::SwapResult>* out_result, gfx::SwapCompletionResult result) { - EXPECT_EQ(expected_swap_result, result.swap_result); + *out_result = result.swap_result; quit_closure.Run(); }, - wait_for_present.QuitClosure(), expected_swap_result), + wait_for_present.QuitClosure(), base::Unretained(&result)), base::DoNothing(), gfx::FrameData()); wait_for_present.Run(); + + return result.value(); } void EnableFeature(const base::test::FeatureRef& feature) { @@ -395,7 +423,7 @@ gfx::OverlayLayerId::MakeForTesting(0)); ASSERT_FALSE(swap_chain); - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); swap_chain = presenter_->GetLayerSwapChainForTesting( gfx::OverlayLayerId::MakeForTesting(0)); @@ -418,7 +446,7 @@ ScheduleOverlay(std::move(params)); } - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); Microsoft::WRL::ComPtr<IDXGISwapChain1> swap_chain2 = presenter_->GetLayerSwapChainForTesting( @@ -443,7 +471,7 @@ ScheduleOverlay(std::move(params)); } - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); Microsoft::WRL::ComPtr<IDXGISwapChain1> swap_chain3 = presenter_->GetLayerSwapChainForTesting( @@ -481,7 +509,7 @@ ScheduleOverlay(std::move(params)); } - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); Microsoft::WRL::ComPtr<IDXGISwapChain1> swap_chain = presenter_->GetLayerSwapChainForTesting( gfx::OverlayLayerId::MakeForTesting(0)); @@ -496,7 +524,7 @@ // Clear SwapChainPresenters // Must do Clear first because the swap chain won't resize immediately if // a new size is given unless this is the very first time after Clear. - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); // The input texture size is bigger than the window size. quad_rect = gfx::Rect(32, 48); @@ -510,7 +538,7 @@ ScheduleOverlay(std::move(params)); } - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); Microsoft::WRL::ComPtr<IDXGISwapChain1> swap_chain2 = presenter_->GetLayerSwapChainForTesting( @@ -545,7 +573,7 @@ ScheduleOverlay(std::move(params)); } - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); Microsoft::WRL::ComPtr<IDXGISwapChain1> swap_chain = presenter_->GetLayerSwapChainForTesting( gfx::OverlayLayerId::MakeForTesting(0)); @@ -569,7 +597,7 @@ ScheduleOverlay(std::move(params)); } - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); Microsoft::WRL::ComPtr<IDXGISwapChain1> swap_chain2 = presenter_->GetLayerSwapChainForTesting( @@ -604,7 +632,7 @@ params.video_params.protected_video_type = gfx::ProtectedVideoType::kClear; ScheduleOverlay(std::move(params)); - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); Microsoft::WRL::ComPtr<IDXGISwapChain1> swap_chain = presenter_->GetLayerSwapChainForTesting( gfx::OverlayLayerId::MakeForTesting(0)); @@ -629,7 +657,7 @@ gfx::ProtectedVideoType::kSoftwareProtected; ScheduleOverlay(std::move(params)); - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); Microsoft::WRL::ComPtr<IDXGISwapChain1> swap_chain = presenter_->GetLayerSwapChainForTesting( gfx::OverlayLayerId::MakeForTesting(0)); @@ -658,7 +686,7 @@ root_surface.layer_id = gfx::OverlayLayerId::MakeForTesting(1); ScheduleOverlay(std::move(root_surface)); - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); const DCLayerTree* layer_tree = presenter_->GetLayerTreeForTesting(); EXPECT_EQ(1u, layer_tree->GetDcompLayerCountForTesting()); @@ -691,14 +719,14 @@ params.layer_id = gfx::OverlayLayerId::MakeForTesting(i); ScheduleOverlay(std::move(params)); } - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); EXPECT_EQ(num_buffers, layer_tree->GetNumSurfacesInPoolForTesting()); } // We expect retained surfaces even after we present a frame with no solid // color overlays. { - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); EXPECT_EQ(std::min(num_buffers, kMaxSolidColorBuffers), layer_tree->GetNumSurfacesInPoolForTesting()); } @@ -727,7 +755,7 @@ ScheduleOverlay(std::move(params)); } - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); EXPECT_EQ(2u, layer_tree->GetNumSurfacesInPoolForTesting()); surfaces_frame1[0] = layer_tree->GetBackgroundColorSurfaceForTesting( @@ -753,7 +781,7 @@ ScheduleOverlay(std::move(params)); } - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); EXPECT_EQ(2u, layer_tree->GetNumSurfacesInPoolForTesting()); surfaces_frame2[0] = layer_tree->GetBackgroundColorSurfaceForTesting( @@ -826,7 +854,7 @@ ScheduleOverlay(std::move(params)); } - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); DCLayerTree* dcLayerTree = presenter_->GetLayerTreeForTesting(); @@ -860,7 +888,7 @@ ScheduleOverlay(std::move(params)); } - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); EXPECT_EQ(2u, dcLayerTree->GetDcompLayerCountForTesting()); // Verify that the visuals are reused from the previous frame but attached // to the root visual in a reversed order. @@ -971,7 +999,7 @@ ScheduleOverlay(CreateOverlayWithSwapChain(swap_chainE, swap_chain_size, 5)); ScheduleOverlay(CreateOverlayWithSwapChain(swap_chainF, swap_chain_size, 6)); - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); DCLayerTree* dc_layer_tree = presenter_->GetLayerTreeForTesting(); @@ -1022,7 +1050,7 @@ ScheduleOverlay(CreateOverlayWithSwapChain(swap_chainC, swap_chain_size, 4)); ScheduleOverlay(CreateOverlayWithSwapChain(swap_chainM, swap_chain_size, 5)); - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); EXPECT_EQ(6u, dc_layer_tree->GetDcompLayerCountForTesting()); @@ -1115,7 +1143,7 @@ EXPECT_FALSE(presenter_->GetLayerSwapChainForTesting( gfx::OverlayLayerId::MakeForTesting(1))); - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); auto ExpectSwapChainAndMaintainsAspectRatio = [&](gfx::OverlayLayerId id, gfx::SizeF expected_size) { @@ -1197,7 +1225,7 @@ params.video_params.is_p010_content = is_p010; ScheduleOverlay(std::move(params)); - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); Sleep(1000); } @@ -1235,7 +1263,7 @@ } ScheduleOverlay(std::move(dc_layer_params)); - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); SkBitmap pixels = GLTestHelper::ReadBackWindow(window_.hwnd(), window_size); @@ -1295,7 +1323,7 @@ ScheduleOverlay(std::move(fit_in_hole_overlay)); - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); auto pixels = GLTestHelper::ReadBackWindow(window_.hwnd(), window_size); @@ -1447,7 +1475,7 @@ ScheduleOverlay(std::move(params)); } - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); // Scaling up the swapchain with the same image should cause it to be // transformed again, but not presented again. @@ -1460,7 +1488,7 @@ ScheduleOverlay(std::move(params)); } - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); Sleep(1000); if (check_color) { @@ -1524,7 +1552,7 @@ params.layer_id = gfx::OverlayLayerId::MakeForTesting(0); ScheduleOverlay(std::move(params)); - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); Sleep(1000); SkColor expected_color = SkColorSetRGB(0xff, 0xb7, 0xff); @@ -1593,7 +1621,7 @@ params.layer_id = gfx::OverlayLayerId::MakeForTesting(0); ScheduleOverlay(std::move(params)); - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); Sleep(1000); @@ -1821,7 +1849,7 @@ params.video_params.color_space = gfx::ColorSpace::CreateREC709(); ScheduleOverlay(std::move(params)); - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); } Microsoft::WRL::ComPtr<IDXGISwapChain1> swap_chain = @@ -1845,7 +1873,7 @@ params.video_params.color_space = gfx::ColorSpace::CreateREC709(); ScheduleOverlay(std::move(params)); - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); } swap_chain = presenter_->GetLayerSwapChainForTesting( gfx::OverlayLayerId::MakeForTesting(0)); @@ -1871,7 +1899,7 @@ params.video_params.color_space = gfx::ColorSpace::CreateREC709(); ScheduleOverlay(std::move(params)); - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); } // Swap chain is set to monitor/onscreen size. @@ -1903,7 +1931,7 @@ params.video_params.color_space = gfx::ColorSpace::CreateREC709(); ScheduleOverlay(std::move(params)); - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); } // Swap chain is set to monitor size (100, 100). @@ -1951,7 +1979,7 @@ dc_layer_params.layer_id = gfx::OverlayLayerId::MakeForTesting(0); ScheduleOverlay(std::move(dc_layer_params)); - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); SkColor expected_color = SK_ColorRED; EXPECT_SKCOLOR_CLOSE( @@ -1971,7 +1999,7 @@ dc_layer_params.layer_id = gfx::OverlayLayerId::MakeForTesting(0); ScheduleOverlay(std::move(dc_layer_params)); - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); SkColor expected_color = SK_ColorGREEN; EXPECT_SKCOLOR_CLOSE( @@ -1994,7 +2022,7 @@ dc_layer_params.layer_id = gfx::OverlayLayerId::MakeForTesting(0); ScheduleOverlay(std::move(dc_layer_params)); - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); SkColor expected_color = SK_ColorRED; EXPECT_SKCOLOR_CLOSE( @@ -2014,7 +2042,7 @@ dc_layer_params.layer_id = gfx::OverlayLayerId::MakeForTesting(0); ScheduleOverlay(std::move(dc_layer_params)); - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); SkColor expected_color = SK_ColorRED; EXPECT_SKCOLOR_CLOSE( @@ -2046,7 +2074,7 @@ dc_layer_params.layer_id = gfx::OverlayLayerId::MakeForTesting(0); ScheduleOverlay(std::move(dc_layer_params)); - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); // We expect DComp to display the overlay with the same bounds as if viz were // to composite it. @@ -2197,7 +2225,7 @@ params.layer_id = gfx::OverlayLayerId::MakeForTesting(0); ScheduleOverlay(std::move(params)); - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); EXPECT_SKCOLOR_EQ(color.toSkColor(), GLTestHelper::ReadBackWindowPixel( window_.hwnd(), gfx::Point(0, 0))); @@ -2316,7 +2344,7 @@ } capture_names_in_test_.insert(capture_name); - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); SkBitmap window_readback = GLTestHelper::ReadBackWindow(window_.hwnd(), window_size_); @@ -3259,7 +3287,7 @@ params.video_params.color_space = gfx::ColorSpace::CreateREC709(); ScheduleOverlay(std::move(params)); - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); auto swap_chain = presenter_->GetLayerSwapChainForTesting( gfx::OverlayLayerId::MakeForTesting(0)); @@ -3484,7 +3512,7 @@ dc_layer_params.layer_id = gfx::OverlayLayerId::MakeForTesting(0); dc_layer_params.video_params.possible_video_fullscreen_letterboxing = true; ScheduleOverlay(std::move(dc_layer_params)); - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); } if (std::get<0>(GetParam()).use_letterbox_video_optimization) { @@ -3513,7 +3541,7 @@ dc_layer_params.layer_id = gfx::OverlayLayerId::MakeForTesting(0); dc_layer_params.video_params.possible_video_fullscreen_letterboxing = true; ScheduleOverlay(std::move(dc_layer_params)); - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); } if (std::get<0>(GetParam()).use_letterbox_video_optimization) { @@ -3542,7 +3570,7 @@ dc_layer_params.layer_id = gfx::OverlayLayerId::MakeForTesting(0); dc_layer_params.video_params.possible_video_fullscreen_letterboxing = true; ScheduleOverlay(std::move(dc_layer_params)); - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); } if (std::get<0>(GetParam()).use_letterbox_video_optimization) { @@ -3588,7 +3616,7 @@ dc_layer_params.layer_id = gfx::OverlayLayerId::MakeForTesting(0); dc_layer_params.video_params.possible_video_fullscreen_letterboxing = true; ScheduleOverlay(std::move(dc_layer_params)); - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); } if (std::get<0>(GetParam()).use_letterbox_video_optimization) { @@ -3637,7 +3665,7 @@ dc_layer_params.layer_id = gfx::OverlayLayerId::MakeForTesting(0); dc_layer_params.video_params.possible_video_fullscreen_letterboxing = true; ScheduleOverlay(std::move(dc_layer_params)); - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); } Microsoft::WRL::ComPtr<IDXGISwapChain1> swap_chain; @@ -3684,7 +3712,7 @@ dc_layer_params.video_params.possible_video_fullscreen_letterboxing = true; ScheduleOverlay(std::move(dc_layer_params)); - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); } // It's the same image, so it should have the same swapchain. @@ -3731,7 +3759,7 @@ dc_layer_params.video_params.possible_video_fullscreen_letterboxing = true; ScheduleOverlay(std::move(dc_layer_params)); - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); } Microsoft::WRL::ComPtr<IDXGISwapChain1> swap_chain3 = presenter_->GetLayerSwapChainForTesting( @@ -3786,7 +3814,7 @@ dc_layer_params.layer_id = gfx::OverlayLayerId::MakeForTesting(0); dc_layer_params.video_params.possible_video_fullscreen_letterboxing = true; ScheduleOverlay(std::move(dc_layer_params)); - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); } if (std::get<0>(GetParam()).use_letterbox_video_optimization) { @@ -3816,7 +3844,7 @@ dc_layer_params.layer_id = gfx::OverlayLayerId::MakeForTesting(0); dc_layer_params.video_params.possible_video_fullscreen_letterboxing = true; ScheduleOverlay(std::move(dc_layer_params)); - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); } if (std::get<0>(GetParam()).use_letterbox_video_optimization) { @@ -3846,7 +3874,7 @@ dc_layer_params.layer_id = gfx::OverlayLayerId::MakeForTesting(0); dc_layer_params.video_params.possible_video_fullscreen_letterboxing = true; ScheduleOverlay(std::move(dc_layer_params)); - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); } if (std::get<0>(GetParam()).use_letterbox_video_optimization) { @@ -3892,7 +3920,7 @@ dc_layer_params.layer_id = gfx::OverlayLayerId::MakeForTesting(0); dc_layer_params.video_params.possible_video_fullscreen_letterboxing = true; ScheduleOverlay(std::move(dc_layer_params)); - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); } if (std::get<0>(GetParam()).use_letterbox_video_optimization) { @@ -3989,7 +4017,7 @@ dc_layer_params.video_params.possible_video_fullscreen_letterboxing = true; ScheduleOverlay(std::move(dc_layer_params)); - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); } // DComp visual is clipped to the whole monitor size. @@ -4079,7 +4107,7 @@ dc_layer_params.video_params.possible_video_fullscreen_letterboxing = true; ScheduleOverlay(std::move(dc_layer_params)); - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); } // DComp visual is clipped to the whole monitor size. @@ -4164,7 +4192,7 @@ dc_layer_params.video_params.possible_video_fullscreen_letterboxing = true; ScheduleOverlay(std::move(dc_layer_params)); - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); } gfx::Transform visual_transform; @@ -4222,7 +4250,7 @@ dc_layer_params.layer_id = gfx::OverlayLayerId::MakeForTesting(0); ScheduleOverlay(std::move(dc_layer_params)); - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); } // Swap chain size is set to onscreen content size. @@ -4305,7 +4333,7 @@ dc_layer_params.layer_id = gfx::OverlayLayerId::MakeForTesting(0); ScheduleOverlay(std::move(dc_layer_params)); - PresentAndCheckSwapResult(gfx::SwapResult::SWAP_ACK); + ASSERT_EQ(PresentAndGetSwapResult(), gfx::SwapResult::SWAP_ACK); } // Swap chain size is set to onscreen content size.
diff --git a/ui/views/controls/webview/web_contents_set_background_color.h b/ui/views/controls/webview/web_contents_set_background_color.h index da0d573f..255b8373 100644 --- a/ui/views/controls/webview/web_contents_set_background_color.h +++ b/ui/views/controls/webview/web_contents_set_background_color.h
@@ -5,12 +5,14 @@ #ifndef UI_VIEWS_CONTROLS_WEBVIEW_WEB_CONTENTS_SET_BACKGROUND_COLOR_H_ #define UI_VIEWS_CONTROLS_WEBVIEW_WEB_CONTENTS_SET_BACKGROUND_COLOR_H_ +#include <stdint.h> + #include "content/public/browser/web_contents_observer.h" #include "content/public/browser/web_contents_user_data.h" #include "ui/views/controls/webview/webview_export.h" // Defined in SkColor.h (32-bit ARGB color). -using SkColor = unsigned int; +using SkColor = uint32_t; namespace views {
diff --git a/url/android/java/src/org/chromium/url/GURL.java b/url/android/java/src/org/chromium/url/GURL.java index 82b5f21..7f2ff68 100644 --- a/url/android/java/src/org/chromium/url/GURL.java +++ b/url/android/java/src/org/chromium/url/GURL.java
@@ -75,7 +75,7 @@ private Parsed mParsed; private static class Holder { - private static GURL sEmptyGURL = new GURL(""); + private static final GURL sEmptyGURL = new GURL(""); } @CalledByNative
diff --git a/v8 b/v8 index d1a3ead..577adbe 160000 --- a/v8 +++ b/v8
@@ -1 +1 @@ -Subproject commit d1a3ead4abb24b456a6ba3b7d098299d111c4d38 +Subproject commit 577adbe0c15f8fa0643d5f91cc92a06c271c3456