diff --git a/DEPS b/DEPS index 12842f2..aa8d772 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': '1352cfbc23726d06daa6dc8320c8eea7da7ce099', + 'src_internal_revision': '0e4d05ade90a328d85fdf0516544ba6491b6ec35', # 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': 'dc1958e7118c351cef5adae548337f7f11746b95', + 'skia_revision': '6d29cd66e2059acd5491a733c2c7dfd3c4f8b2f6', # 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': 'ad9041e4d0f760e0c1c87d79a60b9ff1d2c77f96', + 'v8_revision': '06588c16dc5fb1d32c50f884015b90e327dd444c', # 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': '94ee620d2e2f771d350e14ca90804bf1457834d3', + 'angle_revision': 'dfefcbc68cc3627e6cd80c83ce67815fb5b6efd9', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. @@ -319,7 +319,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling BoringSSL # and whatever else without interference from each other. - 'boringssl_revision': '5622da92e1e7bacb5d0785ff5650a5a23b143b84', + 'boringssl_revision': '45f35e007cf55285581fae079b721c63922871b9', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling Fuchsia sdk # 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': '9e57472d991ef17726931163fb943277e372421e', + 'catapult_revision': '43e5bb872890d0b7038c81744e169c9e0edd8013', # 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': '668292f6e38a78c16e1877c6e9919716bd7da04d', + 'devtools_frontend_revision': '576cf523f65f423424a2991c4c7983bf87d05348', # 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. @@ -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': 'e96ebef1d3b0e109109f1c108e5d9f4c773bd281', + 'nearby_revision': 'fff5c22e3178a633f57e4ad1fb5ad96a6116240a', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling securemessage # and whatever else without interference from each other. @@ -515,11 +515,11 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling webpagereplay # and whatever else without interference from each other. - 'webpagereplay_revision': '18172a359f6dab8e3f70b6c5c8c7c55d3e97537a', + 'webpagereplay_revision': 'e463cb47fd355a21463d0f567ee78c0316e198d6', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling llvm-libc # and whatever else without interference from each other. - 'llvm_libc_revision': 'a2f7b489cd4fecf856eb3739cc5a341545022896', + 'llvm_libc_revision': 'ced017335267492f948279508b4c60681eddf1b8', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling llvm-libc # and whatever else without interference from each other. @@ -1521,7 +1521,7 @@ 'src/clank': { 'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' + - '36c23c84ecbd0d6f2633e7aae5f64cf4245061c4', + '1dace63d589c82eb30da99b3579c15199e4d0c69', 'condition': 'checkout_android and checkout_src_internal', }, @@ -1986,7 +1986,7 @@ # Tools used when building Chrome for Chrome OS. This affects both the Simple # Chrome workflow, as well as the chromeos-chrome ebuild. 'src/third_party/chromite': { - 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'be7db7a8cb09acf9cb9467be836b9569777baba6', + 'url': Var('chromium_git') + '/chromiumos/chromite.git' + '@' + 'd6db0868fc4ae3f19fd9d9ee4a4dfd6f0c88b078', 'condition': 'checkout_chromeos', }, @@ -2296,7 +2296,7 @@ Var('chromium_git') + '/external/libaddressinput.git' + '@' + '2610f7b1043d6784ada41392fc9392d1ea09ea07', 'src/third_party/libaom/source/libaom': - Var('aomedia_git') + '/aom.git' + '@' + '3304ee478e7e8e41da2d9f96e5c5fc9b1e5bb043', + Var('aomedia_git') + '/aom.git' + '@' + '6c4010bde34318fd6c1f0d10196f27ac9908eeb8', 'src/third_party/crabbyavif/src': Var('chromium_git') + '/external/github.com/webmproject/CrabbyAvif.git' + '@' + Var('crabbyavif_revision'), @@ -2559,7 +2559,7 @@ Var('pdfium_git') + '/pdfium.git' + '@' + Var('pdfium_revision'), 'src/third_party/perfetto': - Var('chromium_git') + '/external/github.com/google/perfetto.git' + '@' + '167e1f0dab2691a4b2a911e001317353405d83d9', + Var('chromium_git') + '/external/github.com/google/perfetto.git' + '@' + '891351c7233523c01dc0e58ac8650df47fad9ab5', 'src/base/tracing/test/data': { 'bucket': 'perfetto', @@ -2878,16 +2878,16 @@ 'dep_type': 'cipd', }, - 'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@3395378f6990e79066b5f1647f6f8ac5de07e26d', + 'src/third_party/vulkan-deps': '{chromium_git}/vulkan-deps@8d1a39bd39e47a078f784e038d4561d2cfdc5f21', 'src/third_party/glslang/src': '{chromium_git}/external/github.com/KhronosGroup/glslang@05cfcc1613c28c1274036f53616d66324f7cd383', 'src/third_party/spirv-cross/src': '{chromium_git}/external/github.com/KhronosGroup/SPIRV-Cross@b8fcf307f1f347089e3c46eb4451d27f32ebc8d3', 'src/third_party/spirv-headers/src': '{chromium_git}/external/github.com/KhronosGroup/SPIRV-Headers@50daff941d88609b4d2ad076eae558e727f8e5cd', 'src/third_party/spirv-tools/src': '{chromium_git}/external/github.com/KhronosGroup/SPIRV-Tools@dec28643ed15f68a2bc95650de25e0a7486b564c', 'src/third_party/vulkan-headers/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Headers@b39ab380a44b6c8df462c34e976ea9ce2d2c336b', - 'src/third_party/vulkan-loader/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Loader@22c0f133e6675f9313c12fb5e58337f8fa9b9195', + 'src/third_party/vulkan-loader/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Loader@7ef1581a996ba3ac58ae739fd7bfcf24d3bf2a57', 'src/third_party/vulkan-tools/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Tools@d671923090e4dc74c0ebdb10c6e09fa0826e1fe9', 'src/third_party/vulkan-utility-libraries/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-Utility-Libraries@54c9baf20802a13279e23fa4cb0528dd5cf16064', - 'src/third_party/vulkan-validation-layers/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-ValidationLayers@3fa19fccc75171a6b607f95510c37739c606b809', + 'src/third_party/vulkan-validation-layers/src': '{chromium_git}/external/github.com/KhronosGroup/Vulkan-ValidationLayers@1c9f8202b87119b23c81dad7f44cba2b8bc79180', 'src/third_party/vulkan_memory_allocator': Var('chromium_git') + '/external/github.com/GPUOpen-LibrariesAndSDKs/VulkanMemoryAllocator.git' + '@' + '56300b29fbfcc693ee6609ddad3fdd5b7a449a21', @@ -2932,7 +2932,7 @@ Var('chromium_git') + '/webpagereplay.git' + '@' + Var('webpagereplay_revision'), 'src/third_party/webrtc': - Var('webrtc_git') + '/src.git' + '@' + '2f61be11629916ec0d3f083ef16b85113ee1db54', + Var('webrtc_git') + '/src.git' + '@' + 'b98efd4b57d927b119a0c5fd70181c423d179339', # Wuffs' canonical repository is at github.com/google/wuffs, but we use # Skia's mirror of Wuffs, the same as in upstream Skia's DEPS file. @@ -3065,7 +3065,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/help_app/app', - 'version': 'EAAQA9qexggZC8JxHnUvbFSiC_sWL9RtxzE90Twyxp4C', + 'version': 'rMCcVF38pkHQkbSgVUADZbrTE_WJStYC4Um_RFCMtsMC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -3076,7 +3076,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/media_app/app', - 'version': '7UcYt7Be4ZKo4woY47ZC5J9Mwmc7qVMnADv2RryFiusC', + 'version': '_dc11gpBziW1a28ibIkLThLi3baWtOKprilMoMAwCc0C', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -4718,7 +4718,7 @@ 'src/ios_internal': { 'url': Var('chrome_git') + '/chrome/ios_internal.git' + '@' + - 'b254cb46f918229d29978dcd9685439f27798668', + '6f934023958e0f948212f4743697f175669da13b', 'condition': 'checkout_ios and checkout_src_internal', },
diff --git a/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java b/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java index 951e32f..8146abc5 100644 --- a/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java +++ b/android_webview/java/src/org/chromium/android_webview/common/ProductionSupportedFlagList.java
@@ -1063,6 +1063,9 @@ AwFeatures.WEBVIEW_CONNECT_TO_COMPONENT_PROVIDER_IN_BACKGROUND, "Connect to the non-embedded components provider from a background thread."), Flag.baseFeature("PrefetchUseContentRefactor"), + Flag.baseFeature( + VizFeatures.NO_LATE_BEGIN_FRAMES, + "Enables not sending BeginFrameArgs late when a client begins observing them."), // Add new commandline switches and features above. The final entry should have a // trailing comma for cleaner diffs. };
diff --git a/base/i18n/rtl.cc b/base/i18n/rtl.cc index b37edc0..a8eacf3f 100644 --- a/base/i18n/rtl.cc +++ b/base/i18n/rtl.cc
@@ -31,6 +31,8 @@ #include "base/ios/ios_util.h" #endif +namespace base::i18n { + namespace { // Extract language, country and variant, but ignore keywords. For example, @@ -64,19 +66,19 @@ // Returns LEFT_TO_RIGHT or RIGHT_TO_LEFT if |character| has strong // directionality, returns UNKNOWN_DIRECTION if it doesn't. Please refer to // http://unicode.org/reports/tr9/ for more information. -base::i18n::TextDirection GetCharacterDirection(UChar32 character) { - static bool has_switch = base::CommandLine::ForCurrentProcess()->HasSwitch( +TextDirection GetCharacterDirection(UChar32 character) { + static bool has_switch = CommandLine::ForCurrentProcess()->HasSwitch( switches::kForceTextDirection); if (has_switch) { - base::CommandLine* command_line = base::CommandLine::ForCurrentProcess(); + CommandLine* command_line = CommandLine::ForCurrentProcess(); std::string force_flag = command_line->GetSwitchValueASCII(switches::kForceTextDirection); if (force_flag == switches::kForceDirectionRTL) { - return base::i18n::RIGHT_TO_LEFT; + return RIGHT_TO_LEFT; } if (force_flag == switches::kForceDirectionLTR) { - return base::i18n::LEFT_TO_RIGHT; + return LEFT_TO_RIGHT; } } // Now that we have the character, we use ICU in order to query for the @@ -87,37 +89,20 @@ case U_RIGHT_TO_LEFT_ARABIC: case U_RIGHT_TO_LEFT_EMBEDDING: case U_RIGHT_TO_LEFT_OVERRIDE: - return base::i18n::RIGHT_TO_LEFT; + return RIGHT_TO_LEFT; case U_LEFT_TO_RIGHT: case U_LEFT_TO_RIGHT_EMBEDDING: case U_LEFT_TO_RIGHT_OVERRIDE: - return base::i18n::LEFT_TO_RIGHT; + return LEFT_TO_RIGHT; } - return base::i18n::UNKNOWN_DIRECTION; -} - -} // namespace - -namespace base::i18n { - -// Represents the locale-specific ICU text direction. -static TextDirection g_icu_text_direction = UNKNOWN_DIRECTION; - -// Convert the ICU default locale to a string. -std::string GetConfiguredLocale() { - return GetLocaleString(icu::Locale::getDefault()); -} - -// Convert the ICU canonicalized locale to a string. -std::string GetCanonicalLocale(const std::string& locale) { - return GetLocaleString(icu::Locale::createCanonical(locale.c_str())); + return UNKNOWN_DIRECTION; } // Convert Chrome locale name to ICU locale name -std::string ICULocaleName(const std::string& locale_string) { +std::string ICULocaleName(std::string_view locale_string) { // If not Spanish, just return it. if (locale_string.substr(0, 2) != "es") { - return locale_string; + return std::string(locale_string); } // Expand es to es-ES. if (EqualsCaseInsensitiveASCII(locale_string, "es")) { @@ -140,10 +125,25 @@ } // Currently, Chrome has only "es" and "es-419", but later we may have // more specific "es-RR". - return locale_string; + return std::string(locale_string); } -void SetICUDefaultLocale(const std::string& locale_string) { +} // namespace + +// Represents the locale-specific ICU text direction. +static TextDirection g_icu_text_direction = UNKNOWN_DIRECTION; + +// Convert the ICU default locale to a string. +std::string GetConfiguredLocale() { + return GetLocaleString(icu::Locale::getDefault()); +} + +// Convert the ICU canonicalized locale to a string. +std::string GetCanonicalLocale(const std::string& locale) { + return GetLocaleString(icu::Locale::createCanonical(locale.c_str())); +} + +void SetICUDefaultLocale(std::string_view locale_string) { #if BUILDFLAG(IS_IOS) static base::debug::CrashKeyString* crash_key_locale = base::debug::AllocateCrashKeyString("icu_locale_input",
diff --git a/base/i18n/rtl.h b/base/i18n/rtl.h index 545c58f..0ccac05 100644 --- a/base/i18n/rtl.h +++ b/base/i18n/rtl.h
@@ -48,7 +48,7 @@ // This is handy in that we don't have to call GetApplicationLocale() // everytime we call locale-dependent ICU APIs as long as we make sure // that this is called before any locale-dependent API is called. -BASE_I18N_EXPORT void SetICUDefaultLocale(const std::string& locale_string); +BASE_I18N_EXPORT void SetICUDefaultLocale(std::string_view locale_string); // Returns true if the application text direction is right-to-left. BASE_I18N_EXPORT bool IsRTL();
diff --git a/base/test/BUILD.gn b/base/test/BUILD.gn index 24cd8c3..15fdad3 100644 --- a/base/test/BUILD.gn +++ b/base/test/BUILD.gn
@@ -720,6 +720,7 @@ "android/javatests/src/org/chromium/base/test/transit/Transition.java", "android/javatests/src/org/chromium/base/test/transit/TravelException.java", "android/javatests/src/org/chromium/base/test/transit/Triggers.java", + "android/javatests/src/org/chromium/base/test/transit/Trip.java", "android/javatests/src/org/chromium/base/test/transit/TripBuilder.java", "android/javatests/src/org/chromium/base/test/transit/UiThreadCondition.java", "android/javatests/src/org/chromium/base/test/transit/ViewConditions.java",
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 d47a5d97..659b9bd 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
@@ -261,7 +261,7 @@ // If the preCheck already saw all Conditions fulfilled and there is no trigger which might // cause state changes, avoid checking Conditions a second time. - if (mTransition.mTrigger == null && !anyCriteriaMissing) { + if (!mTransition.hasTrigger() && !anyCriteriaMissing) { mPreCheckFulfilledConditions = true; Log.i(
diff --git a/base/test/android/javatests/src/org/chromium/base/test/transit/ConditionalState.java b/base/test/android/javatests/src/org/chromium/base/test/transit/ConditionalState.java index 2c804e72..eae5dc0c 100644 --- a/base/test/android/javatests/src/org/chromium/base/test/transit/ConditionalState.java +++ b/base/test/android/javatests/src/org/chromium/base/test/transit/ConditionalState.java
@@ -330,9 +330,23 @@ } /** + * Do nothing to trigger a Transition. + * + * <p>This is useful to wait ConditionalStates/Conditions to be reached without performing any + * action. + * + * <p>Adds this ConditionalState as context. + * + * @return a {@link TripBuilder} to perform the Transition. + */ + public TripBuilder noopTo() { + return Triggers.noopTo().withContext(this); + } + + /** * Run an arbitrary function on the instrumentation thread to trigger a Transition. * - * <p>Adds this Station as context. + * <p>Adds this ConditionalState as context. * * @return a {@link TripBuilder} to perform the Transition. */ @@ -343,7 +357,7 @@ /** * Run an arbitrary function on the UI thread to trigger a Transition. * - * <p>Adds this Station as context. + * <p>Adds this ConditionalState as context. * * @return a {@link TripBuilder} to perform the Transition. */ @@ -354,7 +368,7 @@ /** * Press back to trigger a Transition. * - * <p>Adds this Station as context. + * <p>Adds this ConditionalState as context. * * @return a {@link TripBuilder} to perform the Transition. */
diff --git a/base/test/android/javatests/src/org/chromium/base/test/transit/Transition.java b/base/test/android/javatests/src/org/chromium/base/test/transit/Transition.java index 356671a..a2998e2 100644 --- a/base/test/android/javatests/src/org/chromium/base/test/transit/Transition.java +++ b/base/test/android/javatests/src/org/chromium/base/test/transit/Transition.java
@@ -6,6 +6,7 @@ import org.chromium.base.Log; import org.chromium.base.ThreadUtils; +import org.chromium.build.annotations.EnsuresNonNullIf; import org.chromium.build.annotations.NullMarked; import org.chromium.build.annotations.Nullable; @@ -25,6 +26,11 @@ void triggerTransition(); } + // NOOP_TRIGGER is a trigger that does nothing when triggered and is special-cased in + // Transition to be handled like a null Trigger. This causes the Transition to not fail if + // all Conditions are already fulfilled in preCheck(). + public static final Trigger NOOP_TRIGGER = () -> {}; + private static final String TAG = "Transit"; private static int sLastTripId; @@ -67,11 +73,12 @@ private boolean shouldFailOnAlreadyFulfilled() { // At least one Condition should be not fulfilled, or this is likely an incorrectly // designed Transition. Exceptions to this rule: - // 1. null Trigger, for example when focusing on secondary elements of a screen that - // aren't declared in the Station's constructor or in its declareExtraElements(). + // 1. null or NOOP_TRIGGER Trigger, for example when focusing on secondary elements of a + // screen that aren't declared in the Station's constructor or in its + // declareExtraElements(). // 2. A explicit exception is made with TransitionOptions.mPossiblyAlreadyFulfilled. // E.g. when not possible to determine whether the trigger needs to be run. - return !mOptions.getPossiblyAlreadyFulfilled() && mTrigger != null; + return !mOptions.getPossiblyAlreadyFulfilled() && hasTrigger(); } protected void onBeforeTransition() { @@ -123,12 +130,13 @@ } protected void triggerTransition() { - if (mTrigger != null) { - Log.i(TAG, "%s: will run trigger", toDebugString()); + if (hasTrigger()) { try { if (mOptions.getRunTriggerOnUiThread()) { + Log.i(TAG, "%s: will run trigger on UI thread", toDebugString()); ThreadUtils.runOnUiThread(mTrigger::triggerTransition); } else { + Log.i(TAG, "%s: will run trigger on Instrumentation thread", toDebugString()); mTrigger.triggerTransition(); } Log.i(TAG, "%s: finished running trigger", toDebugString()); @@ -267,7 +275,7 @@ * <p>Returns a new TransitionOptions instance. */ static TransitionOptions merge(TransitionOptions primary, TransitionOptions secondary) { - TransitionOptions.Builder builder = secondary.new Builder(); + TransitionOptions.Builder builder = newOptions(); // Merge Transition Conditions if (secondary.mTransitionConditions != null) { @@ -394,4 +402,9 @@ return states.toString(); } } + + @EnsuresNonNullIf("mTrigger") + boolean hasTrigger() { + return mTrigger != null && mTrigger != NOOP_TRIGGER; + } }
diff --git a/base/test/android/javatests/src/org/chromium/base/test/transit/Triggers.java b/base/test/android/javatests/src/org/chromium/base/test/transit/Triggers.java index 89b31ac..e7e6ec3 100644 --- a/base/test/android/javatests/src/org/chromium/base/test/transit/Triggers.java +++ b/base/test/android/javatests/src/org/chromium/base/test/transit/Triggers.java
@@ -9,6 +9,16 @@ /** Common Triggers to start Transitions. */ public class Triggers { /** + * Do nothing to trigger a Transition. + * + * <p>This is useful to wait ConditionalStates/Conditions to be reached without performing any + * action. + */ + public static TripBuilder noopTo() { + return new TripBuilder().withTrigger(Transition.NOOP_TRIGGER); + } + + /** * Run an arbitrary function on the instrumentation thread to trigger a Transition. * * @return a {@link TripBuilder} to perform the Transition.
diff --git a/base/test/android/javatests/src/org/chromium/base/test/transit/Trip.java b/base/test/android/javatests/src/org/chromium/base/test/transit/Trip.java new file mode 100644 index 0000000..bbf8f9e --- /dev/null +++ b/base/test/android/javatests/src/org/chromium/base/test/transit/Trip.java
@@ -0,0 +1,140 @@ +// 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.test.transit; + +import org.chromium.build.annotations.NullMarked; +import org.chromium.build.annotations.Nullable; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +/** + * A generic {@link Transition} out of one or more {@link Facility}s into another {@link Facility}. + */ +@NullMarked +public class Trip extends Transition { + private final @Nullable Station<?> mOriginStation; + private final @Nullable Station<?> mDestinationStation; + private final List<Facility<?>> mFacilitiesToExit; + private final List<Facility<?>> mFacilitiesToEnter; + private final List<CarryOn> mCarryOnsToDrop; + private final List<CarryOn> mCarryOnsToPickUp; + private final String mTransitionName; + + /** Use {@link TripBuilder} to create a Trip. */ + Trip( + @Nullable Station<?> originStation, + @Nullable Station<?> destinationStation, + List<Facility<?>> facilitiesToExit, + List<Facility<?>> facilitiesToEnter, + List<CarryOn> carryOnsToDrop, + List<CarryOn> carryOnsToPickUp, + TransitionOptions options, + @Nullable Trigger trigger) { + super( + options, + aggregateStates(originStation, facilitiesToExit, carryOnsToDrop), + aggregateStates(destinationStation, facilitiesToEnter, carryOnsToPickUp), + trigger); + mOriginStation = originStation; + mDestinationStation = destinationStation; + mFacilitiesToExit = facilitiesToExit; + mFacilitiesToEnter = facilitiesToEnter; + mCarryOnsToDrop = carryOnsToDrop; + mCarryOnsToPickUp = carryOnsToPickUp; + + String transitionTypeName = determineTransitionTypeName(); + mTransitionName = determineTransitionName(transitionTypeName); + } + + @Override + protected void onAfterTransition() { + super.onAfterTransition(); + + if (mOriginStation != null || mDestinationStation != null) { + TrafficControl.notifyActiveStationsChanged( + mOriginStation != null ? List.of(mOriginStation) : Collections.emptyList(), + mDestinationStation != null + ? List.of(mDestinationStation) + : Collections.emptyList()); + } + } + + @Override + public String toDebugString() { + return mTransitionName; + } + + private static List<? extends ConditionalState> aggregateStates( + @Nullable Station<?> station, List<Facility<?>> facilities, List<CarryOn> carryOns) { + List<ConditionalState> states = new ArrayList<>(); + if (station != null) { + states.add(station); + } + states.addAll(facilities); + states.addAll(carryOns); + return states; + } + + private String determineTransitionTypeName() { + if (mDestinationStation != null) { + if (mOriginStation != null) { + return "StationToStationTrip"; + } else { + return "StationSpawn"; + } + } else { + if (mOriginStation != null) { + return "LastStation"; + } + } + + if (!mFacilitiesToEnter.isEmpty()) { + if (!mFacilitiesToExit.isEmpty()) { + return "FacilitySwap"; + } else { + return "FacilityCheckIn"; + } + } else if (!mFacilitiesToExit.isEmpty()) { + return "FacilityCheckOut"; + } + + if (!mCarryOnsToPickUp.isEmpty()) { + if (!mCarryOnsToDrop.isEmpty()) { + return "CarryOnSwap"; + } else { + return "CarryOnPickUp"; + } + } else if (!mCarryOnsToDrop.isEmpty()) { + return "CarryOnDrop"; + } + + return "GenericTrip"; + } + + private String determineTransitionName(String transitionTypeName) { + if (!mEnteredStates.isEmpty()) { + String facilitiesToEnterString = getStateListString(mEnteredStates); + if (!mExitedStates.isEmpty()) { + String facilitiesToExitString = getStateListString(mExitedStates); + return String.format( + "%s %d (from %s to %s)", + transitionTypeName, mId, facilitiesToExitString, facilitiesToEnterString); + } else { + return String.format( + "%s %d (enter %s)", transitionTypeName, mId, facilitiesToEnterString); + } + } else { + if (!mExitedStates.isEmpty()) { + String facilitiesToExitString = getStateListString(mExitedStates); + return String.format( + "%s %d (exit %s)", transitionTypeName, mId, facilitiesToExitString); + } else { + return String.format("%s %d", transitionTypeName, mId); + } + } + } +}
diff --git a/base/test/android/javatests/src/org/chromium/base/test/transit/TripBuilder.java b/base/test/android/javatests/src/org/chromium/base/test/transit/TripBuilder.java index 41ea309..630f5a1 100644 --- a/base/test/android/javatests/src/org/chromium/base/test/transit/TripBuilder.java +++ b/base/test/android/javatests/src/org/chromium/base/test/transit/TripBuilder.java
@@ -24,12 +24,16 @@ public class TripBuilder { private final List<Facility<?>> mFacilitiesToEnter = new ArrayList<>(); private final List<Facility<?>> mFacilitiesToExit = new ArrayList<>(); + private final List<CarryOn> mCarryOnsToPickUp = new ArrayList<>(); + private final List<CarryOn> mCarryOnsToDrop = new ArrayList<>(); private final List<Condition> mConditions = new ArrayList<>(); private @Nullable Trigger mTrigger; - private @Nullable TransitionOptions mOptions; + private TransitionOptions mOptions = TransitionOptions.DEFAULT; private @Nullable Station<?> mDestinationStation; + private @Nullable Station<?> mOriginStation; private @Nullable Station<?> mContextStation; private @Nullable Facility<?> mContextFacility; + private @Nullable CarryOn mContextCarryOn; public TripBuilder() {} @@ -63,6 +67,8 @@ } else if (conditionalState instanceof Facility<?> facility) { mContextFacility = facility; mContextStation = facility.getHostStation(); + } else if (conditionalState instanceof CarryOn carryOn) { + mContextCarryOn = carryOn; } return this; } @@ -83,11 +89,7 @@ */ @CheckReturnValue public TripBuilder withOptions(TransitionOptions options) { - if (mOptions == null) { - mOptions = options; - } else { - mOptions = TransitionOptions.merge(/* primary= */ options, /* secondary= */ mOptions); - } + mOptions = TransitionOptions.merge(/* primary= */ options, /* secondary= */ mOptions); return this; } @@ -98,6 +100,26 @@ return this; } + @CheckReturnValue + public TripBuilder pickUpCarryOnAnd(CarryOn carryOn) { + mCarryOnsToPickUp.add(carryOn); + return this; + } + + @CheckReturnValue + public TripBuilder dropCarryOnAnd() { + assert mContextCarryOn != null + : "Context CarryOn not set, pass the not to drop as a parameter"; + mCarryOnsToDrop.add(mContextCarryOn); + return this; + } + + @CheckReturnValue + public TripBuilder dropCarryOnAnd(CarryOn carryOn) { + mCarryOnsToDrop.add(carryOn); + return this; + } + /** Add a |facility| to enter as part of the Transition. */ @CheckReturnValue public TripBuilder enterFacilityAnd(Facility<?> facility) { @@ -153,6 +175,19 @@ waitForConditionsAnd(conditions).complete(); } + public <CarryOnT extends CarryOn> CarryOnT pickUpCarryOn(CarryOnT carryOn) { + pickUpCarryOnAnd(carryOn).complete(); + return carryOn; + } + + public void dropCarryOn() { + dropCarryOnAnd().complete(); + } + + public void dropCarryOn(CarryOn carryOn) { + dropCarryOnAnd(carryOn).complete(); + } + /** Execute the transition synchronously, entering |facility| and returning it. */ public <FacilityT extends Facility<?>> FacilityT enterFacility(FacilityT facility) { enterFacilityAnd(facility).complete(); @@ -193,70 +228,62 @@ public void complete() { assert mTrigger != null : "Trigger not set"; - // TODO(crbug.com/406325581): Support Station#spawnSync(). - if (mContextStation == null) { + // If a context Station is required, infer it from the active Stations. + // A context Station is required to travel to a Station or to enter Facilities. + if (mContextStation == null + && (mDestinationStation != null || !mFacilitiesToEnter.isEmpty())) { List<Station<?>> activeStations = TrafficControl.getActiveStations(); if (activeStations.size() == 1) { mContextStation = activeStations.get(0); } else { assert false - : "Context Station not set, cannot infer because there isn't exactly one" - + " active Station."; + : String.format( + "Context Station not set with withContext(), cannot infer because" + + " there isn't exactly one active Station. Had %d active" + + " Stations.", + activeStations.size()); } } - Transition trip = buildTrip(); - trip.transitionSync(); - } + // If entering a station, assume to be exiting an active Station too. + // + // TODO(crbug.com/406325581): Stop assuming this if the TransitionBuilder is set to spawn a + // Station. This is needed to support Station#spawnSync(). + if (mDestinationStation != null) { + mOriginStation = mContextStation; + } - // TODO(crbug.com/406325581): Create a generic Trip class to replace these. - private Transition buildTrip() { if (mDestinationStation != null) { for (Facility<?> facility : mFacilitiesToEnter) { mDestinationStation.addInitialFacility(facility); } - // TODO(crbug.com/406325581): Support Station#spawnSync(). - mDestinationStation.requireToBeInSameTask(mContextStation); - return new StationToStationTrip( - List.of(mContextStation), List.of(mDestinationStation), getOptions(), mTrigger); + mDestinationStation.requireToBeInSameTask(mOriginStation); } else { - if (!mFacilitiesToEnter.isEmpty()) { - // TODO(crbug.com/406325581): Support entering Facilities from multiple Stations in - // multi-window. - for (Facility<?> facility : mFacilitiesToEnter) { - mContextStation.registerFacility(facility); - } - - if (!mFacilitiesToExit.isEmpty()) { - return new FacilitySwap( - mFacilitiesToExit, mFacilitiesToEnter, getOptions(), mTrigger); - } else { - return new FacilityCheckIn(mFacilitiesToEnter, getOptions(), mTrigger); - } - } else { - if (!mFacilitiesToExit.isEmpty()) { - return new FacilityCheckOut(mFacilitiesToExit, getOptions(), mTrigger); - } else { - // TODO(crbug.com/406325581): Support Transitions to/from CarryOns and - // Conditions-only. - throw new UnsupportedOperationException( - "TripBuilder only supports transitions with Stations and Facilities for" - + " now."); - } + // TODO(crbug.com/406325581): Support entering Facilities from multiple Stations in + // multi-window. + for (Facility<?> facility : mFacilitiesToEnter) { + mContextStation.registerFacility(facility); } } - } - - private TransitionOptions getOptions() { - TransitionOptions options = mOptions == null ? TransitionOptions.DEFAULT : mOptions; if (!mConditions.isEmpty()) { - options = + mOptions = TransitionOptions.merge( Transition.conditionOption(mConditions.toArray(new Condition[0])), mOptions); } - return options; + + Transition trip = + new Trip( + mOriginStation, + mDestinationStation, + mFacilitiesToExit, + mFacilitiesToEnter, + mCarryOnsToDrop, + mCarryOnsToPickUp, + mOptions, + mTrigger); + trip.transitionSync(); } }
diff --git a/base/win/shortcut.cc b/base/win/shortcut.cc index 967e130..8b79d7e 100644 --- a/base/win/shortcut.cc +++ b/base/win/shortcut.cc
@@ -317,7 +317,8 @@ break; } default: { - NOTREACHED() << "Unexpected variant type: " << pv_app_id.get().vt; + LOG(WARNING) << "Unexpected variant type: " << pv_app_id.get().vt; + break; } } } @@ -336,7 +337,8 @@ properties->set_dual_mode(pv_dual_mode.get().boolVal == VARIANT_TRUE); break; default: - NOTREACHED() << "Unexpected variant type: " << pv_dual_mode.get().vt; + LOG(WARNING) << "Unexpected variant type: " << pv_dual_mode.get().vt; + break; } } @@ -356,8 +358,9 @@ *(pv_toast_activator_clsid.get().puuid)); break; default: - NOTREACHED() << "Unexpected variant type: " + LOG(WARNING) << "Unexpected variant type: " << pv_toast_activator_clsid.get().vt; + break; } } }
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 7c97251..70c5357 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
@@ -42,8 +42,12 @@ "org.chromium.native_test.NativeTestInstrumentationTestRunner.TestList"; private static final String EXTRA_TEST = "org.chromium.native_test.NativeTestInstrumentationTestRunner.Test"; + // An extra to indicate if user data dir should be kept when running the + // given test list. no-op if given a single test. + private static final String EXTRA_KEEP_USER_DATA_DIR = + "org.chromium.native_test.NativeTestInstrumentationTestRunner.KeepUserDataDir"; - private static final String TAG = "NativeTest"; + private static final String TAG = "NativeTestRunner"; private static final long DEFAULT_SHARD_NANO_TIMEOUT = 60 * 1000000000L; // Default to no size limit. @@ -54,11 +58,12 @@ private final SparseArray<ShardMonitor> mMonitors = new SparseArray<ShardMonitor>(); private String mNativeTestActivity; private TestStatusReceiver mReceiver; - private final Queue<String> mShards = new ArrayDeque<String>(); + private final Queue<ShardMetadata> mShards = new ArrayDeque<ShardMetadata>(); private long mShardNanoTimeout = DEFAULT_SHARD_NANO_TIMEOUT; private int mShardSizeLimit = DEFAULT_SHARD_SIZE_LIMIT; private File mStdoutFile; private Bundle mTransparentArguments; + private boolean mKeepUserDataDir; @Override public void onCreate(Bundle arguments) { @@ -101,14 +106,22 @@ mTransparentArguments.remove(EXTRA_STDOUT_FILE); + mKeepUserDataDir = arguments.containsKey(EXTRA_KEEP_USER_DATA_DIR); + if (mKeepUserDataDir) { + Log.i(TAG, "user data dir will be kept between the given tests."); + } + mTransparentArguments.remove(EXTRA_KEEP_USER_DATA_DIR); + String singleTest = arguments.getString(EXTRA_TEST); if (singleTest != null) { - mShards.add(singleTest); + mShards.add(new ShardMetadata(singleTest, false)); } String testListFilePath = arguments.getString(EXTRA_TEST_LIST_FILE); if (testListFilePath != null) { File testListFile = new File(testListFilePath); + + boolean isFirstTest = true; try { BufferedReader testListFileReader = new BufferedReader(new FileReader(testListFile)); @@ -116,15 +129,26 @@ String test; ArrayList<String> workingShard = new ArrayList<String>(); while ((test = testListFileReader.readLine()) != null) { + // For multiple tests passed via a test list file, data + // in user data dir should: + // - Be cleaned before the 1st test, and + // - Kept in the followed tests. + boolean keepUserDataDirForTest = mKeepUserDataDir && !isFirstTest; + isFirstTest = false; workingShard.add(test); if (workingShard.size() == mShardSizeLimit) { - mShards.add(TextUtils.join(":", workingShard)); + mShards.add( + new ShardMetadata( + TextUtils.join(":", workingShard), keepUserDataDirForTest)); workingShard = new ArrayList<String>(); } } if (!workingShard.isEmpty()) { - mShards.add(TextUtils.join(":", workingShard)); + boolean keepUserDataDirForTest = mKeepUserDataDir && !isFirstTest; + mShards.add( + new ShardMetadata( + TextUtils.join(":", workingShard), keepUserDataDirForTest)); } testListFileReader.close(); @@ -180,6 +204,25 @@ mHandler.post(new ShardStarter()); } + /** Stores the metadata for a test shard. */ + private static class ShardMetadata { + private final String mGtestFilter; + private final boolean mKeepUserDataDir; + + public ShardMetadata(String gtestFilter, boolean keepUserDataDir) { + mGtestFilter = gtestFilter; + mKeepUserDataDir = keepUserDataDir; + } + + public String getGtestFilter() { + return mGtestFilter; + } + + public boolean shouldKeepUserDataDir() { + return mKeepUserDataDir; + } + } + /** Monitors a test shard's execution. */ private class ShardMonitor implements Runnable { private static final int MONITOR_FREQUENCY_MS = 1000; @@ -236,8 +279,11 @@ i.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); i.putExtras(mTransparentArguments); if (mShards != null && !mShards.isEmpty()) { - String gtestFilter = mShards.remove(); - i.putExtra(NativeTestIntent.EXTRA_GTEST_FILTER, gtestFilter); + ShardMetadata shardMetadata = mShards.remove(); + i.putExtra(NativeTestIntent.EXTRA_GTEST_FILTER, shardMetadata.getGtestFilter()); + i.putExtra( + NativeTestIntent.EXTRA_KEEP_USER_DATA_DIR, + shardMetadata.shouldKeepUserDataDir()); } i.putExtra(NativeTestIntent.EXTRA_STDOUT_FILE, mStdoutFile.getAbsolutePath()); return i;
diff --git a/build/android/gtest_apk/java/src/org/chromium/build/gtest_apk/NativeTestIntent.java b/build/android/gtest_apk/java/src/org/chromium/build/gtest_apk/NativeTestIntent.java index 88fd88c..e16477e 100644 --- a/build/android/gtest_apk/java/src/org/chromium/build/gtest_apk/NativeTestIntent.java +++ b/build/android/gtest_apk/java/src/org/chromium/build/gtest_apk/NativeTestIntent.java
@@ -17,4 +17,9 @@ public static final String EXTRA_STDOUT_FILE = "org.chromium.native_test.NativeTest.StdoutFile"; public static final String EXTRA_COVERAGE_DEVICE_FILE = "org.chromium.native_test.NativeTest.CoverageDeviceFile"; + // An extra to indicate if the user data dir should be kept before running + // the given native test shard. + // This is different from the one in NativeTestInstrumentationTestRunner.java + public static final String EXTRA_KEEP_USER_DATA_DIR = + "org.chromium.native_test.NativeTest.KeepUserDataDir"; }
diff --git a/build/android/pylib/local/device/local_device_gtest_run.py b/build/android/pylib/local/device/local_device_gtest_run.py index 88d57e6..1e85197 100644 --- a/build/android/pylib/local/device/local_device_gtest_run.py +++ b/build/android/pylib/local/device/local_device_gtest_run.py
@@ -47,12 +47,19 @@ import tombstones _MAX_INLINE_FLAGS_LENGTH = 50 # Arbitrarily chosen. + +# Extras from NativeTestIntent.java _EXTRA_COMMAND_LINE_FILE = ( 'org.chromium.native_test.NativeTest.CommandLineFile') _EXTRA_COMMAND_LINE_FLAGS = ( 'org.chromium.native_test.NativeTest.CommandLineFlags') _EXTRA_COVERAGE_DEVICE_FILE = ( 'org.chromium.native_test.NativeTest.CoverageDeviceFile') + +# Extras from NativeTestInstrumentationTestRunner.java +_EXTRA_KEEP_USER_DATA_DIR = ( + 'org.chromium.native_test.NativeTestInstrumentationTestRunner' + '.KeepUserDataDir') _EXTRA_STDOUT_FILE = ( 'org.chromium.native_test.NativeTestInstrumentationTestRunner' '.StdoutFile') @@ -205,6 +212,17 @@ return pre_tests, other_tests +def _IsPreTestGroup(test_group): + """Check if a test group has one and only one PRE test group.""" + test_set = set() + has_pre_test = False + for test in test_group: + if not has_pre_test and gtest_test_instance.IsPreTest(test): + has_pre_test = True + test_set.add(gtest_test_instance.TestNameWithoutPrefixes(test)) + return has_pre_test and len(test_set) == 1 + + class _ApkDelegate: def __init__(self, test_instance, env): self._activity = test_instance.activity @@ -288,6 +306,9 @@ else: extras[_EXTRA_TEST] = test[0] + if _IsPreTestGroup(test): + extras[_EXTRA_KEEP_USER_DATA_DIR] = 1 + # We need to use GetAppWritablePath here instead of GetExternalStoragePath # since we will not have yet applied legacy storage permission workarounds # on R+. @@ -650,7 +671,7 @@ for test in tests_on_device: if isinstance(test, list): # Any existing list from "tests" shall be a PRE test group. - assert self._IsPreTestGroup(test), ( + assert _IsPreTestGroup(test), ( f'Expecting a PRE test group, got {test}') # A test subgroup will run together even if it has a crashed test shards.append(test) @@ -836,22 +857,11 @@ test = test[-1] return gtest_test_instance.TestNameWithoutDisabledPrefix(test) - def _IsPreTestGroup(self, test_group): - """Check if a test group has one and only one PRE test group.""" - # pylint: disable=no-self-use - test_set = set() - has_pre_test = False - for test in test_group: - if not has_pre_test and gtest_test_instance.IsPreTest(test): - has_pre_test = True - test_set.add(gtest_test_instance.TestNameWithoutPrefixes(test)) - return has_pre_test and len(test_set) == 1 - #override def _ShouldRetryFullGroup(self, test_group): """A group in gtest shall be a PRE test group and retry in full.""" # Ensure the given test group is a PRE test group - assert self._IsPreTestGroup(test_group), ( + assert _IsPreTestGroup(test_group), ( f'Expecting a PRE test group, got {test_group}') return True
diff --git a/build/android/pylib/local/device/local_device_gtest_run_test.py b/build/android/pylib/local/device/local_device_gtest_run_test.py index 5d514993..33fae87e 100755 --- a/build/android/pylib/local/device/local_device_gtest_run_test.py +++ b/build/android/pylib/local/device/local_device_gtest_run_test.py
@@ -99,6 +99,21 @@ self.assertIn(pre_test_group3, pre_tests) self.assertIn(pre_test_group4, pre_tests) + def test_IsPreTestGroup(self): + self.assertTrue(local_device_gtest_run._IsPreTestGroup([ + 'TestSuite1.TestName1', + 'TestSuite1.PRE_TestName1', + 'TestSuite1.PRE_PRE_TestName1', + ])) + self.assertFalse(local_device_gtest_run._IsPreTestGroup([ + 'TestSuite1.TestName2', + ])) + self.assertFalse(local_device_gtest_run._IsPreTestGroup([ + 'TestSuite1.TestName1', + 'TestSuite1.PRE_TestName1', + 'TestSuite1.TestName2', + ])) + def test_ApplyExternalSharding(self): tests = [ 'TestSuite1.TestName1', @@ -156,21 +171,6 @@ actual_shards = self._obj._CreateShardsForDevices(tests) self.assertListEqual(actual_shards, expected_shards) - def test_IsPreTestGroup(self): - self.assertTrue(self._obj._IsPreTestGroup([ - 'TestSuite1.TestName1', - 'TestSuite1.PRE_TestName1', - 'TestSuite1.PRE_PRE_TestName1', - ])) - self.assertFalse(self._obj._IsPreTestGroup([ - 'TestSuite1.TestName2', - ])) - self.assertFalse(self._obj._IsPreTestGroup([ - 'TestSuite1.TestName1', - 'TestSuite1.PRE_TestName1', - 'TestSuite1.TestName2', - ])) - def test_GetTestsToRetry(self): test_data = [ ('TestSuite1.TestName1', base_test_result.ResultType.PASS),
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn index 7889ccf..af40f4a 100644 --- a/chrome/android/BUILD.gn +++ b/chrome/android/BUILD.gn
@@ -1944,6 +1944,7 @@ "//build/android:build_java", "//chrome/browser/autofill/test:test_support_java", "//chrome/browser/download/android:java", + "//chrome/browser/picture_in_picture/test:test_support_java", "//chrome/browser/prefetch/android:java", "//chrome/browser/profiles/android:java", "//chrome/browser/renderer_host/android:test_support_java", @@ -1977,6 +1978,7 @@ "//chrome/browser", "//chrome/browser:browser_process", "//chrome/browser/autofill/test:test_support", + "//chrome/browser/picture_in_picture/test:test_support", "//chrome/browser/renderer_host/android:test_support", "//chrome/browser/sync", "//chrome/browser/thumbnail:test_support", @@ -2364,6 +2366,7 @@ "//chrome/browser/password_manager/android:javatests", "//chrome/browser/password_manager/android/access_loss:javatests", "//chrome/browser/password_manager/android/bottom_sheet:javatests", + "//chrome/browser/picture_in_picture/test:javatests", "//chrome/browser/recent_tabs/internal:recent_tabs_javatests", "//chrome/browser/subresource_filter:subresource_filter_javatests", "//chrome/browser/touch_to_fill/autofill/android/internal:javatests",
diff --git a/chrome/android/chrome_java_resources.gni b/chrome/android/chrome_java_resources.gni index d8bd753..e468aed 100644 --- a/chrome/android/chrome_java_resources.gni +++ b/chrome/android/chrome_java_resources.gni
@@ -485,6 +485,7 @@ "java/res/layout/context_menu_header.xml", "java/res/layout/context_menu_row.xml", "java/res/layout/context_menu_share_row.xml", + "java/res/layout/contextual_search_callout_view.xml", "java/res/layout/contextual_search_caption_view.xml", "java/res/layout/contextual_search_card_icon_view.xml", "java/res/layout/contextual_search_context_view.xml",
diff --git a/chrome/android/chrome_java_sources.gni b/chrome/android/chrome_java_sources.gni index 677f210..6ac2cf57 100644 --- a/chrome/android/chrome_java_sources.gni +++ b/chrome/android/chrome_java_sources.gni
@@ -284,6 +284,7 @@ "java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelStateProvider.java", "java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelTextViewInflater.java", "java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchBarControl.java", + "java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchCalloutControl.java", "java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchCaptionControl.java", "java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchCardIconControl.java", "java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchContextControl.java",
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/ArchivedTabsDialogCoordinator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/ArchivedTabsDialogCoordinator.java index da61484..ce27bd8 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/ArchivedTabsDialogCoordinator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/ArchivedTabsDialogCoordinator.java
@@ -126,11 +126,19 @@ public void restoreAllArchivedTabs() { List<Tab> tabs = TabModelUtils.convertTabListToListOfTabs(mArchivedTabModel); int tabCount = tabs.size(); + List<String> archivedTabGroupSyncIds = getArchivedTabGroupSyncIds(); + int tabGroupTabCount = getSyncedTabGroupTabsCount(archivedTabGroupSyncIds); ArchivedTabsDialogCoordinator.this.restoreArchivedTabs( - tabs, getArchivedTabGroupSyncIds()); + tabs, archivedTabGroupSyncIds); RecordHistogram.recordCount1000Histogram( "Tabs.RestoreAllArchivedTabsMenuItem.TabCount", tabCount); RecordUserAction.record("Tabs.RestoreAllArchivedTabsMenuItem"); + RecordHistogram.recordCount1000Histogram( + "TabGroups.RestoreAllArchivedTabsMenuItem.TabGroupCount", + archivedTabGroupSyncIds.size()); + RecordHistogram.recordCount1000Histogram( + "TabGroups.RestoreAllArchivedTabsMenuItem.TabGroupTabCount", + tabGroupTabCount); } @Override @@ -154,6 +162,12 @@ RecordHistogram.recordCount1000Histogram( "Tabs.RestoreArchivedTabsMenuItem.TabCount", tabCount); RecordUserAction.record("Tabs.RestoreArchivedTabsMenuItem"); + RecordHistogram.recordCount1000Histogram( + "TabGroups.RestoreArchivedTabsMenuItem.TabGroupCount", + tabGroupSyncIds.size()); + RecordHistogram.recordCount1000Histogram( + "TabGroups.RestoreArchivedTabsMenuItem.TabGroupTabCount", + getSyncedTabGroupTabsCount(tabGroupSyncIds)); } @Override @@ -167,6 +181,12 @@ RecordHistogram.recordCount1000Histogram( "Tabs.CloseArchivedTabsMenuItem.TabCount", tabs.size()); RecordUserAction.record("Tabs.CloseArchivedTabsMenuItem"); + RecordHistogram.recordCount1000Histogram( + "TabGroups.CloseArchivedTabsMenuItem.TabGroupCount", + tabGroupSyncIds.size()); + RecordHistogram.recordCount1000Histogram( + "TabGroups.CloseArchivedTabsMenuItem.TabGroupTabCount", + getSyncedTabGroupTabsCount(tabGroupSyncIds)); } }; @@ -250,6 +270,10 @@ mTabGroupUiActionHandlerSupplier.get(), mCurrentTabGroupModelFilterSupplier.get(), requestOpenTabGroupDialog); + RecordUserAction.record("TabGroups.RestoreSingleTabGroup"); + RecordHistogram.recordCount1000Histogram( + "TabGroups.RestoreSingleTabGroup.TabGroupTabCount", + savedTabGroup.savedTabs.size()); } }; } @@ -763,6 +787,12 @@ RecordHistogram.recordCount1000Histogram( "Tabs.CloseAllArchivedTabs.TabCount", tabCount); RecordUserAction.record("Tabs.CloseAllArchivedTabsMenuItem"); + RecordHistogram.recordCount1000Histogram( + "TabGroups.CloseAllArchivedTabGroups.TabGroupCount", + archivedTabGroupSyncIds.size()); + RecordHistogram.recordCount1000Histogram( + "TabGroups.CloseAllArchivedTabGroups.TabGroupTabCount", + tabGroupTabsCount); }); }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/ColorPickerItemViewBinder.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/ColorPickerItemViewBinder.java index fe3b1a7..f8e6c3f 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/ColorPickerItemViewBinder.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/ColorPickerItemViewBinder.java
@@ -20,7 +20,6 @@ import android.view.LayoutInflater; import android.view.View; import android.view.ViewOverlay; -import android.widget.Button; import android.widget.ImageView; import androidx.annotation.ColorInt; @@ -82,8 +81,11 @@ // Update the color icon with the indicated color id. if (isAndroidThemeModuleEnabled()) { - Button colorIcon = view.findViewById(R.id.color_picker_icon); + MaterialButton colorIcon = view.findViewById(R.id.color_picker_icon); colorIcon.setBackgroundTintList(ColorStateList.valueOf(color)); + colorIcon.setRippleColor( + TabGroupColorPickerUtils.buildTabGroupColorPickerRippleColorStateList( + context, isIncognito)); } else { final @ColorInt int selectionBackgroundColor = getColorPickerDialogBackgroundColor(context, isIncognito);
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupRowMediator.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupRowMediator.java index 0a5b9274..ef4ee25 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupRowMediator.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupRowMediator.java
@@ -230,7 +230,14 @@ } } else if (state == GroupWindowState.HIDDEN) { String syncId = savedTabGroup.syncId; + boolean isTabGroupArchived = savedTabGroup.archivalTimeMs != null; mTabGroupUiActionHandler.openTabGroup(syncId); + if (isTabGroupArchived) { + RecordUserAction.record("TabGroups.RestoreFromTabGroupPane"); + RecordHistogram.recordCount1000Histogram( + "TabGroups.RestoreFromTabGroupPane.TabCount", + savedTabGroup.savedTabs.size()); + } savedTabGroup = mTabGroupSyncService.getGroup(syncId); }
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupRowMediatorUnitTest.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupRowMediatorUnitTest.java index 457592b..b047883 100644 --- a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupRowMediatorUnitTest.java +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabGroupRowMediatorUnitTest.java
@@ -51,6 +51,8 @@ import org.chromium.base.Token; import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.base.test.util.Features.EnableFeatures; +import org.chromium.base.test.util.HistogramWatcher; +import org.chromium.base.test.util.UserActionTester; import org.chromium.chrome.browser.data_sharing.DataSharingTabManager; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.hub.PaneId; @@ -326,12 +328,24 @@ .openTabGroup(SYNC_GROUP_ID1); when(mFetchGroupState.get()).thenReturn(GroupWindowState.HIDDEN); PropertyModel propertyModel = buildTestModel(/* isShared= */ true, mUrl1); + UserActionTester userActionTester = new UserActionTester(); + HistogramWatcher histograms = + HistogramWatcher.newBuilder() + .expectIntRecord( + "TabGroups.RestoreFromTabGroupPane.TabCount", + mSyncGroup.savedTabs.size()) + .build(); + mSyncGroup.localId = null; + mSyncGroup.archivalTimeMs = 1L; propertyModel.get(OPEN_RUNNABLE).run(); verify(mTabGroupUiActionHandler).openTabGroup(SYNC_GROUP_ID1); verify(mPaneManager).focusPane(PaneId.TAB_SWITCHER); verify(mTabSwitcherPaneBase).requestOpenTabGroupDialog(mRootId); + assertEquals(1, userActionTester.getActionCount("TabGroups.RestoreFromTabGroupPane")); + histograms.assertExpected(); + userActionTester.tearDown(); } @Test @@ -339,12 +353,21 @@ when(mFetchGroupState.get()).thenReturn(GroupWindowState.HIDDEN); when(mTabGroupSyncService.getGroup(SYNC_GROUP_ID1)).thenReturn(null); PropertyModel propertyModel = buildTestModel(/* isShared= */ true, mUrl1); + UserActionTester userActionTester = new UserActionTester(); + HistogramWatcher histograms = + HistogramWatcher.newBuilder() + .expectNoRecords("TabGroups.RestoreFromTabGroupPane.TabCount") + .build(); + mSyncGroup.localId = null; propertyModel.get(OPEN_RUNNABLE).run(); verify(mTabGroupUiActionHandler).openTabGroup(SYNC_GROUP_ID1); verifyNoInteractions(mPaneManager); verifyNoInteractions(mTabSwitcherPaneBase); + assertEquals(0, userActionTester.getActionCount("TabGroups.RestoreFromTabGroupPane")); + histograms.assertExpected(); + userActionTester.tearDown(); } @Test
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 d7a364b..cd39e1e 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
@@ -168,7 +168,7 @@ : TabListEditorActionMetricGroups.SHARE_TABS; ShareParams shareParams = - new ShareParams.Builder(tab.getWindowAndroid(), tabTitle, tabUrl) + new ShareParams.Builder(assumeNonNull(tab.getWindowAndroid()), tabTitle, tabUrl) .setText(tabText) .build();
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListHighlighter.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListHighlighter.java new file mode 100644 index 0000000..d2612de --- /dev/null +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListHighlighter.java
@@ -0,0 +1,69 @@ +// 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.chrome.browser.tasks.tab_management; + +import static org.chromium.chrome.browser.tasks.tab_management.TabProperties.IS_HIGHLIGHTED; +import static org.chromium.chrome.browser.tasks.tab_management.TabProperties.TAB_ID; + +import org.chromium.build.annotations.NullMarked; +import org.chromium.chrome.browser.tab.TabId; +import org.chromium.ui.modelutil.MVCListAdapter.ListItem; +import org.chromium.ui.modelutil.MVCListAdapter.ModelList; +import org.chromium.ui.modelutil.PropertyModel; + +import java.util.Set; + +/** Used to highlight tabs in the tab list. */ +@NullMarked +public class TabListHighlighter { + private final ModelList mModelList; + + /** + * @param modelList The {@link ModelList} containing the tabs to be highlighted. + */ + public TabListHighlighter(ModelList modelList) { + mModelList = modelList; + } + + /** + * Highlights all tabs in the model list whose IDs are present in the given set. This method + * sets their {@link TabProperties#IS_HIGHLIGHTED} property to true. + * + * <p>Does nothing if the tab is already highlighted. Highlighting a set of tabs does not remove + * the highlights from previously highlighted tabs. + * + * @param tabIds A set of tab IDs to highlight. + */ + public void highlightTabs(Set<@TabId Integer> tabIds) { + for (ListItem listItem : mModelList) { + PropertyModel model = listItem.model; + if (model.containsKey(TAB_ID) && model.containsKey(IS_HIGHLIGHTED)) { + @TabId int tabId = model.get(TAB_ID); + if (tabIds.contains(tabId)) { + model.set(IS_HIGHLIGHTED, true); + } + } + } + } + + /** + * Removes the highlights for all tabs in the model list. This method sets their {@link + * TabProperties#IS_HIGHLIGHTED} property to false. + */ + public void unhighlightTabs() { + for (ListItem listItem : mModelList) { + PropertyModel model = listItem.model; + if (isHighLighted(model)) { + model.set(IS_HIGHLIGHTED, false); + } + } + } + + private boolean isHighLighted(PropertyModel model) { + return model.containsKey(TAB_ID) + && model.containsKey(IS_HIGHLIGHTED) + && model.get(IS_HIGHLIGHTED); + } +}
diff --git a/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListHighlighterUnitTest.java b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListHighlighterUnitTest.java new file mode 100644 index 0000000..7fa08699 --- /dev/null +++ b/chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListHighlighterUnitTest.java
@@ -0,0 +1,121 @@ +// 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.chrome.browser.tasks.tab_management; + +import static org.junit.Assert.assertFalse; +import static org.junit.Assert.assertTrue; + +import static org.chromium.chrome.browser.tasks.tab_management.TabProperties.ALL_KEYS_TAB_GRID; + +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.mockito.junit.MockitoJUnit; +import org.mockito.junit.MockitoRule; + +import org.chromium.base.test.BaseRobolectricTestRunner; +import org.chromium.ui.modelutil.MVCListAdapter; +import org.chromium.ui.modelutil.MVCListAdapter.ListItem; +import org.chromium.ui.modelutil.PropertyModel; + +import java.util.Collections; +import java.util.Set; + +/** Unit tests for {@link TabListHighlighter}. */ +@RunWith(BaseRobolectricTestRunner.class) +public class TabListHighlighterUnitTest { + @Rule public MockitoRule mMockitoRule = MockitoJUnit.rule(); + + private MVCListAdapter.ModelList mModelList; + private TabListHighlighter mHighlightDelegate; + + private PropertyModel mModel1; + private PropertyModel mModel2; + private PropertyModel mModel3; + private PropertyModel mNonTabModel; + + @Before + public void setUp() { + mModelList = new MVCListAdapter.ModelList(); + mHighlightDelegate = new TabListHighlighter(mModelList); + + mModel1 = + new PropertyModel.Builder(ALL_KEYS_TAB_GRID).with(TabProperties.TAB_ID, 10).build(); + mModel2 = + new PropertyModel.Builder(ALL_KEYS_TAB_GRID).with(TabProperties.TAB_ID, 20).build(); + mModel3 = + new PropertyModel.Builder(ALL_KEYS_TAB_GRID).with(TabProperties.TAB_ID, 30).build(); + mNonTabModel = new PropertyModel.Builder(ALL_KEYS_TAB_GRID).build(); + + mModelList.add(new ListItem(0, mModel1)); + mModelList.add(new ListItem(0, mModel2)); + mModelList.add(new ListItem(0, mNonTabModel)); + mModelList.add(new ListItem(0, mModel3)); + } + + @Test + public void testHighlightTabs() { + mModel1.set(TabProperties.IS_HIGHLIGHTED, false); + mModel2.set(TabProperties.IS_HIGHLIGHTED, false); + mModel3.set(TabProperties.IS_HIGHLIGHTED, false); + mNonTabModel.set(TabProperties.IS_HIGHLIGHTED, false); + + Set<Integer> tabIdsToHighlight = Set.of(10, 30); + mHighlightDelegate.highlightTabs(tabIdsToHighlight); + + assertTrue(mModel1.get(TabProperties.IS_HIGHLIGHTED)); + assertFalse(mModel2.get(TabProperties.IS_HIGHLIGHTED)); + assertTrue(mModel3.get(TabProperties.IS_HIGHLIGHTED)); + assertFalse(mNonTabModel.get(TabProperties.IS_HIGHLIGHTED)); + } + + @Test + public void testHighlightTabs_emptyList() { + mModel1.set(TabProperties.IS_HIGHLIGHTED, false); + mModel2.set(TabProperties.IS_HIGHLIGHTED, false); + mModel3.set(TabProperties.IS_HIGHLIGHTED, false); + + Set<Integer> tabIdsToHighlight = Collections.emptySet(); + mHighlightDelegate.highlightTabs(tabIdsToHighlight); + + assertFalse(mModel1.get(TabProperties.IS_HIGHLIGHTED)); + assertFalse(mModel2.get(TabProperties.IS_HIGHLIGHTED)); + assertFalse(mModel3.get(TabProperties.IS_HIGHLIGHTED)); + } + + @Test + public void testHighlightTabs_noMatchingIds() { + mModel1.set(TabProperties.IS_HIGHLIGHTED, false); + mModel2.set(TabProperties.IS_HIGHLIGHTED, false); + mModel3.set(TabProperties.IS_HIGHLIGHTED, false); + + Set<Integer> tabIdsToHighlight = Set.of(99, 101); + mHighlightDelegate.highlightTabs(tabIdsToHighlight); + + assertFalse(mModel1.get(TabProperties.IS_HIGHLIGHTED)); + assertFalse(mModel2.get(TabProperties.IS_HIGHLIGHTED)); + assertFalse(mModel3.get(TabProperties.IS_HIGHLIGHTED)); + } + + @Test + public void testUnhighlightTabs() { + mModel1.set(TabProperties.IS_HIGHLIGHTED, true); + mModel2.set(TabProperties.IS_HIGHLIGHTED, false); + mModel3.set(TabProperties.IS_HIGHLIGHTED, true); + + mHighlightDelegate.unhighlightTabs(); + + assertFalse(mModel1.get(TabProperties.IS_HIGHLIGHTED)); + assertFalse(mModel2.get(TabProperties.IS_HIGHLIGHTED)); + assertFalse(mModel3.get(TabProperties.IS_HIGHLIGHTED)); + } + + @Test + public void testUnhighlightTabs_emptyModelList() { + mModelList.clear(); + mHighlightDelegate.unhighlightTabs(); + } +}
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 d792e54..d979636 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
@@ -1227,8 +1227,8 @@ @Nullable PropertyModel model = mModelList.getModelFromSyncId(syncId); if (model != null) { - Long archivalTimeMs = - mTabGroupSyncService.getGroup(syncId).archivalTimeMs; + SavedTabGroup tabGroup = mTabGroupSyncService.getGroup(syncId); + Long archivalTimeMs = tabGroup.archivalTimeMs; // If the tab group is archived, run archival reset logic and remove the // tab group from the model list. @@ -1236,6 +1236,11 @@ model.set(TabProperties.USE_SHRINK_CLOSE_ANIMATION, true); mModelList.removeAt(index); mTabGroupSyncService.updateArchivalStatus(syncId, false); + RecordUserAction.record( + "TabGroups.ArchivedTabGroupManualCloseOnInactiveSurface"); + RecordHistogram.recordCount1000Histogram( + "TabGroups.ArchivedTabGroupManualCloseOnInactiveSurface.TabGroupTabCount", + tabGroup.savedTabs.size()); } } }
diff --git a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/ArchivedTabsDialogCoordinatorTest.java b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/ArchivedTabsDialogCoordinatorTest.java index f5e44d9c9..29dbb4b 100644 --- a/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/ArchivedTabsDialogCoordinatorTest.java +++ b/chrome/android/features/tab_ui/javatests/src/org/chromium/chrome/browser/tasks/tab_management/ArchivedTabsDialogCoordinatorTest.java
@@ -86,6 +86,7 @@ import org.chromium.chrome.test.transit.page.WebPageStation; import org.chromium.chrome.test.util.ActivityTestUtils; import org.chromium.chrome.test.util.ChromeRenderTestRule; +import org.chromium.components.tab_group_sync.LocalTabGroupId; import org.chromium.components.tab_group_sync.SavedTabGroup; import org.chromium.components.tab_group_sync.SavedTabGroupTab; import org.chromium.components.tab_group_sync.TabGroupSyncService; @@ -409,8 +410,13 @@ mRobot.resultRobot.verifyTabListEditorIsHidden(); assertEquals(1, mUserActionTester.getActionCount("Tabs.OpenArchivedTabsSettingsMenuItem")); + HistogramWatcher histogramExpectation = + HistogramWatcher.newSingleRecordWatcher( + "Tabs.ArchiveSettings.TimeDeltaPreference", 0); + mArchivedTabModelOrchestrator.resetRescueArchivedTabsForTesting(); onView(withText("Never")).perform(click()); + histogramExpectation.assertExpected(); CriteriaHelper.pollUiThread(() -> mRegularTabModel.getCount() == 3); assertEquals(0, mArchivedTabModel.getCount()); @@ -852,7 +858,11 @@ tabSwitcherStation.expectArchiveMessageCard().openArchivedTabsDialog(); HistogramWatcher histogramExpectation = - HistogramWatcher.newSingleRecordWatcher("Tabs.CloseAllArchivedTabs.TabCount", 1); + HistogramWatcher.newBuilder() + .expectIntRecords("Tabs.CloseAllArchivedTabs.TabCount", 1) + .expectIntRecords("TabGroups.CloseAllArchivedTabGroups.TabGroupCount", 1) + .expectIntRecords("TabGroups.CloseAllArchivedTabGroups.TabGroupTabCount", 1) + .build(); onView(withText("2 inactive tabs")).check(matches(isDisplayed())); onView(withText("Close all inactive tabs")).perform(click()); @@ -891,8 +901,11 @@ mRobot.actionRobot.clickToolbarMenuButton().clickToolbarMenuItem("Select tabs"); HistogramWatcher histogramExpectation = - HistogramWatcher.newSingleRecordWatcher( - "Tabs.CloseArchivedTabsMenuItem.TabCount", 2); + HistogramWatcher.newBuilder() + .expectIntRecords("Tabs.CloseArchivedTabsMenuItem.TabCount", 2) + .expectIntRecords("TabGroups.CloseArchivedTabsMenuItem.TabGroupCount", 1) + .expectIntRecords("TabGroups.CloseArchivedTabsMenuItem.TabGroupTabCount", 1) + .build(); mRobot.actionRobot.clickItemAtAdapterPosition(0); mRobot.actionRobot.clickItemAtAdapterPosition(1); mRobot.actionRobot.clickItemAtAdapterPosition(2); @@ -933,8 +946,11 @@ mRobot.actionRobot.clickToolbarMenuButton().clickToolbarMenuItem("Select tabs"); HistogramWatcher histogramExpectation = - HistogramWatcher.newSingleRecordWatcher( - "Tabs.CloseArchivedTabsMenuItem.TabCount", 2); + HistogramWatcher.newBuilder() + .expectIntRecords("Tabs.CloseArchivedTabsMenuItem.TabCount", 2) + .expectIntRecords("TabGroups.CloseArchivedTabsMenuItem.TabGroupCount", 1) + .expectIntRecords("TabGroups.CloseArchivedTabsMenuItem.TabGroupTabCount", 1) + .build(); mRobot.actionRobot.clickItemAtAdapterPosition(0); mRobot.actionRobot.clickItemAtAdapterPosition(1); mRobot.actionRobot.clickItemAtAdapterPosition(2); @@ -970,8 +986,13 @@ onView(withText("2 inactive tabs")).check(matches(isDisplayed())); HistogramWatcher histogramExpectation = - HistogramWatcher.newSingleRecordWatcher( - "Tabs.RestoreAllArchivedTabsMenuItem.TabCount", 1); + HistogramWatcher.newBuilder() + .expectIntRecords("Tabs.RestoreAllArchivedTabsMenuItem.TabCount", 1) + .expectIntRecords( + "TabGroups.RestoreAllArchivedTabsMenuItem.TabGroupCount", 1) + .expectIntRecords( + "TabGroups.RestoreAllArchivedTabsMenuItem.TabGroupTabCount", 1) + .build(); assertEquals(1, mRegularTabModel.getCount()); // Mock the sync backend being initialized so the tab group is restored via @@ -1013,8 +1034,12 @@ mRobot.actionRobot.clickToolbarMenuButton().clickToolbarMenuItem("Select tabs"); HistogramWatcher histogramExpectation = - HistogramWatcher.newSingleRecordWatcher( - "Tabs.RestoreArchivedTabsMenuItem.TabCount", 1); + HistogramWatcher.newBuilder() + .expectIntRecords("Tabs.RestoreArchivedTabsMenuItem.TabCount", 1) + .expectIntRecords("TabGroups.RestoreArchivedTabsMenuItem.TabGroupCount", 1) + .expectIntRecords( + "TabGroups.RestoreArchivedTabsMenuItem.TabGroupTabCount", 1) + .build(); mRobot.actionRobot.clickItemAtAdapterPosition(0); mRobot.actionRobot.clickItemAtAdapterPosition(1); mRobot.resultRobot.verifyToolbarSelectionText("2 tabs"); @@ -1039,6 +1064,91 @@ assertEquals(1, mUserActionTester.getActionCount("Tabs.RestoreArchivedTabsMenuItem")); } + @Test + @MediumTest + @EnableFeatures({ChromeFeatureList.ANDROID_TAB_DECLUTTER_ARCHIVE_TAB_GROUPS}) + public void testCloseArchivedTabGroup_PressCloseButton() throws Exception { + when(mTabGroupSyncService.getAllGroupIds()).thenReturn(new String[] {SYNC_GROUP_ID1}); + SavedTabGroup savedTabGroup = + createSavedTabGroup(SYNC_GROUP_ID1, GROUP_TITLE1, SYNC_GROUP_COLOR1, 1, true); + addArchivedTab(new GURL("https://google.com"), "test 1"); + addArchivedTab(new GURL("https://google.com"), "test 2"); + + RegularTabSwitcherStation tabSwitcherStation = mInitialPage.openRegularTabSwitcher(); + tabSwitcherStation.expectArchiveMessageCard().openArchivedTabsDialog(); + ThreadUtils.runOnUiThreadBlocking(() -> notifyTabGroupSyncObserversWithInitialization()); + + assertEquals(1, mRegularTabModel.getCount()); + assertEquals(2, mArchivedTabModel.getCount()); + + HistogramWatcher histogramExpectation = + HistogramWatcher.newSingleRecordWatcher( + "TabGroups.ArchivedTabGroupManualCloseOnInactiveSurface.TabGroupTabCount", + 1); + + mRobot.actionRobot.clickViewIdAtAdapterPosition(0, R.id.action_button); + + verify(mTabGroupSyncService).updateArchivalStatus(SYNC_GROUP_ID1, false); + savedTabGroup.archivalTimeMs = null; + ThreadUtils.runOnUiThreadBlocking( + () -> notifyTabGroupSyncObserversWithChangedGroup(savedTabGroup)); + mRobot.resultRobot.verifyAdapterHasItemCount(2); + + assertEquals(1, mRegularTabModel.getCount()); + assertEquals(2, mArchivedTabModel.getCount()); + histogramExpectation.assertExpected(); + assertEquals( + 1, + mUserActionTester.getActionCount( + "TabGroups.ArchivedTabGroupManualCloseOnInactiveSurface")); + } + + @Test + @MediumTest + @EnableFeatures({ChromeFeatureList.ANDROID_TAB_DECLUTTER_ARCHIVE_TAB_GROUPS}) + public void testRestoreArchivedTabGroup_ClickIntoTabGroup() { + when(mTabGroupSyncService.getAllGroupIds()).thenReturn(new String[] {SYNC_GROUP_ID1}); + SavedTabGroup savedTabGroupInitial = + createSavedTabGroup(SYNC_GROUP_ID1, GROUP_TITLE1, SYNC_GROUP_COLOR1, 1, true); + SavedTabGroup savedTabGroupLocalIdSet = + createSavedTabGroup(SYNC_GROUP_ID1, GROUP_TITLE1, SYNC_GROUP_COLOR1, 1, true); + savedTabGroupLocalIdSet.localId = new LocalTabGroupId(new Token(123L, 123L)); + + addArchivedTab(new GURL("https://google.com"), "test 1"); + addArchivedTab(new GURL("https://google.com"), "test 2"); + + RegularTabSwitcherStation tabSwitcherStation = mInitialPage.openRegularTabSwitcher(); + tabSwitcherStation.expectArchiveMessageCard().openArchivedTabsDialog(); + ThreadUtils.runOnUiThreadBlocking(() -> notifyTabGroupSyncObserversWithInitialization()); + // Override getGroup mock defined in createSavedTabGroup to support changing state. + when(mTabGroupSyncService.getGroup(SYNC_GROUP_ID1)) + .thenReturn( + savedTabGroupInitial, + savedTabGroupInitial, + savedTabGroupInitial, + savedTabGroupLocalIdSet, + savedTabGroupLocalIdSet); + + assertEquals(1, mRegularTabModel.getCount()); + assertEquals(2, mArchivedTabModel.getCount()); + + HistogramWatcher histogramExpectation = + HistogramWatcher.newSingleRecordWatcher( + "TabGroups.RestoreSingleTabGroup.TabGroupTabCount", 1); + + mRobot.actionRobot.clickItemAtAdapterPosition(0); + + verify(mTabGroupSyncService).updateArchivalStatus(SYNC_GROUP_ID1, false); + savedTabGroupLocalIdSet.archivalTimeMs = null; + ThreadUtils.runOnUiThreadBlocking( + () -> notifyTabGroupSyncObserversWithChangedGroup(savedTabGroupLocalIdSet)); + + assertEquals(2, mRegularTabModel.getCount()); + assertEquals(2, mArchivedTabModel.getCount()); + histogramExpectation.assertExpected(); + assertEquals(1, mUserActionTester.getActionCount("TabGroups.RestoreSingleTabGroup")); + } + private Tab addArchivedTab(GURL url, String title) { return ThreadUtils.runOnUiThreadBlocking( () ->
diff --git a/chrome/android/features/tab_ui/tab_management_java_sources.gni b/chrome/android/features/tab_ui/tab_management_java_sources.gni index 117cec2d..c5939572 100644 --- a/chrome/android/features/tab_ui/tab_management_java_sources.gni +++ b/chrome/android/features/tab_ui/tab_management_java_sources.gni
@@ -173,6 +173,7 @@ "//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEmptyCoordinator.java", "//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEmptyIllustrationAnimationManager.java", "//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListGroupMenuCoordinator.java", + "//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListHighlighter.java", "//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListItemAnimator.java", "//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListMediator.java", "//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListModel.java",
diff --git a/chrome/android/java/res/drawable-hdpi/location_bar_incognito_badge.png b/chrome/android/java/res/drawable-hdpi/location_bar_incognito_badge.png index 7524390..724037bd 100644 --- a/chrome/android/java/res/drawable-hdpi/location_bar_incognito_badge.png +++ b/chrome/android/java/res/drawable-hdpi/location_bar_incognito_badge.png Binary files differ
diff --git a/chrome/android/java/res/drawable-mdpi/location_bar_incognito_badge.png b/chrome/android/java/res/drawable-mdpi/location_bar_incognito_badge.png index 5f3c5fe..77e03f1 100644 --- a/chrome/android/java/res/drawable-mdpi/location_bar_incognito_badge.png +++ b/chrome/android/java/res/drawable-mdpi/location_bar_incognito_badge.png Binary files differ
diff --git a/chrome/android/java/res/drawable-xhdpi/location_bar_incognito_badge.png b/chrome/android/java/res/drawable-xhdpi/location_bar_incognito_badge.png index 4d2682a1..6974f6e 100644 --- a/chrome/android/java/res/drawable-xhdpi/location_bar_incognito_badge.png +++ b/chrome/android/java/res/drawable-xhdpi/location_bar_incognito_badge.png Binary files differ
diff --git a/chrome/android/java/res/drawable-xxhdpi/location_bar_incognito_badge.png b/chrome/android/java/res/drawable-xxhdpi/location_bar_incognito_badge.png index a1cd7a7..37800fb 100644 --- a/chrome/android/java/res/drawable-xxhdpi/location_bar_incognito_badge.png +++ b/chrome/android/java/res/drawable-xxhdpi/location_bar_incognito_badge.png Binary files differ
diff --git a/chrome/android/java/res/drawable-xxxhdpi/location_bar_incognito_badge.png b/chrome/android/java/res/drawable-xxxhdpi/location_bar_incognito_badge.png index 1c5c303..987dc23a 100644 --- a/chrome/android/java/res/drawable-xxxhdpi/location_bar_incognito_badge.png +++ b/chrome/android/java/res/drawable-xxxhdpi/location_bar_incognito_badge.png Binary files differ
diff --git a/chrome/android/java/res/layout/contextual_search_callout_view.xml b/chrome/android/java/res/layout/contextual_search_callout_view.xml new file mode 100644 index 0000000..729f7077 --- /dev/null +++ b/chrome/android/java/res/layout/contextual_search_callout_view.xml
@@ -0,0 +1,33 @@ +<?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. +--> + +<LinearLayout + xmlns:android="http://schemas.android.com/apk/res/android" + android:id="@+id/contextual_search_callout" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:orientation="horizontal" + android:gravity="end|center_vertical" + android:visibility="invisible"> + <ImageView + android:id="@+id/contextual_search_callout_image" + android:layout_width="@dimen/contextual_search_callout_icon_size" + android:layout_height="@dimen/contextual_search_callout_icon_size" + android:scaleType="fitCenter" + android:src="@drawable/ic_logo_googleg_20dp" + android:importantForAccessibility="no"/> + <TextView + android:id="@+id/contextual_search_callout_text" + android:layout_width="wrap_content" + android:layout_height="wrap_content" + android:layout_marginStart="@dimen/contextual_search_callout_margin_start" + android:layout_marginEnd="@dimen/contextual_search_callout_margin_end" + android:textAppearance="@style/TextAppearance.TextMedium.Accent1" + android:maxLines="1" + android:ellipsize="end" + android:includeFontPadding="false" /> +</LinearLayout>
diff --git a/chrome/android/java/res/values/dimens.xml b/chrome/android/java/res/values/dimens.xml index eb05972..05951a6f 100644 --- a/chrome/android/java/res/values/dimens.xml +++ b/chrome/android/java/res/values/dimens.xml
@@ -41,6 +41,9 @@ <dimen name="contextual_search_term_caption_spacing"> @dimen/overlay_panel_caption_spacing </dimen> + <dimen name="contextual_search_callout_icon_size">18dp</dimen> + <dimen name="contextual_search_callout_margin_start">9dp</dimen> + <dimen name="contextual_search_callout_margin_end">24dp</dimen> <dimen name="contextual_search_padded_button_width"> @dimen/overlay_panel_padded_button_width </dimen>
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ZoomController.java b/chrome/android/java/src/org/chromium/chrome/browser/ZoomController.java index 0e54760..141e8e0 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ZoomController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ZoomController.java
@@ -8,6 +8,7 @@ import android.os.SystemClock; import org.chromium.build.annotations.NullMarked; +import org.chromium.build.annotations.Nullable; import org.chromium.components.zoom.ZoomConstants; import org.chromium.content_public.browser.WebContents; import org.chromium.ui.base.EventForwarder; @@ -21,24 +22,24 @@ @NullMarked public class ZoomController { /** - * Zooms in the WebContents by 25% (or less if that would result in - * zooming in more than possible). + * Zooms in the WebContents by 25% (or less if that would result in zooming in more than + * possible). * * @param webContents {@link WebContents} to zoom in. * @return True if there was a zoom change, false otherwise. */ - public static boolean zoomIn(WebContents webContents) { + public static boolean zoomIn(@Nullable WebContents webContents) { return pinchByDelta(webContents, ZoomConstants.ZOOM_IN_DELTA); } /** - * Zooms out the WebContents by 20% (or less if that would result in - * zooming out more than possible). + * Zooms out the WebContents by 20% (or less if that would result in zooming out more than + * possible). * * @param webContents {@link WebContents} to zoom out. * @return True if there was a zoom change, false otherwise. */ - public static boolean zoomOut(WebContents webContents) { + public static boolean zoomOut(@Nullable WebContents webContents) { return pinchByDelta(webContents, ZoomConstants.ZOOM_OUT_DELTA); } @@ -48,12 +49,12 @@ * @param webContents {@link WebContents} to reset the zoom of. * @return True if there was a zoom change, false otherwise. */ - public static boolean zoomReset(WebContents webContents) { + public static boolean zoomReset(@Nullable WebContents webContents) { // Negative value to reset zoom level. return pinchByDelta(webContents, ZoomConstants.ZOOM_RESET_DELTA); } - private static boolean pinchByDelta(WebContents webContents, float delta) { + private static boolean pinchByDelta(@Nullable WebContents webContents, float delta) { if (webContents == null) return false; EventForwarder eventForwarder = webContents.getEventForwarder(); long timeMs = SystemClock.uptimeMillis();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java index 050e69f0..397ae66 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/appmenu/AppMenuPropertiesDelegateImpl.java
@@ -1101,12 +1101,13 @@ */ @Nullable protected ListItem maybeBuildRequestDesktopSiteListItem( - Tab currentTab, boolean isNativePage, boolean showIcon) { + @Nullable Tab currentTab, boolean isNativePage, boolean showIcon) { // Hide request desktop site on all native pages. Also hide it for desktop Android, which // always requests desktop sites. boolean itemVisible = !isNativePage && !shouldShowReaderModePrefs(currentTab) + && currentTab != null && currentTab.getWebContents() != null && !BuildConfig.IS_DESKTOP_ANDROID;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/tabmodel/ArchivedTabModelOrchestrator.java b/chrome/android/java/src/org/chromium/chrome/browser/app/tabmodel/ArchivedTabModelOrchestrator.java index d05c11ed..21db046b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/app/tabmodel/ArchivedTabModelOrchestrator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/tabmodel/ArchivedTabModelOrchestrator.java
@@ -499,7 +499,7 @@ private void rescueArchivedTabGroups() { if (mTabGroupSyncService == null) return; - if (mRescueTabGroupsCalled) return; + if (mRescueTabGroupsCalled) return; // prevents calling when already called once mRescueTabGroupsCalled = true; // Clear all {@link SavedTabGroup}s of possible archived status as the rescue operation.
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/app/tabmodel/HeadlessTabDelegateFactory.java b/chrome/android/java/src/org/chromium/chrome/browser/app/tabmodel/HeadlessTabDelegateFactory.java index b9528aa2..4443a4d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/app/tabmodel/HeadlessTabDelegateFactory.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/app/tabmodel/HeadlessTabDelegateFactory.java
@@ -43,7 +43,7 @@ @Override public @Nullable NativePage createNativePage( - String url, NativePage candidatePage, Tab tab, PdfInfo pdfInfo) { + String url, @Nullable NativePage candidatePage, Tab tab, @Nullable PdfInfo pdfInfo) { return null; } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/complex_tasks/TaskTabHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/complex_tasks/TaskTabHelper.java index fc316833..eb7f5c1 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/complex_tasks/TaskTabHelper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/complex_tasks/TaskTabHelper.java
@@ -25,10 +25,11 @@ /** * Creates the {@link TaskTabHelper} for the given {@link Tab}. + * * @param tab the Tab to attach the helper to. * @param parentTab corresponding parent Tab for the Tab */ - public static void createForTab(Tab tab, Tab parentTab) { + public static void createForTab(Tab tab, @Nullable Tab parentTab) { if (parentTab == null) return; TabAttributes.from(tab) .set(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelRepaddingTextView.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelRepaddingTextView.java index 828ec0c..cafeda5 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelRepaddingTextView.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/OverlayPanelRepaddingTextView.java
@@ -18,7 +18,7 @@ public abstract class OverlayPanelRepaddingTextView extends OverlayPanelInflater { private static final float REPADDING_THRESHOLD = 0.5f; - private final float mPeekedEndButtonsWidth; + private float mPeekedEndButtonsWidth; private final float mExpandedEndButtonsWidth; private int mPaddingStart; @@ -55,9 +55,20 @@ } /** + * Sets the end padding to use when the overlay is peeking. + * + * @param paddingPx The padding in pixels. + */ + public void setPeekedEndPadding(int paddingPx) { + mPeekedEndButtonsWidth = paddingPx; + invalidate(); + } + + /** * Updates the text view during the transition of the Overlay from Peeked to Expanded states. - * @param percentage A value from 0 to 1 that indicates the degree to which the panel has - * been expanded. + * + * @param percentage A value from 0 to 1 that indicates the degree to which the panel has been + * expanded. */ public void onUpdateFromPeekToExpand(float percentage) { mIsPanelExpandedBeyondHalf = percentage > REPADDING_THRESHOLD;
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 c609424..bbedb009 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
@@ -16,15 +16,16 @@ import org.chromium.chrome.R; import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelAnimation; +import org.chromium.chrome.browser.compositor.bottombar.contextualsearch.ContextualSearchCalloutControl.CalloutListener; import org.chromium.chrome.browser.contextualsearch.QuickActionCategory; import org.chromium.chrome.browser.layouts.animation.CompositorAnimator; import org.chromium.ui.base.LocalizationUtils; import org.chromium.ui.resources.dynamics.DynamicResourceLoader; /** - * Controls the Search Bar in the Contextual Search Panel. - * This class holds instances of its subcomponents such as the main text, caption, icon - * and interaction controls such as the close box. + * Controls the Search Bar in the Contextual Search Panel. This class holds instances of its + * subcomponents such as the main text, caption, icon and interaction controls such as the close + * box. */ public class ContextualSearchBarControl { /** Full opacity -- fully visible. */ @@ -57,9 +58,12 @@ /** The {@link ContextualSearchImageControl} for the panel. */ private final ContextualSearchImageControl mImageControl; + /** The {@link ContextualSearchCalloutControl} for the panel. */ + private final ContextualSearchCalloutControl mCalloutControl; + /** - * The opacity of the Bar's Search Context. - * This text control may not be initialized until the opacity is set beyond 0. + * The opacity of the Bar's Search Context. This text control may not be initialized until the + * opacity is set beyond 0. */ private float mSearchBarContextOpacity; @@ -151,6 +155,10 @@ mQuickActionControl = new ContextualSearchQuickActionControl(context, loader); mCardIconControl = new ContextualSearchCardIconControl(context, loader); + mCalloutControl = + new ContextualSearchCalloutControl( + panel, context, container, loader, getCalloutListener()); + mTextLayerMinHeight = context.getResources() .getDimension(R.dimen.contextual_search_text_layer_min_height); @@ -166,6 +174,13 @@ } /** + * @return The {@link ContextualSearchCalloutControl} for the panel. + */ + public ContextualSearchCalloutControl getCalloutControl() { + return mCalloutControl; + } + + /** * Returns the minimum height that the text layer (containing the Search Context, Term and * Caption) should be. */ @@ -190,6 +205,7 @@ mCaptionControl.destroy(); mQuickActionControl.destroy(); mCardIconControl.destroy(); + mCalloutControl.destroy(); } /** @@ -221,6 +237,7 @@ mCaptionControl.onUpdateFromPeekToExpand(percentage); mSearchTermControl.onUpdateFromPeekToExpand(percentage); mContextControl.onUpdateFromPeekToExpand(percentage); + mCalloutControl.onUpdateFromPeekToExpand(percentage); } /** @@ -644,4 +661,16 @@ assert mInBarAnimationTestNotifier == null; mInBarAnimationTestNotifier = runnable; } + + /** Resizes the contextual search bar text when the callout is present. */ + private CalloutListener getCalloutListener() { + return new CalloutListener() { + @Override + public void onCapture(int widthPx) { + mSearchTermControl.setPeekedEndPadding(widthPx); + mCaptionControl.setPeekedEndPadding(widthPx); + mContextControl.setPeekedEndPadding(widthPx); + } + }; + } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchCalloutControl.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchCalloutControl.java new file mode 100644 index 0000000..ca78237 --- /dev/null +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/bottombar/contextualsearch/ContextualSearchCalloutControl.java
@@ -0,0 +1,137 @@ +// 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.chrome.browser.compositor.bottombar.contextualsearch; + +import static org.chromium.build.NullUtil.assumeNonNull; + +import android.content.Context; +import android.view.View; +import android.view.ViewGroup; +import android.widget.ImageView; +import android.widget.TextView; + +import androidx.annotation.Nullable; + +import org.chromium.build.annotations.NullMarked; +import org.chromium.chrome.R; +import org.chromium.chrome.browser.compositor.bottombar.OverlayPanelInflater; +import org.chromium.chrome.browser.flags.ChromeFeatureList; +import org.chromium.ui.resources.dynamics.DynamicResourceLoader; + +/** Controls the callout (e.g. "Latest results") shown in the {@link ContextualSearchBarControl}. */ +@NullMarked +public class ContextualSearchCalloutControl extends OverlayPanelInflater { + + interface CalloutListener { + /** Called when the callout is rendered. */ + void onCapture(int widthPx); + } + + /** Listener for updates to the callout. */ + private final CalloutListener mListener; + + /** Whether this control is enabled or not. */ + private final boolean mIsEnabled; + + /** Whether the alternate text variant is enabled or not. */ + private final boolean mIsTextVariantEnabled; + + @Nullable private TextView mTextView; + + @Nullable private ImageView mImageView; + + private int mCalloutWidthPx; + + private float mOpacity; + + /** + * @param panel The panel. + * @param context The Android Context used to inflate the View. + * @param container The container View used to inflate the View. + * @param resourceLoader The resource loader that will handle the snapshot capturing. + * @param listener The listener for capturing callout resize events. + */ + public ContextualSearchCalloutControl( + ContextualSearchPanel panel, + Context context, + ViewGroup container, + DynamicResourceLoader resourceLoader, + CalloutListener listener) { + super( + panel, + R.layout.contextual_search_callout_view, + R.id.contextual_search_callout, + context, + container, + resourceLoader); + mListener = listener; + mIsEnabled = ChromeFeatureList.isEnabled(ChromeFeatureList.TOUCH_TO_SEARCH_CALLOUT); + mIsTextVariantEnabled = ChromeFeatureList.sTouchToSearchCalloutTextVariant.getValue(); + + // Pre-inflate so that the contextual search text padding is adjusted to the callout width. + if (mIsEnabled) { + inflate(); + invalidate(); + } + } + + /** + * Updates the opacity of the callout based on the panel expansion. + * + * @param percentage The percentage of the panel that is expanded. + */ + public void onUpdateFromPeekToExpand(float percentage) { + // The callout animation completes during the first 50% of the peek to expand transition. + float animationProgressPercent = Math.min(percentage, .5f) / .5f; + // The callout starts off at 100% opacity and finishes at 0% opacity. + mOpacity = 1.f - animationProgressPercent; + } + + /** + * @return The opacity of the callout. + */ + public float getOpacity() { + return mOpacity; + } + + // ======================================================================================== + // OverlayPanelInflater overrides + // ======================================================================================== + + @Override + protected void onFinishInflate() { + super.onFinishInflate(); + + View view = assumeNonNull(getView()); + + mTextView = view.findViewById(R.id.contextual_search_callout_text); + mTextView.setText( + mIsTextVariantEnabled + ? view.getResources() + .getString(R.string.contextual_search_callout_text_variant) + : view.getResources().getString(R.string.contextual_search_callout_text)); + + mImageView = view.findViewById(R.id.contextual_search_callout_image); + } + + @Override + protected void onCaptureEnd() { + super.onCaptureEnd(); + + Context context = assumeNonNull(getContext()); + mCalloutWidthPx = + (int) + (assumeNonNull(mTextView).getWidth() + + assumeNonNull(mImageView).getWidth() + + context.getResources() + .getDimension( + R.dimen.contextual_search_callout_margin_start) + + context.getResources() + .getDimension( + R.dimen.contextual_search_callout_margin_end)); + + mListener.onCapture(mCalloutWidthPx); + } +}
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabTaskDescriptionHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabTaskDescriptionHelper.java index ed7464c..55b49b94 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabTaskDescriptionHelper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/CustomTabTaskDescriptionHelper.java
@@ -160,7 +160,8 @@ } @Override - public void onFaviconUpdated(Tab tab, Bitmap icon, GURL iconUrl) { + public void onFaviconUpdated( + Tab tab, @Nullable Bitmap icon, @Nullable GURL iconUrl) { if (icon == null) return; updateFavicon(icon); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabTabObserver.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabTabObserver.java index 116e351..ddc1be9 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabTabObserver.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/partialcustomtab/PartialCustomTabTabObserver.java
@@ -4,6 +4,7 @@ package org.chromium.chrome.browser.customtabs.features.partialcustomtab; + import org.chromium.base.Callback; import org.chromium.build.annotations.NullMarked; import org.chromium.build.annotations.Nullable; @@ -36,7 +37,9 @@ if (mImmWrapper == null) { mImmWrapper = new PartialCustomTabInputMethodWrapper( - tab.getContext(), tab.getWindowAndroid(), mShowSoftInputCallback); + tab.getContext(), + tab.getWindowAndroidChecked(), + mShowSoftInputCallback); } if (mCurrentTab != tab) { updateImmWrapper(tab);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/ButtonVisibilityRule.java b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/ButtonVisibilityRule.java index 8b666c3..a0d0eb09 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/ButtonVisibilityRule.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/customtabs/features/toolbar/ButtonVisibilityRule.java
@@ -186,6 +186,16 @@ } } + /** + * Return {@code true} if the given button was suppressed (hidden) by this rule checker. + * + * @param index Index of the button. + */ + public boolean isSuppressed(int index) { + Button button = mButtons.get(index); + return button != null && !button.mVisible && button.mSuppressed; + } + /** Refresh visibility of buttons with the state updated so far. */ public void refresh() { if (!mActivated) return;
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 4f66433..100cac0 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
@@ -1505,12 +1505,12 @@ } private void updateOptionalButton(ButtonData buttonData) { - if (mOptionalButtonCoordinator == null && !initializeOptionalButton()) { + if ((mOptionalButtonCoordinator == null && !initializeOptionalButton()) + || mButtonVisibilityRule.isSuppressed(ButtonId.MTB)) { // See if we should show an indicator if optional button cannot be shown. This check // needs to be invoked _after_ optional button initialization is attempted, in order // to determine its visibility in case it gets hidden due to toolbar width/button - // count - // constraints. + // count constraints. maybeShowActionMenuIndicator(buttonData.getButtonSpec().getButtonVariant()); return; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/dom_distiller/ReaderModeManager.java b/chrome/android/java/src/org/chromium/chrome/browser/dom_distiller/ReaderModeManager.java index 4db086b..3deee18 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/dom_distiller/ReaderModeManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/dom_distiller/ReaderModeManager.java
@@ -624,13 +624,17 @@ // button for this site on other tabs. removeUrlFromMutedSites(mDistillerUrl); - if (!SysUtils.isLowEndDevice()) { + if (!SysUtils.isLowEndDevice() && !shouldUseRegularTabsForDistillation()) { distillInCustomTab(); } else { navigateToReaderMode(); } } + private boolean shouldUseRegularTabsForDistillation() { + return DomDistillerFeatures.sReaderModeDistillInApp.isEnabled(); + } + /** Navigate the current tab to a Reader Mode URL. */ private void navigateToReaderMode() { WebContents webContents = mTab.getWebContents();
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 d3a55b6..915909f299 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
@@ -748,7 +748,7 @@ mResultBar = new FindResultBar( getContext(), - mCurrentTab.getContentView(), + assumeNonNull(mCurrentTab.getContentView()), mWindowAndroid, mFindInPageBridge); } else if (!visibility) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/GestureNavigationUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/GestureNavigationUtils.java index 2714cbf..0481072 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/GestureNavigationUtils.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/GestureNavigationUtils.java
@@ -8,6 +8,7 @@ import android.os.Build.VERSION; import android.os.Build.VERSION_CODES; +import android.view.Window; import org.chromium.base.SysUtils; import org.chromium.build.annotations.NullMarked; @@ -35,9 +36,10 @@ if (tab == null) return false; if (!areBackForwardTransitionsEnabled()) return false; // If in gesture mode, only U and above support transition. - if (tab.getWindowAndroid().getWindow() == null) return false; + Window window = tab.getWindowAndroidChecked().getWindow(); + if (window == null) return false; if (VERSION.SDK_INT < VERSION_CODES.UPSIDE_DOWN_CAKE - && UiUtils.isGestureNavigationMode(tab.getWindowAndroid().getWindow())) { + && UiUtils.isGestureNavigationMode(window)) { return false; } if (!allowTransitionFromNativePages() && tab.isNativePage()) return false;
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 04e66e7d..f0e7c58 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
@@ -22,6 +22,7 @@ import android.view.MotionEvent; import android.view.View; import android.view.ViewGroup; +import android.view.Window; import androidx.annotation.IntDef; import androidx.annotation.VisibleForTesting; @@ -320,7 +321,7 @@ BackPressMetrics.recordNavStatusOnGestureStart( assumeNonNull(mTab.getWebContents()) .hasUncommittedNavigationInPrimaryMainFrame(), - assumeNonNull(mTab.getWindowAndroid().getActivity().get()).getWindow()); + getWindow(mTab)); mStartNavDuringOngoingGesture = false; mBackGestureForTabHistoryInProgress = true; } @@ -425,8 +426,7 @@ if (mBackGestureForTabHistoryInProgress) { assumeNonNull(mTab); BackPressMetrics.recordNavStatusDuringGesture( - mStartNavDuringOngoingGesture, - assumeNonNull(mTab.getWindowAndroid().getActivity().get()).getWindow()); + mStartNavDuringOngoingGesture, getWindow(mTab)); } mBackGestureForTabHistoryInProgress = false; mStartNavDuringOngoingGesture = false; @@ -494,7 +494,7 @@ */ private float getProgress() { assert mTab != null; - Activity activity = mTab.getWindowAndroid().getActivity().get(); + Activity activity = mTab.getWindowAndroidChecked().getActivity().get(); assert activity != null; int width; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { @@ -537,4 +537,8 @@ } return forward; } + + private static final Window getWindow(Tab tab) { + return assumeNonNull(tab.getWindowAndroidChecked().getActivity().get()).getWindow(); + } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/RtlGestureNavIphController.java b/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/RtlGestureNavIphController.java index 86771bd..b4a58db 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/RtlGestureNavIphController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/gesturenav/RtlGestureNavIphController.java
@@ -24,6 +24,7 @@ import org.chromium.components.feature_engagement.FeatureConstants; import org.chromium.components.feature_engagement.Tracker; import org.chromium.content_public.browser.NavigationHandle; +import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.modaldialog.ModalDialogManager; /** @@ -118,7 +119,8 @@ private void show() { Tab tab = mActivityTabProvider.get(); assumeNonNull(tab); - ModalDialogManager modalDialogManager = tab.getWindowAndroid().getModalDialogManager(); + WindowAndroid windowAndroid = tab.getWindowAndroidChecked(); + ModalDialogManager modalDialogManager = windowAndroid.getModalDialogManager(); assumeNonNull(modalDialogManager); RtlGestureNavIphDialog dialog = new RtlGestureNavIphDialog(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/pdf/PdfPageIphController.java b/chrome/android/java/src/org/chromium/chrome/browser/pdf/PdfPageIphController.java index 3f75426..dae6ae65 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/pdf/PdfPageIphController.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/pdf/PdfPageIphController.java
@@ -4,6 +4,8 @@ package org.chromium.chrome.browser.pdf; +import static org.chromium.build.NullUtil.assumeNonNull; + import android.app.Activity; import android.content.Context; import android.os.Handler; @@ -103,7 +105,9 @@ new ActivityTabTabObserver(mActivityTabProvider) { @Override public void onPageLoadFinished(Tab tab, GURL url) { - if (tab == null || !tab.isNativePage() || !tab.getNativePage().isPdf()) { + if (tab == null + || !tab.isNativePage() + || !assumeNonNull(tab.getNativePage()).isPdf()) { return; } showDownloadIph(profile);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/stylus_handwriting/StylusWritingCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/stylus_handwriting/StylusWritingCoordinator.java index 761e43d..5880d01 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/stylus_handwriting/StylusWritingCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/stylus_handwriting/StylusWritingCoordinator.java
@@ -4,6 +4,8 @@ package org.chromium.chrome.browser.stylus_handwriting; +import static org.chromium.build.NullUtil.assumeNonNull; + import android.app.Activity; import org.chromium.base.supplier.ObservableSupplier; @@ -49,7 +51,7 @@ public void onContentChanged(Tab tab) { if (tab.getWebContents() == null) return; mStylusWritingController.onWebContentsChanged(tab.getWebContents()); - tab.getContentView() + assumeNonNull(tab.getContentView()) .setStylusWritingIconSupplier( mStylusWritingController::resolvePointerIcon); } @@ -58,7 +60,7 @@ tab -> { if (tab == null || tab.getWebContents() == null) return; mStylusWritingController.onWebContentsChanged(tab.getWebContents()); - tab.getContentView() + assumeNonNull(tab.getContentView()) .setStylusWritingIconSupplier( mStylusWritingController::resolvePointerIcon); });
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 6143a4f..33f8527e 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
@@ -4,6 +4,8 @@ package org.chromium.chrome.browser.tab; +import static org.chromium.build.NullUtil.assumeNonNull; + import android.app.Activity; import android.content.Intent; @@ -76,13 +78,15 @@ } @Override - public WebContents getWebContents() { + public @Nullable WebContents getWebContents() { return mTab.getWebContents(); } @Override public @Nullable ExternalNavigationHandler createExternalNavigationHandler() { - return mTab.getDelegateFactory().createExternalNavigationHandler(mTab); + TabDelegateFactory delegateFactory = mTab.getDelegateFactory(); + if (delegateFactory == null) return null; + return delegateFactory.createExternalNavigationHandler(mTab); } @Override @@ -96,7 +100,7 @@ } @Override - public Activity getActivity() { + public @Nullable Activity getActivity() { return mTab.getActivity(); } @@ -113,7 +117,7 @@ @Override public void closeTab() { if (mTab.isClosing()) return; - mTab.getActivity() + assumeNonNull(mTab.getActivity()) .getTabModelSelector() .tryCloseTab( TabClosureParams.closeTab(mTab).allowUndo(false).build(), @@ -184,10 +188,11 @@ PostTask.postTask( TaskTraits.UI_DEFAULT, () -> { + Activity activity = assumeNonNull(getActivity()); if (!isChromeTabbedActivityRunning) { - getActivity().finishAndRemoveTask(); + activity.finishAndRemoveTask(); } else { - getActivity().moveTaskToBack(false); + activity.moveTaskToBack(false); } closeTab(); });
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/RequestDesktopUtils.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/RequestDesktopUtils.java index f00e3b8..67d50c05 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/RequestDesktopUtils.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/RequestDesktopUtils.java
@@ -388,7 +388,7 @@ * Determine whether RDS window setting should be applied. When returning 'true' the mobile user * agent should be used for the current window size. */ - static boolean shouldApplyWindowSetting(Profile profile, GURL url, Context context) { + static boolean shouldApplyWindowSetting(Profile profile, @Nullable GURL url, Context context) { // Skip window setting on Automotive and revisit if / when they add split screen. if (BuildInfo.getInstance().isAutomotive) { return false;
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabArchiverImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabArchiverImpl.java index f3e4730..a1646b8b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabArchiverImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabArchiverImpl.java
@@ -253,14 +253,21 @@ if (ChromeFeatureList.sAndroidTabDeclutterArchiveTabGroups.isEnabled() && mTabGroupSyncService != null) { + int archivedTabGroups = 0; for (Token tabGroupId : archivedTabGroupIds) { LocalTabGroupId localTabGroupId = new LocalTabGroupId(tabGroupId); SavedTabGroup savedTabGroup = mTabGroupSyncService.getGroup(localTabGroupId); if (savedTabGroup != null && savedTabGroup.syncId != null) { mTabGroupSyncService.updateArchivalStatus( savedTabGroup.syncId, /* archivalStatus= */ true); + archivedTabGroups++; + RecordHistogram.recordCount1000Histogram( + "TabGroups.TabGroupDeclutter.ArchivedTabGroupTabCount", + savedTabGroup.savedTabs.size()); } } + RecordHistogram.recordCount1000Histogram( + "TabGroups.TabGroupDeclutter.ArchivedTabGroups", archivedTabGroups); } int tabCount = tabs.size();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabBrowserControlsConstraintsHelper.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabBrowserControlsConstraintsHelper.java index d573d55..90713e7f 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabBrowserControlsConstraintsHelper.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabBrowserControlsConstraintsHelper.java
@@ -4,6 +4,8 @@ package org.chromium.chrome.browser.tab; +import static org.chromium.build.NullUtil.assumeNonNull; + import org.jni_zero.NativeMethods; import org.chromium.base.Callback; @@ -115,7 +117,7 @@ mTab.addObserver( new EmptyTabObserver() { @Override - public void onInitialized(Tab tab, String appId) { + public void onInitialized(Tab tab, @Nullable String appId) { updateVisibilityDelegate(); } @@ -198,7 +200,8 @@ mVisibilityDelegate.removeObserver(mConstraintsChangedCallback); } mVisibilityDelegate = - mTab.getDelegateFactory().createBrowserControlsVisibilityDelegate(mTab); + assumeNonNull(mTab.getDelegateFactory()) + .createBrowserControlsVisibilityDelegate(mTab); if (mVisibilityDelegate != null) { mVisibilityDelegate.addObserver(mConstraintsChangedCallback); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabBuilder.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabBuilder.java index 81c7cbc9e..89e3765 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabBuilder.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabBuilder.java
@@ -190,6 +190,7 @@ // Initializes Tab. Its user data objects are also initialized through the event // |onInitialized| of TabObserver they register. + assert mDelegateFactory != null; tab.initialize( parent, mCreationType,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabContextMenuItemDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabContextMenuItemDelegate.java index fc09184..df7a7d2 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabContextMenuItemDelegate.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabContextMenuItemDelegate.java
@@ -4,6 +4,8 @@ package org.chromium.chrome.browser.tab; +import static org.chromium.build.NullUtil.assumeNonNull; + import android.app.Activity; import android.content.Context; import android.content.Intent; @@ -13,7 +15,6 @@ import android.provider.ContactsContract; import android.text.TextUtils; -import androidx.annotation.Nullable; import androidx.browser.customtabs.CustomTabsIntent; import org.chromium.base.ContextUtils; @@ -21,6 +22,8 @@ import org.chromium.base.PackageManagerUtils; import org.chromium.base.metrics.RecordUserAction; import org.chromium.base.supplier.Supplier; +import org.chromium.build.annotations.NullMarked; +import org.chromium.build.annotations.Nullable; import org.chromium.chrome.browser.DefaultBrowserInfo; import org.chromium.chrome.browser.IntentHandler; import org.chromium.chrome.browser.bookmarks.BookmarkManagerOpenerImpl; @@ -61,6 +64,7 @@ /** * A default {@link ContextMenuItemDelegate} that supports the context menu functionality in Tab. */ +@NullMarked public class TabContextMenuItemDelegate implements ContextMenuItemDelegate { private final Activity mActivity; private final TabImpl mTab; @@ -98,7 +102,7 @@ @Override public WebContents getWebContents() { - return mTab.getWebContents(); + return assumeNonNull(mTab.getWebContents()); } @Override @@ -166,7 +170,7 @@ public boolean supportsCall() { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("tel:")); - return mTab.getWindowAndroid().canResolveActivity(intent); + return mTab.getWindowAndroidChecked().canResolveActivity(intent); } @Override @@ -181,7 +185,7 @@ public boolean supportsSendEmailMessage() { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("mailto:test@example.com")); - return mTab.getWindowAndroid().canResolveActivity(intent); + return mTab.getWindowAndroidChecked().canResolveActivity(intent); } @Override @@ -196,7 +200,7 @@ public boolean supportsSendTextMessage() { Intent intent = new Intent(Intent.ACTION_VIEW); intent.setData(Uri.parse("sms:")); - return mTab.getWindowAndroid().canResolveActivity(intent); + return mTab.getWindowAndroidChecked().canResolveActivity(intent); } @Override @@ -210,7 +214,7 @@ public boolean supportsAddToContacts() { Intent intent = new Intent(Intent.ACTION_INSERT); intent.setType(ContactsContract.Contacts.CONTENT_TYPE); - return mTab.getWindowAndroid().canResolveActivity(intent); + return mTab.getWindowAndroidChecked().canResolveActivity(intent); } @Override @@ -275,7 +279,7 @@ Activity activity = TabUtils.getActivity(mTab); chromeAsyncTabLauncher.launchTabInOtherWindow( loadUrlParams, - activity, + assumeNonNull(activity), mTab.getParentId(), MultiWindowUtils.getAdjacentWindowActivity(activity)); } @@ -412,7 +416,7 @@ .notifyEvent(EventConstants.READ_LATER_CONTEXT_MENU_TAPPED); // Add to offline pages. - RequestCoordinatorBridge.getForProfile(profile) + assumeNonNull(RequestCoordinatorBridge.getForProfile(profile)) .savePageLater( url.getSpec(), OfflinePageBridge.BOOKMARK_NAMESPACE,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabHelpers.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabHelpers.java index 6cc7b84..8893e9e8 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabHelpers.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabHelpers.java
@@ -6,6 +6,8 @@ import android.app.Activity; +import org.chromium.build.annotations.NullMarked; +import org.chromium.build.annotations.Nullable; import org.chromium.chrome.browser.SwipeRefreshHandler; import org.chromium.chrome.browser.accessibility.AccessibilityTabHelper; import org.chromium.chrome.browser.complex_tasks.TaskTabHelper; @@ -21,15 +23,17 @@ import org.chromium.chrome.browser.ui.edge_to_edge.EdgeToEdgeUtils; /** Helper class that initializes various tab UserData objects. */ +@NullMarked public final class TabHelpers { private TabHelpers() {} /** * Creates Tab helper objects upon Tab creation. + * * @param tab {@link Tab} to create helpers for. * @param parentTab {@link Tab} parent tab */ - static void initTabHelpers(Tab tab, Tab parentTab) { + static void initTabHelpers(Tab tab, @Nullable Tab parentTab) { TabUma.createForTab(tab); TabStateAttributes.createForTab(tab, ((TabImpl) tab).getCreationState()); TabDistillabilityProvider.createForTab(tab);
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 650e3e9..d0d89bb 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
@@ -4,6 +4,8 @@ package org.chromium.chrome.browser.tab; +import static org.chromium.build.NullUtil.assumeNonNull; + import android.annotation.SuppressLint; import android.app.Activity; import android.content.ComponentName; @@ -22,8 +24,6 @@ import androidx.annotation.ColorInt; import androidx.annotation.IntDef; -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; import org.jni_zero.CalledByNative; @@ -45,6 +45,10 @@ import org.chromium.base.supplier.ObservableSupplier; import org.chromium.base.supplier.Supplier; import org.chromium.base.version_info.VersionInfo; +import org.chromium.build.annotations.EnsuresNonNullIf; +import org.chromium.build.annotations.Initializer; +import org.chromium.build.annotations.NullMarked; +import org.chromium.build.annotations.Nullable; import org.chromium.chrome.R; import org.chromium.chrome.browser.ActivityUtils; import org.chromium.chrome.browser.WarmupManager; @@ -113,6 +117,7 @@ * Implementation of the interface {@link Tab}. Contains and manages a {@link ContentView}. This * class is not intended to be extended. */ +@NullMarked class TabImpl implements Tab { /** Used for logging. */ private static final String TAG = "Tab"; @@ -143,7 +148,7 @@ private final Profile mProfile; /** The tab model this tab is currently attached to. */ - private @Nullable ObservableSupplier<Tab> mCurrentTabSupplier; + private @Nullable ObservableSupplier<@Nullable Tab> mCurrentTabSupplier; /** * An Application {@link Context}. Unlike {@link #mActivity}, this is the only one that is @@ -152,10 +157,10 @@ private final Context mThemedApplicationContext; /** Gives {@link Tab} a way to interact with the Android window. */ - private WindowAndroid mWindowAndroid; + private @Nullable WindowAndroid mWindowAndroid; /** The current native page (e.g. chrome-native://newtab), or {@code null} if there is none. */ - private NativePage mNativePage; + private @Nullable NativePage mNativePage; /** * True after a native page has been hidden, before a new background color has been explicitly @@ -165,17 +170,17 @@ private boolean mWaitingOnBgColorAfterHidingNativePage; /** {@link WebContents} showing the current page, or {@code null} if the tab is frozen. */ - private WebContents mWebContents; + private @Nullable WebContents mWebContents; /** The parent view of the ContentView and the InfoBarContainer. */ - private ContentView mContentView; + private @Nullable ContentView mContentView; /** The view provided by {@link TabViewManager} to be shown on top of Content view. */ - private View mCustomView; + private @Nullable View mCustomView; - private @ColorInt Integer mCustomViewBackgroundColor; + private @Nullable @ColorInt Integer mCustomViewBackgroundColor; - AutofillProvider mAutofillProvider; + @Nullable AutofillProvider mAutofillProvider; /** * The {@link TabViewManager} associated with this Tab that is responsible for managing custom @@ -188,7 +193,7 @@ protected final ObserverList<TabObserver> mObservers = new ObserverList<>(); // Content layer Delegates - private TabWebContentsDelegateAndroidImpl mWebContentsDelegate; + private @Nullable TabWebContentsDelegateAndroidImpl mWebContentsDelegate; private boolean mIsClosing; private boolean mDidCloseWhileDetached; @@ -206,7 +211,7 @@ private @Nullable @TabCreationState Integer mCreationState; /** URL load to be performed lazily when the Tab is next shown. */ - private LoadUrlParams mPendingLoadParams; + private @Nullable LoadUrlParams mPendingLoadParams; /** True while a page load is in progress. */ private boolean mIsLoading; @@ -276,13 +281,13 @@ * WebContents around. Upon tab switch WebContents will be unfrozen and the variable will be set * to null. */ - private WebContentsState mWebContentsState; + private @Nullable WebContentsState mWebContentsState; /** Title of the ContentViews webpage. */ - private String mTitle; + private String mTitle = ""; /** URL of the page currently loading. Used as a fall-back in case tab restore fails. */ - private GURL mUrl; + private @Nullable GURL mUrl; private long mLastNavigationCommittedTimestampMillis = INVALID_TIMESTAMP; @@ -300,15 +305,17 @@ */ private boolean mIsAlreadyCreatingNativePage; - private String mPendingNativePageHost; + private @Nullable String mPendingNativePageHost; - private SmoothTransitionDelegate mNativePageSmoothTransitionDelegate; + private @Nullable SmoothTransitionDelegate mNativePageSmoothTransitionDelegate; /** * Notified when the content sensitivity changes, and sets the content sensitivity property on * the {@link TabState}. + * + * <p>Can be non-null once V is the minimum SDK. */ - private SensitiveContentClient.Observer mSensitiveContentClientObserver; + private SensitiveContentClient.@Nullable Observer mSensitiveContentClientObserver; /** Tracks the origin of a background color change. */ @IntDef({ @@ -335,7 +342,7 @@ * @param launchType Type indicating how this tab was launched. */ @SuppressLint("HandlerLeak") - TabImpl(int id, @NonNull Profile profile, @TabLaunchType int launchType) { + TabImpl(int id, Profile profile, @TabLaunchType int launchType) { mId = TabIdManager.getInstance().generateValidId(id); mProfile = profile; assert mProfile != null; @@ -365,13 +372,13 @@ @Override public void onViewDetachedFromWindow(View view) { - if (isNativePage() && getNativePage().getView() == view) { + if (isNativePage() && assumeNonNull(getNativePage()).getView() == view) { if (mNativePageSmoothTransitionDelegate != null) { mNativePageSmoothTransitionDelegate.cancel(); mNativePageSmoothTransitionDelegate = null; } else { // reset ntp view state. - getView().setAlpha(1f); + assumeNonNull(getView()).setAlpha(1f); } } mIsViewAttachedToWindow = false; @@ -409,7 +416,7 @@ } @Override - public WebContents getWebContents() { + public @Nullable WebContents getWebContents() { return mWebContents; } @@ -417,11 +424,12 @@ public Context getContext() { if (getWindowAndroid() == null) return mThemedApplicationContext; Context context = getWindowAndroid().getContext().get(); + assumeNonNull(context); return context == context.getApplicationContext() ? mThemedApplicationContext : context; } @Override - public WindowAndroid getWindowAndroid() { + public @Nullable WindowAndroid getWindowAndroid() { return mWindowAndroid; } @@ -480,12 +488,12 @@ } @Override - public ContentView getContentView() { + public @Nullable ContentView getContentView() { return mContentView; } @Override - public View getView() { + public @Nullable View getView() { if (mCustomView != null) return mCustomView; if (mNativePage != null && !mNativePage.isFrozen()) return mNativePage.getView(); @@ -537,12 +545,13 @@ } @Override - public NativePage getNativePage() { + public @Nullable NativePage getNativePage() { return mNativePage; } @Override @CalledByNative + @EnsuresNonNullIf("mNativePage") public boolean isNativePage() { return mNativePage != null; } @@ -556,7 +565,7 @@ public void freezeNativePage() { if (mNativePage == null || mNativePage.isFrozen() - || mNativePage.getView().getParent() != null) { + || assumeNonNull(mNativePage.getView()).getParent() != null) { return; } mNativePage = FrozenNativePage.freeze(mNativePage); @@ -642,7 +651,7 @@ return mIsDetached; } - private void updateIsDetached(WindowAndroid window) { + private void updateIsDetached(@Nullable WindowAndroid window) { // HiddenTabHolder relies on isDetached() being true to determine whether the tab is // a background tab during initWebContents() before invoking ReparentingTask#detach(). // In this scenario, the tab owns its own WindowAndroid and has no activity attachment. @@ -693,7 +702,7 @@ // parent tab. if (mDelegateFactory == null) { mDelegateFactory = ((TabImpl) parent).getDelegateFactory(); - setDelegateFactory(mDelegateFactory); + setDelegateFactory(assumeNonNull(mDelegateFactory)); } } } @@ -793,7 +802,7 @@ mIsLoading = false; // In case extracting the WebContentsState fails make sure we reload to the same URL. if (mWebContentsState == null) { - mPendingLoadParams = new LoadUrlParams(mUrl); + mPendingLoadParams = new LoadUrlParams(mUrl == null ? GURL.emptyGURL() : mUrl); } else { // getWebContentsState should already have consumed the pending load params if one // existed. Only one of mPendingLoadParams and mWebContentsState should be populated at @@ -818,7 +827,7 @@ Referrer referrer = params.getReferrer(); mWebContentsState = WebContentsStateBridge.appendPendingNavigation( - mWebContentsState, + assumeNonNull(mWebContentsState), title, params.getUrl(), referrer != null ? referrer.getUrl() : null, @@ -835,7 +844,7 @@ if (success) { // The pending load params were consumed to make the WebContentsState. Invalidate them. mPendingLoadParams = null; - mUrl = new GURL(mWebContentsState.getVirtualUrlFromState()); + mUrl = new GURL(assumeNonNull(mWebContentsState).getVirtualUrlFromState()); } else { // Since we are not allowed to auto-navigate the only remaining fallback is to clobber // all navigation state and treat the tab as if it is in a pending load state. All the @@ -849,7 +858,7 @@ } observers.rewind(); notifyFaviconChanged(); - updateTitle(title); + updateTitle(title == null ? "" : title); while (observers.hasNext()) { observers.next().onNavigationEntriesAppended(this); @@ -886,7 +895,9 @@ // physical backing size set, which means it will never produce any frames. In this case, // set the physical backing size to an estimate of what it would be if it were shown. if (caller == TabLoadIfNeededCaller.MEDIA_CAPTURE_PICKER && !hasBacking()) { + assumeNonNull(mWindowAndroid); var display = mWindowAndroid.getDisplay(); + assumeNonNull(mWebContents); int width = (int) (mWebContents.getWidth() * display.getDipScale()); int height = (int) (mWebContents.getHeight() * display.getDipScale()); TabImplJni.get() @@ -956,7 +967,7 @@ @Override public float getProgress() { - return !isLoading() ? 1 : (int) mWebContents.getLoadProgress(); + return !isLoading() ? 1 : (int) assumeNonNull(mWebContents).getLoadProgress(); } @Override @@ -997,7 +1008,7 @@ if (webContents == null) return; if (mIsHidden) { webContents.updateWebContentsVisibility(Visibility.HIDDEN); - } else if (!mIsDetached && mWindowAndroid.getOcclusionSupplier().get()) { + } else if (!mIsDetached && assumeNonNull(mWindowAndroid).getOcclusionSupplier().get()) { // If we are not attached to a window, occlusion does not make sense. webContents.updateWebContentsVisibility(Visibility.OCCLUDED); } else { @@ -1146,7 +1157,7 @@ * TabModel}. */ @Deprecated - ChromeActivity getActivity() { + @Nullable ChromeActivity getActivity() { if (getWindowAndroid() == null) return null; Activity activity = ContextUtils.activityFromContext(getWindowAndroid().getContext().get()); if (activity instanceof ChromeActivity) return (ChromeActivity) activity; @@ -1195,6 +1206,7 @@ * @param initializeRenderer Determines whether or not we initialize renderer with {@link * WebContents} creation. */ + @Initializer @VisibleForTesting(otherwise = VisibleForTesting.PACKAGE_PRIVATE) void initialize( @Nullable Tab parent, @@ -1267,6 +1279,7 @@ } } + assumeNonNull(webContents); initWebContents(webContents); // Avoid an empty title by updating the title here. This could happen if restoring from // a WebContents that has no renderer and didn't force a reload. This happens on @@ -1313,8 +1326,9 @@ mWebContentsState = state.contentsState; setTimestampMillis(state.timestampMillis); setLastNavigationCommittedTimestampMillis(state.lastNavigationCommittedTimestampMillis); + assumeNonNull(state.contentsState); mUrl = new GURL(state.contentsState.getVirtualUrlFromState()); - setTitle(state.contentsState.getDisplayTitleFromState()); + setTitle(assumeNonNull(state.contentsState.getDisplayTitleFromState())); mTabLaunchTypeAtCreation = state.tabLaunchTypeAtCreation; setRootId(state.rootId == Tab.INVALID_TAB_ID ? mId : state.rootId); setTabGroupId(state.tabGroupId); @@ -1339,7 +1353,7 @@ } private static void updateImportance( - WebContents webContents, @ChildProcessImportance int importance) { + @Nullable WebContents webContents, @ChildProcessImportance int importance) { if (webContents == null || ChromeFeatureList.isEnabled(ChromeFeatureList.PROCESS_RANK_POLICY_ANDROID)) { // When ProcessRankPolicyAndroid of performance manager is enabled, the policy updates @@ -1378,12 +1392,12 @@ updateIsDetached(windowAndroid); } - TabDelegateFactory getDelegateFactory() { + @Nullable TabDelegateFactory getDelegateFactory() { return mDelegateFactory; } @VisibleForTesting - TabWebContentsDelegateAndroidImpl getTabWebContentsDelegateAndroid() { + @Nullable TabWebContentsDelegateAndroidImpl getTabWebContentsDelegateAndroid() { return mWebContentsDelegate; } @@ -1469,7 +1483,11 @@ } // Start the cross-fade animation after the invoking animation is done. - switch (getWebContents().getCurrentBackForwardTransitionStage()) { + WebContents webContents = getWebContents(); + assumeNonNull(webContents); + View view = getView(); + assumeNonNull(view); + switch (webContents.getCurrentBackForwardTransitionStage()) { case AnimationStage.NONE: // Native animator is destroy before animation is done. // Non-null nativePageSmoothTransitionDelegate means the page is transiting to @@ -1480,7 +1498,7 @@ mNativePageSmoothTransitionDelegate = null; } else if (isNativePage()) { // May reach this if a navigation is committed in the mid of gesture. - getView().setAlpha(1f); + view.setAlpha(1f); } return; case AnimationStage.OTHER: @@ -1488,8 +1506,8 @@ // A transition is starting. Hide the Java view to present that. // Wait until the content/ draws the transition. CompositorViewHolder viewHolder = - getActivity().getCompositorViewHolderSupplier().get(); - viewHolder.requestRender(() -> getView().setAlpha(0f)); + assumeNonNull(getActivity()).getCompositorViewHolderSupplier().get(); + viewHolder.requestRender(() -> assumeNonNull(getView()).setAlpha(0f)); } return; case AnimationStage.WAITING_FOR_EMBEDDER_CONTENT_FOR_COMMITTED_ENTRY: @@ -1498,15 +1516,15 @@ mNativePageSmoothTransitionDelegate.start( () -> { if (isDestroyed()) return; - getWebContents().onContentForNavigationEntryShown(); + assumeNonNull(getWebContents()).onContentForNavigationEntryShown(); notifyContentChanged(); }); mNativePageSmoothTransitionDelegate = null; } else if (isNativePage()) { // Navigation from native page was cancelled. - if (getView().getAlpha() != 1f) { + if (view.getAlpha() != 1f) { // This means the content/ is waiting for the NTP to be fully visible. - getView().setAlpha(1f); - getView().post(getWebContents()::onContentForNavigationEntryShown); + view.setAlpha(1f); + view.post(webContents::onContentForNavigationEntryShown); } } } @@ -1643,7 +1661,7 @@ * @param pdfInfo Information of the pdf, or null if there is no associated pdf download. * @return True, if a native page was displayed for url. */ - boolean maybeShowNativePage(String url, boolean forceReload, PdfInfo pdfInfo) { + boolean maybeShowNativePage(String url, boolean forceReload, @Nullable PdfInfo pdfInfo) { // While detached for reparenting we don't have an owning Activity, or TabModelSelector, // so we can't create the native page. The native page will be created once reparenting is // completed. @@ -1667,6 +1685,7 @@ mPendingNativePageHost = nativePageHost; mIsAlreadyCreatingNativePage = true; NativePage candidateForReuse = forceReload ? null : getNativePage(); + assumeNonNull(mDelegateFactory); NativePage nativePage = mDelegateFactory.createNativePage(url, candidateForReuse, this, pdfInfo); mIsAlreadyCreatingNativePage = false; @@ -1727,7 +1746,7 @@ } @Override - public LoadUrlParams getPendingLoadParams() { + public @Nullable LoadUrlParams getPendingLoadParams() { return mPendingLoadParams; } @@ -1800,17 +1819,24 @@ @CalledByNative void swapWebContents(WebContents webContents, boolean didStartLoad, boolean didFinishLoad) { boolean hasWebContents = mContentView != null && mWebContents != null; + assumeNonNull(mContentView); Rect original = hasWebContents ? new Rect(0, 0, mContentView.getWidth(), mContentView.getHeight()) : new Rect(); for (TabObserver observer : mObservers) observer.webContentsWillSwap(this); - if (hasWebContents) mWebContents.updateWebContentsVisibility(Visibility.HIDDEN); + if (hasWebContents) { + assumeNonNull(mWebContents); + mWebContents.updateWebContentsVisibility(Visibility.HIDDEN); + } Context appContext = ContextUtils.getApplicationContext(); Rect bounds = original.isEmpty() ? TabUtils.estimateContentSize(appContext) : null; if (bounds != null) original.set(bounds); - mWebContents.setFocus(false); + if (hasWebContents) { + assumeNonNull(mWebContents); + mWebContents.setFocus(false); + } destroyWebContents(false /* do not delete native web contents */); hideNativePage( false, @@ -1882,7 +1908,7 @@ } @CalledByNative - private static long[] getAllNativePtrs(Tab[] tabsArray) { + private static long @Nullable [] getAllNativePtrs(Tab @Nullable [] tabsArray) { if (tabsArray == null) return null; long[] tabsPtrArray = new long[tabsArray.length]; @@ -1920,7 +1946,7 @@ * * @param webContents The WebContents object that will initialize all the browser components. */ - private void initWebContents(@NonNull WebContents webContents) { + private void initWebContents(WebContents webContents) { try { TraceEvent.begin("ChromeTab.initWebContents"); WebContents oldWebContents = mWebContents; @@ -1940,7 +1966,8 @@ if (oldWebContents != null) { updateImportance(oldWebContents, ChildProcessImportance.NORMAL); - getWebContentsAccessibility(oldWebContents).setObscuredByAnotherView(false); + assumeNonNull(getWebContentsAccessibility(oldWebContents)) + .setObscuredByAnotherView(false); } updateImportance(mWebContents, mImportance); @@ -1960,6 +1987,11 @@ boolean isBackgroundTab = isDetached(); assert mNativeTabAndroid != 0; + assumeNonNull(mDelegateFactory); + ContextMenuPopulatorFactory contextMenuPopulatorFactory = + mDelegateFactory.createContextMenuPopulatorFactory(this); + assumeNonNull(contextMenuPopulatorFactory); + assumeNonNull(mWebContentsDelegate); TabImplJni.get() .initWebContents( mNativeTabAndroid, @@ -1967,9 +1999,7 @@ isBackgroundTab, webContents, mWebContentsDelegate, - new TabContextMenuPopulatorFactory( - mDelegateFactory.createContextMenuPopulatorFactory(this), - this)); + new TabContextMenuPopulatorFactory(contextMenuPopulatorFactory, this)); mWebContents.notifyRendererPreferenceUpdate(); mContentView.setImportantForAutofill( @@ -2001,6 +2031,7 @@ if (mWebContentsDelegate != null) { mWebContentsDelegate.destroy(); } + assumeNonNull(mDelegateFactory); TabWebContentsDelegateAndroid delegate = mDelegateFactory.createWebContentsDelegate(this); mWebContentsDelegate = new TabWebContentsDelegateAndroidImpl(this, delegate); } @@ -2017,15 +2048,16 @@ () -> { mNativePage = nativePage; if (!mNativePage.isFrozen()) { - mNativePage - .getView() - .addOnAttachStateChangeListener(mAttachStateChangeListener); + View view = mNativePage.getView(); + assumeNonNull(view); + view.addOnAttachStateChangeListener(mAttachStateChangeListener); } if (isDisplayingBackForwardAnimation()) { assert GestureNavigationUtils.areBackForwardTransitionsEnabled() : "Must not draw bf screenshot if back forward transition is" + " disabled"; mNativePageSmoothTransitionDelegate = mNativePage.enableSmoothTransition(); + assumeNonNull(mNativePageSmoothTransitionDelegate); mNativePageSmoothTransitionDelegate.prepare(); } pushNativePageStateToNavigationEntry(); @@ -2044,7 +2076,7 @@ * @param postHideTask {@link Runnable} task to run before actually destroying the native page. * This is necessary to keep the tasks to perform in order. */ - private void hideNativePage(boolean notify, Runnable postHideTask) { + private void hideNativePage(boolean notify, @Nullable Runnable postHideTask) { if (mNativePageSmoothTransitionDelegate != null) { mNativePageSmoothTransitionDelegate.cancel(); mNativePageSmoothTransitionDelegate = null; @@ -2054,7 +2086,9 @@ NativePage previousNativePage = mNativePage; if (mNativePage != null) { if (!mNativePage.isFrozen()) { - mNativePage.getView().removeOnAttachStateChangeListener(mAttachStateChangeListener); + View view = mNativePage.getView(); + assumeNonNull(view); + view.removeOnAttachStateChangeListener(mAttachStateChangeListener); } mNativePage = null; mWaitingOnBgColorAfterHidingNativePage = true; @@ -2076,13 +2110,15 @@ WebContents webContents = getWebContents(); if (webContents != null) { + ContextMenuPopulatorFactory contextMenuPopulatorFactory = + mDelegateFactory.createContextMenuPopulatorFactory(this); + assumeNonNull(contextMenuPopulatorFactory); + assumeNonNull(mWebContentsDelegate); TabImplJni.get() .updateDelegates( mNativeTabAndroid, mWebContentsDelegate, - new TabContextMenuPopulatorFactory( - mDelegateFactory.createContextMenuPopulatorFactory(this), - this)); + new TabContextMenuPopulatorFactory(contextMenuPopulatorFactory, this)); webContents.notifyRendererPreferenceUpdate(); } } @@ -2174,6 +2210,7 @@ for (TabObserver observer : mObservers) observer.onRestoreFailed(this); restored = false; + assumeNonNull(mUrl); if (!mUrl.getSpec().isEmpty()) { failedRestoreUrl = mUrl.getSpec(); } else if (!TextUtils.isEmpty( @@ -2182,7 +2219,7 @@ } } Supplier<CompositorViewHolder> compositorViewHolderSupplier = - getActivity().getCompositorViewHolderSupplier(); + assumeNonNull(getActivity()).getCompositorViewHolderSupplier(); View compositorView = compositorViewHolderSupplier.get(); webContents.setSize(compositorView.getWidth(), compositorView.getHeight()); @@ -2363,7 +2400,7 @@ } @Override - public WebContentsState getWebContentsState() { + public @Nullable WebContentsState getWebContentsState() { return mWebContentsState; } @@ -2379,6 +2416,7 @@ @VisibleForTesting boolean hasBacking() { + if (mWebContents == null) return false; return !TabImplJni.get().isPhysicalBackingSizeEmpty(mNativeTabAndroid, mWebContents); } @@ -2436,11 +2474,12 @@ } } - private static WebContentsAccessibility getWebContentsAccessibility(WebContents webContents) { + private static @Nullable WebContentsAccessibility getWebContentsAccessibility( + @Nullable WebContents webContents) { return webContents != null ? WebContentsAccessibility.fromWebContents(webContents) : null; } - private void destroyNativePageInternal(NativePage nativePage) { + private void destroyNativePageInternal(@Nullable NativePage nativePage) { if (nativePage == null) return; assert nativePage != mNativePage : "Attempting to destroy active page."; @@ -2460,7 +2499,7 @@ && ChromeFeatureList.isEnabled( SensitiveContentFeatures.SENSITIVE_CONTENT_WHILE_SWITCHING_TABS)) { SensitiveContentClient.fromWebContents(mWebContents) - .removeObserver(mSensitiveContentClientObserver); + .removeObserver(assumeNonNull(mSensitiveContentClientObserver)); } if (mAutofillProvider != null) { @@ -2468,6 +2507,7 @@ mAutofillProvider = null; } + assumeNonNull(mContentView); mContentView.removeOnAttachStateChangeListener(mAttachStateChangeListener); mContentView = null; updateInteractableState(); @@ -2597,8 +2637,9 @@ @CalledByNative @Override public boolean isTrustedWebActivity() { - if (getWebContents() == null) return false; - return mWebContentsDelegate.isTrustedWebActivity(getWebContents()); + WebContents webContents = getWebContents(); + if (webContents == null || mWebContentsDelegate == null) return false; + return mWebContentsDelegate.isTrustedWebActivity(webContents); } @Override @@ -2645,7 +2686,7 @@ } @Override - public void onAddedToTabModel(ObservableSupplier<Tab> currentTabSupplier) { + public void onAddedToTabModel(ObservableSupplier<@Nullable Tab> currentTabSupplier) { // Tabs should not be attached to multiple tab models. assert mCurrentTabSupplier == null; @@ -2653,7 +2694,7 @@ } @Override - public void onRemovedFromTabModel(ObservableSupplier<Tab> currentTabSupplier) { + public void onRemovedFromTabModel(ObservableSupplier<@Nullable Tab> currentTabSupplier) { // Usually mCurrentTabSupplier should equal currentTabSupplier when it's removed from the // TabModel. However, during reparenting it appears there are situations where the tab is // not removed from the original TabModel before being added to the new TabModel. In these
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabViewAndroidDelegate.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabViewAndroidDelegate.java index f4c0be9..bdc9903 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabViewAndroidDelegate.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabViewAndroidDelegate.java
@@ -4,6 +4,8 @@ package org.chromium.chrome.browser.tab; +import static org.chromium.build.NullUtil.assumeNonNull; + import android.util.SparseArray; import android.view.ViewGroup; import android.view.ViewStructure; @@ -57,7 +59,7 @@ getDragAndDropDelegate().setDragAndDropBrowserDelegate(mDragAndDropBrowserDelegate); } - mCurrentInsetSupplier = tab.getWindowAndroid().getApplicationBottomInsetSupplier(); + mCurrentInsetSupplier = tab.getWindowAndroidChecked().getApplicationBottomInsetSupplier(); mCurrentInsetSupplier.addObserver(mInsetObserver); mTab.addObserver( @@ -71,7 +73,8 @@ } if (window != null) { mCurrentInsetSupplier = - tab.getWindowAndroid().getApplicationBottomInsetSupplier(); + tab.getWindowAndroidChecked() + .getApplicationBottomInsetSupplier(); mCurrentInsetSupplier.addObserver(mInsetObserver); } updateVisualViewportBottomInset(); @@ -144,8 +147,9 @@ } @Override - public void updateAnchorViews(ViewGroup oldContainerView) { + public void updateAnchorViews(@Nullable ViewGroup oldContainerView) { super.updateAnchorViews(oldContainerView); + assumeNonNull(oldContainerView); assert oldContainerView instanceof ContentView : "TabViewAndroidDelegate does not host container views other than ContentView.";
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsDelegateAndroidImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsDelegateAndroidImpl.java index 6779bf4..aebd5826 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsDelegateAndroidImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsDelegateAndroidImpl.java
@@ -29,6 +29,8 @@ import org.chromium.base.ObserverList.RewindableIterator; import org.chromium.base.PackageManagerUtils; import org.chromium.base.lifetime.Destroyable; +import org.chromium.build.annotations.NullMarked; +import org.chromium.build.annotations.Nullable; import org.chromium.chrome.R; import org.chromium.chrome.browser.ZoomController; import org.chromium.chrome.browser.app.bluetooth.BluetoothNotificationService; @@ -56,6 +58,7 @@ import java.util.List; /** Implementation class of {@link TabWebContentsDelegateAndroid}. */ +@NullMarked final class TabWebContentsDelegateAndroidImpl extends TabWebContentsDelegateAndroid implements Destroyable { private final TabImpl mTab; @@ -338,7 +341,7 @@ // Speculative fix for crbug.com/384566650 if (webContents != null && !webContents.isDestroyed()) { auditor.notifyCertificateFailure( - PolicyAuditorJni.get().getCertificateFailure(mTab.getWebContents()), + PolicyAuditorJni.get().getCertificateFailure(webContents), ContextUtils.getApplicationContext()); } } @@ -456,11 +459,11 @@ /** * @return the WebAPK manifest scope. This gives frames within the scope increased privileges - * such as autoplaying media unmuted. + * such as autoplaying media unmuted. */ @CalledByNative @Override - protected String getManifestScope() { + protected @Nullable String getManifestScope() { return mDelegate.getManifestScope(); } @@ -537,12 +540,12 @@ } @Override - public boolean maybeCopyContentAreaAsBitmap(Callback<Bitmap> callback) { + public boolean maybeCopyContentAreaAsBitmap(Callback<@Nullable Bitmap> callback) { return NativePageBitmapCapturer.maybeCaptureNativeView(mTab, callback); } @Override - public Bitmap maybeCopyContentAreaAsBitmapSync() { + public @Nullable Bitmap maybeCopyContentAreaAsBitmapSync() { return NativePageBitmapCapturer.maybeCaptureNativeViewSync(mTab, getTopControlsHeight()); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsObserver.java b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsObserver.java index f68d3513..24ce9833 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsObserver.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tab/TabWebContentsObserver.java
@@ -4,6 +4,8 @@ package org.chromium.chrome.browser.tab; +import static org.chromium.build.NullUtil.assumeNonNull; + import android.app.Activity; import androidx.annotation.VisibleForTesting; @@ -20,6 +22,8 @@ import org.chromium.base.task.PostTask; import org.chromium.base.task.TaskTraits; import org.chromium.blink.mojom.ViewportFit; +import org.chromium.build.annotations.NullMarked; +import org.chromium.build.annotations.Nullable; import org.chromium.chrome.R; import org.chromium.chrome.browser.SwipeRefreshHandler; import org.chromium.chrome.browser.app.bluetooth.BluetoothNotificationService; @@ -47,6 +51,7 @@ import org.chromium.url.GURL; /** WebContentsObserver used by Tab. */ +@NullMarked public class TabWebContentsObserver extends TabWebContentsUserData { // URL didFailLoad error code. Should match the value in net_error_list.h. public static final int BLOCKED_BY_ADMINISTRATOR = -22; @@ -58,8 +63,8 @@ private final TabImpl mTab; private final ObserverList<Callback<WebContents>> mInitObservers = new ObserverList<>(); - private Observer mObserver; - private GURL mLastUrl; + private @Nullable Observer mObserver; + private @Nullable GURL mLastUrl; public static TabWebContentsObserver from(Tab tab) { TabWebContentsObserver observer = get(tab); @@ -71,7 +76,7 @@ } @VisibleForTesting - public static TabWebContentsObserver get(Tab tab) { + public static @Nullable TabWebContentsObserver get(Tab tab) { return tab.getUserDataHost().getUserData(USER_DATA_KEY); } @@ -129,7 +134,7 @@ sadTab.show( mTab.getThemedApplicationContext(), /* suggestionAction= */ () -> { - Activity activity = mTab.getWindowAndroid().getActivity().get(); + Activity activity = mTab.getWindowAndroidChecked().getActivity().get(); assert activity != null; HelpAndFeedbackLauncherImpl.getForProfile(mTab.getProfile()) .show( @@ -140,7 +145,7 @@ /* buttonAction= */ () -> { if (sadTab.showSendFeedbackView()) { - mTab.getActivity() + assumeNonNull(mTab.getActivity()) .startHelpAndFeedback( mTab.getUrl().getSpec(), "MobileSadTabFeedback", @@ -179,7 +184,7 @@ // content. The URL check is done in addition to the isNativePage to ensure a navigation // off the native page did not result in the crash. if (mTab.isNativePage() - && (mTab.getNativePage().getUrl().equals(mTab.getUrl().getSpec()) + && (assumeNonNull(mTab.getNativePage()).getUrl().equals(mTab.getUrl().getSpec()) || NativePage.isNativePageUrl( mTab.getUrl(), mTab.isIncognito(), @@ -191,7 +196,7 @@ int activityState = ApplicationStatus.getStateForActivity( - mTab.getWindowAndroid().getActivity().get()); + mTab.getWindowAndroidChecked().getActivity().get()); if (mTab.isHidden() || activityState == ActivityState.PAUSED || activityState == ActivityState.STOPPED @@ -346,13 +351,14 @@ @Override public void didChangeThemeColor() { - mTab.updateThemeColor(mTab.getWebContents().getThemeColor()); + mTab.updateThemeColor(assumeNonNull(mTab.getWebContents()).getThemeColor()); } @Override public void onBackgroundColorChanged() { if (ChromeFeatureList.sNavBarColorMatchesTabBackground.isEnabled()) { - mTab.changeWebContentBackgroundColor(mTab.getWebContents().getBackgroundColor()); + mTab.changeWebContentBackgroundColor( + assumeNonNull(mTab.getWebContents()).getBackgroundColor()); } } @@ -391,6 +397,7 @@ } void updateNotificationsForTab() { + assumeNonNull(mLastUrl); MediaCaptureNotificationServiceImpl.updateMediaNotificationForTab( ContextUtils.getApplicationContext(), mTab.getId(), null, mLastUrl); BluetoothNotificationManager.updateBluetoothNotificationForTab(
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabCollectionTabModelImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabCollectionTabModelImpl.java index 4beb130b..535f041 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabCollectionTabModelImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tabmodel/TabCollectionTabModelImpl.java
@@ -127,7 +127,9 @@ @Override public @Nullable Tab getTabAt(int index) { - return null; + if (mNativeTabCollectionTabModelImplPtr == 0) return null; + return TabCollectionTabModelImplJni.get() + .getTabAtIndexRecursive(mNativeTabCollectionTabModelImplPtr, index); } @Override @@ -588,5 +590,7 @@ int getTabCountRecursive(long nativeTabCollectionTabModelImpl); int getIndexOfTabRecursive(long nativeTabCollectionTabModelImpl, Tab tab); + + Tab getTabAtIndexRecursive(long nativeTabCollectionTabModelImpl, int index); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java b/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java index 465de42..9bf4082b 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ui/RootUiCoordinator.java
@@ -313,7 +313,11 @@ protected StatusBarColorController mStatusBarColorController; protected final Supplier<SnackbarManager> mSnackbarManagerSupplier; protected final ObservableSupplierImpl<EdgeToEdgeController> mEdgeToEdgeControllerSupplier; - private final EdgeToEdgeDebuggingInfo mEdgeToEdgeDebuggingInfo = new EdgeToEdgeDebuggingInfo(); + private final EdgeToEdgeDebuggingInfo mEdgeToEdgeDebuggingInfo = + new EdgeToEdgeDebuggingInfo( + (info) -> + ChromePureJavaExceptionReporter.reportJavaExceptionFromMsg( + info, /* isWarning= */ true)); protected Destroyable mEdgeToEdgeBottomChin; protected final @ActivityType int mActivityType; protected final Supplier<Boolean> mIsInOverviewModeSupplier; @@ -861,7 +865,7 @@ } public void onResumeWithNative() { - dumpEdgeToEdgeDebuggingInfo("onResumeWithNative"); + addToEdgeToEdgeDebuggingInfo("onResumeWithNative"); } protected boolean showWebSearchInActionMode() { @@ -1866,7 +1870,8 @@ mEdgeToEdgeManager, mBrowserControlsManager, mLayoutManagerSupplier, - mFullscreenManager); + mFullscreenManager, + mEdgeToEdgeDebuggingInfo); mEdgeToEdgeControllerSupplier.set(mEdgeToEdgeController); mEdgeToEdgeBottomChin = createEdgeToEdgeBottomChin(); @@ -1910,7 +1915,7 @@ mEdgeToEdgeDebuggingInfo.setMissingNavBarInsetsReason(reason); } - private void dumpEdgeToEdgeDebuggingInfo(String callSite) { + private void addToEdgeToEdgeDebuggingInfo(String callSite) { if (!ChromeFeatureList.sEdgeToEdgeDebugging.isEnabled() || mEdgeToEdgeDebuggingInfo.isUsed()) { return; @@ -1918,15 +1923,12 @@ boolean hasEdgeToEdgeController = mEdgeToEdgeControllerSupplier.get() != null; boolean isSupportedConfiguration = EdgeToEdgeUtils.isEdgeToEdgeBottomChinEnabled(mActivity); - mEdgeToEdgeDebuggingInfo.buildDebugReport( - mActivity.getWindow(), - mWindowAndroid, + mEdgeToEdgeDebuggingInfo.addToDebugReport( + callSite, hasEdgeToEdgeController, isSupportedConfiguration, - callSite, - (info) -> - ChromePureJavaExceptionReporter.reportJavaExceptionFromMsg( - info, /* isWarning= */ true)); + mActivity != null ? mActivity.getWindow() : null, + mWindowAndroid); } /** Create a bottom chin for Edge-to-Edge. */
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkIconNameUpdateDialog.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkIconNameUpdateDialog.java index f46970d6..d65013d5 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkIconNameUpdateDialog.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkIconNameUpdateDialog.java
@@ -11,6 +11,9 @@ import org.chromium.base.Callback; import org.chromium.base.Log; +import org.chromium.build.annotations.Initializer; +import org.chromium.build.annotations.NullMarked; +import org.chromium.build.annotations.Nullable; import org.chromium.chrome.R; import org.chromium.ui.LayoutInflaterUtils; import org.chromium.ui.modaldialog.DialogDismissalCause; @@ -22,6 +25,7 @@ * The dialog that warns the user that a WebApk is about to be updated, which will result in a short * name, long name and/or icon change. */ +@NullMarked public class WebApkIconNameUpdateDialog implements ModalDialogProperties.Controller { private static final String TAG = "IconNameUpdateDlg"; @@ -33,10 +37,10 @@ private ModalDialogManager mModalDialogManager; // The property model for the dialog. - private PropertyModel mDialogModel; + private @Nullable PropertyModel mDialogModel; // The short name of the app before update. - private String mOldAppShortName; + private @Nullable String mOldAppShortName; // The package name for this app. private String mPackageName; @@ -65,6 +69,7 @@ * @param newIconAdaptive Whether the updated icon is adaptive. * @param callback The callback to use to communicate the results. */ + @Initializer public void show( Context activityContext, ModalDialogManager manager,
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkPostShareTargetNavigator.java b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkPostShareTargetNavigator.java index 0d37d7d..bfb0e55 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkPostShareTargetNavigator.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/webapps/WebApkPostShareTargetNavigator.java
@@ -9,10 +9,12 @@ import org.jni_zero.JniType; import org.jni_zero.NativeMethods; +import org.chromium.build.annotations.NullMarked; import org.chromium.chrome.browser.browserservices.intents.WebApkShareTarget; import org.chromium.content_public.browser.WebContents; /** Perform navigation for share target with POST request. */ +@NullMarked public class WebApkPostShareTargetNavigator { public static boolean navigateIfPostShareTarget( String url, WebApkShareTarget target, ShareData data, WebContents webContents) {
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 8ce5933..b697f5e3 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
@@ -8,6 +8,8 @@ import android.content.Context; import org.chromium.base.ContextUtils; +import org.chromium.build.annotations.NullMarked; +import org.chromium.build.annotations.Nullable; import org.chromium.chrome.R; import org.chromium.chrome.browser.browserservices.metrics.WebApkUmaRecorder; import org.chromium.chrome.browser.tab.EmptyTabObserver; @@ -20,9 +22,10 @@ * Displays error dialog on top of splash screen if there is a network error while loading the start * URL. */ +@NullMarked public class WebApkSplashNetworkErrorObserver extends EmptyTabObserver { private final Activity mActivity; - private WebApkOfflineDialog mOfflineDialog; + private @Nullable WebApkOfflineDialog mOfflineDialog; private boolean mDidShowNetworkErrorDialog; @@ -98,10 +101,10 @@ } /** - * Generates network error dialog message for the given error code. Returns null if the - * dialog should not be shown. + * Generates network error dialog message for the given error code. Returns null if the dialog + * should not be shown. */ - private String generateNetworkErrorWebApkDialogMessage(@NetError int errorCode) { + private @Nullable String generateNetworkErrorWebApkDialogMessage(@NetError int errorCode) { Context context = ContextUtils.getApplicationContext(); switch (errorCode) { case NetError.ERR_INTERNET_DISCONNECTED:
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 86dfe61..04846274 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
@@ -45,7 +45,7 @@ private final ModalDialogManager mModalDialogManager; // The short name of the app the user is uninstalling. - private final String mAppShortName; + private final @Nullable String mAppShortName; // The package name for the app the user is uninstalling. private final String mAppPackageName; @@ -63,7 +63,7 @@ Context activityContext, ModalDialogManager manager, String appPackageName, - String appShortName, + @Nullable String appShortName, boolean showAbuseCheckbox, Callback callback) { mActivityContext = activityContext;
diff --git a/chrome/android/javatests/BUILD.gn b/chrome/android/javatests/BUILD.gn index 47c9c51..c382b15b 100644 --- a/chrome/android/javatests/BUILD.gn +++ b/chrome/android/javatests/BUILD.gn
@@ -629,6 +629,7 @@ resources_package = "org.chromium.chrome.test" sources = [ + "src/org/chromium/chrome/browser/contextualsearch/ContextualSearchCalloutTest.java", "src/org/chromium/chrome/browser/contextualsearch/ContextualSearchCriticalTest.java", "src/org/chromium/chrome/browser/contextualsearch/ContextualSearchFakeServer.java", "src/org/chromium/chrome/browser/contextualsearch/ContextualSearchHistogramTest.java",
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/TabTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/TabTest.java index ed5a311..1e1cafc 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/TabTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/TabTest.java
@@ -16,7 +16,6 @@ import android.app.Activity; -import androidx.annotation.Nullable; import androidx.test.core.app.ApplicationProvider; import androidx.test.filters.SmallTest; @@ -354,14 +353,11 @@ String secondUrl = mActivityTestRule.getTestServer().getURL("/chrome/test/data/android/test.html"); checkFreezingAndAppendingPendingNavigation( - this::createSecondFrozenTab, firstUrl, secondUrl, null); + this::createSecondFrozenTab, firstUrl, secondUrl, ""); } private void checkFreezingAndAppendingPendingNavigation( - TestTabCreator tabCreator, - String firstUrl, - String secondUrl, - @Nullable String secondTitle) { + TestTabCreator tabCreator, String firstUrl, String secondUrl, String secondTitle) { TabObserver observer = Mockito.mock(TabObserver.class); Tab bgTab = tabCreator.createTab(firstUrl); boolean wasFrozen = bgTab.isFrozen();
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchCalloutTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchCalloutTest.java new file mode 100644 index 0000000..07f79e0 --- /dev/null +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/contextualsearch/ContextualSearchCalloutTest.java
@@ -0,0 +1,53 @@ +// 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.chrome.browser.contextualsearch; + +import androidx.test.filters.SmallTest; + +import org.junit.Assert; +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.chromium.base.ThreadUtils; +import org.chromium.base.test.util.Batch; +import org.chromium.base.test.util.CommandLineFlags; +import org.chromium.base.test.util.Feature; +import org.chromium.base.test.util.Features.EnableFeatures; +import org.chromium.chrome.browser.compositor.bottombar.contextualsearch.ContextualSearchCalloutControl; +import org.chromium.chrome.browser.compositor.bottombar.contextualsearch.ContextualSearchPanel; +import org.chromium.chrome.browser.flags.ChromeFeatureList; +import org.chromium.chrome.browser.flags.ChromeSwitches; +import org.chromium.chrome.test.ChromeJUnit4ClassRunner; + +/** Tests the touch to search callout feature of Contextual Search. */ +@RunWith(ChromeJUnit4ClassRunner.class) +@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) +@EnableFeatures(ChromeFeatureList.TOUCH_TO_SEARCH_CALLOUT) +@Batch(Batch.PER_CLASS) +public class ContextualSearchCalloutTest extends ContextualSearchInstrumentationBase { + + @Test + @SmallTest + @Feature({"ContextualSearch"}) + public void testCalloutControlOpacity() throws Exception { + ContextualSearchPanel panel = (ContextualSearchPanel) mManager.getContextualSearchPanel(); + // The view gets inflated immediately so this needs to run on the UI thread. + ThreadUtils.runOnUiThreadBlocking(() -> panel.getSearchBarControl()); + ContextualSearchCalloutControl calloutControl = + panel.getSearchBarControl().getCalloutControl(); + + calloutControl.onUpdateFromPeekToExpand(0.f); + Assert.assertEquals(1, calloutControl.getOpacity(), 0.01f); + + calloutControl.onUpdateFromPeekToExpand(0.25f); + Assert.assertEquals(0.5f, calloutControl.getOpacity(), 0.01f); + + calloutControl.onUpdateFromPeekToExpand(0.5f); + Assert.assertEquals(0, calloutControl.getOpacity(), 0.01f); + + calloutControl.onUpdateFromPeekToExpand(1.f); + Assert.assertEquals(0, calloutControl.getOpacity(), 0.01f); + } +}
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/dom_distiller/ReaderModeTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/dom_distiller/ReaderModeTest.java index 2d1ceb9..ab64c9c 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/dom_distiller/ReaderModeTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/dom_distiller/ReaderModeTest.java
@@ -14,6 +14,7 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; +import static org.chromium.base.test.transit.Triggers.noopTo; import static org.chromium.chrome.browser.dom_distiller.ReaderModeManager.DOM_DISTILLER_SCHEME; import android.app.Activity; @@ -35,12 +36,12 @@ import org.chromium.base.ApplicationStatus; import org.chromium.base.ThreadUtils; -import org.chromium.base.test.transit.Condition; import org.chromium.base.test.util.CommandLineFlags; import org.chromium.base.test.util.Criteria; import org.chromium.base.test.util.CriteriaHelper; import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.Features.DisableFeatures; +import org.chromium.base.test.util.Features.EnableFeatures; import org.chromium.base.test.util.Restriction; import org.chromium.chrome.browser.ChromeTabbedActivity; import org.chromium.chrome.browser.app.ChromeActivity; @@ -61,6 +62,7 @@ import org.chromium.chrome.test.util.ChromeTabUtils; import org.chromium.chrome.test.util.MenuUtils; import org.chromium.components.dom_distiller.core.DistilledPagePrefs; +import org.chromium.components.dom_distiller.core.DomDistillerFeatures; import org.chromium.components.dom_distiller.core.DomDistillerService; import org.chromium.components.dom_distiller.core.DomDistillerUrlUtils; import org.chromium.components.messages.MessageDispatcher; @@ -148,7 +150,24 @@ @Test @MediumTest - @DisabledTest(message = "https://crbug.com/423966068") + @EnableFeatures(DomDistillerFeatures.READER_MODE_DISTILL_IN_APP) + public void testReaderModeInRegularTab() throws TimeoutException { + mDownloadTestRule.loadUrl(mURL); + + Tab originalTab = mDownloadTestRule.getActivity().getActivityTab(); + ThreadUtils.runOnUiThreadBlocking( + () -> { + originalTab + .getUserDataHost() + .getUserData(ReaderModeManager.USER_DATA_KEY) + .activateReaderMode(); + }); + waitForDistillation(PAGE_TITLE, originalTab); + } + + @Test + @MediumTest + @DisabledTest(message = "https://crbug.com/423646543") public void testReaderModeInCct_Downloaded() throws TimeoutException { mDownloadTestRule.loadUrl(mURL); Tab originalTab = mDownloadTestRule.getActivity().getActivityTab(); @@ -334,27 +353,35 @@ DistilledPagePrefs prefs = getDistilledPagePrefs(); prefs.addObserver(mTestObserver); - Condition.waitFor(new TabBackgroundColorCondition(tab, "\"rgb(255, 255, 255)\"")); + noopTo().waitForConditions(new TabBackgroundColorCondition(tab, "\"rgb(255, 255, 255)\"")); ReaderModePreferencesDialog dialog = ReaderModePreferencesDialog.open(activity); // Test setting background color - dialog.pickColorDark(new TabBackgroundColorCondition(tab, "\"rgb(32, 33, 36)\"")); - dialog.pickColorSepia(new TabBackgroundColorCondition(tab, "\"rgb(254, 247, 224)\"")); - dialog.pickColorLight(new TabBackgroundColorCondition(tab, "\"rgb(255, 255, 255)\"")); + dialog.darkButtonElement + .clickTo() + .waitForConditions(new TabBackgroundColorCondition(tab, "\"rgb(32, 33, 36)\"")); + dialog.sepiaButtonElement + .clickTo() + .waitForConditions(new TabBackgroundColorCondition(tab, "\"rgb(254, 247, 224)\"")); + dialog.lightButtonElement + .clickTo() + .waitForConditions(new TabBackgroundColorCondition(tab, "\"rgb(255, 255, 255)\"")); verify(mTestObserver, times(3)).onChangeTheme(anyInt()); // Test setting font size - Condition.waitFor(new TabFontSizeCondition(tab, "\"14px\"")); + noopTo().waitForConditions(new TabFontSizeCondition(tab, "\"14px\"")); // Max is 200% font size. - dialog.setFontSizeSliderToMax(new TabFontSizeCondition(tab, "\"28px\"")); + dialog.setFontSizeSliderToMaxTo() + .waitForConditions(new TabFontSizeCondition(tab, "\"28px\"")); // Min is 50% font size. - dialog.setFontSizeSliderToMin(new TabFontSizeCondition(tab, "\"7px\"")); + dialog.setFontSizeSliderToMinTo() + .waitForConditions(new TabFontSizeCondition(tab, "\"7px\"")); verify(mTestObserver, times(2)).onChangeFontScaling(anyFloat()); // TODO(crbug.com/40125950): change font family as well. - dialog.pressBackToClose(); + dialog.pressBackTo().dropCarryOn(); } /**
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/TabArchiverTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/TabArchiverTest.java index 26e1c0fe..c5c245f4 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/tab/TabArchiverTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/tab/TabArchiverTest.java
@@ -65,6 +65,7 @@ import org.chromium.chrome.test.batch.BlankCTATabInitialStateRule; import org.chromium.components.tab_group_sync.LocalTabGroupId; import org.chromium.components.tab_group_sync.SavedTabGroup; +import org.chromium.components.tab_group_sync.SavedTabGroupTab; import org.chromium.components.tab_group_sync.TabGroupSyncService; import java.util.Arrays; @@ -312,6 +313,9 @@ String syncId = "sync_id"; SavedTabGroup savedTabGroup = new SavedTabGroup(); savedTabGroup.syncId = syncId; + SavedTabGroupTab savedTabGroupTab1 = new SavedTabGroupTab(); + SavedTabGroupTab savedTabGroupTab2 = new SavedTabGroupTab(); + savedTabGroup.savedTabs = Arrays.asList(savedTabGroupTab1, savedTabGroupTab2); when(mTabGroupSyncService.getGroup(any(LocalTabGroupId.class))).thenReturn(savedTabGroup); Tab tab = @@ -335,6 +339,8 @@ HistogramWatcher watcher = HistogramWatcher.newBuilder() .expectIntRecords("Tabs.TabArchived.TabCount", 1) + .expectIntRecords("TabGroups.TabGroupDeclutter.ArchivedTabGroups", 1) + .expectIntRecords("TabGroups.TabGroupDeclutter.ArchivedTabGroupTabCount", 2) .build(); runOnUiThreadBlocking( () -> @@ -389,6 +395,8 @@ HistogramWatcher watcher = HistogramWatcher.newBuilder() .expectIntRecords("Tabs.TabArchived.TabCount", 1) + .expectNoRecords("TabGroups.TabGroupDeclutter.ArchivedTabGroups") + .expectNoRecords("TabGroups.TabGroupDeclutter.ArchivedTabGroupTabCount") .build(); // The grouped tab should be skipped. runOnUiThreadBlocking( @@ -407,6 +415,14 @@ @MediumTest @EnableFeatures(ChromeFeatureList.ANDROID_TAB_DECLUTTER_ARCHIVE_TAB_GROUPS) public void testGroupedTabsAreArchived() { + String syncId = "sync_id"; + SavedTabGroup savedTabGroup = new SavedTabGroup(); + savedTabGroup.syncId = syncId; + SavedTabGroupTab savedTabGroupTab1 = new SavedTabGroupTab(); + SavedTabGroupTab savedTabGroupTab2 = new SavedTabGroupTab(); + savedTabGroup.savedTabs = Arrays.asList(savedTabGroupTab1, savedTabGroupTab2); + when(mTabGroupSyncService.getGroup(any(LocalTabGroupId.class))).thenReturn(savedTabGroup); + sActivityTestRule.loadUrlInNewTab( sActivityTestRule.getTestServer().getURL(TEST_PATH), /* incognito= */ false); @@ -440,6 +456,8 @@ HistogramWatcher watcher = HistogramWatcher.newBuilder() .expectIntRecords("Tabs.TabArchived.TabCount", 1) + .expectIntRecords("TabGroups.TabGroupDeclutter.ArchivedTabGroups", 1) + .expectIntRecords("TabGroups.TabGroupDeclutter.ArchivedTabGroupTabCount", 2) .build(); // The grouped tab should not be added to the archived tab model and have been closed from // the regular tab model.
diff --git a/chrome/android/junit/BUILD.gn b/chrome/android/junit/BUILD.gn index b584d4cf..6127b3c 100644 --- a/chrome/android/junit/BUILD.gn +++ b/chrome/android/junit/BUILD.gn
@@ -1112,6 +1112,7 @@ "//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorLayoutUnitTest.java", "//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListEditorMediatorUnitTest.java", "//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListGroupMenuCoordinatorUnitTest.java", + "//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListHighlighterUnitTest.java", "//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListItemAnimatorUnitTest.java", "//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListModelUnitTest.java", "//chrome/android/features/tab_ui/java/src/org/chromium/chrome/browser/tasks/tab_management/TabListOnScrollListenerUnitTest.java",
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/autofill/OWNERS b/chrome/android/junit/src/org/chromium/chrome/browser/autofill/OWNERS index db55bc9..147d604 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/autofill/OWNERS +++ b/chrome/android/junit/src/org/chromium/chrome/browser/autofill/OWNERS
@@ -1 +1,5 @@ file://chrome/android/java/src/org/chromium/chrome/browser/autofill/OWNERS + +# Payments-relevant files +per-file AutofillImageFetcher*Test.java=file://components/autofill/core/browser/payments/ANDROID_OWNERS +per-file AutofillUiUtilsTest.java=file://components/autofill/core/browser/payments/ANDROID_OWNERS
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarUnitTest.java index 95d1355..abcf438 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/customtabs/features/toolbar/CustomTabToolbarUnitTest.java
@@ -700,6 +700,20 @@ assertEquals(View.GONE, mToolbar.findViewById(R.id.menu_dot).getVisibility()); } + @Test + @EnableFeatures(ChromeFeatureList.CCT_ADAPTIVE_BUTTON) + public void testOptionalButton_notEnabledForWidthConstraint() { + mToolbar.setToolbarWidthForTesting(48 + 68); + mToolbar.updateOptionalButton(getDataForPriceInsightsIconButton()); + + // For MTB hidden due to width constraint, |OptionButtonCoordinator| is instantiated + // since the button visibility rule needs to be applied after the MTB is added to + // the toolbar. If toolbar width changes dynamically later, it lets the optional button + // start showing. + assertNotNull(mToolbar.getOptionalButtonCoordinatorForTesting()); + assertEquals(View.VISIBLE, mToolbar.findViewById(R.id.menu_dot).getVisibility()); + } + private void assertUrlAndTitleVisible(boolean titleVisible, boolean urlVisible) { int expectedTitleVisibility = titleVisible ? View.VISIBLE : View.GONE; int expectedUrlVisibility = urlVisible ? View.VISIBLE : View.GONE;
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/tab/TabViewAndroidDelegateTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/tab/TabViewAndroidDelegateTest.java index 191f059..7db2338 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/tab/TabViewAndroidDelegateTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/tab/TabViewAndroidDelegateTest.java
@@ -75,7 +75,7 @@ when(mWindowAndroid.getApplicationBottomInsetSupplier()) .thenReturn(mApplicationInsetSupplier); - when(mTab.getWindowAndroid()).thenReturn(mWindowAndroid); + when(mTab.getWindowAndroidChecked()).thenReturn(mWindowAndroid); when(mTab.getWebContents()).thenReturn(mWebContents); mViewAndroidDelegate = new TabViewAndroidDelegate(mTab, mContentView);
diff --git a/chrome/app/generated_resources.grd b/chrome/app/generated_resources.grd index 70e00c7..ee6313e 100644 --- a/chrome/app/generated_resources.grd +++ b/chrome/app/generated_resources.grd
@@ -8820,6 +8820,10 @@ <message name="IDS_OPENS_MANAGEMENT_PAGE" desc="ARIA (accessibility) role description for a link in the New Tab footer which opens the chrome://management page in the current tab."> Learn about how your browser is managed </message> + <message name="IDS_HIDE_NEW_TAB_FOOTER" desc="Label for option to hide New Tab Footer feature, a UI that may show at the bottom of the New Tab Page."> + Hide footer on New Tab page + </message> + <!-- Star View menu --> <if expr="use_titlecase"> <message name="IDS_STAR_VIEW_MENU_ADD_BOOKMARK" desc="The item label of the menu triggered from the star icon in the location bar for adding a bookmark.">
diff --git a/chrome/app/generated_resources_grd/IDS_HIDE_NEW_TAB_FOOTER.png.sha1 b/chrome/app/generated_resources_grd/IDS_HIDE_NEW_TAB_FOOTER.png.sha1 new file mode 100644 index 0000000..b210b0af --- /dev/null +++ b/chrome/app/generated_resources_grd/IDS_HIDE_NEW_TAB_FOOTER.png.sha1
@@ -0,0 +1 @@ +fe1b15d676a452fbb6bb9ae0e719d64ba546cf63 \ No newline at end of file
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 91acf3f..71c95a6 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -761,11 +761,15 @@ const FeatureEntry::FeatureParam kReaderModeImprovementsCustomCPATimeout[] = { {"custom_cpa_timeout_enabled", "true"}, {"custom_cpa_timeout", "300"}}; +const FeatureEntry::FeatureParam + kReaderModeImprovementsShowReadingModeInRegularTab[] = { + {"show_in_regular_tab", "true"}}; const FeatureEntry::FeatureParam kReaderModeImprovementsAllOn[] = { {"trigger_on_mobile_friendly_pages", "true"}, {"always_on_entry_point", "true"}, {"custom_cpa_timeout_enabled", "true"}, - {"custom_cpa_timeout", "300"}}; + {"custom_cpa_timeout", "300"}, + {"show_in_regular_tab", "true"}}; const FeatureEntry::FeatureVariation kReaderModeImprovementsChoices[] = { {"trigger on mobile-friendly pages", @@ -775,6 +779,10 @@ std::size(kReaderModeImprovementsAlwaysOnEntryPoint), nullptr}, {"increased cpa timeout", kReaderModeImprovementsCustomCPATimeout, std::size(kReaderModeImprovementsCustomCPATimeout), nullptr}, + {"reading mode in regular tab", + kReaderModeImprovementsShowReadingModeInRegularTab, + std::size(kReaderModeImprovementsShowReadingModeInRegularTab), nullptr}, + {"all", kReaderModeImprovementsAllOn, std::size(kReaderModeImprovementsAllOn), nullptr}}; @@ -5513,6 +5521,10 @@ {"reader-mode-auto-distill", flag_descriptions::kReaderModeAutoDistillName, flag_descriptions::kReaderModeAutoDistillDescription, kOsAndroid, FEATURE_VALUE_TYPE(dom_distiller::kReaderModeAutoDistill)}, + {"reader-mode-distill-in-app", + flag_descriptions::kReaderModeDistillInAppName, + flag_descriptions::kReaderModeDistillInAppDescription, kOsAndroid, + FEATURE_VALUE_TYPE(dom_distiller::kReaderModeDistillInApp)}, {"reader-mode-heuristics", flag_descriptions::kReaderModeHeuristicsName, flag_descriptions::kReaderModeHeuristicsDescription, kOsAndroid, MULTI_VALUE_TYPE(kReaderModeHeuristicsChoices)},
diff --git a/chrome/browser/actor/BUILD.gn b/chrome/browser/actor/BUILD.gn index 4be6b795..a1c6ceb 100644 --- a/chrome/browser/actor/BUILD.gn +++ b/chrome/browser/actor/BUILD.gn
@@ -61,6 +61,8 @@ "tools/observation_delay_controller.cc", "tools/page_tool.cc", "tools/page_tool.h", + "tools/tab_management_tool.cc", + "tools/tab_management_tool.h", "tools/tool.cc", "tools/tool.h", "tools/tool_callbacks.cc", @@ -79,6 +81,7 @@ "//chrome/browser/profiles:profile", "//chrome/browser/safe_browsing", "//chrome/browser/ui:browser_navigator_params_headers", + "//chrome/browser/ui/browser_window:browser_window", "//chrome/browser/ui/tabs:tabs_public", "//chrome/common", "//components/safe_browsing:buildflags",
diff --git a/chrome/browser/actor/aggregated_journal_serializer.cc b/chrome/browser/actor/aggregated_journal_serializer.cc index deeddf3..2e06dbb4 100644 --- a/chrome/browser/actor/aggregated_journal_serializer.cc +++ b/chrome/browser/actor/aggregated_journal_serializer.cc
@@ -87,7 +87,8 @@ const AggregatedJournal::Entry& entry) { protozero::HeapBuffered<perfetto::protos::pbzero::TracePacket> msg; msg->set_trusted_packet_sequence_id(sequence_id_++); - msg->set_timestamp(NowInNanoseconds()); + msg->set_timestamp( + (entry.data->timestamp - base::Time::UnixEpoch()).InNanoseconds()); msg->set_timestamp_clock_id(perfetto::protos::pbzero::BUILTIN_CLOCK_REALTIME); auto* track_event = msg->set_track_event(); perfetto::protos::pbzero::TrackEvent_Type pb_type =
diff --git a/chrome/browser/actor/tools/tab_management_tool.cc b/chrome/browser/actor/tools/tab_management_tool.cc new file mode 100644 index 0000000..c0ae0ef9 --- /dev/null +++ b/chrome/browser/actor/tools/tab_management_tool.cc
@@ -0,0 +1,69 @@ +// 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/actor/tools/tab_management_tool.h" + +#include "chrome/browser/actor/tools/tool_callbacks.h" +#include "chrome/browser/ui/browser.h" +#include "chrome/browser/ui/browser_window/public/browser_window_interface.h" +#include "chrome/common/actor.mojom.h" +#include "chrome/common/actor/action_result.h" +#include "components/sessions/core/session_id.h" +#include "content/public/browser/web_contents.h" +#include "third_party/abseil-cpp/absl/strings/str_format.h" +#include "ui/base/window_open_disposition.h" +#include "url/gurl.h" +#include "url/url_constants.h" + +namespace actor { + +TabManagementTool::TabManagementTool( + int32_t window_id, + const optimization_guide::proto::CreateTabAction& action) + : window_id_(window_id), action_(action) {} + +TabManagementTool::~TabManagementTool() = default; + +void TabManagementTool::Validate(ValidateCallback callback) { + PostResponseTask(std::move(callback), MakeOkResult()); +} + +void TabManagementTool::Invoke(InvokeCallback callback) { + BrowserWindowInterface* browser_window_interface = + BrowserWindowInterface::FromSessionID( + SessionID::FromSerializedValue(window_id_)); + if (!browser_window_interface) { + PostResponseTask(std::move(callback), + MakeResult(mojom::ActionResultCode::kWindowWentAway)); + return; + } + + // TODO(bokan): Is the foreground bit always set? If not, should this return + // an error or default to what? For now we default to foreground. + WindowOpenDisposition disposition = + (!action_.has_foreground() || action_.foreground()) + ? WindowOpenDisposition::NEW_FOREGROUND_TAB + : WindowOpenDisposition::NEW_BACKGROUND_TAB; + + // Open a blank tab. + browser_window_interface->OpenGURL(GURL(url::kAboutBlankURL), disposition); + + PostResponseTask(std::move(callback), MakeOkResult()); +} + +std::string TabManagementTool::DebugString() const { + return absl::StrFormat("TabManagementTool:%s", JournalEvent().c_str()); +} + +std::string TabManagementTool::JournalEvent() const { + return "CreateTab"; +} + +bool TabManagementTool::RequiresFrame() const { + // This is to avoid the kFrameWentAway check in + // ToolController::ValidationComplete. + return false; +} + +} // namespace actor
diff --git a/chrome/browser/actor/tools/tab_management_tool.h b/chrome/browser/actor/tools/tab_management_tool.h new file mode 100644 index 0000000..a0c0bd5 --- /dev/null +++ b/chrome/browser/actor/tools/tab_management_tool.h
@@ -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. + +#ifndef CHROME_BROWSER_ACTOR_TOOLS_TAB_MANAGEMENT_TOOL_H_ +#define CHROME_BROWSER_ACTOR_TOOLS_TAB_MANAGEMENT_TOOL_H_ + +#include "base/memory/weak_ptr.h" +#include "chrome/browser/actor/tools/tool.h" +#include "components/optimization_guide/proto/features/actions_data.pb.h" + +namespace actor { + +// A tool to manage the tabs in a browser window, e.g. create, close, +// activate, etc. +// TODO(crbug.com/411462297): Implement actions other than create. +class TabManagementTool : public Tool { + public: + TabManagementTool(int32_t window_id, + const optimization_guide::proto::CreateTabAction& action); + ~TabManagementTool() override; + + // actor::Tool: + void Validate(ValidateCallback callback) override; + void Invoke(InvokeCallback callback) override; + std::string DebugString() const override; + std::string JournalEvent() const override; + bool RequiresFrame() const override; + + private: + int32_t window_id_; + const optimization_guide::proto::CreateTabAction action_; + + base::WeakPtrFactory<TabManagementTool> weak_ptr_factory_{this}; +}; + +} // namespace actor + +#endif // CHROME_BROWSER_ACTOR_TOOLS_TAB_MANAGEMENT_TOOL_H_
diff --git a/chrome/browser/actor/tools/tool.cc b/chrome/browser/actor/tools/tool.cc index 78cd62c..75c24c7 100644 --- a/chrome/browser/actor/tools/tool.cc +++ b/chrome/browser/actor/tools/tool.cc
@@ -15,4 +15,8 @@ return std::make_unique<ObservationDelayController>(target_frame); } +bool Tool::RequiresFrame() const { + return true; +} + } // namespace actor
diff --git a/chrome/browser/actor/tools/tool.h b/chrome/browser/actor/tools/tool.h index 6e7f920..57fab05 100644 --- a/chrome/browser/actor/tools/tool.h +++ b/chrome/browser/actor/tools/tool.h
@@ -54,6 +54,13 @@ // completed and a new frame presented. virtual std::unique_ptr<ObservationDelayController> GetObservationDelayer( content::RenderFrameHost& target_frame) const; + + // Whether or not the tool requires a frame to operate on. Note, this also + // includes "tab-scoped" tools which are considered to operate on the "main + // frame" in the tab. + // TODO(crbug.com/411462297): Temporary until we have a better mechanism for + // non-frame-scoped tools. + virtual bool RequiresFrame() const; }; } // namespace actor
diff --git a/chrome/browser/actor/tools/tool_controller.cc b/chrome/browser/actor/tools/tool_controller.cc index 49bac126..97933b0 100644 --- a/chrome/browser/actor/tools/tool_controller.cc +++ b/chrome/browser/actor/tools/tool_controller.cc
@@ -15,6 +15,7 @@ #include "chrome/browser/actor/tools/history_tool.h" #include "chrome/browser/actor/tools/navigate_tool.h" #include "chrome/browser/actor/tools/page_tool.h" +#include "chrome/browser/actor/tools/tab_management_tool.h" #include "chrome/browser/actor/tools/tool.h" #include "chrome/browser/actor/tools/tool_callbacks.h" #include "chrome/browser/actor/tools/wait_tool.h" @@ -84,7 +85,12 @@ case Action::kWait: { return std::make_unique<WaitTool>(); } - case Action::kCreateTab: + case Action::kCreateTab: { + // Extract the window ID from the action. + int32_t window_id = action.create_tab().window_id(); + return std::make_unique<TabManagementTool>(window_id, + action.create_tab()); + } case Action::kCloseTab: case Action::kActivateTab: case Action::kCreateWindow: @@ -145,17 +151,17 @@ // TODO(crbug.com/389739308): Ensure the acting tab remains valid (i.e. alive // and focused), return error otherwise. - - RenderFrameHost* target_frame = - active_state_->weak_document_ptr.AsRenderFrameHostIfValid(); - if (!target_frame) { - CompleteToolRequest(MakeResult(mojom::ActionResultCode::kFrameWentAway)); - return; + if (active_state_->tool->RequiresFrame()) { + RenderFrameHost* target_frame = + active_state_->weak_document_ptr.AsRenderFrameHostIfValid(); + if (!target_frame) { + CompleteToolRequest(MakeResult(mojom::ActionResultCode::kFrameWentAway)); + return; + } + observation_delayer_ = + active_state_->tool->GetObservationDelayer(*target_frame); } - observation_delayer_ = - active_state_->tool->GetObservationDelayer(*target_frame); - active_state_->tool->Invoke(base::BindOnce( &ToolController::DidFinishToolInvoke, weak_ptr_factory_.GetWeakPtr())); }
diff --git a/chrome/browser/actor/tools/tools_browsertest.cc b/chrome/browser/actor/tools/tools_browsertest.cc index 2582f0f..3769064 100644 --- a/chrome/browser/actor/tools/tools_browsertest.cc +++ b/chrome/browser/actor/tools/tools_browsertest.cc
@@ -71,8 +71,12 @@ using content::WeakDocumentPtr; using content::WebContents; using content::WebContentsObserver; +using optimization_guide::proto::Action; +using optimization_guide::proto::Actions; +using optimization_guide::proto::ActionsResult; using optimization_guide::proto::BrowserAction; using optimization_guide::proto::ClickAction; +using optimization_guide::proto::CreateTabAction; using optimization_guide::proto::NavigateAction; using tabs::TabInterface; @@ -142,9 +146,15 @@ host_resolver()->AddRule("*", "127.0.0.1"); ASSERT_TRUE(embedded_test_server()->Start()); ASSERT_TRUE(embedded_https_test_server().Start()); - auto execution_engine = std::make_unique<ExecutionEngine>( - browser()->profile(), browser()->GetActiveTabInterface()); + auto execution_engine = InitializeExecutionEngine(); + ExecutionEngine* raw_execution_engine = execution_engine.get(); actor_task_ = std::make_unique<ActorTask>(std::move(execution_engine)); + raw_execution_engine->SetOwner(actor_task_.get()); + } + + virtual std::unique_ptr<ExecutionEngine> InitializeExecutionEngine() { + return std::make_unique<ExecutionEngine>( + browser()->profile(), browser()->GetActiveTabInterface()); } void SetUpCommandLine(base::CommandLine* command_line) override { @@ -189,11 +199,32 @@ .ExtractString(); } + ActorTask& actor_task() const { + CHECK(actor_task_); + return *actor_task_.get(); + } + private: ScopedFeatureList scoped_feature_list_; std::unique_ptr<ActorTask> actor_task_; }; +// ActorToolsTest but using the V2 ExecutionEngine API. +// TODO(crbug.com/411462297): All tests should eventually use the V2 API and the +// original test harness should be migrated to the new API. New tests should use +// this harness. +class ActorToolsTestV2 : public ActorToolsTest { + public: + ActorToolsTestV2() = default; + ~ActorToolsTestV2() override = default; + explicit ActorToolsTestV2(const ActorToolsTest&) = delete; + ActorToolsTestV2& operator=(const ActorToolsTestV2&) = delete; + + std::unique_ptr<ExecutionEngine> InitializeExecutionEngine() override { + return std::make_unique<ExecutionEngine>(browser()->profile()); + } +}; + // =============================================== // Please keep the tests in this file grouped by tool. // =============================================== @@ -1311,7 +1342,7 @@ class ActorToolsTestDSF2 : public ActorToolsTest { public: ActorToolsTestDSF2() = default; - explicit ActorToolsTestDSF2(const ActorToolsTest&) = delete; + explicit ActorToolsTestDSF2(const ActorToolsTestDSF2&) = delete; ActorToolsTestDSF2& operator=(const ActorToolsTestDSF2&) = delete; ~ActorToolsTestDSF2() override = default; @@ -2180,6 +2211,60 @@ } // =============================================== +// Tab Management Tool +// =============================================== + +IN_PROC_BROWSER_TEST_F(ActorToolsTestV2, + TabManagementTool_CreateForegroundTab) { + // Navigate the starting tab so it can be differentiated from the new tab. + const GURL start_tab_url = + embedded_test_server()->GetURL("/actor/blank.html"); + ASSERT_TRUE(content::NavigateToURL(web_contents(), start_tab_url)); + + const int initial_tab_count = browser()->tab_strip_model()->GetTabCount(); + + Actions actions; + actions.set_task_id(actor_task().id().GetUnsafeValue()); + CreateTabAction* create_tab = actions.add_actions()->mutable_create_tab(); + create_tab->set_foreground(true); + create_tab->set_window_id(browser()->session_id().id()); + + TestFuture<ActionsResult> result; + execution_engine().Act(actions, result.GetCallback()); + EXPECT_EQ(result.Get().action_result(), + static_cast<int>(mojom::ActionResultCode::kOk)); + + EXPECT_EQ(initial_tab_count + 1, browser()->tab_strip_model()->GetTabCount()); + EXPECT_EQ(GURL("about:blank"), + browser()->tab_strip_model()->GetActiveWebContents()->GetURL()); +} + +IN_PROC_BROWSER_TEST_F(ActorToolsTestV2, + TabManagementTool_CreateBackgroundTab) { + // Navigate the starting tab so it can be differentiated from the new tab. + const GURL start_tab_url = + embedded_test_server()->GetURL("/actor/blank.html"); + ASSERT_TRUE(content::NavigateToURL(web_contents(), start_tab_url)); + + const int initial_tab_count = browser()->tab_strip_model()->GetTabCount(); + + Actions actions; + actions.set_task_id(actor_task().id().GetUnsafeValue()); + CreateTabAction* create_tab = actions.add_actions()->mutable_create_tab(); + create_tab->set_foreground(false); + create_tab->set_window_id(browser()->session_id().id()); + + TestFuture<ActionsResult> result; + execution_engine().Act(actions, result.GetCallback()); + EXPECT_EQ(result.Get().action_result(), + static_cast<int>(mojom::ActionResultCode::kOk)); + + EXPECT_EQ(initial_tab_count + 1, browser()->tab_strip_model()->GetTabCount()); + EXPECT_EQ(start_tab_url, + browser()->tab_strip_model()->GetActiveWebContents()->GetURL()); +} + +// =============================================== // Tool-Agnostic Tests // ===============================================
diff --git a/chrome/browser/autofill/android/OWNERS b/chrome/browser/autofill/android/OWNERS index 731670ee..682b910 100644 --- a/chrome/browser/autofill/android/OWNERS +++ b/chrome/browser/autofill/android/OWNERS
@@ -1 +1,5 @@ - file://components/autofill/android/OWNERS +file://components/autofill/android/OWNERS + +# Payments-relevant files +per-file autofill_image_fetcher_impl.*=file://components/autofill/core/browser/payments/ANDROID_OWNERS +per-file personal_data_manager_android.*=file://components/autofill/core/browser/payments/ANDROID_OWNERS
diff --git a/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/OWNERS b/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/OWNERS new file mode 100644 index 0000000..1982797 --- /dev/null +++ b/chrome/browser/autofill/android/java/src/org/chromium/chrome/browser/autofill/OWNERS
@@ -0,0 +1,4 @@ +# Payments-relevant files +per-file AutofillImageFetcher*.java=file://components/autofill/core/browser/payments/ANDROID_OWNERS +per-file AutofillUiUtils.java=file://components/autofill/core/browser/payments/ANDROID_OWNERS +per-file PersonalDataManager*.java=file://components/autofill/core/browser/payments/ANDROID_OWNERS
diff --git a/chrome/browser/autofill/test/android/java/src/org/chromium/chrome/browser/autofill/OWNERS b/chrome/browser/autofill/test/android/java/src/org/chromium/chrome/browser/autofill/OWNERS new file mode 100644 index 0000000..7b25154 --- /dev/null +++ b/chrome/browser/autofill/test/android/java/src/org/chromium/chrome/browser/autofill/OWNERS
@@ -0,0 +1,2 @@ +# Payments-relevant files +per-file PersonalDataManagerTest.java=file://components/autofill/core/browser/payments/ANDROID_OWNERS
diff --git a/chrome/browser/chromeos/app_mode/kiosk_browser_session.cc b/chrome/browser/chromeos/app_mode/kiosk_browser_session.cc index 6828ff11..4ff9e6c 100644 --- a/chrome/browser/chromeos/app_mode/kiosk_browser_session.cc +++ b/chrome/browser/chromeos/app_mode/kiosk_browser_session.cc
@@ -232,6 +232,8 @@ PrefRegistrySimple::NO_REGISTRATION_FLAGS); registry->RegisterBooleanPref(prefs::kKioskWebAppOfflineEnabled, true); registry->RegisterBooleanPref(prefs::kKioskChromeAppsForceAllowed, false); + registry->RegisterBooleanPref(prefs::kKioskApplicationLogCollectionEnabled, + false); } void KioskBrowserSession::InitForChromeAppKiosk(const std::string& app_id) {
diff --git a/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/interstitial/NewDownloadTab.java b/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/interstitial/NewDownloadTab.java index 4d9fbcc..2a60029a 100644 --- a/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/interstitial/NewDownloadTab.java +++ b/chrome/browser/download/android/java/src/org/chromium/chrome/browser/download/interstitial/NewDownloadTab.java
@@ -150,7 +150,7 @@ mTab = tab; mActivity = activity; mCoordinator = coordinator; - NewDownloadTabProvider.attach(tab.getWindowAndroid(), this); + NewDownloadTabProvider.attach(tab.getWindowAndroidChecked(), this); } private boolean isViewAttached() {
diff --git a/chrome/browser/enterprise/data_controls/reporting_service.cc b/chrome/browser/enterprise/data_controls/reporting_service.cc index ba0e313..4c45731b 100644 --- a/chrome/browser/enterprise/data_controls/reporting_service.cc +++ b/chrome/browser/enterprise/data_controls/reporting_service.cc
@@ -86,9 +86,18 @@ using SourceType = enterprise_connectors::ContentMetaData::CopiedTextSource; - enterprise_connectors::ContentMetaData::CopiedTextSource copied_text_source; + SourceType copied_text_source; if (!source.browser_context()) { - copied_text_source.set_context(SourceType::CLIPBOARD); + // This off the record check will also include guest profile sources, but + // since there is no way to disambiguate them with a null BrowserContext + // INCOGNITO is selected instead of CLIPBOARD to not share the source URL in + // such cases. + if (source.data_transfer_endpoint() && + source.data_transfer_endpoint()->off_the_record()) { + copied_text_source.set_context(SourceType::INCOGNITO); + } else { + copied_text_source.set_context(SourceType::CLIPBOARD); + } } else if (Profile::FromBrowserContext(source.browser_context()) ->IsIncognitoProfile()) { copied_text_source.set_context(SourceType::INCOGNITO); @@ -101,8 +110,18 @@ switch (copied_text_source.context()) { case SourceType::UNSPECIFIED: case SourceType::INCOGNITO: - case SourceType::CLIPBOARD: break; + case SourceType::CLIPBOARD: + // If the user does something like closing the browser between the time + // they copy and then paste, the DTE might have a URL even though the lack + // of browser context will make it impossible to know if the `SourceType` + // is `SAME_PROFILE` or `OTHER_PROFILE`. + // + // In that case, we can be conservative and perform the same check as + // `OTHER_PROFILE`. Note that this code path is unreachable in the case of + // an incognito source URL as that is handled in the `set_context` + // conditions above. + [[fallthrough]]; case SourceType::OTHER_PROFILE: // Only add a source URL if the other profile is getting the policy // applied at the machine scope, not the user scope.
diff --git a/chrome/browser/enterprise/data_controls/reporting_service_unittest.cc b/chrome/browser/enterprise/data_controls/reporting_service_unittest.cc index 95c8d0a..415929b7 100644 --- a/chrome/browser/enterprise/data_controls/reporting_service_unittest.cc +++ b/chrome/browser/enterprise/data_controls/reporting_service_unittest.cc
@@ -19,6 +19,7 @@ #include "content/public/browser/web_contents.h" #include "content/public/test/browser_task_environment.h" #include "testing/gtest/include/gtest/gtest.h" +#include "ui/base/data_transfer_policy/data_transfer_endpoint.h" namespace data_controls { @@ -43,6 +44,11 @@ managed_profile_); } + void TearDown() override { + managed_profile_->GetPrefs()->ClearPref(kDataControlsRulesScopePref); + helper_.reset(); + } + Profile* incognito_managed_profile() { return managed_profile_->GetPrimaryOTRProfile(/*create_if_needed=*/true); } @@ -125,6 +131,14 @@ *guest_contents()->GetPrimaryMainFrame()); } + content::ClipboardEndpoint os_clipboard_endpoint(GURL url, + bool off_the_record) { + return content::ClipboardEndpoint( + ui::DataTransferEndpoint(url, ui::DataTransferEndpointOptions{ + .off_the_record = off_the_record, + })); + } + protected: content::BrowserTaskEnvironment task_environment_; std::unique_ptr<TestingProfileManager> profile_manager_; @@ -252,6 +266,76 @@ } TEST_F(DataControlsReportingServiceTest, + PasteInManagedProfile_OSClipboardSource) { + Verdict::TriggeredRules triggered_rules = {{0, {"1", "rule_1_name"}}}; + auto validator = helper_->CreateValidator(); + validator.ExpectDataControlsSensitiveDataEvent( + /*expected_url=*/ + kChromiumUrl, + /*expected_tab_url=*/kChromiumUrl, + /*expected_source=*/"CLIPBOARD", + /*expected_destination=*/kChromiumUrl, + /*expected_mimetypes=*/ + []() { + static std::set<std::string> set = {"text/plain"}; + return &set; + }(), + /*expected_trigger=*/"WEB_CONTENT_UPLOAD", + /*triggered_rules=*/triggered_rules, + /*expected_result=*/"EVENT_RESULT_WARNED", + /*expected_profile_username=*/kUserName, + /*expected_profile_identifier=*/ + managed_profile_->GetPath().AsUTF8Unsafe(), + /*expected_content_size=*/1234); + + auto* service = ReportingServiceFactory::GetInstance()->GetForBrowserContext( + managed_profile_); + service->ReportPaste( + os_clipboard_endpoint(GURL(kGoogleUrl), /*off_the_record=*/false), + managed_endpoint(GURL(kChromiumUrl)), + { + .size = 1234, + .format_type = ui::ClipboardFormatType::PlainTextType(), + }, + Verdict::Warn(triggered_rules)); +} + +TEST_F(DataControlsReportingServiceTest, + PasteInManagedProfile_IncognitoOSClipboardSource) { + Verdict::TriggeredRules triggered_rules = {{0, {"1", "rule_1_name"}}}; + auto validator = helper_->CreateValidator(); + validator.ExpectDataControlsSensitiveDataEvent( + /*expected_url=*/ + kChromiumUrl, + /*expected_tab_url=*/kChromiumUrl, + /*expected_source=*/"INCOGNITO", + /*expected_destination=*/kChromiumUrl, + /*expected_mimetypes=*/ + []() { + static std::set<std::string> set = {"text/plain"}; + return &set; + }(), + /*expected_trigger=*/"WEB_CONTENT_UPLOAD", + /*triggered_rules=*/triggered_rules, + /*expected_result=*/"EVENT_RESULT_WARNED", + /*expected_profile_username=*/kUserName, + /*expected_profile_identifier=*/ + managed_profile_->GetPath().AsUTF8Unsafe(), + /*expected_content_size=*/1234); + + auto* service = ReportingServiceFactory::GetInstance()->GetForBrowserContext( + managed_profile_); + service->ReportPaste( + os_clipboard_endpoint(GURL(kGoogleUrl), /*off_the_record=*/true), + managed_endpoint(GURL(kChromiumUrl)), + { + .size = 1234, + .format_type = ui::ClipboardFormatType::PlainTextType(), + }, + Verdict::Warn(triggered_rules)); +} + +TEST_F(DataControlsReportingServiceTest, PasteInManagedProfile_ManagedSourceProfile) { Verdict::TriggeredRules triggered_rules = {{0, {"1", "rule_1_name"}}}; auto validator = helper_->CreateValidator(); @@ -545,6 +629,52 @@ } TEST_F(DataControlsReportingServiceTest, + GetClipboardSource_OSClipboardOnManagedBrowser) { + managed_profile_->GetPrefs()->SetInteger(kDataControlsRulesScopePref, + policy::POLICY_SCOPE_MACHINE); + auto os_clipboard_copy_source = ReportingService::GetClipboardSource( + /*source=*/os_clipboard_endpoint(GURL(kGoogleUrl), + /*off_the_record=*/false), + /*destination=*/managed_endpoint(GURL(kChromiumUrl)), + kDataControlsRulesScopePref); + ASSERT_EQ( + os_clipboard_copy_source.context(), + enterprise_connectors::ContentMetaData::CopiedTextSource::CLIPBOARD); + ASSERT_EQ( + ReportingService::GetClipboardSourceString(os_clipboard_copy_source), + "https://google.com/"); + ASSERT_EQ(ReportingService::GetClipboardSourceString( + /*source=*/os_clipboard_endpoint(GURL(kGoogleUrl), + /*off_the_record=*/false), + /*destination=*/managed_endpoint(GURL(kChromiumUrl)), + kDataControlsRulesScopePref), + "https://google.com/"); +} + +TEST_F(DataControlsReportingServiceTest, + GetClipboardSource_IncognitoOSClipboardOnManagedBrowser) { + managed_profile_->GetPrefs()->SetInteger(kDataControlsRulesScopePref, + policy::POLICY_SCOPE_MACHINE); + auto os_clipboard_copy_source = ReportingService::GetClipboardSource( + /*source=*/os_clipboard_endpoint(GURL(kGoogleUrl), + /*off_the_record=*/true), + /*destination=*/managed_endpoint(GURL(kChromiumUrl)), + kDataControlsRulesScopePref); + ASSERT_EQ( + os_clipboard_copy_source.context(), + enterprise_connectors::ContentMetaData::CopiedTextSource::INCOGNITO); + ASSERT_EQ( + ReportingService::GetClipboardSourceString(os_clipboard_copy_source), + "INCOGNITO"); + ASSERT_EQ(ReportingService::GetClipboardSourceString( + /*source=*/os_clipboard_endpoint(GURL(kGoogleUrl), + /*off_the_record=*/true), + /*destination=*/managed_endpoint(GURL(kChromiumUrl)), + kDataControlsRulesScopePref), + "INCOGNITO"); +} + +TEST_F(DataControlsReportingServiceTest, GetClipboardSource_UnmanagedProfileOnManagedBrowser) { managed_profile_->GetPrefs()->SetInteger(kDataControlsRulesScopePref, policy::POLICY_SCOPE_MACHINE); @@ -585,6 +715,52 @@ } TEST_F(DataControlsReportingServiceTest, + GetClipboardSource_OSClipboardOnUnmanagedBrowser) { + managed_profile_->GetPrefs()->SetInteger(kDataControlsRulesScopePref, + policy::POLICY_SCOPE_USER); + auto os_clipboard_copy_source = ReportingService::GetClipboardSource( + /*source=*/os_clipboard_endpoint(GURL(kGoogleUrl), + /*off_the_record=*/false), + /*destination=*/managed_endpoint(GURL(kChromiumUrl)), + kDataControlsRulesScopePref); + ASSERT_EQ( + os_clipboard_copy_source.context(), + enterprise_connectors::ContentMetaData::CopiedTextSource::CLIPBOARD); + ASSERT_EQ( + ReportingService::GetClipboardSourceString(os_clipboard_copy_source), + "CLIPBOARD"); + ASSERT_EQ(ReportingService::GetClipboardSourceString( + /*source=*/os_clipboard_endpoint(GURL(kGoogleUrl), + /*off_the_record=*/false), + /*destination=*/managed_endpoint(GURL(kChromiumUrl)), + kDataControlsRulesScopePref), + "CLIPBOARD"); +} + +TEST_F(DataControlsReportingServiceTest, + GetClipboardSource_IncognitoOSClipboardOnUnmanagedBrowser) { + managed_profile_->GetPrefs()->SetInteger(kDataControlsRulesScopePref, + policy::POLICY_SCOPE_USER); + auto os_clipboard_copy_source = ReportingService::GetClipboardSource( + /*source=*/os_clipboard_endpoint(GURL(kGoogleUrl), + /*off_the_record=*/true), + /*destination=*/managed_endpoint(GURL(kChromiumUrl)), + kDataControlsRulesScopePref); + ASSERT_EQ( + os_clipboard_copy_source.context(), + enterprise_connectors::ContentMetaData::CopiedTextSource::INCOGNITO); + ASSERT_EQ( + ReportingService::GetClipboardSourceString(os_clipboard_copy_source), + "INCOGNITO"); + ASSERT_EQ(ReportingService::GetClipboardSourceString( + /*source=*/os_clipboard_endpoint(GURL(kGoogleUrl), + /*off_the_record=*/true), + /*destination=*/managed_endpoint(GURL(kChromiumUrl)), + kDataControlsRulesScopePref), + "INCOGNITO"); +} + +TEST_F(DataControlsReportingServiceTest, GetClipboardSource_UnmanagedProfileOnUnmanagedBrowser) { managed_profile_->GetPrefs()->SetInteger(kDataControlsRulesScopePref, policy::POLICY_SCOPE_USER);
diff --git a/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_apitest.cc b/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_apitest.cc index 871d242d..82d7af36 100644 --- a/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_apitest.cc +++ b/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_apitest.cc
@@ -1166,21 +1166,27 @@ async function asyncAssertions() { chrome.enterprise.reportingPrivate.onDataMaskingRulesTriggered.addListener( rules => { - if (rules.length === 0) { + if (rules.triggeredRuleInfo.length === 0) { chrome.test.fail( 'There should not be an event when no rules are triggered'); } else { - chrome.test.assertEq(rules, [ - { - level:'mask_type', - regex_pattern:'pattern', - triggeredRuleInfo:{ - matchedDetectors:[], - ruleId:'rule_id', - ruleName:'rule_name' - }, + chrome.test.assertEq(rules, { + triggeredRuleInfo: [ + { + matchedDetectors:[ + { + detectorId: "12345", + displayName: "display_name", + maskType:'mask_type', + pattern:'pattern' + } + ], + ruleId:'rule_id', + ruleName:'rule_name' + } + ], url:'https://foo.bar/' - }]); + }); chrome.test.succeed(); } } @@ -1217,6 +1223,7 @@ data_masking->set_display_name("display_name"); data_masking->set_mask_type("mask_type"); data_masking->set_pattern("pattern"); + data_masking->set_detector_id("12345"); router->OnUrlFilteringVerdict(GURL(kTestUrl), response); @@ -1229,37 +1236,41 @@ async function asyncAssertions() { chrome.enterprise.reportingPrivate.onDataMaskingRulesTriggered.addListener( rules => { - chrome.test.assertEq(rules, [ - { - level:'mask_type_1', - regex_pattern:'pattern_1', - triggeredRuleInfo:{ - matchedDetectors:[], + chrome.test.assertEq(rules, { + triggeredRuleInfo: [ + { ruleId:'rule_id_1', - ruleName:'rule_name_1' + ruleName:'rule_name_1', + matchedDetectors:[ + { + displayName: "display_name_1", + detectorId: "id_1", + maskType:'mask_type_1', + pattern:'pattern_1' + }, + { + displayName: "display_name_2", + detectorId: "id_2", + maskType:'mask_type_2', + pattern:'pattern_2' + } + ], }, - url:'https://foo.bar/' - }, - { - level:'mask_type_2', - regex_pattern:'pattern_2', - triggeredRuleInfo:{ - matchedDetectors:[], - ruleId:'rule_id_1', - ruleName:'rule_name_1' - }, - url:'https://foo.bar/' - }, - { - level:'mask_type_3', - regex_pattern:'pattern_3', - triggeredRuleInfo:{ - matchedDetectors:[], + { ruleId:'rule_id_2', - ruleName:'rule_name_2' - }, - url:'https://foo.bar/' - }]); + ruleName:'rule_name_2', + matchedDetectors:[ + { + displayName: "display_name_3", + detectorId: "id_3", + maskType:'mask_type_3', + pattern:'pattern_3' + } + ] + } + ], + url:'https://foo.bar/' + }); chrome.test.succeed(); } ); @@ -1286,11 +1297,13 @@ data_masking_1->set_display_name("display_name_1"); data_masking_1->set_mask_type("mask_type_1"); data_masking_1->set_pattern("pattern_1"); + data_masking_1->set_detector_id("id_1"); auto* data_masking_2 = rule_1->add_data_masking_actions(); data_masking_2->set_display_name("display_name_2"); data_masking_2->set_mask_type("mask_type_2"); data_masking_2->set_pattern("pattern_2"); + data_masking_2->set_detector_id("id_2"); auto* rule_2 = response.add_threat_info()->mutable_matched_url_navigation_rule(); @@ -1301,6 +1314,7 @@ data_masking_3->set_display_name("display_name_3"); data_masking_3->set_mask_type("mask_type_3"); data_masking_3->set_pattern("pattern_3"); + data_masking_3->set_detector_id("id_3"); EnterpriseReportingPrivateEventRouterFactory::GetInstance() ->GetForProfile(profile())
diff --git a/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_event_router.cc b/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_event_router.cc index 0f51ffda..9435fd4 100644 --- a/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_event_router.cc +++ b/chrome/browser/extensions/api/enterprise_reporting_private/enterprise_reporting_private_event_router.cc
@@ -14,19 +14,6 @@ namespace extensions { -namespace { - -api::enterprise_reporting_private::TriggeredRuleInfo GetTriggeredRuleInfo( - const safe_browsing::MatchedUrlNavigationRule& rule) { - api::enterprise_reporting_private::TriggeredRuleInfo rule_info; - rule_info.rule_id = rule.rule_id(); - rule_info.rule_name = rule.rule_name(); - - return rule_info; -} - -} // namespace - EnterpriseReportingPrivateEventRouter::EnterpriseReportingPrivateEventRouter( content::BrowserContext* context) : event_router_(EventRouter::Get(context)) {} @@ -42,24 +29,35 @@ return; } - std::vector<api::enterprise_reporting_private::DataMaskingRule> rules_list; + api::enterprise_reporting_private::DataMaskingRules data_masking_rules; + data_masking_rules.url = url.spec(); + for (const auto& threat_info : response.threat_info()) { const auto& data_masking_actions = threat_info.matched_url_navigation_rule().data_masking_actions(); + if (data_masking_actions.empty()) { + continue; + } + + api::enterprise_reporting_private::TriggeredRuleInfo rule_info; + rule_info.rule_id = threat_info.matched_url_navigation_rule().rule_id(); + rule_info.rule_name = threat_info.matched_url_navigation_rule().rule_name(); for (const auto& data_masking_action : data_masking_actions) { - api::enterprise_reporting_private::DataMaskingRule rule; - rule.level = data_masking_action.mask_type(); - rule.regex_pattern = data_masking_action.pattern(); - rule.triggered_rule_info = - GetTriggeredRuleInfo(threat_info.matched_url_navigation_rule()); - rule.url = url.spec(); + api::enterprise_reporting_private::MatchedDetector detector; - rules_list.push_back(std::move(rule)); + detector.detector_id = data_masking_action.detector_id(); + detector.display_name = data_masking_action.display_name(); + detector.mask_type = data_masking_action.mask_type(); + detector.pattern = data_masking_action.pattern(); + + rule_info.matched_detectors.push_back(std::move(detector)); } + + data_masking_rules.triggered_rule_info.push_back(std::move(rule_info)); } - if (rules_list.empty()) { + if (data_masking_rules.triggered_rule_info.empty()) { return; } @@ -68,7 +66,7 @@ api::enterprise_reporting_private::OnDataMaskingRulesTriggered:: kEventName, api::enterprise_reporting_private::OnDataMaskingRulesTriggered::Create( - std::move(rules_list)))); + std::move(data_masking_rules)))); } // static
diff --git a/chrome/browser/extensions/component_extension_browsertest.cc b/chrome/browser/extensions/component_extension_browsertest.cc deleted file mode 100644 index ef284da..0000000 --- a/chrome/browser/extensions/component_extension_browsertest.cc +++ /dev/null
@@ -1,27 +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/extensions/extension_browsertest.h" -#include "content/public/test/browser_test.h" -#include "extensions/test/result_catcher.h" - -namespace extensions { - -using ComponentExtensionBrowserTest = ExtensionBrowserTest; - -// Tests that MojoJS is enabled for component extensions that need it. -// Note the test currently only runs for ChromeOS because the test extension -// uses `mojoPrivate` to test and `mojoPrivate` is ChromeOS only. -IN_PROC_BROWSER_TEST_F(ComponentExtensionBrowserTest, MojoJS) { - ResultCatcher result_catcher; - - auto* extension = - LoadExtension(test_data_dir_.AppendASCII("service_worker/mojo"), - {.load_as_component = true}); - ASSERT_TRUE(extension); - - ASSERT_TRUE(result_catcher.GetNextResult()); -} - -} // namespace extensions
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index 366b9de..1040e73 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -8357,6 +8357,11 @@ "expiry_milestone": 145 }, { + "name": "reader-mode-distill-in-app", + "owners": ["wylieb@google.com", "chrome-reader-mode-team@google.com"], + "expiry_milestone": 150 + }, + { "name": "reader-mode-enabled", "owners": ["fernandex@google.com", "qpubert@google.com", "bling-flags@google.com"], "expiry_milestone": 145
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index bee3758..afcb020 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -5300,6 +5300,9 @@ const char kReaderModeAutoDistillName[] = "Reader Mode auto distillation"; const char kReaderModeAutoDistillDescription[] = "Automatically distills web contents on every page."; +const char kReaderModeDistillInAppName[] = "Reader Mode distillation in app"; +const char kReaderModeDistillInAppDescription[] = + "Distills the web page in brapp instead of a custom tab."; const char kReaderModeHeuristicsName[] = "Reader Mode triggering"; const char kReaderModeHeuristicsDescription[] = "Determines what pages the Reader Mode infobar is shown on.";
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index 6824092..dfef232b 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -3101,6 +3101,8 @@ extern const char kReadAloudTapToSeekDescription[]; extern const char kReaderModeAutoDistillName[]; extern const char kReaderModeAutoDistillDescription[]; +extern const char kReaderModeDistillInAppName[]; +extern const char kReaderModeDistillInAppDescription[]; extern const char kReaderModeHeuristicsName[]; extern const char kReaderModeHeuristicsDescription[]; extern const char kReaderModeHeuristicsMarkup[];
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 432f1f1..6a9dce6c 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
@@ -169,11 +169,11 @@ public static final String ANDROID_APP_INTEGRATION_MULTI_DATA_SOURCE = "AndroidAppIntegrationMultiDataSource"; public static final String ANDROID_APP_INTEGRATION_V2 = "AndroidAppIntegrationV2"; - public static final String ANDROID_COMPOSEPLATE = "AndroidComposeplate"; public static final String ANDROID_APP_INTEGRATION_WITH_FAVICON = "AndroidAppIntegrationWithFavicon"; public static final String ANDROID_BOOKMARK_BAR = "AndroidBookmarkBar"; public static final String ANDROID_BOTTOM_TOOLBAR = "AndroidBottomToolbar"; + public static final String ANDROID_COMPOSEPLATE = "AndroidComposeplate"; public static final String ANDROID_DUMP_ON_SCROLL_WITHOUT_RESOURCE = "AndroidDumpOnScrollWithoutResource"; public static final String ANDROID_ELEGANT_TEXT_HEIGHT = "AndroidElegantTextHeight"; @@ -191,8 +191,6 @@ public static final String ANDROID_PINNED_TABS = "AndroidPinnedTabs"; public static final String ANDROID_PROGRESS_BAR_VISUAL_UPDATE = "AndroidProgressBarVisualUpdate"; - public static final String ANDROID_TAB_GROUPS_COLOR_UPDATE_GM3 = - "AndroidTabGroupsColorUpdateGM3"; public static final String ANDROID_SHOW_RESTORE_TABS_PROMO_ON_FRE_BYPASSED_KILL_SWITCH = "AndroidShowRestoreTabsPromoOnFREBypassedKillSwitch"; public static final String ANDROID_SURFACE_COLOR_UPDATE = "AndroidSurfaceColorUpdate"; @@ -211,6 +209,8 @@ "AndroidTabDeclutterPerformanceImprovements"; public static final String ANDROID_TAB_DECLUTTER_RESCUE_KILLSWITCH = "AndroidTabDeclutterRescueKillswitch"; + public static final String ANDROID_TAB_GROUPS_COLOR_UPDATE_GM3 = + "AndroidTabGroupsColorUpdateGM3"; public static final String ANDROID_TAB_SKIP_SAVE_TABS_TASK_KILLSWITCH = "AndroidTabSkipSaveTabsTaskKillswitch"; public static final String ANDROID_THEME_MODULE = "AndroidThemeModule"; @@ -366,17 +366,17 @@ public static final String DEVICE_AUTHENTICATOR_ANDROIDX = "DeviceAuthenticatorAndroidx"; public static final String DISABLE_INSTANCE_LIMIT = "DisableInstanceLimit"; public static final String DISCO_FEED_ENDPOINT = "DiscoFeedEndpoint"; + public static final String DISPLAY_EDGE_TO_EDGE_FULLSCREEN = "DisplayEdgeToEdgeFullscreen"; public static final String DISPLAY_WILDCARD_CONTENT_SETTINGS = "DisplayWildcardInContentSettings"; - public static final String DISPLAY_EDGE_TO_EDGE_FULLSCREEN = "DisplayEdgeToEdgeFullscreen"; public static final String DRAW_CUTOUT_EDGE_TO_EDGE = "DrawCutoutEdgeToEdge"; public static final String DRAW_KEY_NATIVE_EDGE_TO_EDGE = "DrawKeyNativeEdgeToEdge"; public static final String DYNAMIC_SAFE_AREA_INSETS = "DynamicSafeAreaInsets"; public static final String EDGE_TO_EDGE_BOTTOM_CHIN = "EdgeToEdgeBottomChin"; public static final String EDGE_TO_EDGE_DEBUGGING = "EdgeToEdgeDebugging"; + public static final String EDGE_TO_EDGE_EVERYWHERE = "EdgeToEdgeEverywhere"; public static final String EDGE_TO_EDGE_MONITOR_CONFIGURATIONS = "EdgeToEdgeMonitorConfigurations"; - public static final String EDGE_TO_EDGE_EVERYWHERE = "EdgeToEdgeEverywhere"; public static final String EDGE_TO_EDGE_SAFE_AREA_CONSTRAINT = "EdgeToEdgeSafeAreaConstraint"; public static final String EDGE_TO_EDGE_TABLET = "EdgeToEdgeTablet"; public static final String EDGE_TO_EDGE_WEB_OPT_IN = "EdgeToEdgeWebOptIn"; @@ -385,12 +385,12 @@ public static final String EDUCATIONAL_TIP_MODULE = "EducationalTipModule"; public static final String EMPTY_TAB_LIST_ANIMATION_KILL_SWITCH = "EmptyTabListAnimationKillSwitch"; - public static final String ENABLE_SAVE_PACKAGE_FOR_OFF_THE_RECORD = - "EnableSavePackageForOffTheRecord"; public static final String ENABLE_CLIPBOARD_DATA_CONTROLS_ANDROID = "EnableClipboardDataControlsAndroid"; public static final String ENABLE_DISCOUNT_INFO_API = "EnableDiscountInfoApi"; public static final String ENABLE_EXCLUSIVE_ACCESS_MANAGER = "EnableExclusiveAccessManager"; + public static final String ENABLE_SAVE_PACKAGE_FOR_OFF_THE_RECORD = + "EnableSavePackageForOffTheRecord"; public static final String ENABLE_X_AXIS_ACTIVITY_TRANSITION = "EnableXAxisActivityTransition"; public static final String FEED_CONTAINMENT = "FeedContainment"; public static final String FEED_FOLLOW_UI_UPDATE = "FeedFollowUiUpdate"; @@ -412,9 +412,9 @@ public static final String FULLSCREEN_INSETS_API_MIGRATION = "FullscreenInsetsApiMigration"; public static final String FULLSCREEN_INSETS_API_MIGRATION_ON_AUTOMOTIVE = "FullscreenInsetsApiMigrationOnAutomotive"; - public static final String GRID_TAB_SWITCHER_UPDATE = "GridTabSwitcherUpdate"; public static final String GRID_TAB_SWITCHER_SURFACE_COLOR_UPDATE = "GridTabSwitcherSurfaceColorUpdate"; + public static final String GRID_TAB_SWITCHER_UPDATE = "GridTabSwitcherUpdate"; public static final String GROUP_NEW_TAB_WITH_PARENT = "GroupNewTabWithParent"; public static final String GROUP_SUGGESTION_SERVICE = "GroupSuggestionService"; public static final String HASH_PREFIX_REAL_TIME_LOOKUPS = @@ -458,10 +458,10 @@ public static final String NEW_TAB_PAGE_ANDROID_TRIGGER_FOR_PRERENDER2 = "NewTabPageAndroidTriggerForPrerender2"; public static final String NEW_TAB_PAGE_CUSTOMIZATION = "NewTabPageCustomization"; - public static final String NEW_TAB_PAGE_CUSTOMIZATION_V2 = "NewTabPageCustomizationV2"; + public static final String NEW_TAB_PAGE_CUSTOMIZATION_FOR_MVT = "NewTabPageCustomizationForMvt"; public static final String NEW_TAB_PAGE_CUSTOMIZATION_TOOLBAR_BUTTON = "NewTabPageCustomizationToolbarButton"; - public static final String NEW_TAB_PAGE_CUSTOMIZATION_FOR_MVT = "NewTabPageCustomizationForMvt"; + public static final String NEW_TAB_PAGE_CUSTOMIZATION_V2 = "NewTabPageCustomizationV2"; public static final String NOTIFICATION_ONE_TAP_UNSUBSCRIBE = "NotificationOneTapUnsubscribe"; public static final String NOTIFICATION_PERMISSION_BOTTOM_SHEET = "NotificationPermissionBottomSheet"; @@ -591,13 +591,15 @@ "SwapNewTabAndNewTabInGroupAndroid"; public static final String SYNC_ENABLE_PASSWORDS_SYNC_ERROR_MESSAGE_ALTERNATIVE = "SyncEnablePasswordsSyncErrorMessageAlternative"; + public static final String TABLET_TAB_STRIP_ANIMATION = "TabletTabStripAnimation"; + public static final String TAB_ARCHIVAL_DRAG_DROP_ANDROID = "TabArchivalDragDropAndroid"; public static final String TAB_CLOSURE_METHOD_REFACTOR = "TabClosureMethodRefactor"; + public static final String TAB_COLLECTION_ANDROID = "TabCollectionAndroid"; + public static final String TAB_FREEZE_ON_UNDOABLE_CLOSURE_KILL_SWITCH = + "TabFreezeOnUndoableClosureKillSwitch"; public static final String TAB_GROUP_ENTRY_POINTS_ANDROID = "TabGroupEntryPointsAndroid"; public static final String TAB_GROUP_PARITY_BOTTOM_SHEET_ANDROID = "TabGroupParityBottomSheetAndroid"; - public static final String TABLET_TAB_STRIP_ANIMATION = "TabletTabStripAnimation"; - public static final String TAB_FREEZE_ON_UNDOABLE_CLOSURE_KILL_SWITCH = - "TabFreezeOnUndoableClosureKillSwitch"; public static final String TAB_STATE_FLAT_BUFFER = "TabStateFlatBuffer"; public static final String TAB_STRIP_CONTEXT_MENU = "TabStripContextMenuAndroid"; public static final String TAB_STRIP_DENSITY_CHANGE_ANDROID = "TabStripDensityChangeAndroid"; @@ -607,10 +609,8 @@ public static final String TAB_STRIP_LAYOUT_OPTIMIZATION = "TabStripLayoutOptimization"; public static final String TAB_STRIP_TRANSITION_IN_DESKTOP_WINDOW = "TabStripTransitionInDesktopWindow"; - public static final String TAB_ARCHIVAL_DRAG_DROP_ANDROID = "TabArchivalDragDropAndroid"; - public static final String TAB_COLLECTION_ANDROID = "TabCollectionAndroid"; - public static final String TAB_SWITCHER_DRAG_DROP_ANDROID = "TabSwitcherDragDropAndroid"; public static final String TAB_SWITCHER_COLOR_BLEND_ANIMATE = "TabSwitcherColorBlendAnimate"; + public static final String TAB_SWITCHER_DRAG_DROP_ANDROID = "TabSwitcherDragDropAndroid"; public static final String TAB_SWITCHER_FOREIGN_FAVICON_SUPPORT = "TabSwitcherForeignFaviconSupport"; public static final String TAB_WINDOW_MANAGER_REPORT_INDICES_MISMATCH = @@ -633,11 +633,11 @@ public static final String UNO_PHASE_2_FOLLOW_UP = "UnoPhase2FollowUp"; public static final String UPDATE_COMPOSTIROR_FOR_SURFACE_CONTROL = "UpdateCompositorForSurfaceControl"; + public static final String USE_ACTIVITY_MANAGER_FOR_TAB_ACTIVATION = + "UseActivityManagerForTabActivation"; public static final String USE_ALTERNATE_HISTORY_SYNC_ILLUSTRATION = "UseAlternateHistorySyncIllustration"; public static final String USE_CHIME_ANDROID_SDK = "UseChimeAndroidSdk"; - public static final String USE_ACTIVITY_MANAGER_FOR_TAB_ACTIVATION = - "UseActivityManagerForTabActivation"; public static final String USE_INITIAL_NETWORK_STATE_AT_STARTUP = "UseInitialNetworkStateAtStartup"; public static final String USE_LIBUNWINDSTACK_NATIVE_UNWINDER_ANDROID = @@ -669,13 +669,12 @@ newCachedFlag(ANDROID_APP_INTEGRATION_MULTI_DATA_SOURCE, false, true); public static final CachedFlag sAndroidAppIntegrationV2 = newCachedFlag(ANDROID_APP_INTEGRATION_V2, true); - - public static final CachedFlag sAndroidComposeplate = - newCachedFlag(ANDROID_COMPOSEPLATE, false, true); public static final CachedFlag sAndroidAppIntegrationWithFavicon = newCachedFlag(ANDROID_APP_INTEGRATION_WITH_FAVICON, true); public static final CachedFlag sAndroidBottomToolbar = newCachedFlag(ANDROID_BOTTOM_TOOLBAR, false, true); + public static final CachedFlag sAndroidComposeplate = + newCachedFlag(ANDROID_COMPOSEPLATE, false, true); public static final CachedFlag sAndroidElegantTextHeight = newCachedFlag(ANDROID_ELEGANT_TEXT_HEIGHT, true); public static final CachedFlag sAndroidMinimalUiLargeScreen = @@ -697,8 +696,6 @@ newCachedFlag(ANDROID_WEB_APP_LAUNCH_HANDLER, false, true); public static final CachedFlag sAndroidWindowPopupLargeScreen = newCachedFlag(ANDROID_WINDOW_POPUP_LARGE_SCREEN, false); - public static final CachedFlag sEnableExclusiveAccessManager = - newCachedFlag(ENABLE_EXCLUSIVE_ACCESS_MANAGER, false); public static final CachedFlag sAppSpecificHistory = newCachedFlag(APP_SPECIFIC_HISTORY, true); public static final CachedFlag sAsyncNotificationManager = newCachedFlag(ASYNC_NOTIFICATION_MANAGER, false, true); @@ -733,8 +730,8 @@ /* defaultValueInTests= */ true); public static final CachedFlag sCctEphemeralMode = newCachedFlag(CCT_EPHEMERAL_MODE, true); public static final CachedFlag sCctFixWarmup = - newCachedFlag(CCT_FIX_WARMUP, /* defaultValue= */ false, - /* defaultValueInTests= */ true); + newCachedFlag( + CCT_FIX_WARMUP, /* defaultValue= */ false, /* defaultValueInTests= */ true); public static final CachedFlag sCctFreInSameTask = newCachedFlag(CCT_FRE_IN_SAME_TASK, true); public static final CachedFlag sCctGoogleBottomBar = newCachedFlag( @@ -755,6 +752,10 @@ /* defaultValueInTests= */ true); public static final CachedFlag sCctNestedSecurityIcon = newCachedFlag(CCT_NESTED_SECURITY_ICON, true); + public static final CachedFlag sCctOpenInBrowserButtonIfAllowedByEmbedder = + newCachedFlag(CCT_OPEN_IN_BROWSER_BUTTON_IF_ALLOWED_BY_EMBEDDER, false); + public static final CachedFlag sCctOpenInBrowserButtonIfEnabledByEmbedder = + newCachedFlag(CCT_OPEN_IN_BROWSER_BUTTON_IF_ENABLED_BY_EMBEDDER, true); public static final CachedFlag sCctPredictiveBackGesture = newCachedFlag( CCT_PREDICTIVE_BACK_GESTURE, @@ -765,10 +766,6 @@ CCT_REALTIME_ENGAGEMENT_EVENTS_IN_BACKGROUND, /* defaultValue= */ false, /* defaultValueInTests= */ true); - public static final CachedFlag sCctOpenInBrowserButtonIfAllowedByEmbedder = - newCachedFlag(CCT_OPEN_IN_BROWSER_BUTTON_IF_ALLOWED_BY_EMBEDDER, false); - public static final CachedFlag sCctOpenInBrowserButtonIfEnabledByEmbedder = - newCachedFlag(CCT_OPEN_IN_BROWSER_BUTTON_IF_ENABLED_BY_EMBEDDER, true); public static final CachedFlag sCctResizableForThirdParties = newCachedFlag(CCT_RESIZABLE_FOR_THIRD_PARTIES, true); public static final CachedFlag sCctRevampedBranding = @@ -803,13 +800,13 @@ EDGE_TO_EDGE_DEBUGGING, /* defaultValue= */ false, /* defaultValueInTests= */ true); - public static final CachedFlag sEdgeToEdgeMonitorConfigurations = - newCachedFlag(EDGE_TO_EDGE_MONITOR_CONFIGURATIONS, /* defaultValue= */ true); public static final CachedFlag sEdgeToEdgeEverywhere = newCachedFlag( EDGE_TO_EDGE_EVERYWHERE, /* defaultValue= */ false, /* defaultValueInTests= */ true); + public static final CachedFlag sEdgeToEdgeMonitorConfigurations = + newCachedFlag(EDGE_TO_EDGE_MONITOR_CONFIGURATIONS, /* defaultValue= */ true); public static final CachedFlag sEdgeToEdgeTablet = newCachedFlag(EDGE_TO_EDGE_TABLET, false); public static final CachedFlag sEdgeToEdgeWebOptIn = newCachedFlag(EDGE_TO_EDGE_WEB_OPT_IN, true); @@ -819,6 +816,8 @@ newCachedFlag(EDUCATIONAL_TIP_MODULE, false, true); public static final CachedFlag sEnableDiscountInfoApi = newCachedFlag(ENABLE_DISCOUNT_INFO_API, false, true); + public static final CachedFlag sEnableExclusiveAccessManager = + newCachedFlag(ENABLE_EXCLUSIVE_ACCESS_MANAGER, false); public static final CachedFlag sEnableXAxisActivityTransition = newCachedFlag(ENABLE_X_AXIS_ACTIVITY_TRANSITION, false); public static final CachedFlag sFloatingSnackbar = newCachedFlag(FLOATING_SNACKBAR, true); @@ -878,13 +877,12 @@ newCachedFlag(NEW_TAB_PAGE_ANDROID_TRIGGER_FOR_PRERENDER2, true); public static final CachedFlag sNewTabPageCustomization = newCachedFlag(NEW_TAB_PAGE_CUSTOMIZATION, false, true); - public static final CachedFlag sNewTabPageCustomizationV2 = - newCachedFlag(NEW_TAB_PAGE_CUSTOMIZATION_V2, false); - public static final CachedFlag sNewTabPageCustomizationToolbarButton = - newCachedFlag(NEW_TAB_PAGE_CUSTOMIZATION_TOOLBAR_BUTTON, false); - public static final CachedFlag sNewTabPageCustomizationForMvt = newCachedFlag(NEW_TAB_PAGE_CUSTOMIZATION_FOR_MVT, false); + public static final CachedFlag sNewTabPageCustomizationToolbarButton = + newCachedFlag(NEW_TAB_PAGE_CUSTOMIZATION_TOOLBAR_BUTTON, false); + public static final CachedFlag sNewTabPageCustomizationV2 = + newCachedFlag(NEW_TAB_PAGE_CUSTOMIZATION_V2, false); public static final CachedFlag sNotificationTrampoline = newCachedFlag(NOTIFICATION_TRAMPOLINE, false); public static final CachedFlag sOptimizationGuidePushNotifications = @@ -928,8 +926,6 @@ newCachedFlag(START_SURFACE_RETURN_TIME, true); public static final CachedFlag sTabClosureMethodRefactor = newCachedFlag(TAB_CLOSURE_METHOD_REFACTOR, false); - public static final CachedFlag sTabletTabStripAnimation = - newCachedFlag(TABLET_TAB_STRIP_ANIMATION, false); public static final CachedFlag sTabStateFlatBuffer = newCachedFlag( TAB_STATE_FLAT_BUFFER, @@ -949,6 +945,8 @@ /* defaultValueInTests= */ true); public static final CachedFlag sTabWindowManagerReportIndicesMismatch = newCachedFlag(TAB_WINDOW_MANAGER_REPORT_INDICES_MISMATCH, true); + public static final CachedFlag sTabletTabStripAnimation = + newCachedFlag(TABLET_TAB_STRIP_ANIMATION, false); public static final CachedFlag sTestDefaultDisabled = newCachedFlag(TEST_DEFAULT_DISABLED, false); public static final CachedFlag sTestDefaultEnabled = newCachedFlag(TEST_DEFAULT_ENABLED, true); @@ -963,10 +961,10 @@ /* defaultValue= */ false, /* defaultValueInTests= */ true); public static final CachedFlag sTraceBinderIpc = newCachedFlag(TRACE_BINDER_IPC, false); - public static final CachedFlag sUseChimeAndroidSdk = - newCachedFlag(USE_CHIME_ANDROID_SDK, false); public static final CachedFlag sUseActivityManagerForTabActivation = newCachedFlag(USE_ACTIVITY_MANAGER_FOR_TAB_ACTIVATION, true); + public static final CachedFlag sUseChimeAndroidSdk = + newCachedFlag(USE_CHIME_ANDROID_SDK, false); public static final CachedFlag sUseInitialNetworkStateAtStartup = newCachedFlag( USE_INITIAL_NETWORK_STATE_AT_STARTUP, @@ -986,8 +984,8 @@ sAndroidAppIntegrationMultiDataSource, sAndroidAppIntegrationV2, sAndroidAppIntegrationWithFavicon, - sAndroidComposeplate, sAndroidBottomToolbar, + sAndroidComposeplate, sAndroidElegantTextHeight, sAndroidMinimalUiLargeScreen, sAndroidProgressBarVisualUpdate, @@ -999,6 +997,7 @@ sAndroidWindowPopupLargeScreen, sAppSpecificHistory, sAsyncNotificationManager, + sBackgroundThreadPoolFieldTrial, sBatchTabRestore, sBlockIntentsWhileLocked, sBookmarkPaneAndroid, @@ -1021,10 +1020,10 @@ sCctMinimized, sCctNavigationalPrefetch, sCctNestedSecurityIcon, - sCctPredictiveBackGesture, - sCctRealtimeEngagementEventsInBackground, sCctOpenInBrowserButtonIfAllowedByEmbedder, sCctOpenInBrowserButtonIfEnabledByEmbedder, + sCctPredictiveBackGesture, + sCctRealtimeEngagementEventsInBackground, sCctResizableForThirdParties, sCctRevampedBranding, sCctTabModalDialog, @@ -1071,9 +1070,9 @@ sNavBarColorMatchesTabBackground, sNewTabPageAndroidTriggerForPrerender2, sNewTabPageCustomization, - sNewTabPageCustomizationV2, - sNewTabPageCustomizationToolbarButton, sNewTabPageCustomizationForMvt, + sNewTabPageCustomizationToolbarButton, + sNewTabPageCustomizationV2, sNotificationTrampoline, sOptimizationGuidePushNotifications, sPaintPreviewDemo, @@ -1093,20 +1092,19 @@ sSmallerTabStripTitleLimit, sStartSurfaceReturnTime, sTabClosureMethodRefactor, - sTabletTabStripAnimation, sTabStateFlatBuffer, sTabStripDensityChangeAndroid, sTabStripIncognitoMigration, sTabStripLayoutOptimization, sTabWindowManagerReportIndicesMismatch, + sTabletTabStripAnimation, sTopControlsRefactor, sTouchToSearchCallout, sTraceBinderIpc, - sUseChimeAndroidSdk, sUseActivityManagerForTabActivation, + sUseChimeAndroidSdk, sUseInitialNetworkStateAtStartup, sUseLibunwindstackNativeUnwinderAndroid, - sBackgroundThreadPoolFieldTrial, sWebApkMinShellApkVersion); public static final List<CachedFlag> sFlagsCachedInMinimalBrowser = @@ -1124,6 +1122,8 @@ // MutableFlagWithSafeDefault instances. /* Alphabetical: */ + public static final MutableFlagWithSafeDefault sAdaptiveButtonInTopToolbarCustomizationV2 = + newMutableFlagWithSafeDefault(ADAPTIVE_BUTTON_IN_TOP_TOOLBAR_CUSTOMIZATION_V2, false); public static final MutableFlagWithSafeDefault sAndroidAppearanceSettings = newMutableFlagWithSafeDefault(ANDROID_APPEARANCE_SETTINGS, false); public static final MutableFlagWithSafeDefault sAndroidBookmarkBar = @@ -1204,10 +1204,10 @@ newMutableFlagWithSafeDefault(SUPPRESS_TOOLBAR_CAPTURES_AT_GESTURE_END, false); public static final MutableFlagWithSafeDefault sSwapNewTabAndNewTabInGroupAndroid = newMutableFlagWithSafeDefault(SWAP_NEW_TAB_AND_NEW_TAB_IN_GROUP_ANDROID, false); - public static final MutableFlagWithSafeDefault sTabCollectionAndroid = - newMutableFlagWithSafeDefault(TAB_COLLECTION_ANDROID, false); public static final MutableFlagWithSafeDefault sTabArchivalDragDropAndroid = newMutableFlagWithSafeDefault(TAB_ARCHIVAL_DRAG_DROP_ANDROID, false); + public static final MutableFlagWithSafeDefault sTabCollectionAndroid = + newMutableFlagWithSafeDefault(TAB_COLLECTION_ANDROID, false); // Default value will only ever be reached in tests. public static final MutableFlagWithSafeDefault sTabFreezeOnUndoableClosureKillSwitch = newMutableFlagWithSafeDefault(TAB_FREEZE_ON_UNDOABLE_CLOSURE_KILL_SWITCH, true); @@ -1221,8 +1221,6 @@ newMutableFlagWithSafeDefault(TAB_SWITCHER_FOREIGN_FAVICON_SUPPORT, true); public static final MutableFlagWithSafeDefault sToolbarScrollAblation = newMutableFlagWithSafeDefault(TOOLBAR_SCROLL_ABLATION, false); - public static final MutableFlagWithSafeDefault sAdaptiveButtonInTopToolbarCustomizationV2 = - newMutableFlagWithSafeDefault(ADAPTIVE_BUTTON_IN_TOP_TOOLBAR_CUSTOMIZATION_V2, false); // CachedFeatureParam instances. /* Alphabetical order by feature name, arbitrary order by param name: */ @@ -1607,9 +1605,8 @@ sAndroidAppIntegrationModuleForceCardShow, sAndroidAppIntegrationModuleShowThirdPartyCard, sAndroidAppIntegrationMultiDataSourceHistoryContentTtlHours, - sAndroidAppIntegrationMultiDataSourceSkipSchemaCheck, sAndroidAppIntegrationMultiDataSourceSkipDeviceCheck, - sAndroidComposeplateSkipLocaleCheck, + sAndroidAppIntegrationMultiDataSourceSkipSchemaCheck, sAndroidAppIntegrationV2ContentTtlHours, sAndroidAppIntegrationWithFaviconScheduleDelayTimeMs, sAndroidAppIntegrationWithFaviconSkipDeviceCheck, @@ -1617,15 +1614,15 @@ sAndroidAppIntegrationWithFaviconUseLargeFavicon, sAndroidAppIntegrationWithFaviconZeroStateFaviconNumber, sAndroidBottomToolbarDefaultToTop, + sAndroidComposeplateSkipLocaleCheck, sAndroidThemeModuleForceDependencies, sBackgroundThreadPoolFieldTrialConfig, sBatchTabRestoreBatchSize, sCctAdaptiveButtonContextualOnly, + sCctAdaptiveButtonDefaultVariant, sCctAdaptiveButtonEnableOpenInBrowser, sCctAdaptiveButtonEnableVoice, - sCctAdaptiveButtonDefaultVariant, sCctAuthTabEnableHttpsRedirectsVerificationTimeoutMs, - sClampAutomotiveScalingMaxScalingPercentage, sCctAutoTranslateAllowAllFirstParties, sCctAutoTranslatePackageNamesAllowlist, sCctGoogleBottomBarButtonList, @@ -1638,6 +1635,7 @@ sCctResizableForThirdPartiesAllowlistEntries, sCctResizableForThirdPartiesDefaultPolicy, sCctResizableForThirdPartiesDenylistEntries, + sClampAutomotiveScalingMaxScalingPercentage, sClankStartupLatencyInjectionAmountMs, sCollectAndroidFrameTimelineMetricsJankTrackerDelayedStartMs, sDeleteLegacyTabStateFilesBatchSize, @@ -1656,8 +1654,8 @@ sMagicStackAndroidShowAllModules, sMaliciousApkDownloadCheckTelemetryOnly, sMaxLegacyTabStateFilesDeletedPerSession, - sMostVisitedTilesReselectLaxQuery, sMostVisitedTilesReselectLaxPath, + sMostVisitedTilesReselectLaxQuery, sMostVisitedTilesReselectLaxRef, sMostVisitedTilesReselectLaxSchemeHost, sNavBarColorAnimationDisableBottomChinColorAnimation, @@ -1680,9 +1678,9 @@ sTabStripLayoutOptimizationOnExternalDisplay, sTabStripLayoutOptimizationOnExternalDisplayOemDenylist, sTabWindowManagerReportIndicesMismatchTimeDiffThresholdMs, + sTouchToSearchCalloutTextVariant, sUseChimeAndroidSdkAlwaysRegister, - sWebApkMinShellApkVersionValue, - sTouchToSearchCalloutTextVariant); + sWebApkMinShellApkVersionValue); // Mutable*ParamWithSafeDefault instances. /* Alphabetical: */ @@ -1702,14 +1700,14 @@ sAndroidNativePagesInNewTabRecentTabsEnabled = sAndroidNativePagesInNewTab.newBooleanParam( "android_native_pages_in_new_tab_recent_tabs_enabled", true); - public static final MutableIntParamWithSafeDefault - sAndroidTabDeclutterAutoDeleteTimeDeltaHours = - sAndroidTabDeclutterAutoDelete.newIntParam( - "android_tab_declutter_auto_delete_time_delta_hours", 90 * 24); public static final MutableBooleanParamWithSafeDefault sDisableBottomControlsStackerYOffsetDispatching = sBottomBrowserControlsRefactor.newBooleanParam( "disable_bottom_controls_stacker_y_offset", false); + public static final MutableIntParamWithSafeDefault + sAndroidTabDeclutterAutoDeleteTimeDeltaHours = + sAndroidTabDeclutterAutoDelete.newIntParam( + "android_tab_declutter_auto_delete_time_delta_hours", 90 * 24); public static final MutableIntParamWithSafeDefault sTabSwitcherColorBlendAnimateDurationMs = sTabSwitcherColorBlendAnimate.newIntParam("animation_duration_ms", 240); public static final MutableIntParamWithSafeDefault sTabSwitcherColorBlendAnimateInterpolator =
diff --git a/chrome/browser/gesturenav/android/java/src/org/chromium/chrome/browser/gesturenav/NativePageBitmapCapturer.java b/chrome/browser/gesturenav/android/java/src/org/chromium/chrome/browser/gesturenav/NativePageBitmapCapturer.java index dd33b4db..eaa0467 100644 --- a/chrome/browser/gesturenav/android/java/src/org/chromium/chrome/browser/gesturenav/NativePageBitmapCapturer.java +++ b/chrome/browser/gesturenav/android/java/src/org/chromium/chrome/browser/gesturenav/NativePageBitmapCapturer.java
@@ -66,7 +66,7 @@ return true; } - UnownedUserDataHost host = tab.getWindowAndroid().getUnownedUserDataHost(); + UnownedUserDataHost host = tab.getWindowAndroidChecked().getUnownedUserDataHost(); if (CAPTURER_KEY.retrieveDataFromHost(host) == null) { CAPTURER_KEY.attachToHost(host, new NativePageBitmapCapturer()); } @@ -87,6 +87,7 @@ new CaptureObserver() { @Override public void onCaptureStart(Canvas canvas, @Nullable Rect dirtyRect) { + assumeNonNull(tab.getNativePage()); canvas.drawColor(tab.getNativePage().getBackgroundColor()); canvas.translate( 0, -tab.getNativePage().getHeightOverlappedWithTopControls()); @@ -138,7 +139,7 @@ return CaptureNativeViewResult.NULL_WINDOW_ANDROID; } - View view = tab.getView(); + View view = assumeNonNull(tab.getView()); // The view is not laid out yet. if (view.getWidth() == 0 || view.getHeight() == 0) { return CaptureNativeViewResult.VIEW_NOT_LAID_OUT; @@ -168,7 +169,7 @@ private static Bitmap capture(Tab tab, boolean fullscreen, int topControlsHeight) { try (TraceEvent e = TraceEvent.scoped("NativePageBitmapCapturer::capture")) { - View view = tab.getView(); + View view = assumeNonNull(tab.getView()); // The size of the webpage might be different from that of native pages. // The former may also capture the area underneath the navigation bar while // the latter sometimes does not. If their sizes don't match, a fallback screenshot will @@ -184,7 +185,7 @@ .getContainerView() .getHeight()); - bitmap.eraseColor(tab.getNativePage().getBackgroundColor()); + bitmap.eraseColor(assumeNonNull(tab.getNativePage()).getBackgroundColor()); Canvas canvas = new Canvas(bitmap); float scale = getScale();
diff --git a/chrome/browser/headless/headless_mode_protocol_browsertest.cc b/chrome/browser/headless/headless_mode_protocol_browsertest.cc index 4e71414..b53ee45e 100644 --- a/chrome/browser/headless/headless_mode_protocol_browsertest.cc +++ b/chrome/browser/headless/headless_mode_protocol_browsertest.cc
@@ -409,4 +409,30 @@ " workAreaLeft=10 workAreaRight=90" " workAreaTop=20 workAreaBottom=80}") +// TODO(crbug.com/424797525): Fails Mac 13. +#if BUILDFLAG(IS_MAC) +#define MAYBE_StartFullscreenSwitch DISABLED_StartFullscreenSwitch +#else +#define MAYBE_StartFullscreenSwitch StartFullscreenSwitch +#endif + +HEADLESS_MODE_PROTOCOL_TEST_WITH_COMMAND_LINE_EXTRAS( + MAYBE_StartFullscreenSwitch, + "sanity/start-fullscreen-switch.js", + "--screen-info={1600x1200}" + "--start-fullscreen") + +// TODO(crbug.com/423951863): Fails on Linux and Mac. +#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_LINUX) +#define MAYBE_StartFullscreenSwitchScaled DISABLED_StartFullscreenSwitchScaled +#else +#define MAYBE_StartFullscreenSwitchScaled StartFullscreenSwitchScaled +#endif + +HEADLESS_MODE_PROTOCOL_TEST_WITH_COMMAND_LINE_EXTRAS( + MAYBE_StartFullscreenSwitchScaled, + "sanity/start-fullscreen-switch-scaled.js", + "--screen-info={3000x2000 devicePixelRatio=2.0}" + "--start-fullscreen") + } // namespace headless
diff --git a/chrome/browser/headless/test/data/protocol/sanity/start-fullscreen-switch-expected.txt b/chrome/browser/headless/test/data/protocol/sanity/start-fullscreen-switch-expected.txt new file mode 100644 index 0000000..a876202 --- /dev/null +++ b/chrome/browser/headless/test/data/protocol/sanity/start-fullscreen-switch-expected.txt
@@ -0,0 +1,2 @@ +Tests --start-fullscreen switch. +Screen: 1600x1200, Outer: 1600x1200 \ No newline at end of file
diff --git a/chrome/browser/headless/test/data/protocol/sanity/start-fullscreen-switch-scaled-expected.txt b/chrome/browser/headless/test/data/protocol/sanity/start-fullscreen-switch-scaled-expected.txt new file mode 100644 index 0000000..a4569947 --- /dev/null +++ b/chrome/browser/headless/test/data/protocol/sanity/start-fullscreen-switch-scaled-expected.txt
@@ -0,0 +1,2 @@ +Tests --start-fullscreen switch with pixel scaling. +Screen: 1500x1000, Outer: 1500x1000 \ No newline at end of file
diff --git a/chrome/browser/headless/test/data/protocol/sanity/start-fullscreen-switch-scaled.js b/chrome/browser/headless/test/data/protocol/sanity/start-fullscreen-switch-scaled.js new file mode 100644 index 0000000..5c040c16 --- /dev/null +++ b/chrome/browser/headless/test/data/protocol/sanity/start-fullscreen-switch-scaled.js
@@ -0,0 +1,21 @@ +// 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. + +(async function(testRunner) { + const {session} = await testRunner.startBlank( + 'Tests --start-fullscreen switch with pixel scaling.'); + + const expression = ` + let lines = []; + lines.push('Screen: ' + screen.width + 'x' + screen.height); + lines.push('Outer: ' + outerWidth + 'x' + outerHeight); + lines.join(', '); + `; + + const result = await session.evaluate(expression); + + testRunner.log(result); + + testRunner.completeTest(); +})
diff --git a/chrome/browser/headless/test/data/protocol/sanity/start-fullscreen-switch.js b/chrome/browser/headless/test/data/protocol/sanity/start-fullscreen-switch.js new file mode 100644 index 0000000..ee9d18f --- /dev/null +++ b/chrome/browser/headless/test/data/protocol/sanity/start-fullscreen-switch.js
@@ -0,0 +1,21 @@ +// 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. + +(async function(testRunner) { + const {session} = + await testRunner.startBlank('Tests --start-fullscreen switch.'); + + const expression = ` + let lines = []; + lines.push('Screen: ' + screen.width + 'x' + screen.height); + lines.push('Outer: ' + outerWidth + 'x' + outerHeight); + lines.join(', '); + `; + + const result = await session.evaluate(expression); + + testRunner.log(result); + + testRunner.completeTest(); +})
diff --git a/chrome/browser/optimization_guide/hints_fetcher_browsertest.cc b/chrome/browser/optimization_guide/hints_fetcher_browsertest.cc index 0ef93ea..ae5e283 100644 --- a/chrome/browser/optimization_guide/hints_fetcher_browsertest.cc +++ b/chrome/browser/optimization_guide/hints_fetcher_browsertest.cc
@@ -1865,6 +1865,8 @@ identity_test_env_adaptor_; }; +// Verify access token is attached during navigation fetching if a +// personalizable optimization type is requested. IN_PROC_BROWSER_TEST_F(ProactivePersonalizationHintsFetcherBrowserTest, OnNavigationFetchesWithAccessToken) { SetNetworkConnectionOnline(); @@ -1885,7 +1887,25 @@ EXPECT_EQ(1u, count_hints_requests_received()); } -class ProactivePersonalizationHintsWrongOptimizationTypeFetcherBrowserTest +// Verify access token is attached during active tab fetching if a +// personalizable optimization type is requested. +IN_PROC_BROWSER_TEST_F(ProactivePersonalizationHintsFetcherBrowserTest, + ActiveTabFetchesWithAccessToken) { + const base::HistogramTester* histogram_tester = GetHistogramTester(); + EnableSignin(); + SetExpectedBearerAccessToken("Bearer access_token"); + + SetUpComponentUpdateHints(https_url()); + + EXPECT_GE(optimization_guide::RetryForHistogramUntilCountReached( + histogram_tester, + "OptimizationGuide.HintsFetcher.GetHintsRequest.RequestStatus." + "BatchUpdateActiveTabs", + 1), + 1); +} + +class ProactivePersonalizationNoAllowedTypesHintsFetcherBrowserTest : public ProactivePersonalizationHintsFetcherBrowserTest { public: base::FieldTrialParams GetFieldTrialParams() override { @@ -1895,8 +1915,10 @@ } }; +// Verify access token is not attached during navigation fetching if no +// personalizable optimization type is requested. IN_PROC_BROWSER_TEST_F( - ProactivePersonalizationHintsWrongOptimizationTypeFetcherBrowserTest, + ProactivePersonalizationNoAllowedTypesHintsFetcherBrowserTest, OnNavigationDoesNotFetchAccessToken) { SetNetworkConnectionOnline(); SetResponseType( @@ -1915,3 +1937,22 @@ SetExpectedHintsRequestForHostsAndUrls(expected_request); EXPECT_EQ(1u, count_hints_requests_received()); } + +// Verify access token is not attached during active tab fetching if no +// personalizable optimization type is requested. +IN_PROC_BROWSER_TEST_F( + ProactivePersonalizationNoAllowedTypesHintsFetcherBrowserTest, + ActiveTabDoesNotFetchWithAccessToken) { + const base::HistogramTester* histogram_tester = GetHistogramTester(); + EnableSignin(); + SetExpectedBearerAccessToken(std::string()); + + SetUpComponentUpdateHints(https_url()); + + EXPECT_GE(optimization_guide::RetryForHistogramUntilCountReached( + histogram_tester, + "OptimizationGuide.HintsFetcher.GetHintsRequest.RequestStatus." + "BatchUpdateActiveTabs", + 1), + 1); +}
diff --git a/chrome/browser/os_crypt/app_bound_encryption_provider_win.cc b/chrome/browser/os_crypt/app_bound_encryption_provider_win.cc index 78acb195..cfe1e8a 100644 --- a/chrome/browser/os_crypt/app_bound_encryption_provider_win.cc +++ b/chrome/browser/os_crypt/app_bound_encryption_provider_win.cc
@@ -15,6 +15,7 @@ #include "base/logging.h" #include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" +#include "base/notreached.h" #include "base/task/single_thread_task_runner.h" #include "base/task/task_traits.h" #include "base/task/thread_pool.h" @@ -214,10 +215,24 @@ return; } - // There is no key, so generate a new one, but only on a fully supported - // system. In unsupported systems the provider will support decrypt of - // existing data (if App-Bound validation still passes) but not encrypt of any - // new data. + // Clean up bad keys. + switch (encrypted_key_data.error()) { + case KeyRetrievalStatus::kSuccess: + NOTREACHED(); + case KeyRetrievalStatus::kKeyNotFound: + // Not found means nothing to do. + break; + case KeyRetrievalStatus::kKeyDecodeFailure: + case KeyRetrievalStatus::kInvalidKeyHeader: + case KeyRetrievalStatus::kKeyTooShort: + local_state_->ClearPref(kEncryptedKeyPrefName); + break; + } + + // There is no key or the key was invalid, so generate a new one, but only on + // a fully supported system. In unsupported systems the provider will support + // decrypt of existing data (if App-Bound validation still passes) but not + // encrypt of any new data. if (support_level_ != os_crypt::SupportLevel::kSupported) { std::move(callback).Run( kAppBoundDataPrefix, @@ -278,9 +293,19 @@ } // Trim off the key prefix. - return ReadWriteKeyData( + const auto key = ReadWriteKeyData( encrypted_key_with_header->cbegin() + sizeof(kCryptAppBoundKeyPrefix), encrypted_key_with_header->cend()); + + // This is an encrypted random key and encrypting N uniformly random bits + // requires >= N bits of ciphertext - follows from Shannon entropy theory and + // invertibility constraints. However the exact length is + // determined by the elevated service and might vary. + if (key.size() < os_crypt_async::Encryptor::Key::kAES256GCMKeySize) { + return base::unexpected(KeyRetrievalStatus::kKeyTooShort); + } + + return key; } void AppBoundEncryptionProviderWin::StoreKey(
diff --git a/chrome/browser/os_crypt/app_bound_encryption_provider_win.h b/chrome/browser/os_crypt/app_bound_encryption_provider_win.h index 85eb4e6..216c4609 100644 --- a/chrome/browser/os_crypt/app_bound_encryption_provider_win.h +++ b/chrome/browser/os_crypt/app_bound_encryption_provider_win.h
@@ -25,8 +25,8 @@ class PrefRegistrySimple; namespace os_crypt { +class AppBoundEncryptionProviderTest; FORWARD_DECLARE_TEST(AppBoundEncryptionWinReencryptTest, KeyProviderTest); -FORWARD_DECLARE_TEST(AppBoundEncryptionProvider, Basic); } // namespace os_crypt namespace os_crypt_async { @@ -58,7 +58,7 @@ private: FRIEND_TEST_ALL_PREFIXES(os_crypt::AppBoundEncryptionWinReencryptTest, KeyProviderTest); - FRIEND_TEST_ALL_PREFIXES(os_crypt::AppBoundEncryptionProvider, Basic); + friend class os_crypt::AppBoundEncryptionProviderTest; using ReadOnlyKeyData = const std::vector<uint8_t>; using ReadWriteKeyData = std::vector<uint8_t>; @@ -72,7 +72,8 @@ kKeyNotFound = 1, kKeyDecodeFailure = 2, kInvalidKeyHeader = 3, - kMaxValue = kInvalidKeyHeader, + kKeyTooShort = 4, + kMaxValue = kKeyTooShort, }; // os_crypt_async::KeyProvider interface.
diff --git a/chrome/browser/os_crypt/app_bound_encryption_provider_win_unittest.cc b/chrome/browser/os_crypt/app_bound_encryption_provider_win_unittest.cc index 1b62b10..74224c1 100644 --- a/chrome/browser/os_crypt/app_bound_encryption_provider_win_unittest.cc +++ b/chrome/browser/os_crypt/app_bound_encryption_provider_win_unittest.cc
@@ -7,6 +7,7 @@ #include <string> #include "base/strings/strcat.h" +#include "base/test/metrics/histogram_tester.h" #include "base/test/scoped_feature_list.h" #include "base/test/task_environment.h" #include "base/test/test_future.h" @@ -91,9 +92,34 @@ return elevation_service::Elevator::kErrorCouldNotDecryptWithUserContext; } +// Chance of a false positive for a 256 bit random key at run_length 10 +// is 2.97e-15 +bool HasRepeatedCharacters(std::string_view data, size_t run_length = 10) { + size_t count = 1; + for (size_t i = 1; i < data.size(); ++i) { + if (data[i] == data[i - 1]) { + if (++count >= run_length) { + return true; + } + } else { + count = 1; + } + } + return false; +} + } // namespace -TEST(AppBoundEncryptionProvider, TestEncryptDecrypt) { +class AppBoundEncryptionProviderTest : public ::testing::Test { + protected: + // Access the `GetKey` method via the class so it can be more easily friended. + void GetKey(os_crypt_async::KeyProvider& provider, + os_crypt_async::KeyProvider::KeyCallback callback) { + provider.GetKey(std::move(callback)); + } +}; + +TEST_F(AppBoundEncryptionProviderTest, TestEncryptDecrypt) { std::string ciphertext; { DWORD last_error; @@ -112,7 +138,66 @@ } } -TEST(AppBoundEncryptionProvider, Basic) { +TEST_F(AppBoundEncryptionProviderTest, InvalidKeyRegenerated) { + base::test::TaskEnvironment env; + ::testing::StrictMock<MockAppBoundEncryptionOverrides> mock_app_bound; + + SetOverridesForTesting(&mock_app_bound); + + ON_CALL(mock_app_bound, EncryptAppBoundString) + .WillByDefault(::testing::Invoke(DefaultEncrypt)); + ON_CALL(mock_app_bound, DecryptAppBoundString) + .WillByDefault(::testing::Invoke(DefaultDecrypt)); + ON_CALL(mock_app_bound, GetAppBoundEncryptionSupportLevel) + .WillByDefault(::testing::Return(SupportLevel::kSupported)); + + const char* kPrefName = "os_crypt.app_bound_encrypted_key"; + + TestingPrefServiceSimple prefs; + MockPrefChangeCallback pref_observer(&prefs); + PrefChangeRegistrar registrar; + base::HistogramTester histograms; + registrar.Init(&prefs); + registrar.Add(kPrefName, pref_observer.GetCallback()); + os_crypt_async::AppBoundEncryptionProviderWin::RegisterLocalPrefs( + prefs.registry()); + + // Pref is changed three times. Firstly by the test itself, then secondly to + // clear it and finally, to write the new encrypted value. + EXPECT_CALL(pref_observer, OnPreferenceChanged(_)).Times(3); + // Invalid key means decrypt is never called. + EXPECT_CALL(mock_app_bound, DecryptAppBoundString).Times(0); + // The new random key will be encrypted. + EXPECT_CALL(mock_app_bound, EncryptAppBoundString).Times(1); + EXPECT_CALL(mock_app_bound, GetAppBoundEncryptionSupportLevel).Times(1); + + // base64 encoded "APPB" with a zero length key. This simulates the state + // users are in for https://crbug.com/415979068. + prefs.SetString(kPrefName, "QVBQQg=="); + { + os_crypt_async::AppBoundEncryptionProviderWin provider(&prefs); + base::test::TestFuture< + const std::string&, + base::expected<os_crypt_async::Encryptor::Key, + os_crypt_async::KeyProvider::KeyError>> + future; + GetKey(provider, future.GetCallback()); + auto [tag, key] = future.Take(); + EXPECT_EQ(tag, "v20"); + EXPECT_TRUE(key.has_value()); + } + + const auto& pref = prefs.GetString(kPrefName); + // Very basic extra tests: Check key length and that it's not a sequence of + // nulls or poisoned memory. + EXPECT_GT(pref.size(), os_crypt_async::Encryptor::Key::kAES256GCMKeySize); + EXPECT_FALSE(HasRepeatedCharacters(pref)); + + histograms.ExpectUniqueSample("OSCrypt.AppBoundProvider.KeyRetrieval.Status", + /*KeyRetrievalStatus::kKeyTooShort*/ 4, 1); +} + +TEST_F(AppBoundEncryptionProviderTest, Basic) { base::test::ScopedFeatureList feature( os_crypt_async::features::kRegenerateKeyForCatastrophicFailures); @@ -156,7 +241,7 @@ base::expected<os_crypt_async::Encryptor::Key, os_crypt_async::KeyProvider::KeyError>> future; - provider.GetKey(future.GetCallback()); + GetKey(provider, future.GetCallback()); auto [tag, key] = future.Take(); EXPECT_EQ(tag, "v20"); ASSERT_TRUE(key.has_value()); @@ -181,7 +266,7 @@ base::expected<os_crypt_async::Encryptor::Key, os_crypt_async::KeyProvider::KeyError>> future; - provider.GetKey(future.GetCallback()); + GetKey(provider, future.GetCallback()); const auto& [_, key] = future.Get(); ASSERT_TRUE(key.has_value()); // The key returned should be the same as before. @@ -208,7 +293,7 @@ base::expected<os_crypt_async::Encryptor::Key, os_crypt_async::KeyProvider::KeyError>> future; - provider.GetKey(future.GetCallback()); + GetKey(provider, future.GetCallback()); const auto& [_, key] = future.Get(); // A failure like E_FAIL is temporary, the key is not available but hasn't @@ -242,7 +327,7 @@ base::expected<os_crypt_async::Encryptor::Key, os_crypt_async::KeyProvider::KeyError>> future; - provider.GetKey(future.GetCallback()); + GetKey(provider, future.GetCallback()); auto [_, key] = future.Take(); ASSERT_TRUE(key.has_value()); @@ -272,7 +357,7 @@ base::expected<os_crypt_async::Encryptor::Key, os_crypt_async::KeyProvider::KeyError>> future; - provider.GetKey(future.GetCallback()); + GetKey(provider, future.GetCallback()); const auto& [_, key] = future.Get(); ASSERT_TRUE(key.has_value()); @@ -301,7 +386,7 @@ base::expected<os_crypt_async::Encryptor::Key, os_crypt_async::KeyProvider::KeyError>> future; - provider.GetKey(future.GetCallback()); + GetKey(provider, future.GetCallback()); const auto& [_, key] = future.Get(); // The failure is now temporary, the key is not available but hasn't been @@ -331,7 +416,7 @@ base::expected<os_crypt_async::Encryptor::Key, os_crypt_async::KeyProvider::KeyError>> future; - provider.GetKey(future.GetCallback()); + GetKey(provider, future.GetCallback()); const auto& [_, key] = future.Get(); ASSERT_TRUE(key.has_value());
diff --git a/chrome/browser/password_manager/password_change_browsertest.cc b/chrome/browser/password_manager/password_change_browsertest.cc index 5656f4a5..bacc08d37 100644 --- a/chrome/browser/password_manager/password_change_browsertest.cc +++ b/chrome/browser/password_manager/password_change_browsertest.cc
@@ -869,3 +869,31 @@ EXPECT_EQ(url::Origin::Create(GURL("chrome://password-manager/")), url::Origin::Create(tab_strip->GetActiveWebContents()->GetURL())); } + +IN_PROC_BROWSER_TEST_F(PasswordChangeBrowserTest, + ToastHiddenWhenDialogDisplayed) { + SetPrivacyNoticeAcceptedPref(); + const GURL main_url = WebContents()->GetLastCommittedURL(); + EXPECT_CALL(*affiliation_service(), GetChangePasswordURL(main_url)) + .WillOnce(testing::Return(embedded_test_server()->GetURL( + "/password/update_form_empty_fields.html"))); + + password_change_service()->OfferPasswordChangeUi(main_url, u"test", + u"pa$$word", WebContents()); + PasswordChangeDelegate* delegate = + password_change_service()->GetPasswordChangeDelegate(WebContents()); + delegate->StartPasswordChangeFlow(); + MockPasswordChangeOutcome( + PasswordChangeOutcome:: + PasswordChangeSubmissionData_PasswordChangeOutcome_UNSUCCESSFUL_OUTCOME); + + ASSERT_TRUE(base::test::RunUntil([delegate]() { + return delegate->GetCurrentState() == + PasswordChangeDelegate::State::kPasswordChangeFailed; + })); + + PasswordChangeUIController* ui_controller = + static_cast<PasswordChangeDelegateImpl*>(delegate)->ui_controller(); + EXPECT_TRUE(ui_controller->dialog_widget()->IsVisible()); + EXPECT_FALSE(ui_controller->toast_view()); +}
diff --git a/chrome/browser/picture_in_picture/auto_picture_in_picture_tab_model_observer_helper.cc b/chrome/browser/picture_in_picture/auto_picture_in_picture_tab_model_observer_helper.cc index 4ec0dc8e..0f1bd76 100644 --- a/chrome/browser/picture_in_picture/auto_picture_in_picture_tab_model_observer_helper.cc +++ b/chrome/browser/picture_in_picture/auto_picture_in_picture_tab_model_observer_helper.cc
@@ -60,6 +60,11 @@ // TODO(crbug.com/421608904): add implementation } +void AutoPictureInPictureTabModelObserverHelper::WillCloseTab(TabAndroid* tab) { + NOTIMPLEMENTED(); + // TODO(crbug.com/421608904): add implementation +} + void AutoPictureInPictureTabModelObserverHelper::OnTabModelAdded( TabModel* model) { NOTIMPLEMENTED();
diff --git a/chrome/browser/picture_in_picture/auto_picture_in_picture_tab_model_observer_helper.h b/chrome/browser/picture_in_picture/auto_picture_in_picture_tab_model_observer_helper.h index 23a5864..733bfd5 100644 --- a/chrome/browser/picture_in_picture/auto_picture_in_picture_tab_model_observer_helper.h +++ b/chrome/browser/picture_in_picture/auto_picture_in_picture_tab_model_observer_helper.h
@@ -49,9 +49,11 @@ // callback if it changed. void UpdateIsTabActivated(); - raw_ptr<TabModel> observed_tab_model_ = nullptr; - bool is_tab_activated_ = false; - bool is_observing_ = false; + // TODO(crbug.com/421608904): remove [[maybe_unused]] once implementation is + // added. + [[maybe_unused]] raw_ptr<TabModel> observed_tab_model_ = nullptr; + [[maybe_unused]] bool is_tab_activated_ = false; + [[maybe_unused]] bool is_observing_ = false; }; #endif // CHROME_BROWSER_PICTURE_IN_PICTURE_AUTO_PICTURE_IN_PICTURE_TAB_MODEL_OBSERVER_HELPER_H_
diff --git a/chrome/browser/picture_in_picture/test/BUILD.gn b/chrome/browser/picture_in_picture/test/BUILD.gn new file mode 100644 index 0000000..cc83911 --- /dev/null +++ b/chrome/browser/picture_in_picture/test/BUILD.gn
@@ -0,0 +1,63 @@ +# 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("//build/config/android/rules.gni") +import("//third_party/jni_zero/jni_zero.gni") + +android_library("javatests") { + testonly = true + resources_package = "org.chromium.chrome.browser.picture_in_picture" + + sources = [ "android/java/src/org/chromium/chrome/browser/picture_in_picture/AutoPiPTabModelObserverHelperTest.java" ] + + deps = [ + ":test_support_java", + "//base:base_java_test_support", + "//base:callback_java", + "//base/test:public_transit_java", + "//chrome/android:chrome_java", + "//chrome/browser/flags:java", + "//chrome/browser/tab:java", + "//chrome/browser/tabmodel:java", + "//chrome/test/android:chrome_java_integration_test_support", + "//chrome/test/android:chrome_java_transit", + "//content/public/android:content_java", + "//content/public/test/android:content_java_test_support", + "//third_party/androidx:androidx_test_monitor_java", + "//third_party/androidx:androidx_test_runner_java", + "//third_party/junit:junit", + ] +} + +android_library("test_support_java") { + testonly = true + resources_package = "org.chromium.chrome.browser.picture_in_picture" + + sources = [ "android/java/src/org/chromium/chrome/browser/picture_in_picture/AutoPiPTabModelObserverHelperTestUtils.java" ] + + deps = [ + "//base:base_java", + "//content/public/android:content_java", + "//third_party/jni_zero:jni_zero_java", + ] + + srcjar_deps = [ ":jni_headers" ] +} + +generate_jni("jni_headers") { + testonly = true + visibility = [ ":*" ] + sources = [ "android/java/src/org/chromium/chrome/browser/picture_in_picture/AutoPiPTabModelObserverHelperTestUtils.java" ] +} + +static_library("test_support") { + testonly = true + sources = [ "android/auto_pip_tab_model_observer_test_utils.cc" ] + deps = [ + ":jni_headers", + "//base", + "//chrome/browser/picture_in_picture:picture_in_picture", + "//content/public/browser", + ] +}
diff --git a/chrome/browser/picture_in_picture/test/android/auto_pip_tab_model_observer_test_utils.cc b/chrome/browser/picture_in_picture/test/android/auto_pip_tab_model_observer_test_utils.cc new file mode 100644 index 0000000..8f82edf5 --- /dev/null +++ b/chrome/browser/picture_in_picture/test/android/auto_pip_tab_model_observer_test_utils.cc
@@ -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. + +#include "base/android/callback_android.h" +#include "base/android/jni_android.h" +#include "base/no_destructor.h" +#include "chrome/browser/picture_in_picture/auto_picture_in_picture_tab_model_observer_helper.h" +#include "chrome/browser/picture_in_picture/test/jni_headers/AutoPiPTabModelObserverHelperTestUtils_jni.h" +#include "content/public/browser/web_contents.h" + +namespace { + +struct TestState { + std::unique_ptr<AutoPictureInPictureTabModelObserverHelper> helper; + base::android::ScopedJavaGlobalRef<jobject> on_activated_changed_callback; +}; + +TestState* g_test_state = nullptr; + +void RunActivationChangedCallback(bool is_activated) { + if (g_test_state) { + base::android::RunBooleanCallbackAndroid( + g_test_state->on_activated_changed_callback, is_activated); + } +} + +} // namespace + +// ---------------------------------------------------------------------------- +// Native JNI methods +// ---------------------------------------------------------------------------- + +namespace picture_in_picture { + +// static +void JNI_AutoPiPTabModelObserverHelperTestUtils_Initialize( + JNIEnv* env, + const base::android::JavaParamRef<jobject>& j_web_contents, + const base::android::JavaParamRef<jobject>& j_callback) { + // Ensure no previous test state is leaking. + CHECK(!g_test_state); + + g_test_state = new TestState(); + g_test_state->on_activated_changed_callback.Reset(j_callback); + + content::WebContents* web_contents = + content::WebContents::FromJavaWebContents(j_web_contents); + g_test_state->helper = + std::make_unique<AutoPictureInPictureTabModelObserverHelper>( + web_contents, base::BindRepeating(&RunActivationChangedCallback)); +} + +// static +void JNI_AutoPiPTabModelObserverHelperTestUtils_StartObserving( + JNIEnv* env, + const base::android::JavaParamRef<jobject>& j_web_contents) { + CHECK(g_test_state); + g_test_state->helper->StartObserving(); +} + +// static +void JNI_AutoPiPTabModelObserverHelperTestUtils_StopObserving( + JNIEnv* env, + const base::android::JavaParamRef<jobject>& j_web_contents) { + CHECK(g_test_state); + g_test_state->helper->StopObserving(); +} + +// static +void JNI_AutoPiPTabModelObserverHelperTestUtils_Destroy( + JNIEnv* env, + const base::android::JavaParamRef<jobject>& j_web_contents) { + if (g_test_state) { + delete g_test_state; + g_test_state = nullptr; + } +} + +} // namespace picture_in_picture
diff --git a/chrome/browser/picture_in_picture/test/android/java/src/org/chromium/chrome/browser/picture_in_picture/AutoPiPTabModelObserverHelperTest.java b/chrome/browser/picture_in_picture/test/android/java/src/org/chromium/chrome/browser/picture_in_picture/AutoPiPTabModelObserverHelperTest.java new file mode 100644 index 0000000..3ab9c3eb --- /dev/null +++ b/chrome/browser/picture_in_picture/test/android/java/src/org/chromium/chrome/browser/picture_in_picture/AutoPiPTabModelObserverHelperTest.java
@@ -0,0 +1,116 @@ +// 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.chrome.browser.picture_in_picture; + +import static org.junit.Assert.assertEquals; + +import androidx.test.filters.MediumTest; + +import org.junit.After; +import org.junit.Before; +import org.junit.Rule; +import org.junit.Test; +import org.junit.runner.RunWith; + +import org.chromium.base.ThreadUtils; +import org.chromium.base.test.util.Batch; +import org.chromium.base.test.util.CallbackHelper; +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.test.ChromeJUnit4ClassRunner; +import org.chromium.chrome.test.transit.AutoResetCtaTransitTestRule; +import org.chromium.chrome.test.transit.ChromeTransitTestRules; +import org.chromium.chrome.test.transit.page.PageStation; +import org.chromium.chrome.test.transit.page.WebPageStation; +import org.chromium.content_public.browser.WebContents; + +import java.util.concurrent.TimeoutException; + +/** + * Instrumentation test for the C++ AutoPictureInPictureTabModelObserverHelper logic. This test uses + * a JNI bridge to verify the behavior of the C++ class. + */ +@RunWith(ChromeJUnit4ClassRunner.class) +@CommandLineFlags.Add({ChromeSwitches.DISABLE_FIRST_RUN_EXPERIENCE}) +@Batch(Batch.PER_CLASS) +public class AutoPiPTabModelObserverHelperTest { + @Rule + public final AutoResetCtaTransitTestRule mActivityTestRule = + ChromeTransitTestRules.fastAutoResetCtaActivityRule(); + + private WebPageStation mPage; + private WebContents mObservedWebContents; + private final CallbackHelper mOnActivationChangedCallbackHelper = new CallbackHelper(); + + @Before + public void setUp() { + mPage = mActivityTestRule.startOnBlankPage(); + mObservedWebContents = mPage.webContentsElement.get(); + + // Initialize the C++ test utilities for the WebContents under observation, + // passing it the callback to be invoked from C++. + ThreadUtils.runOnUiThreadBlocking( + () -> { + AutoPiPTabModelObserverHelperTestUtils.initialize( + mObservedWebContents, + (isActivated) -> { + mOnActivationChangedCallbackHelper.notifyCalled(); + }); + }); + } + + @After + public void tearDown() { + ThreadUtils.runOnUiThreadBlocking( + () -> AutoPiPTabModelObserverHelperTestUtils.destroy(mObservedWebContents)); + } + + @Test + @MediumTest + @DisabledTest(message = "Implementation not yet landed. See crbug.com/421608904") + public void testTriggersOnTabActivationChanged() throws TimeoutException { + int callCount = mOnActivationChangedCallbackHelper.getCallCount(); + + // Start observing. + AutoPiPTabModelObserverHelperTestUtils.startObserving(mObservedWebContents); + + // Open and switch to a new tab. This should deactivate our observed tab. + PageStation page = mPage.openNewTabFast(); + mOnActivationChangedCallbackHelper.waitForCallback(callCount++); + + // Switch back to the original tab. This should activate it. + page.openRegularTabSwitcher().selectTabAtIndex(0, WebPageStation.newBuilder()); + mOnActivationChangedCallbackHelper.waitForCallback(callCount++); + } + + @Test + @MediumTest + @DisabledTest(message = "Implementation not yet landed. See crbug.com/421608904") + public void testStopAndStartObserving() throws TimeoutException { + int callCount = mOnActivationChangedCallbackHelper.getCallCount(); + + // Start observing, then immediately stop. + AutoPiPTabModelObserverHelperTestUtils.startObserving(mObservedWebContents); + AutoPiPTabModelObserverHelperTestUtils.stopObserving(mObservedWebContents); + + // Open a new tab. Since we are not observing, no additional callback + // should fire. + PageStation page = mPage.openNewTabFast(); + assertEquals( + "Callback should not have fired.", + callCount, + mOnActivationChangedCallbackHelper.getCallCount()); + + // Start observing again. + AutoPiPTabModelObserverHelperTestUtils.startObserving(mObservedWebContents); + + // Switch back to the original tab. It should now trigger the callback. + page.openRegularTabSwitcher().selectTabAtIndex(0, WebPageStation.newBuilder()); + mOnActivationChangedCallbackHelper.waitForCallback(callCount++); + } + + // TODO(crbug.com/421608904): add additional multi window tests. +}
diff --git a/chrome/browser/picture_in_picture/test/android/java/src/org/chromium/chrome/browser/picture_in_picture/AutoPiPTabModelObserverHelperTestUtils.java b/chrome/browser/picture_in_picture/test/android/java/src/org/chromium/chrome/browser/picture_in_picture/AutoPiPTabModelObserverHelperTestUtils.java new file mode 100644 index 0000000..b90e1be --- /dev/null +++ b/chrome/browser/picture_in_picture/test/android/java/src/org/chromium/chrome/browser/picture_in_picture/AutoPiPTabModelObserverHelperTestUtils.java
@@ -0,0 +1,51 @@ +// 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.chrome.browser.picture_in_picture; + +import org.jni_zero.JNINamespace; +import org.jni_zero.NativeMethods; + +import org.chromium.base.Callback; +import org.chromium.base.ThreadUtils; +import org.chromium.content_public.browser.WebContents; + +/** Utility class for testing AutoPictureInPictureTabModelObserverHelper C++ logic via JNI. */ +@JNINamespace("picture_in_picture") +public class AutoPiPTabModelObserverHelperTestUtils { + private AutoPiPTabModelObserverHelperTestUtils() {} + + public static void initialize(WebContents webContents, Callback<Boolean> callback) { + ThreadUtils.runOnUiThreadBlocking( + () -> + AutoPiPTabModelObserverHelperTestUtilsJni.get() + .initialize(webContents, callback)); + } + + public static void startObserving(WebContents webContents) { + ThreadUtils.runOnUiThreadBlocking( + () -> AutoPiPTabModelObserverHelperTestUtilsJni.get().startObserving(webContents)); + } + + public static void stopObserving(WebContents webContents) { + ThreadUtils.runOnUiThreadBlocking( + () -> AutoPiPTabModelObserverHelperTestUtilsJni.get().stopObserving(webContents)); + } + + public static void destroy(WebContents webContents) { + ThreadUtils.runOnUiThreadBlocking( + () -> AutoPiPTabModelObserverHelperTestUtilsJni.get().destroy(webContents)); + } + + @NativeMethods + interface Natives { + void initialize(WebContents webContents, Callback<Boolean> onActivationChanged); + + void startObserving(WebContents webContents); + + void stopObserving(WebContents webContents); + + void destroy(WebContents webContents); + } +}
diff --git a/chrome/browser/platform_experience/BUILD.gn b/chrome/browser/platform_experience/BUILD.gn new file mode 100644 index 0000000..1ed2743b --- /dev/null +++ b/chrome/browser/platform_experience/BUILD.gn
@@ -0,0 +1,11 @@ +# 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("//build/config/chrome_build.gni") + +source_set("features") { + public = [ "features.h" ] + sources = [ "features.cc" ] + public_deps = [ "//base" ] +}
diff --git a/chrome/browser/platform_experience/features.cc b/chrome/browser/platform_experience/features.cc new file mode 100644 index 0000000..ebd842d --- /dev/null +++ b/chrome/browser/platform_experience/features.cc
@@ -0,0 +1,19 @@ +// 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/platform_experience/features.h" + +#include "base/feature_list.h" + +namespace platform_experience::features { + +BASE_FEATURE(kDisablePEHNotifications, + "DisablePEHNotifications", + base::FEATURE_DISABLED_BY_DEFAULT); + +BASE_FEATURE(kShouldUseSpecificPEHNotificationText, + "ShouldUseSpecificPEHNotificationText", + base::FEATURE_DISABLED_BY_DEFAULT); + +} // namespace platform_experience::features
diff --git a/chrome/browser/platform_experience/features.h b/chrome/browser/platform_experience/features.h new file mode 100644 index 0000000..e15010b98 --- /dev/null +++ b/chrome/browser/platform_experience/features.h
@@ -0,0 +1,29 @@ +// 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_PLATFORM_EXPERIENCE_FEATURES_H_ +#define CHROME_BROWSER_PLATFORM_EXPERIENCE_FEATURES_H_ + +#include "base/feature_list.h" +#include "base/metrics/field_trial_params.h" + +namespace platform_experience::features { + +// Forces the PEH to never show notifications. +BASE_DECLARE_FEATURE(kDisablePEHNotifications); + +// By default, a random notification text is chosen when a notification shows. +// This feature allows for a specific notification text to be used. +// kUseNotificationTextIndex specifies which text will be used if a notification +// will show. +BASE_DECLARE_FEATURE(kShouldUseSpecificPEHNotificationText); + +// Defines which notification text will be used if +// kShouldUseSpecificNotificationText is enabled. +inline constexpr base::FeatureParam<int> kUseNotificationTextIndex{ + &kShouldUseSpecificPEHNotificationText, "UseNotificationTextIndex", 0}; + +} // namespace platform_experience::features + +#endif // CHROME_BROWSER_PLATFORM_EXPERIENCE_FEATURES_H_
diff --git a/chrome/browser/policy/configuration_policy_handler_list_factory.cc b/chrome/browser/policy/configuration_policy_handler_list_factory.cc index 39dd668..2d98d69 100644 --- a/chrome/browser/policy/configuration_policy_handler_list_factory.cc +++ b/chrome/browser/policy/configuration_policy_handler_list_factory.cc
@@ -2091,6 +2091,9 @@ { key::kDeviceAttributesAllowedForOrigins, prefs::kDeviceAttributesAllowedForOrigins, base::Value::Type::LIST }, + { key::kKioskApplicationLogCollectionEnabled, + prefs::kKioskApplicationLogCollectionEnabled, + base::Value::Type::BOOLEAN}, { key::kKioskBrowserPermissionsAllowedForOrigins, prefs::kKioskBrowserPermissionsAllowedForOrigins, base::Value::Type::LIST },
diff --git a/chrome/browser/preloading/prerender/prerender_manager.cc b/chrome/browser/preloading/prerender/prerender_manager.cc index e220c2ca..444b55a 100644 --- a/chrome/browser/preloading/prerender/prerender_manager.cc +++ b/chrome/browser/preloading/prerender/prerender_manager.cc
@@ -311,9 +311,14 @@ return nullptr; } -bool PrerenderManager::StartPrewarmSearchResult() { - CHECK(base::FeatureList::IsEnabled(features::kPrewarm)); - const GURL prewarm_url(features::kPrewarmUrl.Get()); +bool PrerenderManager::MaybeStartPrewarmSearchResult() { + if (search_prewarm_handle_ || + !base::FeatureList::IsEnabled(features::kPrewarm)) { + return false; + } + + const GURL prewarm_url = + prewarm_url_for_testing_.value_or(GURL(features::kPrewarmUrl.Get())); CHECK(prewarm_url.is_valid()); auto* preloading_data = @@ -353,6 +358,14 @@ return search_prewarm_handle_ != nullptr; } +void PrerenderManager::StopPrewarmSearchResultForTesting() { + search_prewarm_handle_.reset(); +} + +void PrerenderManager::SetPrewarmUrlForTesting(const GURL& url) { + prewarm_url_for_testing_ = url; +} + void PrerenderManager::StartPrerenderSearchResult( const GURL& canonical_search_url, const GURL& prerendering_url,
diff --git a/chrome/browser/preloading/prerender/prerender_manager.h b/chrome/browser/preloading/prerender/prerender_manager.h index a92e371..37d327c 100644 --- a/chrome/browser/preloading/prerender/prerender_manager.h +++ b/chrome/browser/preloading/prerender/prerender_manager.h
@@ -5,6 +5,7 @@ #ifndef CHROME_BROWSER_PRELOADING_PRERENDER_PRERENDER_MANAGER_H_ #define CHROME_BROWSER_PRELOADING_PRERENDER_PRERENDER_MANAGER_H_ +#include <optional> #include <string> #include "chrome/browser/preloading/preloading_features.h" @@ -62,11 +63,17 @@ void DidFinishNavigation( content::NavigationHandle* navigation_handle) override; - // Calling this method will start prerendering a prewarm page. Prerendered - // page will close at the next call. Returns true if a new prerender is - // started. + // Maybe start prerendering a prewarm page if we haven't prewarm it yet for + // the underlying WebContents. Returns true if a new prerender is started. // TODO(https://crbug.com/423465927): Decide a better timing to close. - bool StartPrewarmSearchResult(); + bool MaybeStartPrewarmSearchResult(); + + // Deletes the existing prewarm page to start another one for testing. + void StopPrewarmSearchResultForTesting(); + + // Sets the prewarm page URL for testing as it's difficult to set the testing + // server's URL as a Finch parameter in the tests. + void SetPrewarmUrlForTesting(const GURL& url); // Calling this method will lead to the cancellation of the previous prerender // if the given `canonical_search_url` differs from the ongoing one's. @@ -133,6 +140,7 @@ base::WeakPtr<content::PreloadingAttempt> attempt); std::unique_ptr<content::PrerenderHandle> search_prewarm_handle_; + std::optional<GURL> prewarm_url_for_testing_; // Stores the prerender which serves for search results. It is responsible for // tracking a started search prerender, and informing `SearchPrefetchService`
diff --git a/chrome/browser/preloading/prerender/prerender_manager_unittest.cc b/chrome/browser/preloading/prerender/prerender_manager_unittest.cc index 96615012..f0646a9 100644 --- a/chrome/browser/preloading/prerender/prerender_manager_unittest.cc +++ b/chrome/browser/preloading/prerender/prerender_manager_unittest.cc
@@ -341,7 +341,7 @@ // Prerender the prewarm page. content::test::PrerenderHostRegistryObserver registry_observer( *GetActiveWebContents()); - ASSERT_TRUE(prerender_manager()->StartPrewarmSearchResult()); + ASSERT_TRUE(prerender_manager()->MaybeStartPrewarmSearchResult()); registry_observer.WaitForTrigger(prewarm_url); // Prewarm page should not be found here as it's matcher was set as not
diff --git a/chrome/browser/preloading/prerender/prerender_omnibox_ui_browsertest.cc b/chrome/browser/preloading/prerender/prerender_omnibox_ui_browsertest.cc index 02654d9..026da75 100644 --- a/chrome/browser/preloading/prerender/prerender_omnibox_ui_browsertest.cc +++ b/chrome/browser/preloading/prerender/prerender_omnibox_ui_browsertest.cc
@@ -198,11 +198,11 @@ predictor_observer.WaitForInitialization(); } - private: OmniboxView* omnibox() { return browser()->window()->GetLocationBar()->GetOmniboxView(); } + private: void FocusOmnibox() { // If the omnibox already has focus, just notify OmniboxTabHelper. if (omnibox()->model()->has_focus()) { @@ -1010,4 +1010,69 @@ EXPECT_FALSE(nav_event->initiator_outermost_main_frame_id); } +class PrewarmOmniboxUIBrowserTest : public PrerenderOmniboxUIBrowserTest { + public: + PrewarmOmniboxUIBrowserTest() { + scoped_feature_list_.InitAndEnableFeatureWithParameters( + features::kPrewarm, + {{"url", "https://search.example.com/prewarm.html"}}); + } + ~PrewarmOmniboxUIBrowserTest() override = default; + + void StopPrewarm() { + auto* manager = PrerenderManager::FromWebContents(GetActiveWebContents()); + if (manager) { + manager->StopPrewarmSearchResultForTesting(); + } + } + + void InitiatePrewarm() { + OmniboxController* omnibox_controller = omnibox()->controller(); + ASSERT_TRUE(omnibox_controller); + omnibox_controller->StartZeroSuggestPrefetch(); + } + + private: + base::test::ScopedFeatureList scoped_feature_list_; +}; + +// Basic scenario for the interactive_ui_tests to trigger the prewarm feature +// from the omnibox. +IN_PROC_BROWSER_TEST_F(PrewarmOmniboxUIBrowserTest, + StartPrewarmOnZeroSuggestPrefetch) { + // Add a new tab to make it possible to close the tab to flush metrics. + ASSERT_EQ(0, browser()->tab_strip_model()->active_index()); + ASSERT_TRUE(AddTabAtIndex(0, embedded_test_server()->GetURL("/empty.html"), + ui::PAGE_TRANSITION_TYPED)); + + // Prewarm might be triggered before the test starts. Stop it to avoid + // affecting the test. + StopPrewarm(); + + // Start monitoring the histogram here. + base::HistogramTester histogram_tester; + + // Override the prewarm URL here as we cannot provide this valid URL when + // we initialize the ScopedFeatureList. + const GURL prewarm_url(embedded_test_server()->GetURL("/prewarm.html")); + PrerenderManager::GetOrCreateForWebContents(GetActiveWebContents()) + ->SetPrewarmUrlForTesting(prewarm_url); + + // Trigger prewarm from the Omnibox. + content::test::PrerenderHostRegistryObserver registry_observer( + *GetActiveWebContents()); + InitiatePrewarm(); + registry_observer.WaitForTrigger(prewarm_url); + + // Close the WebContents that hosted the prewarm page to flush metrics. + browser()->tab_strip_model()->CloseWebContentsAt(0, + TabCloseTypes::CLOSE_NONE); + + // Check metrics that should be recorded for the prewarmed page. + histogram_tester.ExpectUniqueSample( + "Prerender.Experimental.PrerenderHostFinalStatus.Embedder_" + "PrewarmDefaultSearchEngine", + /*kPrimaryMainFrameRendererProcessKilled*/ 57, 1); +} + } // namespace
diff --git a/chrome/browser/printing/print_view_manager.cc b/chrome/browser/printing/print_view_manager.cc index 27da743..d7fb57e 100644 --- a/chrome/browser/printing/print_view_manager.cc +++ b/chrome/browser/printing/print_view_manager.cc
@@ -11,7 +11,6 @@ #include "base/check.h" #include "base/containers/contains.h" -#include "base/feature_list.h" #include "base/functional/bind.h" #include "base/no_destructor.h" #include "base/observer_list.h" @@ -333,8 +332,7 @@ return; } - if (base::FeatureList::IsEnabled(kCheckPrintRfhIsActive) && - !rfh->IsActive()) { + if (!rfh->IsActive()) { // Only active RFHs should show UI elements. std::move(callback).Run(); return;
diff --git a/chrome/browser/printing/print_view_manager_base.cc b/chrome/browser/printing/print_view_manager_base.cc index 891607e..57d0990 100644 --- a/chrome/browser/printing/print_view_manager_base.cc +++ b/chrome/browser/printing/print_view_manager_base.cc
@@ -171,10 +171,6 @@ } // namespace -BASE_FEATURE(kCheckPrintRfhIsActive, - "CheckPrintRfhIsActive", - base::FEATURE_ENABLED_BY_DEFAULT); - PrintViewManagerBase::PrintViewManagerBase(content::WebContents* web_contents) : PrintManager(web_contents), queue_(g_browser_process->print_job_manager()->queue()) { @@ -636,8 +632,7 @@ } content::RenderFrameHost* render_frame_host = GetCurrentTargetFrame(); - if (base::FeatureList::IsEnabled(kCheckPrintRfhIsActive) && - !render_frame_host->IsActive()) { + if (!render_frame_host->IsActive()) { // Only active RFHs should show UI elements. GetDefaultPrintSettingsReply(std::move(callback), nullptr); return;
diff --git a/chrome/browser/printing/print_view_manager_base.h b/chrome/browser/printing/print_view_manager_base.h index 6a2631de..824d6d8a 100644 --- a/chrome/browser/printing/print_view_manager_base.h +++ b/chrome/browser/printing/print_view_manager_base.h
@@ -8,7 +8,6 @@ #include <memory> #include <string> -#include "base/feature_list.h" #include "base/functional/callback.h" #include "base/memory/raw_ptr.h" #include "base/memory/read_only_shared_memory_region.h" @@ -47,10 +46,6 @@ class PrintQueriesQueue; class PrinterQuery; -// TODO(crbug.com/41487419): Remove this emergency off switch after a safe -// rollout. -BASE_DECLARE_FEATURE(kCheckPrintRfhIsActive); - // Base class for managing the print commands for a WebContents. class PrintViewManagerBase : public PrintManager, public PrintJob::Observer { public:
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 0b47b8d9..0e5984fa 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
@@ -925,7 +925,7 @@ || DeviceConditions.getCurrentNetConnectionType(mActivity.getApplicationContext()) == ConnectionType.CONNECTION_NONE // TODO(crbug.com/363326024): Remove once feature is supported for PDF. - || (tab.isNativePage() && tab.getNativePage().isPdf())) { + || (tab.isNativePage() && assumeNonNull(tab.getNativePage()).isPdf())) { return false; }
diff --git a/chrome/browser/resources/ash/settings/common/load_time_booleans.ts b/chrome/browser/resources/ash/settings/common/load_time_booleans.ts index 79cd511..7a068ed 100644 --- a/chrome/browser/resources/ash/settings/common/load_time_booleans.ts +++ b/chrome/browser/resources/ash/settings/common/load_time_booleans.ts
@@ -119,3 +119,8 @@ export function shouldShowStartup(): boolean { return loadTimeData.getBoolean('shouldShowStartup'); } + +// Power page +export function isBatteryChargeLimitAvailable(): boolean { + return loadTimeData.getBoolean('isBatteryChargeLimitAvailable'); +}
diff --git a/chrome/browser/resources/ash/settings/device_page/power.html b/chrome/browser/resources/ash/settings/device_page/power.html index f046734..5aa4094 100644 --- a/chrome/browser/resources/ash/settings/device_page/power.html +++ b/chrome/browser/resources/ash/settings/device_page/power.html
@@ -50,6 +50,8 @@ deep-link-focus-id$="[[Setting.kBatterySaver]]"> </settings-toggle-button> +<template is="dom-if" if="[[batteryChargeLimitAvailable_]]" restamp></template> + <settings-toggle-button id="adaptiveChargingToggle" class$="[[getClassForRow_(batteryStatus_.present, 'adaptiveCharging')]]" hidden$="[[!adaptiveChargingEnabled_]]"
diff --git a/chrome/browser/resources/ash/settings/device_page/power.ts b/chrome/browser/resources/ash/settings/device_page/power.ts index 1bc121f5..9fdd1c7 100644 --- a/chrome/browser/resources/ash/settings/device_page/power.ts +++ b/chrome/browser/resources/ash/settings/device_page/power.ts
@@ -22,6 +22,7 @@ import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {DeepLinkingMixin} from '../common/deep_linking_mixin.js'; +import {isBatteryChargeLimitAvailable} from '../common/load_time_booleans.js'; import {RouteObserverMixin} from '../common/route_observer_mixin.js'; import type {SettingsToggleButtonElement} from '../controls/settings_toggle_button.js'; import {recordSettingChange} from '../metrics_recorder.js'; @@ -172,6 +173,13 @@ }, }, + batteryChargeLimitAvailable_: { + type: Boolean, + value() { + return isBatteryChargeLimitAvailable(); + }, + }, + batterySaverFeatureEnabled_: Boolean, batterySaverHidden_: { @@ -197,6 +205,7 @@ private adaptiveChargingEnabled_: boolean; private adaptiveChargingManaged_: boolean; private adaptiveChargingPref_: chrome.settingsPrivate.PrefObject<boolean>; + private readonly batteryChargeLimitAvailable_: boolean; private batteryIdleManaged_: boolean; private batteryIdleOptions_: IdleOption[]; private batterySaverHidden_: boolean;
diff --git a/chrome/browser/resources/bookmarks/app.css b/chrome/browser/resources/bookmarks/app.css index 6ffa6537..840afc2 100644 --- a/chrome/browser/resources/bookmarks/app.css +++ b/chrome/browser/resources/bookmarks/app.css
@@ -79,7 +79,7 @@ bookmarks-list { flex: 1; - overflow-x: hidden; + overflow-x: auto; } #drop-shadow {
diff --git a/chrome/browser/resources/bookmarks/list.css b/chrome/browser/resources/bookmarks/list.css index 2b02a6d..5865e14 100644 --- a/chrome/browser/resources/bookmarks/list.css +++ b/chrome/browser/resources/bookmarks/list.css
@@ -11,7 +11,6 @@ :host { color: var(--cr-secondary-text-color); - min-width: 300px; overflow-y: auto; padding-bottom: 24px; padding-inline-end: var(--card-padding-side); @@ -25,6 +24,7 @@ border-radius: var(--cr-card-border-radius); box-shadow: var(--cr-card-shadow); margin: 0 auto; + min-width: 300px; max-width: var(--card-max-width); padding: 8px 0; }
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/background/background_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/background/background_test.js index 7c70bbf..c0704aeb 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/background/background_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/background/background_test.js
@@ -1733,7 +1733,7 @@ await mockFeedback.replay(); }); -AX_TEST_F('ChromeVoxMV3BackgroundTest', 'MathMLContent', async function() { +AX_TEST_F('ChromeVoxBackgroundTest', 'MathMLContent', async function() { const mockFeedback = this.createMockFeedback(); const site = ` <math>
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/background/input/command_handler.ts b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/background/input/command_handler.ts index 2f9220f4..93d6bd02 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/background/input/command_handler.ts +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/background/input/command_handler.ts
@@ -1476,8 +1476,8 @@ private showLearnModePage_(): void { const explorerPage = { - url: 'chromevox/mv2/learn_mode/learn_mode.html', - type: 'panel' as CreateType, + url: 'chromevox/mv3/learn_mode/learn_mode.html', + type: 'popup' as CreateType, }; // Use chrome.windows API to ensure page is opened in Ash-chrome. chrome.windows.create(explorerPage);
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/common/internal_key_event.ts b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/common/internal_key_event.ts index 8987a073..f97335f 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/common/internal_key_event.ts +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/common/internal_key_event.ts
@@ -9,6 +9,7 @@ export class InternalKeyEvent { type: string; keyCode: number; + key: string; altKey?: boolean; ctrlKey?: boolean; @@ -21,11 +22,12 @@ // Match key_sequence.ts EventLikeObject type keyPrefix?: boolean; prefixKey?: boolean; - [key: string]: string|number|boolean|undefined; + [k: string]: string|number|boolean|undefined; constructor(evt: any) { this.type = evt.type; this.keyCode = evt.keyCode; + this.key = evt.key; this.altKey = evt.altKey; this.ctrlKey = evt.ctrlKey; this.metaKey = evt.metaKey;
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/common/offscreen_command_type.ts b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/common/offscreen_command_type.ts index 34a4e41..0c4fca68 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/common/offscreen_command_type.ts +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/common/offscreen_command_type.ts
@@ -13,6 +13,11 @@ EARCON_RESET_PAN = 'EarconSesetPan', EARCON_SET_POSITION_FOR_RECT = 'EarconSetPositionForRect', IMAGE_DATA_FROM_URL = 'ImageDataFromUrl', + LEARN_MODE_ON_KEY_DOWN = 'LearnModeOnKeyDown', + LEARN_MODE_ON_KEY_PRESS = 'LearnModeOnKeyDown', + LEARN_MODE_ON_KEY_UP = 'LearnModeOnKeyUp', + LEARN_MODE_REGISTER_LISTENERS = 'LearnModeRegisterListeners', + LEARN_MODE_REMOVE_LISTENERS = 'LearnModeRemoveListeners', LIBLOUIS_START_WORKER = 'LibLouisStartWorker', LIBLOUIS_RPC = 'LibLouisRPC', LIBLOUIS_MESSAGE = 'LibLouisMessage',
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/common/panel_command.ts b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/common/panel_command.ts index 337cb56..a6895ae 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/common/panel_command.ts +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/common/panel_command.ts
@@ -30,7 +30,7 @@ waitForPanel(resolve: () => void) { chrome.runtime.sendMessage( - undefined, {type: PanelCommandType.IS_PANEL_INITIALIZED}, undefined, + undefined, {command: PanelCommandType.IS_PANEL_INITIALIZED}, undefined, (initialized: any) => { // Panel is not yet initialized if (chrome.runtime.lastError) { @@ -70,9 +70,23 @@ OPEN_MENUS_MOST_RECENT = 'open_menus_most_recent', SEARCH = 'search', TUTORIAL = 'tutorial', - ENABLE_TEST_HOOKS = 'enable_test_hooks', IS_PANEL_INITIALIZED = 'IsPanelInitialized', } +/** + * The types of commands that can be sent between the panel popup and the + * ChromeVox service worker for testing purposes. + */ +export enum TestPanelCommandType { + BRAILLE_PAN_RIGHT = 'braille_pan_right', + BRAILLE_PAN_LEFT = 'braille_pan_left', + DISABLE_ERROR_MSG = 'disable_error_msg', + FIRE_MOCK_EVENT = 'fire_mock_event', + FIRE_MOCK_QUERY = 'fire_mock_query', + GET_ACTIVE_MENU_DATA = 'get_active_menu_data', + GET_ACTIVE_SEARCH_MENU_DATA = 'get_active_search_menu_data' +} + TestImportManager.exportForTesting( - PanelCommand, ['PanelCommandType', PanelCommandType]); + PanelCommand, ['PanelCommandType', PanelCommandType], + ['TestPanelCommandType', TestPanelCommandType]);
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/learn_mode/learn_mode.html b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/learn_mode/learn_mode.html index 19837144..f49b0d9e 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/learn_mode/learn_mode.html +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/learn_mode/learn_mode.html
@@ -13,7 +13,6 @@ } </style> -<script type="text/javascript" src="../chromeVoxKbExplorerScript.js"></script> <script type="module" src="learn_mode.js"></script> </head> <body>
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/learn_mode/learn_mode.ts b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/learn_mode/learn_mode.ts index ea0c971..26bb4528 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/learn_mode/learn_mode.ts +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/learn_mode/learn_mode.ts
@@ -19,8 +19,11 @@ import {KeyUtil} from '../common/key_util.js'; import {ChromeVoxKbHandler} from '../common/keyboard_handler.js'; import {Msgs} from '../common/msgs.js'; +import {OffscreenCommandType} from '../common/offscreen_command_type.js'; import {QueueMode, TtsSpeechProperties} from '../common/tts_types.js'; +type SendResponse = (value: any) => void; + import Gesture = chrome.accessibilityPrivate.Gesture; type Tab = chrome.tabs.Tab; @@ -43,14 +46,16 @@ /** Initialize keyboard explorer. */ static init(): void { - // Export global objects from the background page context into this one. - window.backgroundWindow = chrome.extension.getBackgroundPage() as Window; + // Listen to all key events on the offscreen document. + const message = { + command: OffscreenCommandType.LEARN_MODE_REGISTER_LISTENERS + }; + chrome.runtime.sendMessage(undefined, message); + chrome.runtime.onMessage.addListener( + (message: any|undefined, _sender: chrome.runtime.MessageSender, + sendResponse: (value: any) => void) => + this.handleMessageFromOffscreen_(message, sendResponse)); - window.backgroundWindow.addEventListener( - 'keydown', LearnMode.onKeyDown, true); - window.backgroundWindow.addEventListener('keyup', LearnMode.onKeyUp, true); - window.backgroundWindow.addEventListener( - 'keypress', LearnMode.onKeyPress, true); chrome.brailleDisplayPrivate.onKeyEvent.addListener( LearnMode.onBrailleKeyEvent); chrome.accessibilityPrivate.onAccessibilityGesture.addListener( @@ -68,6 +73,7 @@ // duplicate assignment errors. BridgeHelper.clearAllHandlersForTarget(TARGET); + // The following BridgeHelper handlers are only used for testing. BridgeHelper.registerHandler( TARGET, Action.CLEAR_TOUCH_EXPLORE_OUTPUT_TIME, () => MIN_TOUCH_EXPLORE_OUTPUT_TIME_MS = 0); @@ -80,21 +86,46 @@ LearnMode.onBrailleKeyEvent(event)); BridgeHelper.registerHandler( TARGET, Action.ON_KEY_DOWN, - (event: KeyboardEvent) => LearnMode.onKeyDown(event)); + (event: InternalKeyEvent) => + LearnMode.onKeyDown(event, (_stopProp: boolean) => {})); BridgeHelper.registerHandler( TARGET, Action.ON_KEY_UP, - (event: KeyboardEvent) => LearnMode.onKeyUp(event)); + (_event: InternalKeyEvent) => LearnMode.onKeyUp()); BridgeHelper.registerHandler(TARGET, Action.READY, () => readyPromise); readyCallback(); } + private static handleMessageFromOffscreen_( + message: any|undefined, sendResponse: SendResponse): boolean { + switch (message.command) { + case OffscreenCommandType.LEARN_MODE_ON_KEY_DOWN: + const internalEvent = message.internalEvent as InternalKeyEvent; + LearnMode.onKeyDown(internalEvent, sendResponse); + break; + case OffscreenCommandType.LEARN_MODE_ON_KEY_UP: + LearnMode.onKeyUp(); + break; + case OffscreenCommandType.LEARN_MODE_ON_KEY_PRESS: + LearnMode.onKeyPress(); + break; + } + + // Returns false as the response is not asynchronous and the callback does + // not need to be kept alive. + return false; + } + + /** * Handles keydown events by speaking the human understandable name of the * key. - * @return True if the default action should be performed. + * @param evt Serialized key event sent from offscreen document. + * @param stopPropogationCallback Callback function that takes a boolean: true + * to prevent propogation, false to allow propogation. */ - static onKeyDown(evt: KeyboardEvent): boolean { + static onKeyDown( + evt: InternalKeyEvent, stopPropogationCallback: SendResponse): void { // Process this event only once; it isn't a repeat (i.e. a user is holding a // key down). if (!evt.repeat) { @@ -103,13 +134,15 @@ // Allow Ctrl+W or escape to be handled. if ((evt.key === 'w' && evt.ctrlKey)) { LearnMode.close_(); - return true; + stopPropogationCallback(false); + return; } if (evt.key === 'Escape') { // Escape must be pressed twice in a row to exit. if (LearnMode.prevKey === 'Escape') { LearnMode.close_(); - return true; + stopPropogationCallback(false); + return; } else { // Append a message about pressing escape a second time. LearnMode.output(Msgs.getMsg('learn_mode_escape_to_exit')); @@ -127,23 +160,17 @@ }); } - evt.preventDefault(); - evt.stopPropagation(); - return false; + stopPropogationCallback(true); } - static onKeyUp(evt: KeyboardEvent): void { + static onKeyUp(): void { LearnMode.shouldFlushSpeech_ = true; LearnMode.maybeClose_(); LearnMode.clearRange(); - evt.preventDefault(); - evt.stopPropagation(); } - static onKeyPress(evt: KeyboardEvent): void { + static onKeyPress(): void { LearnMode.clearRange(); - evt.preventDefault(); - evt.stopPropagation(); } static onBrailleKeyEvent(evt: chrome.brailleDisplayPrivate.KeyEvent): void { @@ -315,12 +342,9 @@ } private static resetListeners_(): void { - window.backgroundWindow.removeEventListener( - 'keydown', LearnMode.onKeyDown, true); - window.backgroundWindow.removeEventListener( - 'keyup', LearnMode.onKeyUp, true); - window.backgroundWindow.removeEventListener( - 'keypress', LearnMode.onKeyPress, true); + const message = {command: OffscreenCommandType.LEARN_MODE_REMOVE_LISTENERS}; + chrome.runtime.sendMessage(undefined, message); + chrome.brailleDisplayPrivate.onKeyEvent.removeListener( LearnMode.onBrailleKeyEvent); chrome.accessibilityPrivate.onAccessibilityGesture.removeListener(
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/learn_mode/learn_mode_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/learn_mode/learn_mode_test.js index 4ac09e0..6eed48b 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/learn_mode/learn_mode_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/learn_mode/learn_mode_test.js
@@ -45,10 +45,6 @@ } makeMockKeyEvent(params) { - // Fake out these functions. - params.preventDefault = () => {}; - params.stopPropagation = () => {}; - // Set defaults if not defined. params.repeat = params.repeat || false;
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/offscreen/offscreen.ts b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/offscreen/offscreen.ts index b1bd2ba..6e277df 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/offscreen/offscreen.ts +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/offscreen/offscreen.ts
@@ -66,6 +66,89 @@ } /** + * Handles keydown and keyup events when Learn Mode is initiated. + */ +class OffscreenLearnModeKeyboardHandler { + static instance?: OffscreenLearnModeKeyboardHandler; + + constructor() { + // Add listeners to chrome.runtime + chrome.runtime.onMessage.addListener( + (message: any|undefined, _sender: chrome.runtime.MessageSender, + _sendResponse: SendResponse) => + this.handleMessageFromLearnMode_(message)); + } + + private handleMessageFromLearnMode_(message: any|undefined): boolean { + switch (message.command) { + case OffscreenCommandType.LEARN_MODE_REGISTER_LISTENERS: + this.registerListeners_(); + break; + case OffscreenCommandType.LEARN_MODE_REMOVE_LISTENERS: + this.removeListeners_(); + break; + } + // Returns false as the response is not asynchronous and the callback does + // not need to be kept alive. + return false; + } + + static init(): void { + if (OffscreenLearnModeKeyboardHandler.instance) { + throw 'Error: trying to create two instances of singleton ' + + 'OffscreenLearnModeKeyboardHandler.'; + } + OffscreenLearnModeKeyboardHandler.instance = + new OffscreenLearnModeKeyboardHandler(); + } + + private registerListeners_(): void { + window.addEventListener('keydown', this.onKeyDown_, true); + window.addEventListener('keyup', this.onKeyUp_, true); + window.addEventListener('keypress', this.onKeyPress_, true); + } + + private removeListeners_(): void { + window.removeEventListener('keydown', this.onKeyDown_, true); + window.removeEventListener('keyup', this.onKeyUp_, true); + window.removeEventListener('keypress', this.onKeyPress_, true); + } + + private onKeyDown_(evt: KeyboardEvent): void { + const extensionId = undefined; + const message = { + command: OffscreenCommandType.LEARN_MODE_ON_KEY_DOWN, + internalEvent: new InternalKeyEvent(evt) + }; + const options = undefined; + const callback = (value: any) => { + if (value as boolean) { + evt.preventDefault(); + evt.stopPropagation(); + } + }; + chrome.runtime.sendMessage(extensionId, message, options, callback); + } + + private onKeyUp_(evt: KeyboardEvent): void { + evt.preventDefault(); + evt.stopPropagation(); + + const message = {command: OffscreenCommandType.LEARN_MODE_ON_KEY_UP}; + chrome.runtime.sendMessage(undefined, message) + } + + private onKeyPress_(evt: KeyboardEvent): void { + evt.preventDefault(); + evt.stopPropagation(); + + const message = {command: OffscreenCommandType.LEARN_MODE_ON_KEY_PRESS}; + chrome.runtime.sendMessage(undefined, message) + } +} + + +/** * Handles DOM interactions when accessing and tracking access to the clipboard, * used by ClipboardHandler instance within the service worker. */ @@ -252,6 +335,7 @@ OffscreenBackgroundKeyboardHandler.init(); +OffscreenLearnModeKeyboardHandler.init(); OffscreenClipboardHandler.init(); OffscreenSpeechSynthesis.init(); OffscreenBrailleDisplayManager.init();
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/panel/panel.ts b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/panel/panel.ts index 09a4982f..189325f 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/panel/panel.ts +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/panel/panel.ts
@@ -15,7 +15,7 @@ import {Command} from '../common/command.js'; import {Msgs} from '../common/msgs.js'; import type {PanelCommand} from '../common/panel_command.js'; -import {PanelCommandType} from '../common/panel_command.js'; +import {PanelCommandType, TestPanelCommandType} from '../common/panel_command.js'; import type {PanelNodeMenuItemData} from '../common/panel_menu_data.js'; import {SettingsManager} from '../common/settings_manager.js'; @@ -171,14 +171,75 @@ private handleMessageFromServiceWorker_( message: any|undefined, sendResponse: SendResponse): boolean { - if (message.type == PanelCommandType.IS_PANEL_INITIALIZED) { - sendResponse(true); - } else { - this.exec_({type: message.type, data: message.data} as PanelCommand) + switch (message.command) { + // Messages for testing purposes. + case TestPanelCommandType.BRAILLE_PAN_LEFT: + this.onPanLeft_(); + break; + case TestPanelCommandType.BRAILLE_PAN_RIGHT: + this.onPanRight_(); + break; + case TestPanelCommandType.DISABLE_ERROR_MSG: + this.disableErrorMsgForTest_(); + break; + case TestPanelCommandType.FIRE_MOCK_EVENT: + this.fireMockEventForTest_(message['key']); + break; + case TestPanelCommandType.FIRE_MOCK_QUERY: + this.fireMockQueryForTest_(message['query']); + break; + case TestPanelCommandType.GET_ACTIVE_MENU_DATA: + this.getActiveMenuDataForTest_(sendResponse); + break; + case TestPanelCommandType.GET_ACTIVE_SEARCH_MENU_DATA: + this.getActiveSearchMenuDataForTest_(sendResponse); + break; + + // Messages from PanelCommand. + case PanelCommandType.IS_PANEL_INITIALIZED: + sendResponse(true); + break; + default: + this.exec_({type: message.type, data: message.data} as PanelCommand) + break; } return false; } + private disableErrorMsgForTest_() { + MenuManager.disableMissingMsgsErrorsForTesting = true; + } + + private fireMockEventForTest_(key: string): void { + // @ts-ignore: Mocked KeyboardEvent. + const obj: KeyboardEvent = {key}; + obj.preventDefault = function() {}; + obj.stopPropagation = function() {}; + this.onKeyDown_(obj); + } + + private fireMockQueryForTest_(query: string): void { + // @ts-ignore: Mocked InputEvent. + const evt: InputEvent = {target: {value: query}}; + this.menuManager_.onSearchBarQuery(evt); + } + + private getActiveMenuDataForTest_(sendResponse: SendResponse) { + const activeMenu = this.menuManager_.activeMenu; + if (activeMenu) { + sendResponse(activeMenu.getMenuDataForTest()); + } + sendResponse({}); + } + + private getActiveSearchMenuDataForTest_(sendResponse: SendResponse) { + const searchMenu = this.menuManager_.searchMenu; + if (searchMenu) { + sendResponse(searchMenu.getMenuDataForTest()); + } + sendResponse({}); + } + /** * Execute a command to update the panel. * TODO(b/314203187): Not nulls asserted, check that this is correct. @@ -236,14 +297,6 @@ case PanelCommandType.CLOSE_CHROMEVOX: this.onClose(); break; - case PanelCommandType.ENABLE_TEST_HOOKS: - // @ts-ignore: Exports for testing. - window['MenuManager'] = MenuManager; - // @ts-ignore: Exports for testing. - window['Msgs'] = Msgs; - // @ts-ignore: Exports for testing. - window['Panel'] = Panel; - break; } }
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/panel/panel_menu.ts b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/panel/panel_menu.ts index 19ed710..1896ab3 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/panel/panel_menu.ts +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/panel/panel_menu.ts
@@ -14,6 +14,12 @@ type MenuCallback = () => Promise<any>; +type MenuDataForTest = { + menuMsg?: string, + menuItemTitle?: string, + menuItemShortcut?: string +}; + export class PanelMenu { menuBarItemElement: HTMLElement; menuContainerElement: HTMLElement; @@ -277,6 +283,15 @@ } return -1; } + + getMenuDataForTest(): MenuDataForTest { + const menuItem = this.items_[this.activeIndex_]; + return { + menuMsg: this.menuMsg, + menuItemTitle: menuItem ? menuItem.menuItemTitle : undefined, + menuItemShortcut: menuItem ? menuItem.menuItemShortcut : undefined + } + } }
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/panel/panel_test.js b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/panel/panel_test.js index 1fe8440c..6c22f90 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/panel/panel_test.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/panel/panel_test.js
@@ -21,75 +21,80 @@ globalThis.Gesture = chrome.accessibilityPrivate.Gesture; globalThis.RoleType = chrome.automation.RoleType; - - // TODO(crbug.com/388867840): Replace with chrome.runtime.sendMessage to - // panel.html - const panel = this.getPanel().instance; - const original = panel.exec_.bind(panel); - panel.exec_ = (command) => { - original(command); - this.onPanelCommandCalled(); - }; - } - - onPanelCommandCalled() { - if (this.resolvePanelCommandPromise) { - this.resolvePanelCommandPromise(); - } - } - - prepareForPanelCommand() { - this.panelCommandPromise = - new Promise(resolve => this.resolvePanelCommandPromise = resolve); - } - - waitForPanelCommand() { - return this.panelCommandPromise; } fireMockEvent(key) { - return function() { - const obj = {}; - obj.preventDefault = function() {}; - obj.stopPropagation = function() {}; - obj.key = key; - this.getPanel().instance.onKeyDown_(obj); - }.bind(this); + chrome.runtime.sendMessage( + undefined, {command: TestPanelCommandType.FIRE_MOCK_EVENT, key}); } fireMockQuery(query) { - return function() { - const evt = {}; - evt.target = {}; - evt.target.value = query; - this.getPanel().instance.menuManager_.onSearchBarQuery(evt); - }.bind(this); + chrome.runtime.sendMessage( + undefined, {command: TestPanelCommandType.FIRE_MOCK_QUERY, query}); } assertActiveMenuItem(menuMsg, menuItemTitle, opt_menuItemShortcut) { - const menu = this.getPanel().instance.menuManager_.activeMenu_; - const menuItem = menu.items_[menu.activeIndex_]; - assertEquals(menuMsg, menu.menuMsg); - assertEquals(menuItemTitle, menuItem.menuItemTitle); - if (opt_menuItemShortcut) { - assertEquals(opt_menuItemShortcut, menuItem.menuItemShortcut); - } + const callback = (response) => { + assertEquals(menuMsg, response.menuMsg); + assertEquals(menuItemTitle, response.menuItemTitle); + if (opt_menuItemShortcut) { + assertEquals(opt_menuItemShortcut, response.menuItemShortcut); + } + }; + + chrome.runtime.sendMessage( + undefined, {command: TestPanelCommandType.GET_ACTIVE_MENU_DATA}, + undefined, callback); } assertActiveSearchMenuItem(menuItemTitle) { - const searchMenu = this.getPanel().instance.menuManager_.searchMenu; - const activeIndex = searchMenu.activeIndex_; - const activeItem = searchMenu.items_[activeIndex]; - assertEquals(menuItemTitle, activeItem.menuItemTitle); + const callback = (response) => { + assertEquals(menuItemTitle, response.menuItemTitle); + }; + + chrome.runtime.sendMessage( + undefined, {command: TestPanelCommandType.GET_ACTIVE_SEARCH_MENU_DATA}, + undefined, callback); } enableTouchMode() { EventSource.set(EventSourceType.TOUCH_GESTURE); } - isMenuTitleMessage(menuTitleMessage) { - const menu = this.getPanel().instance.menuManager_.activeMenu_; - return menuTitleMessage === menu.menuMsg; + async isMenuTitleMessage(menuTitleMessage) { + return new Promise(resolve => { + const callback = (response) => { + resolve(menuTitleMessage === response.menuMsg); + }; + + chrome.runtime.sendMessage( + undefined, {command: TestPanelCommandType.GET_ACTIVE_MENU_DATA}, + undefined, callback); + }); + } + + async waitForMenu(menuTitleMessage) { + // TODO(crbug.com/424764877): Replace polling. + let pollForMenu = async (resolve) => { + if (await this.isMenuTitleMessage(menuTitleMessage)) { + resolve(); + } else { + setTimeout(() => pollForMenu(resolve), 500) + } + }; + return new Promise(resolve => { + pollForMenu(resolve); + }); + } + + braillePanRight() { + chrome.runtime.sendMessage( + undefined, {command: TestPanelCommandType.BRAILLE_PAN_RIGHT}); + } + + braillePanLeft() { + chrome.runtime.sendMessage( + undefined, {command: TestPanelCommandType.BRAILLE_PAN_LEFT}); } get linksDoc() { @@ -113,23 +118,22 @@ await this.runWithLoadedTree(this.linksDoc); new PanelCommand(PanelCommandType.OPEN_MENUS).send(); await this.waitForMenu('panel_search_menu'); - this.fireMockEvent('ArrowRight')(); + this.fireMockEvent('ArrowRight'); this.assertActiveMenuItem('panel_menu_jump', 'Go To Beginning Of Table'); - this.fireMockEvent('ArrowRight')(); + this.fireMockEvent('ArrowRight'); this.assertActiveMenuItem( 'panel_menu_speech', 'Announce Current Battery Status'); }); -// TODO(https://crbug.com/1299765): Re-enable once flaky timeouts are fixed. -AX_TEST_F('ChromeVoxPanelTest', 'DISABLED_LinkMenu', async function() { +AX_TEST_F('ChromeVoxPanelTest', 'LinkMenu', async function() { await this.runWithLoadedTree(this.linksDoc); CommandHandlerInterface.instance.onCommand('showLinksList'); await this.waitForMenu('role_link'); - this.fireMockEvent('ArrowLeft')(); + this.fireMockEvent('ArrowLeft'); this.assertActiveMenuItem('role_landmark', 'No items'); - this.fireMockEvent('ArrowRight')(); + this.fireMockEvent('ArrowRight'); this.assertActiveMenuItem('role_link', 'apple Internal link'); - this.fireMockEvent('ArrowUp')(); + this.fireMockEvent('ArrowUp'); this.assertActiveMenuItem('role_link', 'banana Internal link'); }); @@ -137,9 +141,9 @@ await this.runWithLoadedTree(`<button>Cancel</button><button>OK</button>`); CommandHandlerInterface.instance.onCommand('showFormsList'); await this.waitForMenu('panel_menu_form_controls'); - this.fireMockEvent('ArrowDown')(); + this.fireMockEvent('ArrowDown'); this.assertActiveMenuItem('panel_menu_form_controls', 'OK Button'); - this.fireMockEvent('ArrowUp')(); + this.fireMockEvent('ArrowUp'); this.assertActiveMenuItem('panel_menu_form_controls', 'Cancel Button'); }); @@ -149,25 +153,26 @@ await this.runWithLoadedTree(this.linksDoc); new PanelCommand(PanelCommandType.OPEN_MENUS).send(); await this.waitForMenu('panel_search_menu'); + await mockFeedback .expectSpeech('Search the menus', /Type to search the menus/) .call(() => { - this.fireMockQuery('jump')(); + this.fireMockQuery('jump'); this.assertActiveSearchMenuItem('Jump To Details'); }) .expectSpeech(/Jump/, 'Menu item', /[0-9]+ of [0-9]+/) .call(() => { - this.fireMockEvent('ArrowDown')(); + this.fireMockEvent('ArrowDown'); this.assertActiveSearchMenuItem('Jump To The Bottom Of The Page'); }) .expectSpeech(/Jump/, 'Menu item', /[0-9]+ of [0-9]+/) .call(() => { - this.fireMockEvent('ArrowDown')(); + this.fireMockEvent('ArrowDown'); this.assertActiveSearchMenuItem('Jump To The Top Of The Page'); }) .expectSpeech(/Jump/, 'Menu item', /[0-9]+ of [0-9]+/) .call(() => { - this.fireMockEvent('ArrowDown')(); + this.fireMockEvent('ArrowDown'); this.assertActiveSearchMenuItem('Jump To Details'); }) .expectSpeech(/Jump/, 'Menu item', /[0-9]+ of [0-9]+/) @@ -182,6 +187,7 @@ await this.runWithLoadedTree(`<button>Cancel</button><button>OK</button>`); doGestureAsync(Gesture.TAP4); await this.waitForMenu('panel_search_menu'); + // GestureCommandHandler behaves in special ways only with range over // the panel. Fake this out by setting range there. const desktop = root.parent.root; @@ -208,10 +214,10 @@ [{'lang': 'en-US'}, {'lang': 'es-ES'}]; CommandHandlerInterface.instance.onCommand('showFormsList'); await this.waitForMenu('panel_menu_form_controls'); - this.fireMockEvent('ArrowDown')(); + this.fireMockEvent('ArrowDown'); this.assertActiveMenuItem( 'panel_menu_form_controls', 'español: Prueba Button'); - this.fireMockEvent('ArrowUp')(); + this.fireMockEvent('ArrowUp'); this.assertActiveMenuItem('panel_menu_form_controls', 'Test Button'); }); @@ -219,9 +225,9 @@ await this.runWithLoadedTree(this.linksDoc); CommandHandlerInterface.instance.onCommand('showActionsMenu'); await this.waitForMenu('panel_menu_actions'); - this.fireMockEvent('ArrowDown')(); + this.fireMockEvent('ArrowDown'); this.assertActiveMenuItem('panel_menu_actions', 'Start Or End Selection'); - this.fireMockEvent('ArrowUp')(); + this.fireMockEvent('ArrowUp'); this.assertActiveMenuItem('panel_menu_actions', 'Click On Current Item'); }); @@ -237,9 +243,9 @@ CommandHandlerInterface.instance.onCommand('showActionsMenu'); await this.waitForMenu('panel_menu_actions'); // Go down three times - this.fireMockEvent('ArrowUp')(); + this.fireMockEvent('ArrowUp'); this.assertActiveMenuItem('panel_menu_actions', 'Long click on current item'); - this.fireMockEvent('ArrowDown')(); + this.fireMockEvent('ArrowDown'); this.assertActiveMenuItem('panel_menu_actions', 'Click On Current Item'); }); @@ -248,15 +254,15 @@ await this.runWithLoadedTree(this.linksDoc); new PanelCommand(PanelCommandType.OPEN_MENUS).send(); await this.waitForMenu('panel_search_menu'); - this.fireMockEvent('ArrowRight')(); + this.fireMockEvent('ArrowRight'); this.assertActiveMenuItem( 'panel_menu_jump', 'Go To Beginning Of Table', 'Search+Alt+Shift+ArrowLeft'); - this.fireMockEvent('ArrowRight')(); + this.fireMockEvent('ArrowRight'); this.assertActiveMenuItem( 'panel_menu_speech', 'Announce Current Battery Status', 'Search+O, then B'); - this.fireMockEvent('ArrowRight')(); + this.fireMockEvent('ArrowRight'); this.assertActiveMenuItem( 'panel_menu_chromevox', 'Enable/Disable Sticky Mode', 'Search+Search'); @@ -270,9 +276,9 @@ new PanelCommand(PanelCommandType.OPEN_MENUS).send(); await this.waitForMenu('panel_search_menu'); do { - this.fireMockEvent('ArrowRight')(); - assertFalse(this.isMenuTitleMessage('panel_menu_touchgestures')); - } while (!this.isMenuTitleMessage('panel_search_menu')); + this.fireMockEvent('ArrowRight'); + assertFalse(await this.isMenuTitleMessage('panel_menu_touchgestures')); + } while (!await this.isMenuTitleMessage('panel_search_menu')); }); // Ensure 'Touch Gesture' is in the panel menus when touch mode is enabled. @@ -286,9 +292,9 @@ // Look for Touch Gestures menu, fail if getting back to start. do { - this.fireMockEvent('ArrowRight')(); - assertFalse(this.isMenuTitleMessage('panel_search_menu')); - } while (!this.isMenuTitleMessage('panel_menu_touchgestures')); + this.fireMockEvent('ArrowRight'); + assertFalse(await this.isMenuTitleMessage('panel_search_menu')); + } while (!await this.isMenuTitleMessage('panel_menu_touchgestures')); this.assertActiveMenuItem( 'panel_menu_touchgestures', 'Click on current item'); @@ -301,28 +307,19 @@ await this.waitForEvent(button, chrome.automation.EventType.FOCUS); CommandHandlerInterface.instance.onCommand('showActionsMenu'); await this.waitForMenu('panel_menu_actions'); - this.fireMockEvent('ArrowDown')(); + this.fireMockEvent('ArrowDown'); this.assertActiveMenuItem('panel_menu_actions', 'Start Or End Selection'); - this.fireMockEvent('ArrowDown')(); - this.fireMockEvent('ArrowDown')(); + this.fireMockEvent('ArrowDown'); + this.fireMockEvent('ArrowDown'); this.assertActiveMenuItem('panel_menu_actions', 'Perform default action'); - this.fireMockEvent('Enter')(); + this.fireMockEvent('Enter'); await this.waitForEvent(button, chrome.automation.EventType.CLICKED); }); AX_TEST_F('ChromeVoxPanelTest', 'PanVirtualBrailleDisplay', async function() { await this.runWithLoadedTree(this.linksDoc); - this.prepareForPanelCommand(); CommandHandlerInterface.instance.onCommand('toggleBrailleCaptions'); - this.waitForPanelCommand(); - - // Locate the buttons to pan left and pan right in the display. - const panelDocument = this.getPanelWindow().document; - const panLeftButton = panelDocument.getElementById('braille-pan-left'); - assertNotNullNorUndefined(panLeftButton); - const panRightButton = panelDocument.getElementById('braille-pan-right'); - assertNotNullNorUndefined(panRightButton); // Mock out ChromeVox.braille to confirm that the commands are routed from the // panel context to the background context. @@ -332,9 +329,9 @@ const panRightDone = new Promise(resolve => panRight = resolve); ChromeVox.braille = {panLeft, panRight}; - panLeftButton.click(); + this.braillePanLeft(); await panLeftDone; - panRightButton.click(); + this.braillePanRight(); await panRightDone; });
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/panel/panel_test_base.js b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/panel/panel_test_base.js index d316515..f443268 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/panel/panel_test_base.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/mv3/panel/panel_test_base.js
@@ -13,42 +13,8 @@ async setUpDeferred() { await super.setUpDeferred(); - await new PanelCommand(PanelCommandType.ENABLE_TEST_HOOKS).send(); await this.waitForPendingMethods(); - this.getPanelWindow().MenuManager.disableMissingMsgsErrorsForTesting = true; - } - - getPanelWindow() { - let panelWindow = null; - while (!panelWindow) { - panelWindow = chrome.extension.getViews().find( - view => view.location.href.indexOf('chromevox/mv3/panel/panel.html') > 0); - } - return panelWindow; - } - - /** - * Gets the Panel object in the panel.html window. Note that the extension - * system destroys our reference to this object unpredictably so always ask - * chrome.extension.getViews for it. - */ - getPanel() { - return this.getPanelWindow().Panel; - } - - - // TODO(crbug.com/388867840): Replace with chrome.runtime.sendMessage to - // panel.html - async waitForMenu(menuMsg) { - const menuManager = this.getPanel().instance.menuManager_; - - // Menu and menu item updates occur in a different js context, so tests need - // to wait until an update has been made. - return new Promise( - resolve => - this.addCallbackPostMethod(menuManager, 'activateMenu', () => { - assertEquals(menuMsg, menuManager.activeMenu_.menuMsg); - resolve(); - }, () => true)); + chrome.runtime.sendMessage( + undefined, {command: TestPanelCommandType.DISABLE_ERROR_MSG}); } };
diff --git a/chrome/browser/sharesheet/share_action/example_action.cc b/chrome/browser/sharesheet/share_action/example_action.cc index 8a125362..168fe98 100644 --- a/chrome/browser/sharesheet/share_action/example_action.cc +++ b/chrome/browser/sharesheet/share_action/example_action.cc
@@ -12,14 +12,12 @@ namespace sharesheet { -ExampleAction::ExampleAction() { - name_ = "example"; -} +ExampleAction::ExampleAction() = default; ExampleAction::~ExampleAction() = default; ShareActionType ExampleAction::GetActionType() const { - return ShareActionType::kExample; + return type_; } const std::u16string ExampleAction::GetActionName() {
diff --git a/chrome/browser/sharesheet/share_action/example_action.h b/chrome/browser/sharesheet/share_action/example_action.h index 8355eef..6bc9119 100644 --- a/chrome/browser/sharesheet/share_action/example_action.h +++ b/chrome/browser/sharesheet/share_action/example_action.h
@@ -13,6 +13,7 @@ class ExampleAction : public ShareAction { public: + explicit ExampleAction(ShareActionType type) : type_(type) {} ExampleAction(); ~ExampleAction() override; ExampleAction(const ExampleAction&) = delete; @@ -29,6 +30,7 @@ bool HasActionView() override; private: + ShareActionType type_ = ShareActionType::kExample; raw_ptr<SharesheetController> controller_ = nullptr; std::string name_; };
diff --git a/chrome/browser/sharesheet/share_action/share_action_cache.cc b/chrome/browser/sharesheet/share_action/share_action_cache.cc index a8b8a61..4acd641 100644 --- a/chrome/browser/sharesheet/share_action/share_action_cache.cc +++ b/chrome/browser/sharesheet/share_action/share_action_cache.cc
@@ -72,8 +72,8 @@ return false; } -void ShareActionCache::AddShareActionForTesting() { - AddShareAction(std::make_unique<ExampleAction>()); +void ShareActionCache::AddShareActionForTest(ShareActionType type) { + AddShareAction(std::make_unique<ExampleAction>(type)); } void ShareActionCache::AddShareAction(std::unique_ptr<ShareAction> action) {
diff --git a/chrome/browser/sharesheet/share_action/share_action_cache.h b/chrome/browser/sharesheet/share_action/share_action_cache.h index c656fd52..995b6584 100644 --- a/chrome/browser/sharesheet/share_action/share_action_cache.h +++ b/chrome/browser/sharesheet/share_action/share_action_cache.h
@@ -42,7 +42,7 @@ // Returns null if |action_type| is not a valid ShareAction. const gfx::VectorIcon* GetVectorIconFromType(ShareActionType action_type); - void AddShareActionForTesting(); + void AddShareActionForTest(ShareActionType type = ShareActionType::kExample); private: void AddShareAction(std::unique_ptr<ShareAction> action);
diff --git a/chrome/browser/sharesheet/sharesheet_service.cc b/chrome/browser/sharesheet/sharesheet_service.cc index b2113a5c..e04b8c1 100644 --- a/chrome/browser/sharesheet/sharesheet_service.cc +++ b/chrome/browser/sharesheet/sharesheet_service.cc
@@ -16,6 +16,7 @@ #include "chrome/browser/apps/app_service/app_service_proxy.h" #include "chrome/browser/apps/app_service/app_service_proxy_factory.h" #include "chrome/browser/apps/app_service/launch_utils.h" +#include "chrome/browser/sharesheet/share_action/example_action.h" #include "chrome/browser/sharesheet/share_action/share_action.h" #include "chrome/browser/sharesheet/share_action/share_action_cache.h" #include "chrome/browser/sharesheet/sharesheet_controller.h" @@ -132,6 +133,10 @@ std::move(intent), std::move(delivered_callback), std::move(close_callback)); } + +void SharesheetService::AddShareActionForTest(ShareActionType type) { + share_action_cache_->AddShareActionForTest(type); // IN-TEST +} #endif // BUILDFLAG(IS_CHROMEOS) // Cleanup delegator when bubble closes. @@ -228,7 +233,7 @@ CHECK(views::Widget::GetWidgetForNativeWindow(native_window)); SharesheetMetrics::RecordSharesheetLaunchSource(source); for (int i = 0; i < num_actions_to_add; ++i) { - share_action_cache_->AddShareActionForTesting(); // IN-TEST + share_action_cache_->AddShareActionForTest(); // IN-TEST } auto targets = GetActionsForIntent(intent); OnReadyToShowBubble(native_window, std::move(intent),
diff --git a/chrome/browser/sharesheet/sharesheet_service.h b/chrome/browser/sharesheet/sharesheet_service.h index 74a160b..17d390d 100644 --- a/chrome/browser/sharesheet/sharesheet_service.h +++ b/chrome/browser/sharesheet/sharesheet_service.h
@@ -94,6 +94,8 @@ DeliveredCallback delivered_callback, CloseCallback close_callback, ActionCleanupCallback cleanup_callback); + + void AddShareActionForTest(ShareActionType type); #endif // BUILDFLAG(IS_CHROMEOS) // |share_action_type| is set to null when testing, but should otherwise have // a valid value. @@ -187,13 +189,15 @@ void RecordShareDataMetrics(const apps::IntentPtr& intent); raw_ptr<Profile> profile_; - std::unique_ptr<ShareActionCache> share_action_cache_; - raw_ptr<apps::AppServiceProxyAsh> app_service_proxy_; // Record of all active SharesheetServiceDelegators. These can be retrieved // by ShareActions and used as SharesheetControllers to make bubble changes. std::vector<std::unique_ptr<SharesheetServiceDelegator>> active_delegators_; + // Action may have a reference to the delegator, so define before delegator. + std::unique_ptr<ShareActionCache> share_action_cache_; + raw_ptr<apps::AppServiceProxyAsh> app_service_proxy_; + base::WeakPtrFactory<SharesheetService> weak_factory_{this}; };
diff --git a/chrome/browser/sync/test/integration/BUILD.gn b/chrome/browser/sync/test/integration/BUILD.gn index 8b0ecd6a..e3361d4 100644 --- a/chrome/browser/sync/test/integration/BUILD.gn +++ b/chrome/browser/sync/test/integration/BUILD.gn
@@ -27,6 +27,7 @@ "//chrome/test:sync_integration_test_support", "//chrome/test:test_support", "//components/bookmarks/browser", + "//components/commerce/core:feature_list", "//components/data_sharing/public", "//components/password_manager/core/browser/sharing", "//components/plus_addresses:test_support",
diff --git a/chrome/browser/sync/test/integration/single_client_secondary_account_sync_test.cc b/chrome/browser/sync/test/integration/single_client_secondary_account_sync_test.cc index c95aebe7..5c4a281 100644 --- a/chrome/browser/sync/test/integration/single_client_secondary_account_sync_test.cc +++ b/chrome/browser/sync/test/integration/single_client_secondary_account_sync_test.cc
@@ -58,38 +58,7 @@ base::CallbackListSubscription test_signin_client_subscription_; }; -// The unconsented primary account isn't supported on ChromeOS. -#if !BUILDFLAG(IS_CHROMEOS) -IN_PROC_BROWSER_TEST_F(SingleClientSecondaryAccountSyncTest, - StartsSyncTransportOnSignin) { - ASSERT_TRUE(SetupClients()); - - // Signing in (without granting sync consent or explicitly setting up Sync) - // should trigger starting the Sync machinery in standalone transport mode. - secondary_account_helper::SignInUnconsentedAccount( - profile(), &test_url_loader_factory_, "user@email.com"); - - EXPECT_TRUE(GetClient(0)->AwaitSyncTransportActive()); - - EXPECT_EQ(syncer::SyncService::TransportState::ACTIVE, - GetSyncService(0)->GetTransportState()); - - ASSERT_FALSE(GetSyncService(0) - ->GetUserSettings() - ->IsInitialSyncFeatureSetupComplete()); - - EXPECT_FALSE(GetSyncService(0)->IsSyncFeatureEnabled()); - EXPECT_FALSE(GetSyncService(0)->IsSyncFeatureActive()); - - // Make sure that only the allowed types got activated. Note that, depending - // on some other feature flags, not all of the allowed types are necessarily - // active, and that's okay. - syncer::DataTypeSet bad_types = - base::Difference(GetSyncService(0)->GetActiveDataTypes(), - AllowedTypesInStandaloneTransportMode()); - EXPECT_TRUE(bad_types.empty()) << syncer::DataTypeSetToDebugString(bad_types); -} -#else +#if BUILDFLAG(IS_CHROMEOS) IN_PROC_BROWSER_TEST_F(SingleClientSecondaryAccountSyncTest, DoesNotStartSyncTransportOnSignin) { ASSERT_TRUE(SetupClients()); @@ -102,7 +71,7 @@ EXPECT_EQ(syncer::SyncService::TransportState::DISABLED, GetSyncService(0)->GetTransportState()); } -#endif // !BUILDFLAG(IS_CHROMEOS) +#endif // BUILDFLAG(IS_CHROMEOS) // ChromeOS doesn't support changes to the primary account after startup, so // this test doesn't apply.
diff --git a/chrome/browser/sync/test/integration/single_client_standalone_transport_sync_test.cc b/chrome/browser/sync/test/integration/single_client_standalone_transport_sync_test.cc index 13f91cc..9bc9423 100644 --- a/chrome/browser/sync/test/integration/single_client_standalone_transport_sync_test.cc +++ b/chrome/browser/sync/test/integration/single_client_standalone_transport_sync_test.cc
@@ -10,10 +10,12 @@ #include "build/build_config.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/sync/test/integration/encryption_helper.h" +#include "chrome/browser/sync/test/integration/secondary_account_helper.h" #include "chrome/browser/sync/test/integration/single_client_status_change_checker.h" #include "chrome/browser/sync/test/integration/sync_service_impl_harness.h" #include "chrome/browser/sync/test/integration/sync_test.h" #include "chrome/common/chrome_paths.h" +#include "components/commerce/core/commerce_feature_list.h" #include "components/password_manager/core/browser/features/password_features.h" #include "components/signin/public/base/signin_switches.h" #include "components/sync/base/data_type.h" @@ -24,6 +26,8 @@ #include "components/sync/test/nigori_test_utils.h" #include "content/public/test/browser_test.h" #include "content/public/test/test_launcher.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" #if BUILDFLAG(IS_CHROMEOS) #include "ash/constants/ash_features.h" @@ -31,6 +35,18 @@ namespace { +using testing::ContainerEq; + +constexpr syncer::DataTypeSet kTypesGatedBehindHistoryOptIn{ + syncer::COLLABORATION_GROUP, + syncer::HISTORY, + syncer::HISTORY_DELETE_DIRECTIVES, + syncer::SAVED_TAB_GROUP, + syncer::SHARED_TAB_GROUP_DATA, + syncer::SHARED_TAB_GROUP_ACCOUNT_DATA, + syncer::SESSIONS, + syncer::USER_EVENTS}; + #if !BUILDFLAG(IS_ANDROID) base::FilePath GetTestFilePathForCacheGuid() { base::FilePath user_data_path; @@ -63,14 +79,34 @@ }; #endif // BUILDFLAG(IS_CHROMEOS) -class SingleClientStandaloneTransportSyncTest : public SyncTest { +class SingleClientStandaloneTransportSyncTest + : public SyncTest, + public testing::WithParamInterface<bool> { public: - SingleClientStandaloneTransportSyncTest() : SyncTest(SINGLE_CLIENT) {} + SingleClientStandaloneTransportSyncTest() : SyncTest(SINGLE_CLIENT) { + if (GetParam()) { + override_features_ + .InitWithFeatures(/*enabled_features=*/ + {syncer:: + kSyncEnableContactInfoDataTypeForCustomPassphraseUsers, + syncer::kReplaceSyncPromosWithSignInPromos}, + /*disabled_features=*/{}); + } else { + override_features_.InitWithFeatures( + /*enabled_features=*/{}, + /*disabled_features=*/ + {syncer::kSyncEnableContactInfoDataTypeForCustomPassphraseUsers, + syncer::kReplaceSyncPromosWithSignInPromos}); + } + } + + private: + base::test::ScopedFeatureList override_features_; }; // On Chrome OS sync auto-starts on sign-in. #if !BUILDFLAG(IS_CHROMEOS) -IN_PROC_BROWSER_TEST_F(SingleClientStandaloneTransportSyncTest, +IN_PROC_BROWSER_TEST_P(SingleClientStandaloneTransportSyncTest, StartsSyncTransportOnSignin) { ASSERT_TRUE(SetupClients()); @@ -94,20 +130,16 @@ EXPECT_FALSE(GetSyncService(0)->IsSyncFeatureEnabled()); EXPECT_FALSE(GetSyncService(0)->IsSyncFeatureActive()); - - // Make sure that only the allowed types got activated. Note that, depending - // on some other feature flags, not all of the allowed types are necessarily - // active, and that's okay. - syncer::DataTypeSet bad_types = - base::Difference(GetSyncService(0)->GetActiveDataTypes(), - AllowedTypesInStandaloneTransportMode()); - EXPECT_TRUE(bad_types.empty()) << syncer::DataTypeSetToDebugString(bad_types); } #endif // !BUILDFLAG(IS_CHROMEOS) #if !BUILDFLAG(IS_ANDROID) -IN_PROC_BROWSER_TEST_F(SingleClientStandaloneTransportSyncTest, +IN_PROC_BROWSER_TEST_P(SingleClientStandaloneTransportSyncTest, SwitchesBetweenTransportAndFeature) { + const syncer::DataType kDataTypeExcludedInTransportMode = syncer::AUTOFILL; + CHECK(!AllowedTypesInStandaloneTransportMode().Has( + kDataTypeExcludedInTransportMode)); + ASSERT_TRUE(SetupClients()); // Setup a primary account, but don't actually enable Sync-the-feature (so @@ -119,10 +151,28 @@ GetSyncService(0)->GetTransportState()); ASSERT_FALSE(GetSyncService(0)->IsSyncFeatureActive()); - syncer::DataTypeSet bad_types = - base::Difference(GetSyncService(0)->GetActiveDataTypes(), - AllowedTypesInStandaloneTransportMode()); - EXPECT_TRUE(bad_types.empty()) << syncer::DataTypeSetToDebugString(bad_types); + syncer::DataTypeSet expected_types = Difference( + AllowedTypesInStandaloneTransportMode(), kTypesGatedBehindHistoryOptIn); + + // Bookmarks and reading list require a separate opt in, unless + // `syncer::kReplaceSyncPromosWithSignInPromos` is enabled. + // TODO(crbug.com/424124636): This shouldn't be necessary if + // `kReplaceSyncPromosWithSignInPromos` is enabled. + expected_types.Remove(syncer::BOOKMARKS); + expected_types.Remove(syncer::READING_LIST); + + // TODO(crbug.com/424124636): The types below should probably be excluded. + if (base::FeatureList::IsEnabled( + syncer::kReplaceSyncPromosWithSignInPromos)) { + expected_types.Put(syncer::AUTOFILL_WALLET_METADATA); + expected_types.Put(syncer::AUTOFILL_WALLET_OFFER); + if (base::FeatureList::IsEnabled(commerce::kProductSpecifications)) { + expected_types.Put(syncer::PRODUCT_COMPARISON); + } + } + + ASSERT_THAT(GetSyncService(0)->GetActiveDataTypes(), + ContainerEq(expected_types)); // Turn Sync-the-feature on. ASSERT_TRUE(GetClient(0)->SetupSync()); @@ -132,18 +182,18 @@ EXPECT_TRUE(GetSyncService(0)->IsSyncFeatureActive()); // Make sure that some data type which is not allowed in transport-only mode // got activated. - ASSERT_FALSE(AllowedTypesInStandaloneTransportMode().Has(syncer::AUTOFILL)); ASSERT_TRUE(GetSyncService(0)->GetUserSettings()->GetSelectedTypes().Has( syncer::UserSelectableType::kAutofill)); - EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::AUTOFILL)); + EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has( + kDataTypeExcludedInTransportMode)); } -#endif // BUILDFLAG(IS_ANDROID) +#endif // !BUILDFLAG(IS_ANDROID) // Tests the behavior of receiving a "Reset Sync" operation from the dashboard // while Sync-the-feature is active: On non-ChromeOS, this signs the user out, // so Sync will be fully disabled. On ChromeOS, there is no sign-out, so // Sync-the-transport will start. -IN_PROC_BROWSER_TEST_F(SingleClientStandaloneTransportSyncTest, +IN_PROC_BROWSER_TEST_P(SingleClientStandaloneTransportSyncTest, HandlesResetFromDashboardWhenSyncActive) { ASSERT_TRUE(SetupClients()); @@ -173,6 +223,39 @@ EXPECT_EQ(syncer::SyncService::TransportState::ACTIVE, GetSyncService(0)->GetTransportState()); EXPECT_FALSE(GetSyncService(0)->IsSyncFeatureEnabled()); + + // There are no immediate plans to launch additional types on ChromeOS, so the + // list is hardcoded here. + EXPECT_THAT(GetSyncService(0)->GetActiveDataTypes(), + ContainerEq(syncer::DataTypeSet{ + syncer::AUTOFILL_WALLET_CREDENTIAL, + syncer::AUTOFILL_WALLET_DATA, + syncer::AUTOFILL_WALLET_USAGE, + syncer::DEVICE_INFO, + syncer::NIGORI, + syncer::USER_CONSENTS, + syncer::SEND_TAB_TO_SELF, + syncer::SECURITY_EVENTS, + syncer::SHARING_MESSAGE, + syncer::ARC_PACKAGE, + syncer::OS_PREFERENCES, + syncer::OS_PRIORITY_PREFERENCES, + // TODO(crbug.com/424698545): This seems off: many of the + // datatypes below should not start. + syncer::APP_LIST, + syncer::COLLABORATION_GROUP, + syncer::CONTACT_INFO, + syncer::EXTENSIONS, + syncer::EXTENSION_SETTINGS, + syncer::INCOMING_PASSWORD_SHARING_INVITATION, + syncer::OUTGOING_PASSWORD_SHARING_INVITATION, + syncer::PASSWORDS, + syncer::PRODUCT_COMPARISON, + syncer::SAVED_TAB_GROUP, + syncer::SHARED_TAB_GROUP_DATA, + syncer::SHARED_TAB_GROUP_ACCOUNT_DATA, + syncer::WEBAUTHN_CREDENTIAL, + })); #else // On platforms other than Ash, the "Reset Sync" operation should revoke // the Sync consent. On Mobile, "Reset Sync" also clears the primary account. @@ -189,7 +272,7 @@ #if !BUILDFLAG(IS_ANDROID) // Regression test for crbug.com/955989 that verifies the cache GUID is not // reset upon restart of the browser, in standalone transport mode. -IN_PROC_BROWSER_TEST_F(SingleClientStandaloneTransportSyncTest, +IN_PROC_BROWSER_TEST_P(SingleClientStandaloneTransportSyncTest, PRE_ReusesSameCacheGuid) { ASSERT_TRUE(SetupClients()); ASSERT_TRUE(GetClient(0)->SignInPrimaryAccount()); @@ -220,7 +303,7 @@ ASSERT_TRUE(base::WriteFile(GetTestFilePathForCacheGuid(), cache_guid)); } -IN_PROC_BROWSER_TEST_F(SingleClientStandaloneTransportSyncTest, +IN_PROC_BROWSER_TEST_P(SingleClientStandaloneTransportSyncTest, ReusesSameCacheGuid) { ASSERT_TRUE(SetupClients()); ASSERT_FALSE(GetSyncService(0)->HasDisableReason( @@ -255,40 +338,8 @@ } #endif // BUILDFLAG(IS_ANDROID) -class SingleClientStandaloneTransportWithReplaceSyncWithSigninSyncTest - : public SingleClientStandaloneTransportSyncTest { - public: - SingleClientStandaloneTransportWithReplaceSyncWithSigninSyncTest() { - override_features_.InitWithFeatures( - /*enabled_features=*/ - {switches::kEnablePreferencesAccountStorage, - syncer::kSeparateLocalAndAccountSearchEngines, - syncer::kSyncEnableContactInfoDataTypeForCustomPassphraseUsers, - syncer::kReplaceSyncPromosWithSignInPromos, - syncer::kSyncAutofillWalletCredentialData}, - /*disabled_features=*/{}); - } - ~SingleClientStandaloneTransportWithReplaceSyncWithSigninSyncTest() override = - default; - - bool WaitForPassphraseRequired() { - return PassphraseRequiredChecker(GetSyncService(0)).Wait(); - } - - bool WaitForPassphraseAccepted() { - return PassphraseAcceptedChecker(GetSyncService(0)).Wait(); - } - - private: - base::test::ScopedFeatureList override_features_; -}; - -// This test is disabled on CrOS as the signed in, non-syncing state does not -// exist. -#if !BUILDFLAG(IS_CHROMEOS) -IN_PROC_BROWSER_TEST_F( - SingleClientStandaloneTransportWithReplaceSyncWithSigninSyncTest, - DataTypesEnabledInTransportModeWithoutHistorySync) { +IN_PROC_BROWSER_TEST_P(SingleClientStandaloneTransportSyncTest, + DataTypesEnabledInTransportModeWithoutAdditionalOptIns) { ASSERT_TRUE(SetupClients()); // Sign in, without turning on Sync-the-feature. ASSERT_TRUE(GetClient(0)->SignInPrimaryAccount()); @@ -299,79 +350,118 @@ ASSERT_FALSE(GetSyncService(0)->GetUserSettings()->GetSelectedTypes().Has( syncer::UserSelectableType::kHistory)); - // With `kReplaceSyncPromosWithSignInPromos` and by default (without opting - // into history), all the history-related should be disabled in transport - // mode. - EXPECT_FALSE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::HISTORY)); - EXPECT_FALSE(GetSyncService(0)->GetActiveDataTypes().Has( - syncer::HISTORY_DELETE_DIRECTIVES)); - EXPECT_FALSE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::SESSIONS)); - EXPECT_FALSE( - GetSyncService(0)->GetActiveDataTypes().Has(syncer::USER_EVENTS)); + // Make sure that only the allowed types got activated. + syncer::DataTypeSet expected_types = Difference( + AllowedTypesInStandaloneTransportMode(), kTypesGatedBehindHistoryOptIn); - EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::PREFERENCES)); - EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has( - syncer::PRIORITY_PREFERENCES)); +#if !BUILDFLAG(IS_ANDROID) + // Bookmarks and reading list require a separate opt in, unless + // `syncer::kReplaceSyncPromosWithSignInPromos` is enabled. + // TODO(crbug.com/424124636): This shouldn't be necessary if + // `kReplaceSyncPromosWithSignInPromos` is enabled. + expected_types.Remove(syncer::BOOKMARKS); + expected_types.Remove(syncer::READING_LIST); +#endif // !BUILDFLAG(IS_ANDROID) - EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has( - syncer::AUTOFILL_WALLET_CREDENTIAL)); - EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has( - syncer::AUTOFILL_WALLET_DATA)); - EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has( - syncer::AUTOFILL_WALLET_METADATA)); - EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has( - syncer::AUTOFILL_WALLET_OFFER)); - EXPECT_TRUE( - GetSyncService(0)->GetActiveDataTypes().Has(syncer::CONTACT_INFO)); + EXPECT_THAT(GetSyncService(0)->GetActiveDataTypes(), + ContainerEq(expected_types)); } -IN_PROC_BROWSER_TEST_F( - SingleClientStandaloneTransportWithReplaceSyncWithSigninSyncTest, - DataTypesEnabledInTransportModeWithHistorySync) { +IN_PROC_BROWSER_TEST_P(SingleClientStandaloneTransportSyncTest, + DataTypesEnabledInTransportModeWithHistorySync) { + // Opting into history is only meaningful if + // `kReplaceSyncPromosWithSignInPromos` is enabled. + if (!GetParam()) { + GTEST_SKIP(); + } + ASSERT_TRUE(SetupClients()); // Sign in, without turning on Sync-the-feature. ASSERT_TRUE(GetClient(0)->SignInPrimaryAccount()); + ASSERT_TRUE(GetClient(0)->AwaitSyncTransportActive()); + ASSERT_EQ(syncer::SyncService::TransportState::ACTIVE, + GetSyncService(0)->GetTransportState()); ASSERT_FALSE(GetSyncService(0)->IsSyncFeatureEnabled()); + ASSERT_FALSE(GetSyncService(0)->GetUserSettings()->GetSelectedTypes().Has( + syncer::UserSelectableType::kHistory)); // Opt in to history and tabs. GetSyncService(0)->GetUserSettings()->SetSelectedType( syncer::UserSelectableType::kHistory, true); GetSyncService(0)->GetUserSettings()->SetSelectedType( syncer::UserSelectableType::kTabs, true); +#if !BUILDFLAG(IS_ANDROID) + GetSyncService(0)->GetUserSettings()->SetSelectedType( + syncer::UserSelectableType::kSavedTabGroups, true); +#endif // !BUILDFLAG(IS_ANDROID) ASSERT_TRUE(GetClient(0)->AwaitSyncTransportActive()); ASSERT_EQ(syncer::SyncService::TransportState::ACTIVE, GetSyncService(0)->GetTransportState()); - // With `kReplaceSyncPromosWithSignInPromos`, all the history-related types - // should be enabled in transport mode. - EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::HISTORY)); - EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has( - syncer::HISTORY_DELETE_DIRECTIVES)); - EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::SESSIONS)); - EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::USER_EVENTS)); + // With the history opt in, all types that can run in transport mode should + // be active. + syncer::DataTypeSet expected_types = AllowedTypesInStandaloneTransportMode(); - EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::PREFERENCES)); - EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has( - syncer::PRIORITY_PREFERENCES)); +#if !BUILDFLAG(IS_ANDROID) + // Bookmarks and reading list require a separate opt in, unless + // `syncer::kReplaceSyncPromosWithSignInPromos` is enabled. + // TODO(crbug.com/424124636): This shouldn't be necessary if + // `kReplaceSyncPromosWithSignInPromos` is enabled. + expected_types.Remove(syncer::BOOKMARKS); + expected_types.Remove(syncer::READING_LIST); +#endif // !BUILDFLAG(IS_ANDROID) - EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has( - syncer::AUTOFILL_WALLET_CREDENTIAL)); - EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has( - syncer::AUTOFILL_WALLET_DATA)); - EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has( - syncer::AUTOFILL_WALLET_METADATA)); - EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has( - syncer::AUTOFILL_WALLET_OFFER)); - EXPECT_TRUE( - GetSyncService(0)->GetActiveDataTypes().Has(syncer::CONTACT_INFO)); + EXPECT_THAT(GetSyncService(0)->GetActiveDataTypes(), + ContainerEq(expected_types)); } -#endif // !BUILDFLAG(IS_CHROMEOS) + +#if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_CHROMEOS) +IN_PROC_BROWSER_TEST_P(SingleClientStandaloneTransportSyncTest, + DataTypesEnabledForImplicitSignIn) { + ASSERT_TRUE(SetupClients()); + + // Signing in (without granting sync consent or explicitly setting up Sync) + // should trigger starting the Sync machinery in standalone transport mode. + secondary_account_helper::ImplicitSignInUnconsentedAccount( + GetProfile(0), &test_url_loader_factory_, "user@email.com"); + + ASSERT_TRUE(GetClient(0)->AwaitSyncTransportActive()); + ASSERT_EQ(syncer::SyncService::TransportState::ACTIVE, + GetSyncService(0)->GetTransportState()); + + // There are no immediate plans to launch additional types to implicitly + // signed in users, so the list is hardcoded here. + syncer::DataTypeSet expected_types{syncer::AUTOFILL_WALLET_CREDENTIAL, + syncer::AUTOFILL_WALLET_DATA, + syncer::AUTOFILL_WALLET_USAGE, + syncer::DEVICE_INFO, + syncer::NIGORI, + syncer::PRIORITY_PREFERENCES, + syncer::USER_CONSENTS, + syncer::SEND_TAB_TO_SELF, + syncer::SECURITY_EVENTS, + syncer::SHARING_MESSAGE}; + + // TODO(crbug.com/424124636): The types below should probably be excluded. + if (base::FeatureList::IsEnabled( + syncer::kReplaceSyncPromosWithSignInPromos)) { + expected_types.Put(syncer::AUTOFILL_WALLET_METADATA); + expected_types.Put(syncer::AUTOFILL_WALLET_OFFER); + if (base::FeatureList::IsEnabled(commerce::kProductSpecifications)) { + expected_types.Put(syncer::PRODUCT_COMPARISON); + } + } + + EXPECT_THAT(GetSyncService(0)->GetActiveDataTypes(), + ContainerEq(expected_types)); +} +#endif // !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_CHROMEOS) // TODO(crbug.com/40200835): Android currently doesn't support PRE_ tests. #if !BUILDFLAG(IS_ANDROID) -IN_PROC_BROWSER_TEST_F( - SingleClientStandaloneTransportWithReplaceSyncWithSigninSyncTest, +IN_PROC_BROWSER_TEST_P( + SingleClientStandaloneTransportSyncTest, PRE_DataTypesEnabledInTransportModeWithCustomPassphrase) { // There's a custom passphrase on the server. const syncer::KeyParamsForTesting kKeyParams = @@ -382,63 +472,89 @@ ASSERT_TRUE(SetupClients()); // Sign in, without turning on Sync-the-feature. ASSERT_TRUE(GetClient(0)->SignInPrimaryAccount()); - ASSERT_FALSE(GetSyncService(0)->IsSyncFeatureEnabled()); - - // Opt in to history and tabs. - GetSyncService(0)->GetUserSettings()->SetSelectedType( - syncer::UserSelectableType::kHistory, true); - GetSyncService(0)->GetUserSettings()->SetSelectedType( - syncer::UserSelectableType::kTabs, true); - // Preferences are opted-into by default. - ASSERT_TRUE(GetSyncService(0)->GetUserSettings()->GetSelectedTypes().Has( - syncer::UserSelectableType::kPreferences)); - - ASSERT_TRUE(WaitForPassphraseRequired()); + ASSERT_TRUE(PassphraseRequiredChecker(GetSyncService(0)).Wait()); ASSERT_TRUE(GetSyncService(0)->GetUserSettings()->SetDecryptionPassphrase( kKeyParams.password)); - ASSERT_TRUE(WaitForPassphraseAccepted()); + ASSERT_TRUE(PassphraseAcceptedChecker(GetSyncService(0)).Wait()); ASSERT_TRUE(GetClient(0)->AwaitSyncTransportActive()); ASSERT_EQ(syncer::SyncService::TransportState::ACTIVE, GetSyncService(0)->GetTransportState()); + ASSERT_FALSE(GetSyncService(0)->IsSyncFeatureEnabled()); - // With a custom passphrase, the actual HISTORY types are not supported. - EXPECT_FALSE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::HISTORY)); - EXPECT_FALSE(GetSyncService(0)->GetActiveDataTypes().Has( - syncer::HISTORY_DELETE_DIRECTIVES)); - EXPECT_FALSE( - GetSyncService(0)->GetActiveDataTypes().Has(syncer::USER_EVENTS)); - // But SESSIONS aka Open Tabs still works. - EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::SESSIONS)); - - // With `kReplaceSyncPromosWithSignInPromos`, both PREFERENCES and - // PRIORITY_PREFERENCES should be enabled in transport mode. - EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::PREFERENCES)); - EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has( - syncer::PRIORITY_PREFERENCES)); + // Make sure that only the allowed types got activated. + syncer::DataTypeSet expected_types = Difference( + AllowedTypesInStandaloneTransportMode(), kTypesGatedBehindHistoryOptIn); // CONTACT_INFO should be disabled by default for explicit-passphrase users. - EXPECT_FALSE( - GetSyncService(0)->GetActiveDataTypes().Has(syncer::CONTACT_INFO)); + expected_types.Remove(syncer::CONTACT_INFO); - // Enabling kAutofill to enable CONTACT_INFO. - GetSyncService(0)->GetUserSettings()->SetSelectedType( - syncer::UserSelectableType::kAutofill, true); + // Bookmarks and reading list require a separate opt in, unless + // `syncer::kReplaceSyncPromosWithSignInPromos` is enabled. + // TODO(crbug.com/424124636): This shouldn't be necessary if + // `kReplaceSyncPromosWithSignInPromos` is enabled. + expected_types.Remove(syncer::BOOKMARKS); + expected_types.Remove(syncer::READING_LIST); - ASSERT_NE(syncer::SyncService::TransportState::ACTIVE, - GetSyncService(0)->GetTransportState()); - ASSERT_TRUE(GetClient(0)->AwaitSyncTransportActive()); + ASSERT_THAT(GetSyncService(0)->GetActiveDataTypes(), + ContainerEq(expected_types)); - // CONTACT_INFO should be enabled. - EXPECT_TRUE( - GetSyncService(0)->GetActiveDataTypes().Has(syncer::CONTACT_INFO)); + // Opting into history is only meaningful if + // `kReplaceSyncPromosWithSignInPromos` is enabled. + if (GetParam()) { + // Opt in to history and tabs. + GetSyncService(0)->GetUserSettings()->SetSelectedType( + syncer::UserSelectableType::kHistory, true); + GetSyncService(0)->GetUserSettings()->SetSelectedType( + syncer::UserSelectableType::kTabs, true); + GetSyncService(0)->GetUserSettings()->SetSelectedType( + syncer::UserSelectableType::kSavedTabGroups, true); + + ASSERT_TRUE(GetClient(0)->AwaitSyncTransportActive()); + ASSERT_EQ(syncer::SyncService::TransportState::ACTIVE, + GetSyncService(0)->GetTransportState()); + + syncer::DataTypeSet expected_types_after_history_opt_in = + AllowedTypesInStandaloneTransportMode(); + + // CONTACT_INFO should remain disabled since it's gated by kAutofill. + expected_types_after_history_opt_in.Remove(syncer::CONTACT_INFO); + + // With a custom passphrase, the actual HISTORY types are not supported. + expected_types_after_history_opt_in.Remove(syncer::HISTORY); + expected_types_after_history_opt_in.Remove( + syncer::HISTORY_DELETE_DIRECTIVES); + expected_types_after_history_opt_in.Remove(syncer::USER_EVENTS); + + // But SESSIONS aka Open Tabs still works. + CHECK(expected_types_after_history_opt_in.Has(syncer::SESSIONS)); + +#if !BUILDFLAG(IS_ANDROID) + // On desktop, bookmarks and reading list require a separate opt in. + // TODO(crbug.com/424124636): This shouldn't be necessary if + // `kReplaceSyncPromosWithSignInPromos` is enabled. + expected_types_after_history_opt_in.Remove(syncer::BOOKMARKS); + expected_types_after_history_opt_in.Remove(syncer::READING_LIST); +#endif // !BUILDFLAG(IS_ANDROID) + + EXPECT_THAT(GetSyncService(0)->GetActiveDataTypes(), + ContainerEq(expected_types_after_history_opt_in)); + + // Enabling kAutofill to enable CONTACT_INFO. + GetSyncService(0)->GetUserSettings()->SetSelectedType( + syncer::UserSelectableType::kAutofill, true); + ASSERT_TRUE(GetClient(0)->AwaitSyncTransportActive()); + + // CONTACT_INFO should be enabled. + EXPECT_TRUE( + GetSyncService(0)->GetActiveDataTypes().Has(syncer::CONTACT_INFO)); + } } // Tests that a custom passphrase user's opt-in to kAutofill (which happened in // the PRE_ test) survives a browser restart. -IN_PROC_BROWSER_TEST_F( - SingleClientStandaloneTransportWithReplaceSyncWithSigninSyncTest, - DataTypesEnabledInTransportModeWithCustomPassphrase) { +IN_PROC_BROWSER_TEST_P(SingleClientStandaloneTransportSyncTest, + DataTypesEnabledInTransportModeWithCustomPassphrase) { ASSERT_TRUE(SetupClients()); ASSERT_FALSE(GetSyncService(0)->IsSyncFeatureEnabled()); @@ -446,152 +562,30 @@ ASSERT_EQ(syncer::SyncService::TransportState::ACTIVE, GetSyncService(0)->GetTransportState()); - // CONTACT_INFO should be enabled after restarting. - EXPECT_TRUE( - GetSyncService(0)->GetActiveDataTypes().Has(syncer::CONTACT_INFO)); + // CONTACT_INFO should be enabled after restarting, if and only if + // `kSyncEnableContactInfoDataTypeForCustomPassphraseUsers` is enabled. + EXPECT_EQ(GetSyncService(0)->GetActiveDataTypes().Has(syncer::CONTACT_INFO), + GetParam()); } #endif // BUILDFLAG(IS_ANDROID) -class SingleClientStandaloneTransportWithoutReplaceSyncWithSigninSyncTest - : public SingleClientStandaloneTransportSyncTest { - public: - SingleClientStandaloneTransportWithoutReplaceSyncWithSigninSyncTest() { -#if BUILDFLAG(IS_ANDROID) - // On Android, PREFERENCES is active in transport mode only with - // `kReplaceSyncPromosWithSignInPromos` enabled. - override_features_.InitWithFeatures( - /*enabled_features=*/{switches::kEnablePreferencesAccountStorage}, - /*disabled_features=*/{syncer::kReplaceSyncPromosWithSignInPromos}); +INSTANTIATE_TEST_SUITE_P(ReplaceSyncWithSignin, + SingleClientStandaloneTransportSyncTest, +#if BUILDFLAG(IS_CHROMEOS) + // On ChromeOS, the behavior after enabling + // `syncer::kReplaceSyncPromosWithSignInPromos` is + // unspecified, so no need to test it. + ::testing::Values(false)); +#elif BUILDFLAG(IS_ANDROID) + // On Android, the feature has been enabled by + // default for a long time. There is no need to + // test the flag-disabled case. + ::testing::Values(true)); #else - // On Desktop, PREFERENCES, SEARCH_ENGINES and THEMES are active in - // transport mode irrespective of `kReplaceSyncPromosWithSignInPromos`. - // TODO(crbug.com/330677712): Merge this with the Android branch once - // `kReplaceSyncPromosWithSignInPromos` is removed. - override_features_.InitWithFeatures( - /*enabled_features=*/{switches::kEnablePreferencesAccountStorage, - syncer::kSeparateLocalAndAccountSearchEngines, - syncer::kSeparateLocalAndAccountThemes}, - /*disabled_features=*/{syncer::kReplaceSyncPromosWithSignInPromos}); -#endif // BUILDFLAG(IS_ANDROID) - } - ~SingleClientStandaloneTransportWithoutReplaceSyncWithSigninSyncTest() - override = default; + ::testing::Bool()); +#endif - private: - base::test::ScopedFeatureList override_features_; -}; - -#if BUILDFLAG(IS_ANDROID) - -IN_PROC_BROWSER_TEST_F( - SingleClientStandaloneTransportWithoutReplaceSyncWithSigninSyncTest, - DataTypesNotEnabledInTransportMode) { - ASSERT_TRUE(SetupClients()); - // Sign in, without turning on Sync-the-feature. - ASSERT_TRUE(GetClient(0)->SignInPrimaryAccount()); - ASSERT_FALSE(GetSyncService(0)->IsSyncFeatureEnabled()); - - // Without `kReplaceSyncPromosWithSignInPromos`, neither History/Tabs nor - // Preferences are supported in transport mode, so they're reported as not - // selected even if the user explicitly tries to turn them on. - syncer::UserSelectableTypeSet types = - GetSyncService(0)->GetUserSettings()->GetRegisteredSelectableTypes(); - ASSERT_TRUE(types.HasAll({syncer::UserSelectableType::kHistory, - syncer::UserSelectableType::kTabs, - syncer::UserSelectableType::kPreferences})); - GetSyncService(0)->GetUserSettings()->SetSelectedTypes( - /*sync_everything=*/true, types); - ASSERT_FALSE(GetSyncService(0)->GetUserSettings()->GetSelectedTypes().Has( - syncer::UserSelectableType::kHistory)); - ASSERT_FALSE(GetSyncService(0)->GetUserSettings()->GetSelectedTypes().Has( - syncer::UserSelectableType::kTabs)); - ASSERT_FALSE(GetSyncService(0)->GetUserSettings()->GetSelectedTypes().Has( - syncer::UserSelectableType::kPreferences)); - - ASSERT_TRUE(GetClient(0)->AwaitSyncTransportActive()); - ASSERT_EQ(syncer::SyncService::TransportState::ACTIVE, - GetSyncService(0)->GetTransportState()); - - // Without `kReplaceSyncPromosWithSignInPromos`, none of the history-related - // types should be active in transport mode (even if the user has opted in). - EXPECT_FALSE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::HISTORY)); - EXPECT_FALSE(GetSyncService(0)->GetActiveDataTypes().Has( - syncer::HISTORY_DELETE_DIRECTIVES)); - EXPECT_FALSE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::SESSIONS)); - EXPECT_FALSE( - GetSyncService(0)->GetActiveDataTypes().Has(syncer::USER_EVENTS)); - - // Without `kReplaceSyncPromosWithSignInPromos`, PREFERENCES should not be - // active in transport mode (even if the user has opted in). - EXPECT_FALSE( - GetSyncService(0)->GetActiveDataTypes().Has(syncer::PREFERENCES)); - // TODO(crbug.com/412602018): With - // `kSyncSupportAlwaysSyncingPriorityPreferences` enabled, - // PRIORITY_PREFERENCES are active in transport mode and decoupled from user - // toggle. Update or add new test to cover PRIORITY_PREFERENCES. -} - -#else - -IN_PROC_BROWSER_TEST_F( - SingleClientStandaloneTransportWithoutReplaceSyncWithSigninSyncTest, - DataTypesNotEnabledInTransportMode) { - ASSERT_TRUE(SetupClients()); - // Sign in, without turning on Sync-the-feature. - ASSERT_TRUE(GetClient(0)->SignInPrimaryAccount()); - ASSERT_FALSE(GetSyncService(0)->IsSyncFeatureEnabled()); - - // Without `kReplaceSyncPromosWithSignInPromos`, History/Tabs are not are - // supported in transport mode, so they're reported as not selected even if - // the user explicitly tries to turn them on. - syncer::UserSelectableTypeSet types = - GetSyncService(0)->GetUserSettings()->GetRegisteredSelectableTypes(); - ASSERT_TRUE(types.HasAll({syncer::UserSelectableType::kHistory, - syncer::UserSelectableType::kTabs, - syncer::UserSelectableType::kPreferences})); - GetSyncService(0)->GetUserSettings()->SetSelectedTypes( - /*sync_everything=*/true, types); - ASSERT_FALSE(GetSyncService(0)->GetUserSettings()->GetSelectedTypes().Has( - syncer::UserSelectableType::kHistory)); - ASSERT_FALSE(GetSyncService(0)->GetUserSettings()->GetSelectedTypes().Has( - syncer::UserSelectableType::kTabs)); - // Preferences, Themes and Search Engines are supported in transport mode, - // provided the enabled feature flags, irrespective of - // `kReplaceSyncPromosWithSignInPromos`. So they're reported as selected even - // when the user explicitly turns them on. - ASSERT_TRUE(GetSyncService(0)->GetUserSettings()->GetSelectedTypes().HasAll( - {syncer::UserSelectableType::kPreferences, - syncer::UserSelectableType::kThemes})); - - ASSERT_TRUE(GetClient(0)->AwaitSyncTransportActive()); - ASSERT_EQ(syncer::SyncService::TransportState::ACTIVE, - GetSyncService(0)->GetTransportState()); - - // Without `kReplaceSyncPromosWithSignInPromos`, none of the history-related - // types should be active in transport mode (even if the user has opted in). - EXPECT_FALSE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::HISTORY)); - EXPECT_FALSE(GetSyncService(0)->GetActiveDataTypes().Has( - syncer::HISTORY_DELETE_DIRECTIVES)); - EXPECT_FALSE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::SESSIONS)); - EXPECT_FALSE( - GetSyncService(0)->GetActiveDataTypes().Has(syncer::USER_EVENTS)); - - // PREFERENCES, SEARCH_ENGINES and THEMES are active in transport mode - // irrespective of `kReplaceSyncPromosWithSignInPromos`, provided the - // enabled feature flags. - EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::THEMES)); - EXPECT_TRUE( - GetSyncService(0)->GetActiveDataTypes().Has(syncer::SEARCH_ENGINES)); - EXPECT_TRUE(GetSyncService(0)->GetActiveDataTypes().Has(syncer::PREFERENCES)); - // TODO(crbug.com/412602018): With - // `kSyncSupportAlwaysSyncingPriorityPreferences` enabled, - // PRIORITY_PREFERENCES are active in transport mode and decoupled from user - // toggle. Update or add new test to cover PRIORITY_PREFERENCES. -} - -#endif // BUILDFLAG(IS_ANDROID) - -// SingleClientStandaloneTransportReplaceSyncWithSigninMigrationSyncTest is +// ReplaceSyncWithSigninMigrationSyncTest is // disabled on CrOS as the signed in, non-syncing state does not exist. // TODO(crbug.com/40145099): Android currently doesn't support PRE_ tests and // all of these are. @@ -602,10 +596,9 @@ // This test intends to test the mobile migration behavior, but runs on desktop. // Desktop and mobile have different behaviors, and as a consequence is test is // only an approximation. -class SingleClientStandaloneTransportReplaceSyncWithSigninMigrationSyncTest - : public SingleClientStandaloneTransportSyncTest { +class ReplaceSyncWithSigninMigrationSyncTest : public SyncTest { public: - SingleClientStandaloneTransportReplaceSyncWithSigninMigrationSyncTest() { + ReplaceSyncWithSigninMigrationSyncTest() : SyncTest(SINGLE_CLIENT) { // Various features that are required for types to be supported in transport // mode are unconditionally enabled. default_features_.InitWithFeatures( @@ -622,17 +615,15 @@ {{syncer::kReplaceSyncPromosWithSignInPromos, !content::IsPreTest()}, {switches::kEnablePreferencesAccountStorage, !content::IsPreTest()}}); } - ~SingleClientStandaloneTransportReplaceSyncWithSigninMigrationSyncTest() - override = default; + ~ReplaceSyncWithSigninMigrationSyncTest() override = default; private: base::test::ScopedFeatureList default_features_; base::test::ScopedFeatureList sync_to_signin_feature_; }; -IN_PROC_BROWSER_TEST_F( - SingleClientStandaloneTransportReplaceSyncWithSigninMigrationSyncTest, - PRE_MigratesSignedInUser) { +IN_PROC_BROWSER_TEST_F(ReplaceSyncWithSigninMigrationSyncTest, + PRE_MigratesSignedInUser) { ASSERT_TRUE(SetupClients()); // Sign in, without turning on Sync-the-feature. ASSERT_TRUE(GetClient(0)->SignInPrimaryAccount()); @@ -661,9 +652,8 @@ GetSyncService(0)->GetTransportState()); } -IN_PROC_BROWSER_TEST_F( - SingleClientStandaloneTransportReplaceSyncWithSigninMigrationSyncTest, - MigratesSignedInUser) { +IN_PROC_BROWSER_TEST_F(ReplaceSyncWithSigninMigrationSyncTest, + MigratesSignedInUser) { ASSERT_TRUE(SetupClients()); ASSERT_FALSE(GetSyncService(0)->IsSyncFeatureEnabled()); @@ -687,9 +677,8 @@ syncer::UserSelectableType::kPreferences)); } -IN_PROC_BROWSER_TEST_F( - SingleClientStandaloneTransportReplaceSyncWithSigninMigrationSyncTest, - PRE_MigratesSignedInCustomPassphraseUser) { +IN_PROC_BROWSER_TEST_F(ReplaceSyncWithSigninMigrationSyncTest, + PRE_MigratesSignedInCustomPassphraseUser) { ASSERT_TRUE(SetupClients()); // Sign in, without turning on Sync-the-feature. ASSERT_TRUE(GetClient(0)->SignInPrimaryAccount()); @@ -714,9 +703,8 @@ syncer::UserSelectableType::kPreferences)); } -IN_PROC_BROWSER_TEST_F( - SingleClientStandaloneTransportReplaceSyncWithSigninMigrationSyncTest, - MigratesSignedInCustomPassphraseUser) { +IN_PROC_BROWSER_TEST_F(ReplaceSyncWithSigninMigrationSyncTest, + MigratesSignedInCustomPassphraseUser) { ASSERT_TRUE(SetupClients()); ASSERT_FALSE(GetSyncService(0)->IsSyncFeatureEnabled());
diff --git a/chrome/browser/sync/test/integration/sync_test.cc b/chrome/browser/sync/test/integration/sync_test.cc index 5744fb9c..c2eddc6c 100644 --- a/chrome/browser/sync/test/integration/sync_test.cc +++ b/chrome/browser/sync/test/integration/sync_test.cc
@@ -58,6 +58,8 @@ #include "chrome/common/chrome_switches.h" #include "components/bookmarks/test/bookmark_test_helpers.h" #include "components/browser_sync/browser_sync_switches.h" +#include "components/commerce/core/commerce_feature_list.h" +#include "components/data_sharing/public/features.h" #include "components/gcm_driver/fake_gcm_profile_service.h" #include "components/gcm_driver/gcm_profile_service.h" #include "components/gcm_driver/instance_id/instance_id.h" @@ -65,6 +67,8 @@ #include "components/gcm_driver/instance_id/instance_id_profile_service.h" #include "components/keyed_service/core/keyed_service.h" #include "components/os_crypt/sync/os_crypt_mocker.h" +#include "components/password_manager/core/browser/password_manager_buildflags.h" +#include "components/plus_addresses/features.h" #include "components/prefs/scoped_user_pref_update.h" #include "components/signin/public/base/consent_level.h" #include "components/signin/public/base/signin_switches.h" @@ -105,6 +109,7 @@ #endif // BUILDFLAG(IS_CHROMEOS) #if BUILDFLAG(IS_ANDROID) +#include "chrome/browser/password_manager/android/password_manager_util_bridge.h" #include "chrome/browser/sync/test/integration/sync_test_utils_android.h" #else // BUILDFLAG(IS_ANDROID) #include "chrome/browser/ui/browser.h" @@ -1075,12 +1080,19 @@ syncer::DataTypeSet AllowedTypesInStandaloneTransportMode() { static_assert(55 == syncer::GetNumDataTypes(), "Add new types below if they can run in transport mode"); + +#if BUILDFLAG(IS_ANDROID) + // On Android, `kReplaceSyncPromosWithSignInPromos` has been enabled by + // default for a long time, so it is not expected to be exercised in tests. + CHECK( + base::FeatureList::IsEnabled(syncer::kReplaceSyncPromosWithSignInPromos)); +#endif // BUILDFLAG(IS_ANDROID) + // Only some types will run by default in transport mode (i.e. without their // own separate opt-in). syncer::DataTypeSet allowed_types = {syncer::AUTOFILL_WALLET_CREDENTIAL, syncer::AUTOFILL_WALLET_DATA, syncer::AUTOFILL_WALLET_USAGE, - syncer::CONTACT_INFO, syncer::DEVICE_INFO, syncer::SECURITY_EVENTS, syncer::SEND_TAB_TO_SELF, @@ -1088,12 +1100,20 @@ syncer::USER_CONSENTS}; allowed_types.PutAll(syncer::ControlTypes()); - allowed_types.Put(syncer::PLUS_ADDRESS); - allowed_types.Put(syncer::PLUS_ADDRESS_SETTING); - allowed_types.Put(syncer::PASSWORDS); - allowed_types.Put(syncer::WEBAUTHN_CREDENTIAL); - allowed_types.Put(syncer::INCOMING_PASSWORD_SHARING_INVITATION); - allowed_types.Put(syncer::OUTGOING_PASSWORD_SHARING_INVITATION); +#if BUILDFLAG(IS_CHROMEOS) + // OS sync types run in transport mode. + allowed_types.PutAll({syncer::APP_LIST, syncer::ARC_PACKAGE, + syncer::OS_PREFERENCES, + syncer::OS_PRIORITY_PREFERENCES}); + + // Some of the feature-guarded logic in the #else branch below could make + // sense for ChromeOS too. However, since there are no immediate plans to + // roll them out on ChromeOS, they are excluded in this test to avoid + // accidental rollouts on ChromeOS transport mode (which is somewhat special, + // and reachable only in advanced scenarios such as the user having cleared + // data via sync dashboard). +#else // BUILDFLAG(IS_CHROMEOS) + allowed_types.Put(syncer::CONTACT_INFO); if (base::FeatureList::IsEnabled( switches::kEnablePreferencesAccountStorage)) { @@ -1111,37 +1131,44 @@ syncer::kReplaceSyncPromosWithSignInPromos)) { allowed_types.Put(syncer::AUTOFILL_WALLET_METADATA); allowed_types.Put(syncer::AUTOFILL_WALLET_OFFER); - allowed_types.Put(syncer::COLLABORATION_GROUP); allowed_types.Put(syncer::HISTORY); allowed_types.Put(syncer::HISTORY_DELETE_DIRECTIVES); - allowed_types.Put(syncer::PRODUCT_COMPARISON); allowed_types.Put(syncer::SAVED_TAB_GROUP); allowed_types.Put(syncer::SESSIONS); - allowed_types.Put(syncer::SHARED_TAB_GROUP_DATA); allowed_types.Put(syncer::USER_EVENTS); + + if (data_sharing::features::IsDataSharingFunctionalityEnabled()) { + allowed_types.Put(syncer::SHARED_TAB_GROUP_DATA); + allowed_types.Put(syncer::COLLABORATION_GROUP); + + if (base::FeatureList::IsEnabled( + syncer::kSyncSharedTabGroupAccountData)) { + allowed_types.Put(syncer::SHARED_TAB_GROUP_ACCOUNT_DATA); + } + } + + if (base::FeatureList::IsEnabled(commerce::kProductSpecifications)) { + allowed_types.Put(syncer::PRODUCT_COMPARISON); + } } if (base::FeatureList::IsEnabled(syncer::kSyncAutofillLoyaltyCard)) { allowed_types.Put(syncer::AUTOFILL_VALUABLE); } - if (base::FeatureList::IsEnabled(syncer::kSyncSharedTabGroupAccountData)) { - allowed_types.Put(syncer::SHARED_TAB_GROUP_ACCOUNT_DATA); + +#if BUILDFLAG(IS_ANDROID) && !BUILDFLAG(USE_LOGIN_DATABASE_AS_BACKEND) + // On Android, PASSWORDS require that Google Play Services is present. + password_manager_android_util::PasswordManagerUtilBridge util_bridge; + if (util_bridge.IsInternalBackendPresent()) { + allowed_types.Put(syncer::PASSWORDS); } +#else // BUILDFLAG(IS_ANDROID) && !BUILDFLAG(USE_LOGIN_DATABASE_AS_BACKEND) + allowed_types.Put(syncer::PASSWORDS); +#endif // BUILDFLAG(IS_ANDROID) && !BUILDFLAG(USE_LOGIN_DATABASE_AS_BACKEND) + #if BUILDFLAG(IS_ANDROID) - if (base::FeatureList::IsEnabled(syncer::kWebApkBackupAndRestoreBackend)) { - allowed_types.Put(syncer::WEB_APKS); - } -#endif - -#if BUILDFLAG(IS_CHROMEOS) - // OS sync types run in transport mode. - allowed_types.PutAll({syncer::APP_LIST, syncer::ARC_PACKAGE, - syncer::OS_PREFERENCES, syncer::OS_PRIORITY_PREFERENCES, - syncer::PRINTERS, - syncer::PRINTERS_AUTHORIZATION_SERVERS, - syncer::WIFI_CONFIGURATIONS, syncer::WORKSPACE_DESK}); -#endif // BUILDFLAG(IS_CHROMEOS) - -#if !BUILDFLAG(IS_ANDROID) + // TODO(crbug.com/420912307): Allow `syncer::WEB_APKS` if + // `syncer::kWebApkBackupAndRestoreBackend` is enabled. +#else // BUILDFLAG(IS_ANDROID) if (base::FeatureList::IsEnabled(syncer::kSeparateLocalAndAccountThemes)) { allowed_types.Put(syncer::THEMES); } @@ -1150,7 +1177,21 @@ syncer::kSeparateLocalAndAccountSearchEngines)) { allowed_types.Put(syncer::SEARCH_ENGINES); } -#endif // !BUILDFLAG(IS_ANDROID) + + // These types are excluded on Android as they run outside Chrome. + allowed_types.Put(syncer::INCOMING_PASSWORD_SHARING_INVITATION); + allowed_types.Put(syncer::OUTGOING_PASSWORD_SHARING_INVITATION); + allowed_types.Put(syncer::WEBAUTHN_CREDENTIAL); +#endif // BUILDFLAG(IS_ANDROID) +#endif // BUILDFLAG(IS_CHROMEOS) + + if (base::FeatureList::IsEnabled( + plus_addresses::features::kPlusAddressesEnabled) && + !plus_addresses::features::kEnterprisePlusAddressServerUrl.Get() + .empty()) { + allowed_types.Put(syncer::PLUS_ADDRESS); + allowed_types.Put(syncer::PLUS_ADDRESS_SETTING); + } return allowed_types; }
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/EmptyTabObserver.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/EmptyTabObserver.java index 82e5a0a..f44dd176 100644 --- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/EmptyTabObserver.java +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/EmptyTabObserver.java
@@ -29,7 +29,7 @@ @NullMarked public class EmptyTabObserver implements TabObserver { @Override - public void onInitialized(Tab tab, String appId) {} + public void onInitialized(Tab tab, @Nullable String appId) {} @Override public void onShown(Tab tab, @TabSelectionType int type) {} @@ -65,7 +65,7 @@ public void onRestoreFailed(Tab tab) {} @Override - public void onFaviconUpdated(Tab tab, Bitmap icon, GURL iconUrl) {} + public void onFaviconUpdated(Tab tab, @Nullable Bitmap icon, @Nullable GURL iconUrl) {} @Override public void onTitleUpdated(Tab tab) {}
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/Tab.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/Tab.java index c5c4c66..a39399a 100644 --- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/Tab.java +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/Tab.java
@@ -4,6 +4,8 @@ package org.chromium.chrome.browser.tab; +import static org.chromium.build.NullUtil.assertNonNull; + import android.content.Context; import android.view.View; @@ -99,9 +101,18 @@ Context getContext(); /** - * @return The {@link WindowAndroid} associated with this {@link Tab}. + * Returns the {@link WindowAndroid} associated with this {@link Tab}. May be null if the tab is + * detached. */ - WindowAndroid getWindowAndroid(); + @Nullable WindowAndroid getWindowAndroid(); + + /** + * Returns the {@link WindowAndroid} associated with this {@link Tab}. Asserts that the {@link + * WindowAndroid} is not null. + */ + default WindowAndroid getWindowAndroidChecked() { + return assertNonNull(getWindowAndroid()); + } /** * Update the attachment state to Window(Activity). @@ -115,16 +126,15 @@ @Nullable WindowAndroid window, @Nullable TabDelegateFactory tabDelegateFactory); /** - * @return Content view used for rendered web contents. Can be null - * if web contents is null. + * @return Content view used for rendered web contents. Can be null if web contents is null. */ - ContentView getContentView(); + @Nullable ContentView getContentView(); /** * @return The {@link View} displaying the current page in the tab. This can be {@code null}, if - * the tab is frozen or being initialized or destroyed. + * the tab is frozen or being initialized or destroyed. */ - View getView(); + @Nullable View getView(); /** * @return The {@link TabViewManager} that is responsible for managing custom {@link View}s @@ -139,7 +149,7 @@ /** * @return Parameters that should be used for a lazily loaded Tab. May be null. */ - LoadUrlParams getPendingLoadParams(); + @Nullable LoadUrlParams getPendingLoadParams(); /** * @return The URL that is loaded in the current tab. This may not be the same as @@ -160,10 +170,10 @@ /** * @return The {@link NativePage} associated with the current page, or {@code null} if there is - * no current page or the current page is displayed using something besides - * {@link NativePage}. + * no current page or the current page is displayed using something besides {@link + * NativePage}. */ - NativePage getNativePage(); + @Nullable NativePage getNativePage(); /** * @return Whether or not the {@link Tab} represents a {@link NativePage}. @@ -418,7 +428,7 @@ /** * @return content state bytes for the {@link Tab} */ - WebContentsState getWebContentsState(); + @Nullable WebContentsState getWebContentsState(); /** * @return timestamp in milliseconds when the tab was last interacted.
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabAssociatedApp.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabAssociatedApp.java index 0a4a203..6fc77ea5 100644 --- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabAssociatedApp.java +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabAssociatedApp.java
@@ -41,7 +41,7 @@ tab.addObserver( new EmptyTabObserver() { @Override - public void onInitialized(Tab tab, String appId) { + public void onInitialized(Tab tab, @Nullable String appId) { if (appId != null) setAppId(appId); }
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabDelegateFactory.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabDelegateFactory.java index 02498fb..b6f34a0 100644 --- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabDelegateFactory.java +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabDelegateFactory.java
@@ -61,5 +61,5 @@ * @return A NativePage showing the specified url or null. */ @Nullable NativePage createNativePage( - String url, NativePage candidatePage, Tab tab, PdfInfo pdfInfo); + String url, @Nullable NativePage candidatePage, Tab tab, @Nullable PdfInfo pdfInfo); }
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabObserver.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabObserver.java index 1635d8d0..ce60664 100644 --- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabObserver.java +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabObserver.java
@@ -25,12 +25,13 @@ @NullMarked public interface TabObserver { /** - * Called when a {@link Tab} finished initialization. The {@link TabState} contains, - * if not {@code null}, various states that a Tab should restore itself from. + * Called when a {@link Tab} finished initialization. The {@link TabState} contains, if not + * {@code null}, various states that a Tab should restore itself from. + * * @param tab The notifying {@link Tab}. * @param appId ID of the external app that opened this tab. */ - void onInitialized(Tab tab, String appId); + void onInitialized(Tab tab, @Nullable String appId); /** * Called when a {@link Tab} is shown. @@ -106,11 +107,12 @@ /** * Called when the favicon of a {@link Tab} has been updated. + * * @param tab The notifying {@link Tab}. * @param icon The favicon that was received. * @param iconUrl The URL that the icon was fetched from. */ - void onFaviconUpdated(Tab tab, Bitmap icon, GURL iconUrl); + void onFaviconUpdated(Tab tab, @Nullable Bitmap icon, @Nullable GURL iconUrl); /** * Called when the title of a {@link Tab} changes.
diff --git a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabWebContentsUserData.java b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabWebContentsUserData.java index d5ae5fb..280bda39 100644 --- a/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabWebContentsUserData.java +++ b/chrome/browser/tab/java/src/org/chromium/chrome/browser/tab/TabWebContentsUserData.java
@@ -45,7 +45,7 @@ @Override public final void destroy() { - cleanupWebContents(mWebContents); + if (mWebContents != null) cleanupWebContents(mWebContents); destroyInternal(); } @@ -64,7 +64,8 @@ /** * Called when {@link WebContents} gets swapped out. + * * @param webContents WebContents object that just became inactive. */ - public abstract void cleanupWebContents(@Nullable WebContents webContents); + public abstract void cleanupWebContents(WebContents webContents); }
diff --git a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/StartupHelper.java b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/StartupHelper.java index 3c359ee..9a24532 100644 --- a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/StartupHelper.java +++ b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/StartupHelper.java
@@ -4,6 +4,7 @@ package org.chromium.chrome.browser.tab_group_sync; +import org.chromium.base.metrics.RecordHistogram; import org.chromium.build.annotations.NullMarked; import org.chromium.chrome.browser.preferences.Pref; import org.chromium.chrome.browser.tab.Tab; @@ -92,12 +93,16 @@ private void closeDeletedGroupsFromTabModel() { LogUtils.log(TAG, "closeDeletedGroupsFromTabModel"); + int tabGroupsClosed = 0; for (LocalTabGroupId tabGroupId : mTabGroupSyncService.getDeletedGroupIds()) { if (!TabGroupSyncUtils.isInCurrentWindow(mTabGroupModelFilter, tabGroupId)) continue; mLocalTabGroupMutationHelper.closeTabGroup( tabGroupId, ClosingSource.CLEANED_UP_ON_STARTUP); + tabGroupsClosed++; } + RecordHistogram.recordCount1000Histogram( + "TabGroups.CloseTabGroupsDeletedRemotely", tabGroupsClosed); } /**
diff --git a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/StartupHelperUnitTest.java b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/StartupHelperUnitTest.java index 948f8ef5..6b1db67 100644 --- a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/StartupHelperUnitTest.java +++ b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/StartupHelperUnitTest.java
@@ -27,6 +27,7 @@ import org.chromium.base.Token; import org.chromium.base.test.BaseRobolectricTestRunner; +import org.chromium.base.test.util.HistogramWatcher; import org.chromium.chrome.browser.preferences.Pref; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.tab.Tab; @@ -153,12 +154,16 @@ List<LocalTabGroupId> deletedIds = new ArrayList<>(); deletedIds.add(LOCAL_TAB_GROUP_ID_1); when(mTabGroupSyncService.getDeletedGroupIds()).thenReturn(deletedIds); + HistogramWatcher histogramExpectation = + HistogramWatcher.newSingleRecordWatcher( + "TabGroups.CloseTabGroupsDeletedRemotely", 1); // Init. Deleted groups should be closed. mStartupHelper.initializeTabGroupSync(); verify(mTabGroupSyncService).getDeletedGroupIds(); verify(mLocalMutationHelper, atLeastOnce()) .closeTabGroup(eq(LOCAL_TAB_GROUP_ID_1), eq(ClosingSource.CLEANED_UP_ON_STARTUP)); + histogramExpectation.assertExpected(); } @Test
diff --git a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncRemoteObserver.java b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncRemoteObserver.java index 51877da..207e71dee 100644 --- a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncRemoteObserver.java +++ b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncRemoteObserver.java
@@ -7,6 +7,7 @@ import android.text.TextUtils; import org.chromium.base.Callback; +import org.chromium.base.metrics.RecordHistogram; import org.chromium.base.supplier.Supplier; import org.chromium.build.annotations.NullMarked; import org.chromium.build.annotations.Nullable; @@ -135,6 +136,7 @@ mEnableLocalObserverCallback.onResult(false); mLocalTabGroupMutationHelper.closeTabGroup(localId, ClosingSource.DELETED_FROM_SYNC); + RecordHistogram.recordCount1000Histogram("TabGroups.CloseTabGroupsDeletedRemotely", 1); mEnableLocalObserverCallback.onResult(true); }
diff --git a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncRemoteObserverUnitTest.java b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncRemoteObserverUnitTest.java index 991f601..2183a4b6 100644 --- a/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncRemoteObserverUnitTest.java +++ b/chrome/browser/tab_group_sync/android/java/src/org/chromium/chrome/browser/tab_group_sync/TabGroupSyncRemoteObserverUnitTest.java
@@ -26,6 +26,7 @@ import org.chromium.base.Token; import org.chromium.base.supplier.Supplier; import org.chromium.base.test.BaseRobolectricTestRunner; +import org.chromium.base.test.util.HistogramWatcher; import org.chromium.chrome.browser.preferences.Pref; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.tab.MockTab; @@ -193,15 +194,24 @@ @Test public void testTabGroupRemoved() { addOneTab(); + HistogramWatcher histogramExpectation = + HistogramWatcher.newSingleRecordWatcher( + "TabGroups.CloseTabGroupsDeletedRemotely", 1); mRemoteObserver.onTabGroupRemoved(LOCAL_TAB_GROUP_ID_1, TriggerSource.REMOTE); verify(mLocalMutationHelper).closeTabGroup(any(), eq(ClosingSource.DELETED_FROM_SYNC)); + histogramExpectation.assertExpected(); } @Test public void testTabGroupRemovedForDifferentWindow() { addOneTab(); + HistogramWatcher histogramExpectation = + HistogramWatcher.newBuilder() + .expectNoRecords("TabGroups.CloseTabGroupsDeletedRemotely") + .build(); mRemoteObserver.onTabGroupRemoved(LOCAL_TAB_GROUP_ID_2, TriggerSource.REMOTE); verify(mLocalMutationHelper, never()).closeTabGroup(any(), anyInt()); + histogramExpectation.assertExpected(); } @Test
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 918d499c..d2a2b19 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
@@ -4,6 +4,8 @@ package org.chromium.chrome.browser.tab_ui; +import static org.chromium.build.NullUtil.assumeNonNull; + import static java.lang.Math.min; import android.content.Context; @@ -239,6 +241,7 @@ if (nativePage == null && !isNativeViewShowing) { return null; } + assumeNonNull(nativePage); View viewToDraw = null; if (isNativeViewShowing) {
diff --git a/chrome/browser/ui/android/edge_to_edge/internal/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerFactory.java b/chrome/browser/ui/android/edge_to_edge/internal/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerFactory.java index be63c41..b3b6191c 100644 --- a/chrome/browser/ui/android/edge_to_edge/internal/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerFactory.java +++ b/chrome/browser/ui/android/edge_to_edge/internal/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeControllerFactory.java
@@ -18,6 +18,7 @@ import org.chromium.chrome.browser.fullscreen.FullscreenManager; import org.chromium.chrome.browser.layouts.LayoutManager; import org.chromium.chrome.browser.tab.Tab; +import org.chromium.chrome.browser.ui.edge_to_edge.EdgeToEdgeUtils.EdgeToEdgeDebuggingInfo; import org.chromium.components.browser_ui.edge_to_edge.EdgeToEdgeManager; import org.chromium.components.browser_ui.edge_to_edge.EdgeToEdgePadAdjuster; import org.chromium.components.browser_ui.edge_to_edge.SystemBarColorHelper; @@ -40,8 +41,8 @@ * @param windowAndroid The current {@link WindowAndroid} to allow drawing under System Bars. * @param tabObservableSupplier Supplies an {@Link Observer} that is notified whenever the Tab * changes. - * @param edgeToEdgeStateProvider Provides the edge-to-edge state and allows for requests to - * draw edge-to-edge. + * @param edgeToEdgeManager Provides the edge-to-edge state and allows for requests to draw + * edge-to-edge. * @param browserControlsStateProvider Provides the state of the BrowserControls so we can tell * if the Toolbar is changing. * @param layoutManagerSupplier The supplier of {@link LayoutManager} for checking the active @@ -57,7 +58,8 @@ EdgeToEdgeManager edgeToEdgeManager, BrowserControlsStateProvider browserControlsStateProvider, ObservableSupplier<LayoutManager> layoutManagerSupplier, - FullscreenManager fullscreenManager) { + FullscreenManager fullscreenManager, + EdgeToEdgeDebuggingInfo edgeToEdgeDebuggingInfo) { if (Build.VERSION.SDK_INT < VERSION_CODES.R) return null; assert EdgeToEdgeUtils.isEdgeToEdgeBottomChinEnabled(activity); return new EdgeToEdgeControllerImpl( @@ -68,7 +70,8 @@ edgeToEdgeManager, browserControlsStateProvider, layoutManagerSupplier, - fullscreenManager); + fullscreenManager, + edgeToEdgeDebuggingInfo); } /**
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 067aead..42c6eab3 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
@@ -40,6 +40,7 @@ import org.chromium.components.browser_ui.edge_to_edge.EdgeToEdgeManager; import org.chromium.components.browser_ui.edge_to_edge.EdgeToEdgePadAdjuster; import org.chromium.components.browser_ui.edge_to_edge.EdgeToEdgeStateProvider; +import org.chromium.content_public.browser.Page; import org.chromium.content_public.browser.WebContents; import org.chromium.content_public.browser.WebContentsObserver; import org.chromium.ui.base.WindowAndroid; @@ -156,6 +157,7 @@ private @Nullable WebContentsObserver mWebContentsObserver; private boolean mIsBottomChinEnabled; + private final EdgeToEdgeUtils.EdgeToEdgeDebuggingInfo mEdgeToEdgeDebuggingInfo; /** * Whether the system is drawing "toEdge" (i.e. the edge-to-edge wrapper has no bottom padding). @@ -211,13 +213,15 @@ EdgeToEdgeManager edgeToEdgeManager, BrowserControlsStateProvider browserControlsStateProvider, ObservableSupplier<LayoutManager> layoutManagerSupplier, - FullscreenManager fullscreenManager) { + FullscreenManager fullscreenManager, + EdgeToEdgeUtils.EdgeToEdgeDebuggingInfo edgeToEdgeDebuggingInfo) { mActivity = activity; mWindowAndroid = windowAndroid; mEdgeToEdgeManager = edgeToEdgeManager; mPxToDp = 1.f / mActivity.getResources().getDisplayMetrics().density; mDisablePaddingRootView = EdgeToEdgeUtils.isEdgeToEdgeEverywhereEnabled(); mIsBottomChinEnabled = EdgeToEdgeUtils.isEdgeToEdgeBottomChinEnabled(activity); + mEdgeToEdgeDebuggingInfo = edgeToEdgeDebuggingInfo; mEdgeToEdgeOsWrapper = edgeToEdgeOsWrapper == null && !mDisablePaddingRootView @@ -436,6 +440,18 @@ observer.onSafeAreaConstraintChanged(mHasSafeAreaConstraint); } } + + @Override + public void firstContentfulPaintInPrimaryMainFrame(Page page) { + if (mEdgeToEdgeDebuggingInfo.isUsed()) return; + mEdgeToEdgeDebuggingInfo.addToDebugReport( + "EdgeToEdgeController->firstContentfulPaintInPrimaryMainFrame", + true, + EdgeToEdgeUtils.isEdgeToEdgeBottomChinEnabled(mActivity), + mActivity.getWindow(), + mWindowAndroid); + mEdgeToEdgeDebuggingInfo.uploadReport(); + } }; }
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 9656122..534bcd75 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
@@ -70,6 +70,7 @@ import org.chromium.chrome.browser.tab.Tab; import org.chromium.chrome.browser.tab.TabObserver; import org.chromium.chrome.browser.ui.edge_to_edge.EdgeToEdgeControllerImpl.SupportedConfigurationSwitch; +import org.chromium.chrome.browser.ui.edge_to_edge.EdgeToEdgeUtils.EdgeToEdgeDebuggingInfo; import org.chromium.chrome.browser.ui.native_page.NativePage; import org.chromium.components.browser_ui.edge_to_edge.EdgeToEdgeManager; import org.chromium.components.browser_ui.edge_to_edge.EdgeToEdgePadAdjuster; @@ -176,6 +177,7 @@ @Mock private BrowserControlsStateProvider mBrowserControlsStateProvider; @Mock private LayoutManager mLayoutManager; @Mock private FullscreenManager mFullscreenManager; + @Mock private EdgeToEdgeDebuggingInfo mEdgeToEdgeDebuggingInfo; @Implements(EdgeToEdgeControllerFactory.class) static class ShadowEdgeToEdgeControllerFactory extends EdgeToEdgeControllerFactory { @@ -236,7 +238,8 @@ mEdgeToEdgeManager, mBrowserControlsStateProvider, mLayoutManagerSupplier, - mFullscreenManager); + mFullscreenManager, + mEdgeToEdgeDebuggingInfo); verify(mEdgeToEdgeStateProvider, times(1)).acquireSetDecorFitsSystemWindowToken(); if (!EdgeToEdgeUtils.isEdgeToEdgeEverywhereEnabled()) { @@ -447,7 +450,8 @@ mEdgeToEdgeManager, mBrowserControlsStateProvider, mLayoutManagerSupplier, - mFullscreenManager); + mFullscreenManager, + null); assertNotNull(liveController); liveController.setIsOptedIntoEdgeToEdgeForTesting(true); liveController.setIsDrawingToEdgeForTesting(true); @@ -1123,6 +1127,20 @@ EdgeToEdgeUtils.hasTappableNavigationBar(window)); } + @Test + public void firstContentfulPaint_uploadDebuggingReport() { + // Standard setup of a Web Tab ToEdge + when(mTab.isNativePage()).thenReturn(false); + mTabProvider.set(mTab); + verifyInteractions(mTab); + + WebContentsObserver webContentsObserver = + mEdgeToEdgeControllerImpl.getWebContentsObserver(); + assertNotNull(webContentsObserver); + webContentsObserver.firstContentfulPaintInPrimaryMainFrame(null); + verify(mEdgeToEdgeDebuggingInfo).uploadReport(); + } + void assertToEdgeExpectations() { // Pad the top only, bottom is ToEdge. verify(mOsWrapper, atLeastOnce())
diff --git a/chrome/browser/ui/android/edge_to_edge/internal/junit/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeDebuggingInfoTest.java b/chrome/browser/ui/android/edge_to_edge/internal/junit/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeDebuggingInfoTest.java index ef7562a2..90e977f 100644 --- a/chrome/browser/ui/android/edge_to_edge/internal/junit/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeDebuggingInfoTest.java +++ b/chrome/browser/ui/android/edge_to_edge/internal/junit/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeDebuggingInfoTest.java
@@ -57,7 +57,7 @@ @Mock private Window mWindow; @Mock private View mDecorView; - private final EdgeToEdgeDebuggingInfo mEdgeToEdgeDebuggingInfo = new EdgeToEdgeDebuggingInfo(); + private EdgeToEdgeDebuggingInfo mEdgeToEdgeDebuggingInfo; private final PayloadCallbackHelper<String> mCrashUploadCallback = new PayloadCallbackHelper<>(); @@ -65,18 +65,19 @@ public void setUp() { EdgeToEdgeUtils.setObservedTappableNavigationBarForTesting(false); doReturn(mDecorView).when(mWindow).getDecorView(); + mEdgeToEdgeDebuggingInfo = new EdgeToEdgeDebuggingInfo(mCrashUploadCallback::notifyCalled); } @Test public void withValidGestureNavBarInsets() { setupMockWindowInsets(NAV_BAR_ONLY_INSETS); - mEdgeToEdgeDebuggingInfo.buildDebugReport( - mWindow, - /* windowAndroid= */ null, + mEdgeToEdgeDebuggingInfo.addToDebugReport( + "callSite", /* hasEdgeToEdgeController= */ true, /* isSupportedConfiguration= */ true, - "callSite", - mCrashUploadCallback::notifyCalled); + mWindow, + /* windowAndroid= */ null); + mEdgeToEdgeDebuggingInfo.uploadReport(); assertEquals( "Configuration is not case of interests.", 0, mCrashUploadCallback.getCallCount()); @@ -86,13 +87,13 @@ public void withValidTappableNavBarInsets() { // Case where controller is not created, window has consistent tappable nav bar insets. setupMockWindowInsets(NAV_BAR_TAPPABLE_INSETS); - mEdgeToEdgeDebuggingInfo.buildDebugReport( - mWindow, - /* windowAndroid= */ null, + mEdgeToEdgeDebuggingInfo.addToDebugReport( + "callSite", /* hasEdgeToEdgeController= */ false, /* isSupportedConfiguration= */ false, - "callSite", - mCrashUploadCallback::notifyCalled); + mWindow, + /* windowAndroid= */ null); + mEdgeToEdgeDebuggingInfo.uploadReport(); assertEquals( "Configuration is not case of interests.", 0, mCrashUploadCallback.getCallCount()); @@ -101,13 +102,13 @@ @Test public void invalidTappableNavBarInsets() { setupMockWindowInsets(NAV_BAR_TAPPABLE_INSETS); - mEdgeToEdgeDebuggingInfo.buildDebugReport( - mWindow, - /* windowAndroid= */ null, + mEdgeToEdgeDebuggingInfo.addToDebugReport( + "callSite", /* hasEdgeToEdgeController= */ true, /* isSupportedConfiguration= */ false, - "callSite", - mCrashUploadCallback::notifyCalled); + mWindow, + /* windowAndroid= */ null); + mEdgeToEdgeDebuggingInfo.uploadReport(); assertEquals( "Configuration is a case of interests.", 1, mCrashUploadCallback.getCallCount()); @@ -118,13 +119,13 @@ public void emptyTappableNavBarInsets() { setupMockWindowInsets(EMPTY_NAV_BAR_INSETS); mEdgeToEdgeDebuggingInfo.setMissingNavBarInsetsReason(MissingNavbarInsetsReason.OTHER); - mEdgeToEdgeDebuggingInfo.buildDebugReport( - mWindow, - /* windowAndroid= */ null, + mEdgeToEdgeDebuggingInfo.addToDebugReport( + "callSite", /* hasEdgeToEdgeController= */ true, /* isSupportedConfiguration= */ true, - "callSite", - mCrashUploadCallback::notifyCalled); + mWindow, + /* windowAndroid= */ null); + mEdgeToEdgeDebuggingInfo.uploadReport(); assertEquals( "Report when nav bar insets are empty at controller creation.",
diff --git a/chrome/browser/ui/android/edge_to_edge/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeUtils.java b/chrome/browser/ui/android/edge_to_edge/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeUtils.java index 6016e88..91fa69c 100644 --- a/chrome/browser/ui/android/edge_to_edge/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeUtils.java +++ b/chrome/browser/ui/android/edge_to_edge/java/src/org/chromium/chrome/browser/ui/edge_to_edge/EdgeToEdgeUtils.java
@@ -490,50 +490,59 @@ public static class EdgeToEdgeDebuggingInfo { boolean mHasUploaded; @Nullable @MissingNavbarInsetsReason Integer mMissingNavBarReason; + @Nullable String mUploadMessage; + final Callback<String> mReportUploadCallback; /** - * Gather the current debug information + * Create an EdgeToEdgeDebuggingInfo for logging info useful to debugging edge-to-edge + * issues. * - * @param window The current window. - * @param windowAndroid The window android of the activity. - * @param hasEdgeToEdgeController Whether the activity has an EdgeToEdgeController. - * @param isSupportedConfiguration Whether the activity supports for edge-to-edge. - * @param callSite The call site of the debugging info. * @param reportUploadCallback The callback to update debugging report. */ - public void buildDebugReport( - @Nullable Window window, - @Nullable WindowAndroid windowAndroid, + public EdgeToEdgeDebuggingInfo(Callback<String> reportUploadCallback) { + mReportUploadCallback = reportUploadCallback; + } + + /** + * Add to the current debug information + * + * @param callSite The call site of the debugging info. + * @param hasEdgeToEdgeController Whether the activity has an EdgeToEdgeController. + * @param isSupportedConfiguration Whether the activity supports for edge-to-edge. + * @param window The current window. + * @param windowAndroid The window android of the activity. + */ + public void addToDebugReport( + String callSite, boolean hasEdgeToEdgeController, boolean isSupportedConfiguration, - String callSite, - Callback<String> reportUploadCallback) { + @Nullable Window window, + @Nullable WindowAndroid windowAndroid) { if (mHasUploaded || !ChromeFeatureList.sEdgeToEdgeDebugging.isEnabled()) return; - if (!isCaseOfInterests(hasEdgeToEdgeController, window)) return; - String missingNavbarReasonString = - mMissingNavBarReason != null ? String.valueOf(mMissingNavBarReason) : "null"; - String state = - "EdgeToEdgeDebugging: callSite: " - + callSite - + " \nEdgeToEdgeController hasValue: " - + hasEdgeToEdgeController - + " \nisSupportedConfiguration: " - + isSupportedConfiguration - + " \nedgeToEdgeEverywhere: " - + EdgeToEdgeUtils.isEdgeToEdgeEverywhereEnabled() - + " \nobservedTappableNavigationBar: " - + sObservedTappableNavigationBar - + " \nmissingNavBarReason: " - + missingNavbarReasonString; + if (mUploadMessage == null) { + mUploadMessage = + "EdgeToEdgeDebugging:" + + " \nedgeToEdgeEverywhere: " + + EdgeToEdgeUtils.isEdgeToEdgeEverywhereEnabled() + + " \nmissingNavBarReason: " + + mMissingNavBarReason; + } + String hasSeenNonZeroNavBar = ""; String rawWindowInsetsIndicateGestureNav = ""; String rawWindowInsetsState = ""; String rawWindowInsetsIgnoringVisibilityState = ""; String rawWindowInsetsTappableState = ""; - String rawWindowInsetsStateSystemGestures = ""; + String rawWindowInsetsSystemGesturesState = ""; if (windowAndroid != null && windowAndroid.getInsetObserver() != null) { + hasSeenNonZeroNavBar = + " \nhasSeenNonZeroNavBar: " + + windowAndroid + .getInsetObserver() + .hasSeenNonZeroNavigationBarInsets(); + var lastRawWindowInsets = windowAndroid.getInsetObserver().getLastRawWindowInsets(); var gestureNavString = lastRawWindowInsets == null @@ -580,14 +589,13 @@ .getInsetsIgnoringVisibility( WindowInsetsCompat.Type.systemGestures()) .toString(); - rawWindowInsetsStateSystemGestures = + rawWindowInsetsSystemGesturesState = " \nlastRawWindowInsets systemGestures: " + systemGesturesInsetsString; } String windowMetricsIndicateGestureNav = ""; String windowMetricsInsetsState = ""; String windowMetricsInsetsStateTappable = ""; - String windowMetricsInsetsStateMandatoryGestures = ""; String windowMetricsInsetsStateSystemGestures = ""; if (Build.VERSION.SDK_INT >= VERSION_CODES.R) { if (window != null @@ -623,18 +631,6 @@ windowMetricsInsetsStateTappable = " \nwindowMetricsInsetsTappable: " + insetsStringTappable; - var insetsStringMandatoryGestures = - windowInsets == null - ? "null" - : windowInsets - .getInsets( - WindowInsetsCompat.Type - .mandatorySystemGestures()) - .toString(); - windowMetricsInsetsStateMandatoryGestures = - " \nwindowMetricsInsetsMandatoryGestures: " - + insetsStringMandatoryGestures; - var insetsStringSystemGestures = windowInsets == null ? "null" @@ -645,21 +641,33 @@ " \nwindowMetricsInsetsSystemGestures: " + insetsStringSystemGestures; } } - - // Ensure report is only sent once. - mHasUploaded = true; - reportUploadCallback.onResult( - state + mUploadMessage += + "\n\ncallSite: " + + callSite + + hasSeenNonZeroNavBar + + "\nisSupportedConfiguration: " + + isSupportedConfiguration + + " \nobservedTappableNavigationBar: " + + sObservedTappableNavigationBar + rawWindowInsetsIndicateGestureNav + rawWindowInsetsState + rawWindowInsetsIgnoringVisibilityState + rawWindowInsetsTappableState - + rawWindowInsetsStateSystemGestures + + rawWindowInsetsSystemGesturesState + windowMetricsIndicateGestureNav + windowMetricsInsetsState + windowMetricsInsetsStateTappable - + windowMetricsInsetsStateMandatoryGestures - + windowMetricsInsetsStateSystemGestures); + + windowMetricsInsetsStateSystemGestures; + } + + /** Uploads the current report. */ + public void uploadReport() { + if (mHasUploaded || !ChromeFeatureList.sEdgeToEdgeDebugging.isEnabled()) return; + if (mUploadMessage == null) return; + + // Ensure report is only sent once. + mHasUploaded = true; + mReportUploadCallback.onResult(mUploadMessage); } /** Returns whether the the instance has uploaded any report. */
diff --git a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java index e54aec7f..184a026 100644 --- a/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java +++ b/chrome/browser/ui/android/omnibox/java/src/org/chromium/chrome/browser/omnibox/suggestions/AutocompleteMediator.java
@@ -4,6 +4,7 @@ package org.chromium.chrome.browser.omnibox.suggestions; + import android.content.Context; import android.content.Intent; import android.content.res.Resources; @@ -639,8 +640,9 @@ // When invoked directly from a browser, we want to trigger switch to tab animation. // If invoked from other activities, ex. searchActivity, we do not need to trigger the // animation since Android will show the animation for switching apps. - if (tab.getWindowAndroid().getActivityState() == ActivityState.STOPPED - || tab.getWindowAndroid().getActivityState() == ActivityState.DESTROYED) { + WindowAndroid windowAndroid = tab.getWindowAndroidChecked(); + if (windowAndroid.getActivityState() == ActivityState.STOPPED + || windowAndroid.getActivityState() == ActivityState.DESTROYED) { mBringTabToFrontCallback.onResult(tab); return true; }
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 02f8c17..9f0d1cc 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
@@ -954,7 +954,7 @@ // We have a tab, and tab manager. The tab is part of the stopped activity. doReturn(mTab).when(mAutocompleteController).getMatchingTabForSuggestion(any()); mTabWindowManagerSupplier.set(mTabManager); - doReturn(mMockWindowAndroid).when(mTab).getWindowAndroid(); + doReturn(mMockWindowAndroid).when(mTab).getWindowAndroidChecked(); doReturn(ActivityState.STOPPED).when(mMockWindowAndroid).getActivityState(); assertTrue(mMediator.maybeSwitchToTab(null)); } @@ -969,7 +969,7 @@ // https://crbug.com/1300447 doReturn(mTab).when(mAutocompleteController).getMatchingTabForSuggestion(any()); mTabWindowManagerSupplier.set(mTabManager); - doReturn(mMockWindowAndroid).when(mTab).getWindowAndroid(); + doReturn(mMockWindowAndroid).when(mTab).getWindowAndroidChecked(); doReturn(ActivityState.RESUMED).when(mMockWindowAndroid).getActivityState(); doReturn(null).when(mTabManager).getTabModelForTab(any()); assertFalse(mMediator.maybeSwitchToTab(null)); @@ -985,7 +985,7 @@ // https://crbug.com/1300447 doReturn(mTab).when(mAutocompleteController).getMatchingTabForSuggestion(any()); mTabWindowManagerSupplier.set(mTabManager); - doReturn(mMockWindowAndroid).when(mTab).getWindowAndroid(); + doReturn(mMockWindowAndroid).when(mTab).getWindowAndroidChecked(); doReturn(ActivityState.RESUMED).when(mMockWindowAndroid).getActivityState(); doReturn(mTabModel).when(mTabManager).getTabModelForTab(any()); @@ -1004,7 +1004,7 @@ // The tab reports association with an existing model; the model confirms this. doReturn(mTab).when(mAutocompleteController).getMatchingTabForSuggestion(any()); mTabWindowManagerSupplier.set(mTabManager); - doReturn(mMockWindowAndroid).when(mTab).getWindowAndroid(); + doReturn(mMockWindowAndroid).when(mTab).getWindowAndroidChecked(); doReturn(ActivityState.RESUMED).when(mMockWindowAndroid).getActivityState(); doReturn(mTabModel).when(mTabManager).getTabModelForTab(any()); doReturn(1).when(mTabModel).getCount();
diff --git a/chrome/browser/ui/android/pdf/java/src/org/chromium/chrome/browser/pdf/PdfUtils.java b/chrome/browser/ui/android/pdf/java/src/org/chromium/chrome/browser/pdf/PdfUtils.java index 0506a50..3208fda 100644 --- a/chrome/browser/ui/android/pdf/java/src/org/chromium/chrome/browser/pdf/PdfUtils.java +++ b/chrome/browser/ui/android/pdf/java/src/org/chromium/chrome/browser/pdf/PdfUtils.java
@@ -176,7 +176,7 @@ * @param nativePage The NativePage being used to retrieve pdf information. * @return Pdf information including filename, filepath etc. */ - public static @Nullable PdfInfo getPdfInfo(NativePage nativePage) { + public static @Nullable PdfInfo getPdfInfo(@Nullable NativePage nativePage) { if (nativePage == null || !nativePage.isPdf()) { return null; } @@ -223,7 +223,7 @@ } /** Return the type of the pdf page. */ - public static @PdfPageType int getPdfPageType(NativePage pdfPage) { + public static @PdfPageType int getPdfPageType(@Nullable NativePage pdfPage) { if (pdfPage == null || !pdfPage.isPdf()) { return PdfPageType.NONE; } @@ -281,7 +281,7 @@ * @param nativePage When the native page is a pdf page, record whether it is frozen before the * tab is displayed. */ - public static void recordIsPdfFrozen(NativePage nativePage) { + public static void recordIsPdfFrozen(@Nullable NativePage nativePage) { if (nativePage == null) { return; }
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings.grd b/chrome/browser/ui/android/strings/android_chrome_strings.grd index 669be14f..6807fa4 100644 --- a/chrome/browser/ui/android/strings/android_chrome_strings.grd +++ b/chrome/browser/ui/android/strings/android_chrome_strings.grd
@@ -1131,6 +1131,12 @@ <message name="IDS_CONTEXTUAL_SEARCH_SEE_BETTER_RESULTS_SUMMARY" desc="Summary for the see better results switch in Contextual Search preference."> By including more of a page’s text, you might see better results </message> + <message name="IDS_CONTEXTUAL_SEARCH_CALLOUT_TEXT" desc="The text for a button, which when pressed opens the latest search results for the currently selected text."> + Latest results + </message> + <message name="IDS_CONTEXTUAL_SEARCH_CALLOUT_TEXT_VARIANT" desc="The text for a button, which when pressed allows the user to see more information about the currently selected text."> + See more + </message> <message name="IDS_DO_NOT_TRACK_TITLE" desc="Title for the 'Do Not Track' preference. Please leave the 'Do Not Track' part in English according to the glossary."> Send a “Do Not Track” request </message>
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CONTEXTUAL_SEARCH_CALLOUT_TEXT.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CONTEXTUAL_SEARCH_CALLOUT_TEXT.png.sha1 new file mode 100644 index 0000000..6374ab2 --- /dev/null +++ b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CONTEXTUAL_SEARCH_CALLOUT_TEXT.png.sha1
@@ -0,0 +1 @@ +6bde8bd2623645db4c7bb139360d8a3123f6f915 \ No newline at end of file
diff --git a/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CONTEXTUAL_SEARCH_CALLOUT_TEXT_VARIANT.png.sha1 b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CONTEXTUAL_SEARCH_CALLOUT_TEXT_VARIANT.png.sha1 new file mode 100644 index 0000000..effaa132 --- /dev/null +++ b/chrome/browser/ui/android/strings/android_chrome_strings_grd/IDS_CONTEXTUAL_SEARCH_CALLOUT_TEXT_VARIANT.png.sha1
@@ -0,0 +1 @@ +e71e73808b7735cd7472397de298b8a578d21ffe \ No newline at end of file
diff --git a/chrome/browser/ui/android/tab_model/tab_collection_tab_model_impl.cc b/chrome/browser/ui/android/tab_model/tab_collection_tab_model_impl.cc index faba73c..fd4d6fa 100644 --- a/chrome/browser/ui/android/tab_model/tab_collection_tab_model_impl.cc +++ b/chrome/browser/ui/android/tab_model/tab_collection_tab_model_impl.cc
@@ -17,6 +17,9 @@ // This JNI header is generated from TabCollectionTabModelImpl.java. #include "chrome/android/chrome_jni_headers/TabCollectionTabModelImpl_jni.h" +using base::android::JavaParamRef; +using base::android::ScopedJavaLocalRef; + namespace tabs { namespace { @@ -29,7 +32,7 @@ Profile* profile) : java_object_(env, java_object), profile_(profile), - tab_strip_collection_(std::make_unique<tabs::TabStripCollection>()) {} + tab_strip_collection_(std::make_unique<TabStripCollection>()) {} TabCollectionTabModelImpl::~TabCollectionTabModelImpl() = default; @@ -43,14 +46,14 @@ int TabCollectionTabModelImpl::GetIndexOfTabRecursive( JNIEnv* env, - const base::android::JavaParamRef<jobject>& j_tab_android) const { + const JavaParamRef<jobject>& j_tab_android) const { TabAndroid* target_tab = TabAndroid::GetNativeTab(env, j_tab_android); if (!target_tab) { return kInvalidTabIndex; } int current_index = 0; - for (tabs::TabInterface* tab_in_collection : *tab_strip_collection_) { + for (TabInterface* tab_in_collection : *tab_strip_collection_) { if (tab_in_collection == target_tab) { return current_index; } @@ -59,13 +62,24 @@ return kInvalidTabIndex; } +ScopedJavaLocalRef<jobject> TabCollectionTabModelImpl::GetTabAtIndexRecursive( + JNIEnv* env, + size_t index) const { + if (index >= tab_strip_collection_->TabCountRecursive()) { + return ScopedJavaLocalRef<jobject>(); + } + TabInterface* tab = tab_strip_collection_->GetTabAtIndexRecursive(index); + TabAndroid* tab_android = static_cast<TabAndroid*>(tab); + return tab_android->GetJavaObject(); +} + static jlong JNI_TabCollectionTabModelImpl_Init( JNIEnv* env, - const base::android::JavaParamRef<jobject>& j_java_object, - const base::android::JavaParamRef<jobject>& j_profile) { + const JavaParamRef<jobject>& j_java_object, + const JavaParamRef<jobject>& j_profile) { Profile* profile = Profile::FromJavaObject(j_profile); - tabs::TabCollectionTabModelImpl* tab_collection_tab_model_impl = - new tabs::TabCollectionTabModelImpl(env, j_java_object, profile); + TabCollectionTabModelImpl* tab_collection_tab_model_impl = + new TabCollectionTabModelImpl(env, j_java_object, profile); return reinterpret_cast<intptr_t>(tab_collection_tab_model_impl); }
diff --git a/chrome/browser/ui/android/tab_model/tab_collection_tab_model_impl.h b/chrome/browser/ui/android/tab_model/tab_collection_tab_model_impl.h index 51ce4ca..14efc8f4 100644 --- a/chrome/browser/ui/android/tab_model/tab_collection_tab_model_impl.h +++ b/chrome/browser/ui/android/tab_model/tab_collection_tab_model_impl.h
@@ -41,6 +41,11 @@ JNIEnv* env, const jni_zero::JavaParamRef<jobject>& j_tab_android) const; + // Recurses until reaching the given index. Returns null if not found. + base::android::ScopedJavaLocalRef<jobject> GetTabAtIndexRecursive( + JNIEnv* env, + size_t index) const; + private: JavaObjectWeakGlobalRef java_object_; raw_ptr<Profile> profile_;
diff --git a/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/ThemeUtils.java b/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/ThemeUtils.java index b2b2dce..b03b729 100644 --- a/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/ThemeUtils.java +++ b/chrome/browser/ui/android/theme/java/src/org/chromium/chrome/browser/theme/ThemeUtils.java
@@ -4,6 +4,8 @@ package org.chromium.chrome.browser.theme; +import static org.chromium.build.NullUtil.assumeNonNull; + import android.content.Context; import android.content.res.ColorStateList; import android.graphics.Color; @@ -45,7 +47,7 @@ * @return The background color of {@link Tab}. */ public static @ColorInt int getBackgroundColor(Tab tab) { - if (tab.isNativePage()) return tab.getNativePage().getBackgroundColor(); + if (tab.isNativePage()) return assumeNonNull(tab.getNativePage()).getBackgroundColor(); WebContents tabWebContents = tab.getWebContents(); RenderWidgetHostView rwhv =
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/TranslateToolbarButtonController.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/TranslateToolbarButtonController.java index e872382..1894f7f 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/TranslateToolbarButtonController.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/adaptive/TranslateToolbarButtonController.java
@@ -4,6 +4,8 @@ package org.chromium.chrome.browser.toolbar.adaptive; +import static org.chromium.build.NullUtil.assumeNonNull; + import android.content.res.Resources; import android.graphics.drawable.Drawable; import android.view.View; @@ -80,7 +82,7 @@ protected boolean shouldShowButton(@Nullable Tab tab) { if (tab == null) return false; if (!super.shouldShowButton(tab)) return false; - if (tab.isNativePage() && tab.getNativePage().isPdf()) return false; + if (tab.isNativePage() && assumeNonNull(tab.getNativePage()).isPdf()) return false; return UrlUtilities.isHttpOrHttps(tab.getUrl()); } }
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 c05a7ffc..dd4d246 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
@@ -169,7 +169,8 @@ mEdgeToEdgeManager, mBrowserControlsStateProvider, new ObservableSupplierImpl<>(mLayoutManager), - mFullscreenManager); + mFullscreenManager, + null); BottomControlsMediator plainMediator = new BottomControlsMediator( mWindowAndroid, @@ -201,7 +202,8 @@ mEdgeToEdgeManager, mBrowserControlsStateProvider, new ObservableSupplierImpl<>(mLayoutManager), - mFullscreenManager); + mFullscreenManager, + null); new BottomControlsMediator( mWindowAndroid, mModel,
diff --git a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/load_progress/LoadProgressMediator.java b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/load_progress/LoadProgressMediator.java index d4b3630c5..846f5684 100644 --- a/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/load_progress/LoadProgressMediator.java +++ b/chrome/browser/ui/android/toolbar/java/src/org/chromium/chrome/browser/toolbar/load_progress/LoadProgressMediator.java
@@ -4,6 +4,8 @@ package org.chromium.chrome.browser.toolbar.load_progress; +import static org.chromium.build.NullUtil.assumeNonNull; + import org.chromium.base.MathUtils; import org.chromium.base.supplier.ObservableSupplier; import org.chromium.build.annotations.NullMarked; @@ -83,7 +85,8 @@ tab.getUrl(), tab.isIncognito(), tab.isNativePage() - && tab.getNativePage().isPdf())) { + && assumeNonNull(tab.getNativePage()) + .isPdf())) { return; } @@ -135,7 +138,7 @@ if (NativePage.isNativePageUrl( tab.getUrl(), tab.isIncognito(), - tab.isNativePage() && tab.getNativePage().isPdf())) { + tab.isNativePage() && assumeNonNull(tab.getNativePage()).isPdf())) { finishLoadProgress(false); } else { startLoadProgress();
diff --git a/chrome/browser/ui/ash/sharesheet/sharesheet_bubble_view_delegate.cc b/chrome/browser/ui/ash/sharesheet/sharesheet_bubble_view_delegate.cc index 7e143aba..0446063 100644 --- a/chrome/browser/ui/ash/sharesheet/sharesheet_bubble_view_delegate.cc +++ b/chrome/browser/ui/ash/sharesheet/sharesheet_bubble_view_delegate.cc
@@ -40,19 +40,24 @@ } return; } - DCHECK(sharesheet_bubble_view_owned_); + CHECK(sharesheet_bubble_view_owned_); // The BubbleView gives its own ownership to the widget in ShowBubble(), so we - // relinquish our ownership here. + // relinquish our ownership here. Unratinaed is safe because this object will + // be deleted after the widget is deleted. sharesheet_bubble_view_owned_.release()->ShowBubble( std::move(targets), std::move(intent), std::move(delivered_callback), - std::move(close_callback)); + base::BindOnce(&SharesheetBubbleViewDelegate::OnClose, + base::Unretained(this), std::move(close_callback))); } void SharesheetBubbleViewDelegate::ShowNearbyShareBubbleForArc( apps::IntentPtr intent, ::sharesheet::DeliveredCallback delivered_callback, ::sharesheet::CloseCallback close_callback) { - if (IsBubbleVisible()) { + if (!sharesheet_bubble_view_owned_) { + if (!IsBubbleVisible()) { + sharesheet_bubble_view_->GetWidget()->Show(); + } if (delivered_callback) { std::move(delivered_callback) .Run(::sharesheet::SharesheetResult::kErrorAlreadyOpen); @@ -62,12 +67,13 @@ } return; } - DCHECK(sharesheet_bubble_view_owned_); + CHECK(sharesheet_bubble_view_owned_); // The BubbleView gives its own ownership to the widget in // ShowNearbyShareBubbleForArc(), so we relinquish our ownership here. sharesheet_bubble_view_owned_.release()->ShowNearbyShareBubbleForArc( std::move(intent), std::move(delivered_callback), - std::move(close_callback)); + base::BindOnce(&SharesheetBubbleViewDelegate::OnClose, + base::Unretained(this), std::move(close_callback))); } void SharesheetBubbleViewDelegate::OnActionLaunched(bool has_action_view) { @@ -100,11 +106,20 @@ } bool SharesheetBubbleViewDelegate::IsBubbleVisible() const { - DCHECK(sharesheet_bubble_view_); + CHECK(sharesheet_bubble_view_); return sharesheet_bubble_view_->GetWidget() && sharesheet_bubble_view_->GetWidget()->IsVisible(); } +void SharesheetBubbleViewDelegate::OnClose( + ::sharesheet::CloseCallback close_callback, + views::Widget::ClosedReason reason) { + if (close_callback) { + std::move(close_callback).Run(reason); + } + sharesheet_bubble_view_ = nullptr; +} + SharesheetBubbleView* SharesheetBubbleViewDelegate::GetBubbleViewForTesting() { return sharesheet_bubble_view_; }
diff --git a/chrome/browser/ui/ash/sharesheet/sharesheet_bubble_view_delegate.h b/chrome/browser/ui/ash/sharesheet/sharesheet_bubble_view_delegate.h index 4d1c881..885276f 100644 --- a/chrome/browser/ui/ash/sharesheet/sharesheet_bubble_view_delegate.h +++ b/chrome/browser/ui/ash/sharesheet/sharesheet_bubble_view_delegate.h
@@ -53,6 +53,9 @@ friend class SharesheetBubbleViewTest; friend class SharesheetBubbleViewNearbyShareBrowserTest; + void OnClose(::sharesheet::CloseCallback close_callback, + views::Widget::ClosedReason reason); + SharesheetBubbleView* GetBubbleViewForTesting(); std::unique_ptr<SharesheetBubbleView> sharesheet_bubble_view_owned_;
diff --git a/chrome/browser/ui/ash/sharesheet/sharesheet_bubble_view_unittest.cc b/chrome/browser/ui/ash/sharesheet/sharesheet_bubble_view_unittest.cc index 3cc193c..25898312 100644 --- a/chrome/browser/ui/ash/sharesheet/sharesheet_bubble_view_unittest.cc +++ b/chrome/browser/ui/ash/sharesheet/sharesheet_bubble_view_unittest.cc
@@ -8,6 +8,7 @@ #include <memory> #include "ash/frame/non_client_frame_view_ash.h" +#include "ash/wm/window_util.h" #include "base/memory/raw_ptr.h" #include "base/strings/utf_string_conversions.h" #include "base/test/metrics/histogram_tester.h" @@ -40,6 +41,8 @@ #include "ui/views/view.h" #include "ui/views/widget/widget.h" #include "ui/views/widget/widget_delegate.h" +#include "ui/views/widget/widget_observer.h" +#include "ui/wm/core/transient_window_manager.h" namespace { @@ -69,7 +72,8 @@ } }; -class SharesheetBubbleViewTest : public ChromeAshTestBase { +class SharesheetBubbleViewTest : public ChromeAshTestBase, + public views::WidgetObserver { public: SharesheetBubbleViewTest() = default; @@ -101,15 +105,19 @@ if (bubble_delegate_) { bubble_delegate_->CloseBubble(::sharesheet::SharesheetResult::kCancel); } - ASSERT_FALSE(sharesheet_widget_); + ASSERT_FALSE(sharesheet_bubble_view_); ChromeAshTestBase::TearDown(); } + ::sharesheet::SharesheetService* GetSharesheetService() { + return ::sharesheet::SharesheetServiceFactory::GetForProfile( + profile_.get()); + } + void ShowAndVerifyBubble(apps::IntentPtr intent, ::sharesheet::LaunchSource source, int num_actions_to_add = 0) { - ::sharesheet::SharesheetService* const sharesheet_service = - ::sharesheet::SharesheetServiceFactory::GetForProfile(profile_.get()); + auto* sharesheet_service = GetSharesheetService(); sharesheet_service->ShowBubbleForTesting( parent_window_, std::move(intent), source, /*delivered_callback=*/base::DoNothing(), @@ -124,6 +132,8 @@ EXPECT_NE(sharesheet_bubble_view_, nullptr); EXPECT_EQ(sharesheet_bubble_view_->GetID(), SHARESHEET_BUBBLE_VIEW_ID); + sharesheet_bubble_view_->GetWidget()->AddObserver(this); + ASSERT_TRUE(bubble_delegate_->IsBubbleVisible()); sharesheet_widget_ = sharesheet_bubble_view_->GetWidget(); ASSERT_EQ(sharesheet_widget_->GetName(), "SharesheetBubbleView"); @@ -132,26 +142,29 @@ void CloseBubble() { bubble_delegate_->CloseBubble(::sharesheet::SharesheetResult::kCancel); - ASSERT_FALSE(sharesheet_widget_); + ASSERT_FALSE(sharesheet_bubble_view_); } void CloseBubbleWithEscKey() { GetEventGenerator()->PressAndReleaseKey(ui::VKEY_ESCAPE); - ASSERT_FALSE(sharesheet_widget_); + ASSERT_FALSE(sharesheet_bubble_view_); } - bool IsSharesheetVisible() { - return sharesheet_widget_ && sharesheet_widget_->IsVisible(); - } + bool IsSharesheetVisible() { return sharesheet_widget_->IsVisible(); } views::Widget* sharesheet_widget() { return sharesheet_widget_; } void OnClose(views::Widget::ClosedReason reason) { sharesheet_bubble_view_ = nullptr; - sharesheet_widget_ = nullptr; bubble_delegate_ = nullptr; } + // views::WidgetObserver:: + void OnWidgetDestroyed(views::Widget* widget) override { + widget->RemoveObserver(this); + sharesheet_widget_ = nullptr; + } + SharesheetBubbleView* sharesheet_bubble_view() { return sharesheet_bubble_view_; } @@ -278,13 +291,15 @@ ui::ScopedAnimationDurationScaleMode::SLOW_DURATION); GetEventGenerator()->PressAndReleaseKey(ui::VKEY_TAB); ASSERT_TRUE(targets_view->children()[0]->HasFocus()); + + // Wait for the widget to get destroyed. + views::test::WidgetDestroyedWaiter widget_observer(sharesheet_widget()); + GetEventGenerator()->PressAndReleaseKey(ui::VKEY_RETURN); // Click on copy target. Click(targets_view->children()[0]); - // Wait for the widget to get destroyed. - views::test::WidgetDestroyedWaiter widget_observer(sharesheet_widget()); // Ensure the widget does close. widget_observer.Wait(); @@ -523,5 +538,37 @@ ASSERT_FALSE(IsSharesheetVisible()); } +TEST_F(SharesheetBubbleViewTest, ReshowHiddenBubble) { + auto* sharesheet_service = GetSharesheetService(); + auto app_window = CreateAppWindow(); + + auto* transient_window_manager = + ::wm::TransientWindowManager::GetIfExists(app_window.get()); + EXPECT_EQ(0u, transient_window_manager->transient_children().size()); + + sharesheet_service->AddShareActionForTest( + ::sharesheet::ShareActionType::kNearbyShare); + sharesheet_service->ShowNearbyShareBubbleForArc( + app_window.get(), ::sharesheet::CreateValidTextIntent(), + ::sharesheet::LaunchSource::kUnknown, base::DoNothing(), + base::DoNothing(), base::DoNothing()); + ASSERT_EQ(1u, transient_window_manager->transient_children().size()); + + auto* bubble_window = transient_window_manager->transient_children()[0].get(); + + window_util::MinimizeAndHideWithoutAnimation({app_window.get()}); + + EXPECT_FALSE(app_window->IsVisible()); + EXPECT_FALSE(bubble_window->IsVisible()); + + // Reshowing the bubble shouldn't crash. + sharesheet_service->ShowNearbyShareBubbleForArc( + app_window.get(), ::sharesheet::CreateValidTextIntent(), + ::sharesheet::LaunchSource::kUnknown, base::DoNothing(), + base::DoNothing(), base::DoNothing()); + + EXPECT_TRUE(bubble_window->IsVisible()); +} + } // namespace sharesheet } // namespace ash
diff --git a/chrome/browser/ui/browser.cc b/chrome/browser/ui/browser.cc index 79623d8..277cbd8 100644 --- a/chrome/browser/ui/browser.cc +++ b/chrome/browser/ui/browser.cc
@@ -509,6 +509,16 @@ //////////////////////////////////////////////////////////////////////////////// // Browser, CreateParams: +BrowserWindowInterface* BrowserWindowInterface::FromSessionID( + const SessionID& session_id) { + for (Browser* browser : *BrowserList::GetInstance()) { + if (browser->GetSessionID() == session_id) { + return browser; + } + } + return nullptr; +} + Browser::CreateParams::CreateParams(Profile* profile, bool user_gesture) : CreateParams(TYPE_NORMAL, profile, user_gesture) {}
diff --git a/chrome/browser/ui/browser_window/browser_window_features.cc b/chrome/browser/ui/browser_window/browser_window_features.cc index 78493406e..3f42b88e 100644 --- a/chrome/browser/ui/browser_window/browser_window_features.cc +++ b/chrome/browser/ui/browser_window/browser_window_features.cc
@@ -389,6 +389,7 @@ memory_saver_opt_in_iph_controller_.reset(); lens_overlay_entry_point_controller_.reset(); tab_search_toolbar_button_controller_.reset(); + toast_service_.reset(); extension_window_controller_.reset(); #if BUILDFLAG(ENABLE_GLIC)
diff --git a/chrome/browser/ui/browser_window/public/browser_window_interface.h b/chrome/browser/ui/browser_window/public/browser_window_interface.h index b9499d4..532b5723 100644 --- a/chrome/browser/ui/browser_window/public/browser_window_interface.h +++ b/chrome/browser/ui/browser_window/public/browser_window_interface.h
@@ -98,6 +98,9 @@ // The following methods will be removed in the future. #if !BUILDFLAG(IS_ANDROID) + // Returns nullptr if no browser window with the given session ID exists. + static BrowserWindowInterface* FromSessionID(const SessionID& session_id); + // The contents of the active tab is rendered in a views::WebView. When the // active tab switches, the contents of the views::WebView is modified, but // the instance itself remains the same.
diff --git a/chrome/browser/ui/omnibox/chrome_omnibox_client.cc b/chrome/browser/ui/omnibox/chrome_omnibox_client.cc index 911c52c..a3e2207 100644 --- a/chrome/browser/ui/omnibox/chrome_omnibox_client.cc +++ b/chrome/browser/ui/omnibox/chrome_omnibox_client.cc
@@ -834,6 +834,13 @@ return std::nullopt; } +void ChromeOmniboxClient::MaybePrewarmForDefaultSearchEngine() { + auto* prerender_manager = PrerenderManager::GetOrCreateForWebContents( + location_bar_->GetWebContents()); + CHECK(prerender_manager); + prerender_manager->MaybeStartPrewarmSearchResult(); +} + base::WeakPtr<OmniboxClient> ChromeOmniboxClient::AsWeakPtr() { return weak_factory_.GetWeakPtr(); }
diff --git a/chrome/browser/ui/omnibox/chrome_omnibox_client.h b/chrome/browser/ui/omnibox/chrome_omnibox_client.h index 1156032..5fc63d2 100644 --- a/chrome/browser/ui/omnibox/chrome_omnibox_client.h +++ b/chrome/browser/ui/omnibox/chrome_omnibox_client.h
@@ -124,6 +124,7 @@ bool IsHistoryEmbeddingsEnabled() const override; std::optional<lens::proto::LensOverlaySuggestInputs> GetLensOverlaySuggestInputs() const override; + void MaybePrewarmForDefaultSearchEngine() override; base::WeakPtr<OmniboxClient> AsWeakPtr() override; // Update shortcuts when a navigation succeeds.
diff --git a/chrome/browser/ui/omnibox/omnibox_search_aggregator_browsertest.cc b/chrome/browser/ui/omnibox/omnibox_search_aggregator_browsertest.cc index 74b9577..4c9059856 100644 --- a/chrome/browser/ui/omnibox/omnibox_search_aggregator_browsertest.cc +++ b/chrome/browser/ui/omnibox/omnibox_search_aggregator_browsertest.cc
@@ -256,8 +256,9 @@ } }; +// TODO(crbug.com/425120649) Flaky. IN_PROC_BROWSER_TEST_F(OmniboxSearchAggregatorSingleRequestTest, - GoodJsonResponse) { + DISABLED_GoodJsonResponse) { net::test_server::ControllableHttpResponse search_aggregator_response( embedded_test_server(), kSearchAggregatorPolicySuggestPath); ASSERT_TRUE(embedded_test_server()->Start()); @@ -333,8 +334,9 @@ }))); } +// TODO(crbug.com/425120649): Flaky. IN_PROC_BROWSER_TEST_F(OmniboxSearchAggregatorTest, - GoodJsonResponseMultipleRequests) { + DISABLED_GoodJsonResponseMultipleRequests) { std::vector<std::unique_ptr<net::test_server::ControllableHttpResponse>> requests = {}; for (size_t i = 0; i < 3; ++i) { @@ -406,8 +408,9 @@ }))); } +// TODO(crbug.com/425120649) Flaky. IN_PROC_BROWSER_TEST_F(OmniboxSearchAggregatorSingleRequestTest, - RedirectedResponse) { + DISABLED_RedirectedResponse) { net::test_server::ControllableHttpResponse redirect_response( embedded_test_server(), kSearchAggregatorPolicySuggestPath); const std::string redirected_path = "/suggest-redirect"; @@ -513,15 +516,10 @@ search_aggregator_query_response_; }; -// TODO(crbug.com/421836646): Re-enable this test once the flakiness is -// resolved. -#if BUILDFLAG(IS_WIN) -#define MAYBE_HTTPErrorResponse DISABLED_HTTPErrorResponse -#else -#define MAYBE_HTTPErrorResponse HTTPErrorResponse -#endif +// TODO(crbug.com/421836646): Flaky on `BUILDFLAG(IS_WIN)` +// TODO(crbug.com/425120649): Flaky. IN_PROC_BROWSER_TEST_P(OmniboxSearchAggregatorHTTPErrorTest, - MAYBE_HTTPErrorResponse) { + DISABLED_HTTPErrorResponse) { AutocompleteInput input( kSearchInput, metrics::OmniboxEventProto::NTP, ChromeAutocompleteSchemeClassifier(browser()->profile()));
diff --git a/chrome/browser/ui/passwords/password_change_ui_controller.cc b/chrome/browser/ui/passwords/password_change_ui_controller.cc index 48c3b2f..4ab50a2 100644 --- a/chrome/browser/ui/passwords/password_change_ui_controller.cc +++ b/chrome/browser/ui/passwords/password_change_ui_controller.cc
@@ -149,7 +149,7 @@ } // Close the toast before attempting to open any dialog. - CloseDialogWidget(views::Widget::ClosedReason::kUnspecified); + CloseToastWidget(views::Widget::ClosedReason::kUnspecified); ShowDialog( std::move(std::get<std::unique_ptr<ui::DialogModel>>(configuration))); }
diff --git a/chrome/browser/ui/tabs/BUILD.gn b/chrome/browser/ui/tabs/BUILD.gn index 2aab74c..9c905f0 100644 --- a/chrome/browser/ui/tabs/BUILD.gn +++ b/chrome/browser/ui/tabs/BUILD.gn
@@ -138,6 +138,7 @@ "existing_tab_group_sub_menu_model.h", "existing_window_sub_menu_model.h", "recent_tabs_sub_menu_model.h", + "split_tab_menu_model.h", "tab_model.h", ] @@ -172,6 +173,7 @@ "existing_comparison_table_sub_menu_model.cc", "existing_tab_group_sub_menu_model.cc", "existing_window_sub_menu_model.cc", + "split_tab_menu_model.cc", "tab_model.cc", ] @@ -267,7 +269,6 @@ "pinned_tab_codec.h", "pinned_tab_service.h", "pinned_tab_service_factory.h", - "split_tab_menu_model.h", "split_tab_util.h", "tab_renderer_data.h", "tab_style.h", @@ -317,7 +318,6 @@ "pinned_tab_service.cc", "pinned_tab_service_factory.cc", "recent_tabs_sub_menu_model.cc", - "split_tab_menu_model.cc", "split_tab_util.cc", "tab_dialog_manager.cc", "tab_features.cc",
diff --git a/chrome/browser/ui/tabs/existing_base_sub_menu_model.h b/chrome/browser/ui/tabs/existing_base_sub_menu_model.h index 3e05ec5..f55b15f 100644 --- a/chrome/browser/ui/tabs/existing_base_sub_menu_model.h +++ b/chrome/browser/ui/tabs/existing_base_sub_menu_model.h
@@ -44,6 +44,7 @@ static constexpr int kMinExistingWindowCommandId = 1001; static constexpr int kMinExistingTabGroupCommandId = 1301; static constexpr int kMinExistingComparisonTableCommandId = 1601; + static constexpr int kMinSplitTabMenuModelCommandId = 1701; ExistingBaseSubMenuModel(const ExistingBaseSubMenuModel&) = delete; ExistingBaseSubMenuModel& operator=(const ExistingBaseSubMenuModel&) = delete;
diff --git a/chrome/browser/ui/tabs/split_tab_menu_model.h b/chrome/browser/ui/tabs/split_tab_menu_model.h index 2b38e92..8a728d5 100644 --- a/chrome/browser/ui/tabs/split_tab_menu_model.h +++ b/chrome/browser/ui/tabs/split_tab_menu_model.h
@@ -9,6 +9,7 @@ #include <optional> #include <string> +#include "chrome/browser/ui/tabs/existing_base_sub_menu_model.h" #include "ui/base/interaction/element_identifier.h" #include "ui/menus/simple_menu_model.h" @@ -40,8 +41,9 @@ // Enum class denoting which close tab menu item the menu should show. enum class CloseTabMenuItem { kNone, kCloseStartEndTab, kCloseSpecifiedTab }; + // Start command IDs at 1701 to avoid conflicts with other submenus. enum class CommandId { - kReversePosition, + kReversePosition = ExistingBaseSubMenuModel::kMinSplitTabMenuModelCommandId, kCloseSpecifiedTab, kCloseStartTab, kCloseEndTab,
diff --git a/chrome/browser/ui/ui_features.h b/chrome/browser/ui/ui_features.h index 7caf314e..1c4636f 100644 --- a/chrome/browser/ui/ui_features.h +++ b/chrome/browser/ui/ui_features.h
@@ -88,7 +88,7 @@ kPreloadTopChromeWebUIMode( &kPreloadTopChromeWebUI, kPreloadTopChromeWebUIModeName, - PreloadTopChromeWebUIMode::kPreloadOnMakeContents, + PreloadTopChromeWebUIMode::kPreloadOnWarmup, &kPreloadTopChromeWebUIModeOptions); // If smart preload is enabled, the preload WebUI is determined by historical
diff --git a/chrome/browser/ui/views/external_protocol_dialog.cc b/chrome/browser/ui/views/external_protocol_dialog.cc index 5e7aafa..9093d693 100644 --- a/chrome/browser/ui/views/external_protocol_dialog.cc +++ b/chrome/browser/ui/views/external_protocol_dialog.cc
@@ -10,6 +10,8 @@ #include "base/types/optional_util.h" #include "build/build_config.h" #include "chrome/browser/external_protocol/external_protocol_handler.h" +#include "chrome/browser/picture_in_picture/picture_in_picture_occlusion_observer.h" +#include "chrome/browser/picture_in_picture/scoped_picture_in_picture_occlusion_observation.h" #include "chrome/browser/profiles/profile.h" #include "chrome/browser/shell_integration.h" #include "chrome/browser/tab_contents/tab_util.h" @@ -32,6 +34,7 @@ #include "ui/views/controls/message_box_view.h" #include "ui/views/layout/fill_layout.h" #include "ui/views/widget/widget.h" +#include "ui/views/window/dialog_client_view.h" using content::WebContents; @@ -49,6 +52,44 @@ } // namespace +class ExternalProtocolDialog::PictureInPictureWatcher + : public PictureInPictureOcclusionObserver { + public: + explicit PictureInPictureWatcher(ExternalProtocolDialog* dialog) + : dialog_(dialog) { + CHECK(dialog_); + occlusion_observation_.Observe(dialog_->GetWidget()); + } + + PictureInPictureWatcher(const PictureInPictureWatcher&) = delete; + PictureInPictureWatcher& operator=(const PictureInPictureWatcher&) = delete; + ~PictureInPictureWatcher() override = default; + + // Returns true whenever `dialog_` is occluded by Picture-in-Picture windows, + // false otherwise. + bool OccludedByPictureInPicture() { return occluded_by_picture_in_picture_; } + + // Simulates Picture-in-Picture occlussion changed for testing. + void SimulateOcclusionStateChangedForTesting(bool occluded) { + OnOcclusionStateChanged(occluded); + } + + private: + // PictureInPictureOcclusionObserver: + void OnOcclusionStateChanged(bool occluded) override { + // Protect from immediate input if the dialog has just become unoccluded. + if (occluded_by_picture_in_picture_ && !occluded) { + dialog_->TriggerInputProtection(); + } + + occluded_by_picture_in_picture_ = occluded; + } + + ScopedPictureInPictureOcclusionObservation occlusion_observation_{this}; + bool occluded_by_picture_in_picture_ = false; + const raw_ptr<ExternalProtocolDialog> dialog_; +}; + #if !BUILDFLAG(IS_CHROMEOS) // static void ExternalProtocolHandler::RunExternalProtocolDialog( @@ -137,6 +178,7 @@ } constrained_window::ShowWebModalDialogViews(this, web_contents); + picture_in_picture_watcher_ = std::make_unique<PictureInPictureWatcher>(this); } ExternalProtocolDialog::~ExternalProtocolDialog() = default; @@ -176,6 +218,32 @@ url_, web_contents_.get(), initiator_document_); } +void ExternalProtocolDialog::TriggerInputProtection() { + GetDialogClientView()->TriggerInputProtection(); +} + +bool ExternalProtocolDialog::ShouldIgnoreButtonPressedEventHandling( + View* button, + const ui::Event& event) const { + // Ignore button pressed events whenever we are occluded by a + // Picture-in-Picture window. + return picture_in_picture_watcher_ + ? picture_in_picture_watcher_->OccludedByPictureInPicture() + : false; +} + +bool ExternalProtocolDialog::ShouldAllowKeyEventsDuringInputProtection() const { + return false; +} + +void ExternalProtocolDialog::SimulateOcclusionStateChangedForTesting( + bool occluded) { + CHECK(picture_in_picture_watcher_); + picture_in_picture_watcher_ + ->SimulateOcclusionStateChangedForTesting( // IN-TEST + occluded); +} + void ExternalProtocolDialog::SetRememberSelectionCheckboxCheckedForTesting( bool checked) { message_box_view_->SetCheckBoxSelected(checked);
diff --git a/chrome/browser/ui/views/external_protocol_dialog.h b/chrome/browser/ui/views/external_protocol_dialog.h index e77fc97..97f376a 100644 --- a/chrome/browser/ui/views/external_protocol_dialog.h +++ b/chrome/browser/ui/views/external_protocol_dialog.h
@@ -5,6 +5,8 @@ #ifndef CHROME_BROWSER_UI_VIEWS_EXTERNAL_PROTOCOL_DIALOG_H_ #define CHROME_BROWSER_UI_VIEWS_EXTERNAL_PROTOCOL_DIALOG_H_ +#include <memory> + #include "base/memory/raw_ptr.h" #include "base/memory/weak_ptr.h" #include "content/public/browser/weak_document_ptr.h" @@ -25,6 +27,11 @@ class MessageBoxView; } +// Dialog that asks the user to confirm launching a url using the external +// protocol handler. +// +// Users can allow or block the launch and optionally remember this decision +// for the specific protocol and initiating origin. class ExternalProtocolDialog : public views::DialogDelegateView { METADATA_HEADER(ExternalProtocolDialog, views::DialogDelegateView) @@ -49,6 +56,18 @@ void SetRememberSelectionCheckboxCheckedForTesting(bool checked); void OnDialogAccepted(); + // Trigger input protection to protect against certain kinds of clickjacking. + void TriggerInputProtection(); + + // views::DialogDelegate: + bool ShouldIgnoreButtonPressedEventHandling( + View* button, + const ui::Event& event) const override; + bool ShouldAllowKeyEventsDuringInputProtection() const override; + + // Simulates Picture-in-Picture occlussion changed for testing. + void SimulateOcclusionStateChangedForTesting(bool occluded); + const base::WeakPtr<content::WebContents> web_contents_; const GURL url_; @@ -58,6 +77,11 @@ // The message box whose commands we handle. raw_ptr<views::MessageBoxView> message_box_view_ = nullptr; + + // The PictureInPictureWatcher tracks dialog occlussions by Picture-in-Picture + // windows, to ensure input protection and ignore spurious interactions. + class PictureInPictureWatcher; + std::unique_ptr<PictureInPictureWatcher> picture_in_picture_watcher_; }; #endif // CHROME_BROWSER_UI_VIEWS_EXTERNAL_PROTOCOL_DIALOG_H_
diff --git a/chrome/browser/ui/views/external_protocol_dialog_browsertest.cc b/chrome/browser/ui/views/external_protocol_dialog_browsertest.cc index 0e7fd50..6701ff9 100644 --- a/chrome/browser/ui/views/external_protocol_dialog_browsertest.cc +++ b/chrome/browser/ui/views/external_protocol_dialog_browsertest.cc
@@ -18,7 +18,11 @@ #include "content/public/browser/web_contents.h" #include "content/public/test/browser_test.h" #include "content/public/test/browser_test_utils.h" +#include "ui/events/event.h" +#include "ui/events/event_utils.h" #include "ui/views/controls/button/checkbox.h" +#include "ui/views/metrics.h" +#include "ui/views/test/button_test_api.h" IN_PROC_BROWSER_TEST_F(ExternalProtocolDialogBrowserTest, TestAccept) { ShowUi(std::string("https://example.test")); @@ -140,3 +144,55 @@ // request initiator EXPECT_EQ(launch_url_, "b.test"); } + +IN_PROC_BROWSER_TEST_F(ExternalProtocolDialogBrowserTest, + TestPictureInPictureOcclusionStateChanges) { + ShowUi(std::string("https://example.test")); + ui::MouseEvent mouse_event(ui::EventType::kMousePressed, gfx::Point(), + gfx::Point(), ui::EventTimeForNow(), 0, 0); + EXPECT_FALSE(ShouldIgnoreButtonPressedEventHandling(nullptr, mouse_event)); + + // Simulate Picture-in-Picture dialog occlusion. + SimulateOcclusionStateChanged(true); + EXPECT_TRUE(ShouldIgnoreButtonPressedEventHandling(nullptr, mouse_event)); + + // Simulate Picture-in-Picture dialog not occluded. + SimulateOcclusionStateChanged(false); + EXPECT_FALSE(ShouldIgnoreButtonPressedEventHandling(nullptr, mouse_event)); +} + +IN_PROC_BROWSER_TEST_F(ExternalProtocolDialogBrowserTest, + TestShouldIgnoreButtonEventsWhenOccluded) { + ShowUi(std::string("https://example.test")); + + ui::MouseEvent mouse_event(ui::EventType::kMousePressed, gfx::Point(), + gfx::Point(), ui::EventTimeForNow(), 0, 0); + + // Initially not occluded by Picture-in-Picture. + EXPECT_FALSE(ShouldIgnoreButtonPressedEventHandling(nullptr, mouse_event)); + + SimulateOcclusionStateChanged(true); + EXPECT_TRUE(ShouldIgnoreButtonPressedEventHandling(nullptr, mouse_event)); + + SimulateOcclusionStateChanged(false); + EXPECT_FALSE(ShouldIgnoreButtonPressedEventHandling(nullptr, mouse_event)); +} + +IN_PROC_BROWSER_TEST_F(ExternalProtocolDialogBrowserTest, + TestKeyEventsAreProtected) { + ShowUi(std::string("https://example.test")); + EXPECT_FALSE(ShouldAllowKeyEventsDuringInputProtection()); + + ui::KeyEvent press_enter(ui::EventType::kKeyPressed, ui::VKEY_RETURN, + ui::EF_NONE, ui::EventTimeForNow()); + views::test::ButtonTestApi(dialog_->GetOkButton()).NotifyClick(press_enter); + EXPECT_FALSE(url_did_launch_); + + ui::KeyEvent press_enter_delayed( + ui::EventType::kKeyPressed, ui::VKEY_RETURN, ui::EF_NONE, + ui::EventTimeForNow() + + base::Milliseconds(views::GetDoubleClickInterval())); + views::test::ButtonTestApi(dialog_->GetOkButton()) + .NotifyClick(press_enter_delayed); + EXPECT_TRUE(url_did_launch_); +}
diff --git a/chrome/browser/ui/views/external_protocol_dialog_test_harness.cc b/chrome/browser/ui/views/external_protocol_dialog_test_harness.cc index 60e320d..45de794 100644 --- a/chrome/browser/ui/views/external_protocol_dialog_test_harness.cc +++ b/chrome/browser/ui/views/external_protocol_dialog_test_harness.cc
@@ -23,6 +23,19 @@ dialog_->SetRememberSelectionCheckboxCheckedForTesting(checked); } + void SimulateOcclusionStateChanged(bool occluded) { + dialog_->SimulateOcclusionStateChangedForTesting(occluded); + } + + bool ShouldIgnoreButtonPressedEventHandling(views::View* button, + const ui::Event& event) const { + return dialog_->ShouldIgnoreButtonPressedEventHandling(button, event); + } + + bool ShouldAllowKeyEventsDuringInputProtection() const { + return dialog_->ShouldAllowKeyEventsDuringInputProtection(); + } + private: raw_ptr<ExternalProtocolDialog> dialog_; }; @@ -81,6 +94,25 @@ test::ExternalProtocolDialogTestApi(dialog_).SetCheckBoxSelected(checked); } +void ExternalProtocolDialogBrowserTest::SimulateOcclusionStateChanged( + bool occluded) { + test::ExternalProtocolDialogTestApi(dialog_).SimulateOcclusionStateChanged( + occluded); +} + +bool ExternalProtocolDialogBrowserTest::ShouldIgnoreButtonPressedEventHandling( + views::View* button, + const ui::Event& event) const { + return test::ExternalProtocolDialogTestApi(dialog_) + .ShouldIgnoreButtonPressedEventHandling(button, event); +} + +bool ExternalProtocolDialogBrowserTest:: + ShouldAllowKeyEventsDuringInputProtection() const { + return test::ExternalProtocolDialogTestApi(dialog_) + .ShouldAllowKeyEventsDuringInputProtection(); +} + // ExternalProtocolHandler::Delegate: scoped_refptr<shell_integration::DefaultSchemeClientWorker> ExternalProtocolDialogBrowserTest::CreateShellWorker(const GURL& url) {
diff --git a/chrome/browser/ui/views/external_protocol_dialog_test_harness.h b/chrome/browser/ui/views/external_protocol_dialog_test_harness.h index 6aba114..d18e83e 100644 --- a/chrome/browser/ui/views/external_protocol_dialog_test_harness.h +++ b/chrome/browser/ui/views/external_protocol_dialog_test_harness.h
@@ -30,6 +30,23 @@ void SetChecked(bool checked); + // Returns true if the `ExternalProtocolDialog` is occluded by a + // Picture-in-Picture window. + bool OccludedByPictureInPicture() const; + + // Sets the `ExternalProtocolDialog` Picture-in-Picture occlusion state to the + // `occluded` value. + void SimulateOcclusionStateChanged(bool occluded); + + // Returns true if button pressed events on the `ExternalProtocolDialog` + // should be ignored. + bool ShouldIgnoreButtonPressedEventHandling(views::View* button, + const ui::Event& event) const; + + // Returns true if key events on the `ExternalProtocolDialog` should be + // allowed when input protection is active. + bool ShouldAllowKeyEventsDuringInputProtection() const; + // ExternalProtocolHandler::Delegate: scoped_refptr<shell_integration::DefaultSchemeClientWorker> CreateShellWorker( const GURL& url) override;
diff --git a/chrome/browser/ui/views/frame/browser_view.cc b/chrome/browser/ui/views/frame/browser_view.cc index 88ba0f94..c2e9f77 100644 --- a/chrome/browser/ui/views/frame/browser_view.cc +++ b/chrome/browser/ui/views/frame/browser_view.cc
@@ -4787,13 +4787,12 @@ const int relative_active_position = active_index - first_split_tab_index; multi_contents_view_->SetActiveIndex(relative_active_position); + multi_contents_view_->UpdateSplitRatio( + split_data->visual_data()->split_ratio()); + if (focus_active_view) { multi_contents_view_->GetActiveContentsView()->RequestFocus(); } - - // Update visual information for the split. - multi_contents_view_->UpdateSplitRatio( - split_data->visual_data()->split_ratio()); } void BrowserView::HideSplitView() { @@ -4817,6 +4816,14 @@ browser_->tab_strip_model()->GetIndexOfTab(first_tab); const int relative_active_position = active_index - first_split_tab_index; multi_contents_view_->SetActiveIndex(relative_active_position); + + // When active tab changes inside a split, it's generally due to focus change. + // However, there are cases where inactive tab can be activated without a + // focus change e.g. using tab shortcuts and in these cases update focus. + if (GetWidget()->IsActive() && + multi_contents_view_->GetInactiveContentsView()->HasFocus()) { + multi_contents_view_->GetActiveContentsView()->RequestFocus(); + } } void BrowserView::UpdateContentsInSplitView(
diff --git a/chrome/browser/ui/views/frame/browser_view_browsertest.cc b/chrome/browser/ui/views/frame/browser_view_browsertest.cc index 25b0c75..ffa3c7cc 100644 --- a/chrome/browser/ui/views/frame/browser_view_browsertest.cc +++ b/chrome/browser/ui/views/frame/browser_view_browsertest.cc
@@ -69,7 +69,6 @@ #include "ui/accessibility/platform/ax_platform_node_test_helper.h" #include "ui/base/l10n/l10n_util.h" #include "ui/base/ui_base_features.h" -#include "ui/views/widget/any_widget_observer.h" #include "url/url_constants.h" #if defined(USE_AURA) @@ -148,6 +147,49 @@ raw_ptr<content::WebContents, DanglingUntriaged> other_; }; +// Waits for a different view to claim focus within a widget with the specified +// name. +class TestFocusChangeWaiter : public views::FocusChangeListener { + public: + TestFocusChangeWaiter(views::FocusManager* focus_manager, + const std::string& expected_widget_name) + : focus_manager_(focus_manager), + expected_widget_name_(expected_widget_name) { + if (auto* current_focused_view = focus_manager->GetFocusedView()) { + previous_view_id_ = current_focused_view->GetID(); + } else { + previous_view_id_ = -1; + } + focus_manager_->AddFocusChangeListener(this); + } + + TestFocusChangeWaiter(const TestFocusChangeWaiter&) = delete; + TestFocusChangeWaiter& operator=(const TestFocusChangeWaiter&) = delete; + ~TestFocusChangeWaiter() override { + focus_manager_->RemoveFocusChangeListener(this); + } + + void Wait() { run_loop_.Run(); } + + private: + // views::FocusChangeListener: + void OnDidChangeFocus(views::View* focused_before, + views::View* focused_now) override { + if (focused_now && focused_now->GetID() != previous_view_id_) { + views::Widget* widget = focused_now->GetWidget(); + if (widget && widget->GetName() == expected_widget_name_) { + run_loop_.Quit(); + } + } + } + + raw_ptr<views::FocusManager> focus_manager_; + base::RunLoop run_loop_; + int previous_view_id_; + std::string expected_widget_name_; + base::WeakPtrFactory<TestFocusChangeWaiter> weak_factory_{this}; +}; + class TestTabModalConfirmDialogDelegate : public TabModalConfirmDialogDelegate { public: explicit TestTabModalConfirmDialogDelegate(content::WebContents* contents) @@ -532,10 +574,19 @@ content::WebContents* contents = browser_view()->GetActiveWebContents(); auto delegate = std::make_unique<TestTabModalConfirmDialogDelegate>(contents); - views::NamedWidgetShownWaiter waiter(views::test::AnyWidgetTestPasskey{}, - "MessageBoxView"); + + // `ViewAXPlatformNodeDelegate::GetChildWidgets` expects the following + // conditions to be met in order to conclude that a tab modal dialog is + // showing: + // 1. The dialog is included in `Widget::GetAllOwnedWidgets()`. + // 2. The currently-focused view is contained in the dialog. + // Waiting for the dialog to be shown should ensure that the first + // condition is met. But we also need to wait for the focus to change + // or the second condition flakily fails. + TestFocusChangeWaiter focus_waiter(browser_view()->GetFocusManager(), + "MessageBoxView"); TabModalConfirmDialog::Create(std::move(delegate), contents); - ASSERT_TRUE(waiter.WaitIfNeededAndGet()); + focus_waiter.Wait(); // The tab modal dialog should be in the accessibility tree; everything else // should be hidden. So we expect an "OK" button and no reload button.
diff --git a/chrome/browser/ui/views/frame/multi_contents_view_interactive_uitest.cc b/chrome/browser/ui/views/frame/multi_contents_view_interactive_uitest.cc index 1299c3bd..bcc78f4 100644 --- a/chrome/browser/ui/views/frame/multi_contents_view_interactive_uitest.cc +++ b/chrome/browser/ui/views/frame/multi_contents_view_interactive_uitest.cc
@@ -19,6 +19,7 @@ #include "chrome/browser/ui/views/frame/multi_contents_view_drop_target_controller.h" #include "chrome/browser/ui/views/frame/multi_contents_view_mini_toolbar.h" #include "chrome/browser/ui/views/test/split_tabs_interactive_test_mixin.h" +#include "chrome/browser/ui/views/test/tab_strip_interactive_test_mixin.h" #include "chrome/common/webui_url_constants.h" #include "chrome/test/base/interactive_test_utils.h" #include "chrome/test/interaction/interactive_browser_test.h" @@ -69,7 +70,8 @@ } // namespace class MultiContentsViewUiTest - : public SplitTabsInteractiveTestMixin<InteractiveBrowserTest> { + : public SplitTabsInteractiveTestMixin< + TabStripInteractiveTestMixin<InteractiveBrowserTest>> { protected: TabStripModel* tab_strip_model() { return browser()->tab_strip_model(); } @@ -155,11 +157,6 @@ return result; } - auto CheckTabIsActive(int index) { - return CheckResult([this]() { return tab_strip_model()->active_index(); }, - index); - } - auto CheckActiveContentsHasFocus() { return CheckView( MultiContentsView::kMultiContentsViewElementId, @@ -179,8 +176,8 @@ // visible IN_PROC_BROWSER_TEST_F(MultiContentsViewUiTest, EnterAndExitSplitViews) { RunTestSequence( - CreateTabsAndEnterSplitView(), CheckTabIsActive(0), ExitSplitView(0), - CheckTabIsActive(0), + CreateTabsAndEnterSplitView(), WaitForActiveTabChange(0), + ExitSplitView(0), WaitForActiveTabChange(0), CheckResult([this]() { return tab_strip_model()->count(); }, 2u)); } @@ -190,14 +187,16 @@ DEFINE_LOCAL_STATE_IDENTIFIER_VALUE(MultiContentsViewBoundsChangedObserver, kMultiContentsViewBoundsChangedObserver); RunTestSequence( - CreateTabsAndEnterSplitView(), CheckTabIsActive(0), + CreateTabsAndEnterSplitView(), WaitForActiveTabChange(0), AddInstrumentedTab(kSecondTab, GURL(chrome::kChromeUISettingsURL), 2), - CheckTabIsActive(2), SelectTab(kTabStripElementId, 0, InputType::kMouse), + WaitForActiveTabChange(2), + SelectTab(kTabStripElementId, 0, InputType::kMouse), // Check if there is just one resizing event that happens when switching // between a split view to a regular tab. - CheckTabIsActive(0), + WaitForActiveTabChange(0), ObserveState(kMultiContentsViewBoundsChangedObserver, browser()), - SelectTab(kTabStripElementId, 2, InputType::kMouse), CheckTabIsActive(2), + SelectTab(kTabStripElementId, 2, InputType::kMouse), + WaitForActiveTabChange(2), CheckState(kMultiContentsViewBoundsChangedObserver, 1), StopObservingState(kMultiContentsViewBoundsChangedObserver)); } @@ -206,8 +205,8 @@ // focused using mouse click. IN_PROC_BROWSER_TEST_F(MultiContentsViewUiTest, ActivatesInactiveViewUsingMouseClick) { - RunTestSequence(CreateTabsAndEnterSplitView(), CheckTabIsActive(0), - FocusInactiveTabInSplit(), CheckTabIsActive(1), + RunTestSequence(CreateTabsAndEnterSplitView(), WaitForActiveTabChange(0), + FocusInactiveTabInSplit(), WaitForActiveTabChange(1), CheckActiveContentsHasFocus()); } @@ -216,7 +215,7 @@ IN_PROC_BROWSER_TEST_F(MultiContentsViewUiTest, ActivatesInactiveViewUsingKeyboard) { RunTestSequence( - CreateTabsAndEnterSplitView(), CheckTabIsActive(0), + CreateTabsAndEnterSplitView(), WaitForActiveTabChange(0), // The second contents view should be next in the focus order after // the resize handle so send a TAB key event to move focus to inactive tab FocusElement( @@ -224,7 +223,26 @@ SendKeyPress( MultiContentsResizeHandle::kMultiContentsResizeHandleElementId, ui::VKEY_TAB), - CheckTabIsActive(1), CheckActiveContentsHasFocus()); + WaitForActiveTabChange(1), CheckActiveContentsHasFocus()); +} + +// Check that MultiContentsView changes its active view when the tab shortcut +// is used and the active view has focus. +IN_PROC_BROWSER_TEST_F(MultiContentsViewUiTest, + ActivatesInactiveViewUsingAccelerator) { + const int kControlCommandModifier = +#if BUILDFLAG(IS_MAC) + ui::EF_COMMAND_DOWN; +#else + ui::EF_CONTROL_DOWN; +#endif + + RunTestSequence( + CreateTabsAndEnterSplitView(), WaitForActiveTabChange(0), + FocusWebContents(kNewTab), + SendAccelerator(kBrowserViewElementId, + ui::Accelerator(ui::VKEY_2, kControlCommandModifier)), + WaitForActiveTabChange(1), CheckActiveContentsHasFocus()); } // Check focus for the MultiContentView when in split view @@ -235,7 +253,8 @@ AddInstrumentedTab(kSecondTab, GURL(chrome::kChromeUISettingsURL), 2), FocusWebContents(kSecondTab), CheckResult([this]() { return tab_strip_model()->count(); }, 3u), - EnterSplitView(2, 0), CheckTabIsActive(2), CheckActiveContentsHasFocus()); + EnterSplitView(2, 0), WaitForActiveTabChange(2), + CheckActiveContentsHasFocus()); } // Split view active tab change while browser window doesn't have focus. This @@ -262,11 +281,11 @@ AddInstrumentedTab(kSecondTab, GURL(chrome::kChromeUISettingsURL), 2), FocusWebContents(kSecondTab), CheckResult([this]() { return tab_strip_model()->count(); }, 3u), - EnterSplitView(2, 0), CheckTabIsActive(2), + EnterSplitView(2, 0), WaitForActiveTabChange(2), PressButton(kTabSearchButtonElementId), WaitForShow(kTabSearchBubbleElementId), Do([this]() { browser()->tab_strip_model()->ActivateTabAt(1); }), - WaitForHide(kTabSearchBubbleElementId), CheckTabIsActive(1), + WaitForHide(kTabSearchBubbleElementId), WaitForActiveTabChange(1), CheckActiveContentsHasFocus()); } @@ -295,28 +314,28 @@ AddInstrumentedTab(kSecondTab, GURL(chrome::kChromeUISettingsURL), 2), FocusWebContents(kSecondTab), CheckResult([this]() { return tab_strip_model()->count(); }, 3u), - EnterSplitView(2, 0), CheckTabIsActive(2), + EnterSplitView(2, 0), WaitForActiveTabChange(2), // Switch from the split view to a regular tab - SelectTab(kTabStripElementId, 0, InputType::kMouse), CheckTabIsActive(0), - FocusWebContents(kNewTab), + SelectTab(kTabStripElementId, 0, InputType::kMouse), + WaitForActiveTabChange(0), FocusWebContents(kNewTab), // Launch the tab search bubble using the tab search button PressButton(kTabSearchButtonElementId), WaitForShow(kTabSearchBubbleElementId), // Switch from a regular tab directly to an inactive tab, which is on // the left side of a split with the TabSearch bubble dialog opened. Do([this]() { browser()->tab_strip_model()->ActivateTabAt(1); }), - WaitForHide(kTabSearchBubbleElementId), CheckTabIsActive(1), + WaitForHide(kTabSearchBubbleElementId), WaitForActiveTabChange(1), CheckActiveContentsHasFocus(), // Switch out of the split view back to the regular tab - SelectTab(kTabStripElementId, 0, InputType::kMouse), CheckTabIsActive(0), - FocusWebContents(kNewTab), + SelectTab(kTabStripElementId, 0, InputType::kMouse), + WaitForActiveTabChange(0), FocusWebContents(kNewTab), // Launch the tab search bubble using the tab search button PressButton(kTabSearchButtonElementId), WaitForShow(kTabSearchBubbleElementId), // Switch from a regular tab directly to an inactive tab, which is on // the right side of a split with the TabSearch bubble dialog opened. Do([this]() { browser()->tab_strip_model()->ActivateTabAt(2); }), - WaitForHide(kTabSearchBubbleElementId), CheckTabIsActive(2), + WaitForHide(kTabSearchBubbleElementId), WaitForActiveTabChange(2), CheckActiveContentsHasFocus()); } @@ -418,18 +437,18 @@ IN_PROC_BROWSER_TEST_F(MultiContentsViewUiTest, ActivatesMostRecentlyActiveTabInSplit) { RunTestSequence( - CreateTabsAndEnterSplitView(), CheckTabIsActive(0), + CreateTabsAndEnterSplitView(), WaitForActiveTabChange(0), AddInstrumentedTab(kSecondTab, GURL(chrome::kChromeUISettingsURL), 2), - CheckTabIsActive(2), + WaitForActiveTabChange(2), // Since tab 0 and 1 are part of a split view and tab 0 was the most // recently focused half of the split it should become the active tab, but // both tabs will be visible. SelectTab(kTabStripElementId, 1, InputType::kMouse, 0), - CheckTabIsActive(0), + WaitForActiveTabChange(0), // Select another tab in the split view and ensure the active index // doesn't change since it isn't the currently focused tab. SelectTab(kTabStripElementId, 1, InputType::kMouse, 0), - CheckTabIsActive(0)); + WaitForActiveTabChange(0)); } IN_PROC_BROWSER_TEST_F(MultiContentsViewUiTest, @@ -490,8 +509,8 @@ GURL(chrome::kChromeUISettingsURL); return first_web_contents_set && second_web_contents_set; }), - WaitForState(kMultiContentsViewSwapObserver, true), CheckTabIsActive(1), - CheckActiveContentsHasFocus()); + WaitForState(kMultiContentsViewSwapObserver, true), + WaitForActiveTabChange(1), CheckActiveContentsHasFocus()); } IN_PROC_BROWSER_TEST_F(MultiContentsViewUiTest, @@ -546,8 +565,8 @@ GURL(chrome::kChromeUISettingsURL); return first_web_contents_set && second_web_contents_set; }), - WaitForState(kMultiContentsViewSwapObserver, true), CheckTabIsActive(1), - CheckActiveContentsHasFocus()); + WaitForState(kMultiContentsViewSwapObserver, true), + WaitForActiveTabChange(1), CheckActiveContentsHasFocus()); } IN_PROC_BROWSER_TEST_F(MultiContentsViewUiTest, @@ -578,7 +597,7 @@ MiniToolbarShownForInactiveContents) { RunTestSequence( // Open split view. - CreateTabsAndEnterSplitView(), CheckTabIsActive(0), + CreateTabsAndEnterSplitView(), WaitForActiveTabChange(0), // Verify the mini toolbar is only visible for the inactive contents. Check([&]() { return !multi_contents_view() @@ -589,7 +608,7 @@ return multi_contents_view()->mini_toolbar_for_testing(1)->GetVisible(); }), // Focus inactive contents and verify active tab. - FocusInactiveTabInSplit(), CheckTabIsActive(1), + FocusInactiveTabInSplit(), WaitForActiveTabChange(1), // Verify the mini toolbar is only visile for the newly inactive contents. Check([&]() { return multi_contents_view()->mini_toolbar_for_testing(0)->GetVisible(); @@ -713,7 +732,7 @@ DISABLED_ShowsDropTargetOnLinkDragged) { RunTestSequence( AddInstrumentedTab(kNewTab, GetURL("/links.html"), 0), - CheckTabIsActive(0), + WaitForActiveTabChange(0), // Drag an href element to the drop target area. The drop // target should be shown. MoveMouseTo(kNewTab, DeepQuery{"#title1"}), @@ -726,7 +745,7 @@ DoesNotShowDropTargetOnNonURLDragged) { RunTestSequence( AddInstrumentedTab(kNewTab, GetURL("/button.html"), 0), - CheckTabIsActive(0), + WaitForActiveTabChange(0), // Dragging a non-url to the drop target area should have no // effect. MoveMouseTo(kNewTab, DeepQuery{"#button"}), @@ -781,7 +800,7 @@ const std::string kBookmarkButtonId = "bookmark_button"; RunTestSequence( AddInstrumentedTab(kNewTab, GURL(chrome::kChromeUISettingsURL), 0), - CheckTabIsActive(0), WaitForShow(kBookmarkBarElementId), + WaitForActiveTabChange(0), WaitForShow(kBookmarkBarElementId), NameBookmarkButton(kBookmarkButtonId, bookmark_title), MoveMouseTo(kBookmarkButtonId), DragMouseToWithoutWait(MultiContentsView::kMultiContentsViewElementId,
diff --git a/chrome/browser/ui/views/frame/webui_tab_strip_container_view_browsertest.cc b/chrome/browser/ui/views/frame/webui_tab_strip_container_view_browsertest.cc deleted file mode 100644 index a395a1a3..0000000 --- a/chrome/browser/ui/views/frame/webui_tab_strip_container_view_browsertest.cc +++ /dev/null
@@ -1,134 +0,0 @@ -// Copyright 2019 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/frame/webui_tab_strip_container_view.h" - -#include <utility> - -#include "base/test/scoped_feature_list.h" -#include "chrome/browser/ui/browser.h" -#include "chrome/browser/ui/ui_features.h" -#include "chrome/browser/ui/views/frame/browser_view.h" -#include "chrome/browser/ui/views/toolbar/toolbar_view.h" -#include "chrome/browser/ui/webui/tab_strip/tab_strip_ui.h" -#include "chrome/test/base/in_process_browser_test.h" -#include "content/public/test/browser_test.h" -#include "ui/base/pointer/touch_ui_controller.h" - -class WebUITabStripContainerViewBrowserTest : public InProcessBrowserTest { - public: - WebUITabStripContainerViewBrowserTest() { - feature_override_.InitAndEnableFeature(features::kWebUITabStrip); - } - - ~WebUITabStripContainerViewBrowserTest() override = default; - - void SetUpOnMainThread() override { - InProcessBrowserTest::SetUpOnMainThread(); - browser_view_ = BrowserView::GetBrowserViewForBrowser(browser()); - } - - void TearDownOnMainThread() override { - browser_view_ = nullptr; - InProcessBrowserTest::TearDownOnMainThread(); - } - - BrowserView* browser_view() { return browser_view_; } - - private: - base::test::ScopedFeatureList feature_override_; - ui::TouchUiController::TouchUiScoperForTesting touch_ui_scoper_{true}; - - protected: - raw_ptr<BrowserView> browser_view_ = nullptr; -}; - -IN_PROC_BROWSER_TEST_F(WebUITabStripContainerViewBrowserTest, - TabStripStartsClosed) { - EXPECT_TRUE(WebUITabStripContainerView::UseTouchableTabStrip( - browser_view()->browser())); - ASSERT_NE(nullptr, browser_view()->webui_tab_strip()); - EXPECT_FALSE(browser_view()->webui_tab_strip()->GetVisible()); -} - -IN_PROC_BROWSER_TEST_F(WebUITabStripContainerViewBrowserTest, - TouchModeTransition) { - EXPECT_TRUE(WebUITabStripContainerView::UseTouchableTabStrip( - browser_view()->browser())); - EXPECT_NE(nullptr, browser_view()->webui_tab_strip()); - EXPECT_FALSE(browser_view()->GetTabStripVisible()); - - ui::TouchUiController::TouchUiScoperForTesting disable_touch_mode(false); - EXPECT_FALSE(WebUITabStripContainerView::UseTouchableTabStrip( - browser_view()->browser())); - EXPECT_TRUE(browser_view()->GetTabStripVisible()); - - ui::TouchUiController::TouchUiScoperForTesting reenable_touch_mode(true); - EXPECT_TRUE(WebUITabStripContainerView::UseTouchableTabStrip( - browser_view()->browser())); - EXPECT_FALSE(browser_view()->GetTabStripVisible()); - ASSERT_NE(nullptr, browser_view()->webui_tab_strip()); -} - -IN_PROC_BROWSER_TEST_F(WebUITabStripContainerViewBrowserTest, - ButtonsPresentInToolbar) { - ASSERT_NE(nullptr, browser_view()->toolbar()->new_tab_button_for_testing()); - EXPECT_TRUE(browser_view()->toolbar()->Contains( - browser_view()->toolbar()->new_tab_button_for_testing())); - EXPECT_TRUE( - browser_view()->toolbar()->new_tab_button_for_testing()->GetVisible()); - ASSERT_NE(nullptr, browser_view()->webui_tab_strip()->tab_counter()); - EXPECT_TRUE(browser_view()->toolbar()->Contains( - browser_view()->webui_tab_strip()->tab_counter())); -} - -IN_PROC_BROWSER_TEST_F(WebUITabStripContainerViewBrowserTest, - CloseContainerOnRendererCrash) { - auto* webui_tab_strip = browser_view()->webui_tab_strip(); - webui_tab_strip->PrimaryMainFrameRenderProcessGone( - base::TerminationStatus::TERMINATION_STATUS_PROCESS_CRASHED); - EXPECT_EQ(false, webui_tab_strip->GetVisible()); - webui_tab_strip->SetVisibleForTesting(true); - EXPECT_EQ(true, webui_tab_strip->GetVisible()); -} - -class WebUITabStripDevToolsBrowserTest - : public WebUITabStripContainerViewBrowserTest { - public: - WebUITabStripDevToolsBrowserTest() = default; - ~WebUITabStripDevToolsBrowserTest() override = default; - - void SetUpOnMainThread() override { - WebUITabStripContainerViewBrowserTest::SetUpOnMainThread(); - Browser::CreateParams params = - Browser::CreateParams::CreateForDevTools(browser()->profile()); - devtools_browser_ = Browser::Create(params); - } - - void TearDownOnMainThread() override { - devtools_browser_ = nullptr; - WebUITabStripContainerViewBrowserTest::TearDownOnMainThread(); - } - - protected: - raw_ptr<Browser> devtools_browser_ = nullptr; -}; - -// Regression test for crbug.com/1010247, crbug.com/1090208. -IN_PROC_BROWSER_TEST_F(WebUITabStripDevToolsBrowserTest, - DevToolsWindowHasNoTabStrip) { - BrowserView* devtools_browser_view = - BrowserView::GetBrowserViewForBrowser(devtools_browser_); - ASSERT_TRUE(devtools_browser_view); - - EXPECT_FALSE( - WebUITabStripContainerView::UseTouchableTabStrip(devtools_browser_)); - EXPECT_EQ(nullptr, devtools_browser_view->webui_tab_strip()); - - ui::TouchUiController::TouchUiScoperForTesting disable_touch_mode(false); - ui::TouchUiController::TouchUiScoperForTesting reenable_touch_mode(true); - EXPECT_EQ(nullptr, devtools_browser_view->webui_tab_strip()); -} - -// TODO(crbug.com/40124617): add coverage of open and close gestures.
diff --git a/chrome/browser/ui/views/frame/webui_tab_strip_container_view_unittest.cc b/chrome/browser/ui/views/frame/webui_tab_strip_container_view_unittest.cc new file mode 100644 index 0000000..8dc737e --- /dev/null +++ b/chrome/browser/ui/views/frame/webui_tab_strip_container_view_unittest.cc
@@ -0,0 +1,104 @@ +// Copyright 2019 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/frame/webui_tab_strip_container_view.h" + +#include <utility> + +#include "base/functional/bind.h" +#include "base/test/scoped_feature_list.h" +#include "chrome/browser/extensions/extension_tab_util.h" +#include "chrome/browser/feature_engagement/tracker_factory.h" +#include "chrome/browser/ui/browser_commands.h" +#include "chrome/browser/ui/ui_features.h" +#include "chrome/browser/ui/views/frame/browser_view.h" +#include "chrome/browser/ui/views/frame/test_with_browser_view.h" +#include "chrome/browser/ui/views/toolbar/toolbar_view.h" +#include "chrome/browser/ui/webui/tab_strip/tab_strip_ui.h" +#include "chrome/test/base/test_browser_window.h" +#include "components/feature_engagement/public/feature_constants.h" +#include "components/feature_engagement/test/mock_tracker.h" +#include "content/public/common/drop_data.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "ui/base/pointer/touch_ui_controller.h" + +class WebUITabStripContainerViewTest : public TestWithBrowserView { + public: + template <typename... Args> + explicit WebUITabStripContainerViewTest(Args... args) + : TestWithBrowserView(args...) { + feature_override_.InitAndEnableFeature(features::kWebUITabStrip); + } + + ~WebUITabStripContainerViewTest() override = default; + + private: + base::test::ScopedFeatureList feature_override_; + ui::TouchUiController::TouchUiScoperForTesting touch_ui_scoper_{true}; +}; + +TEST_F(WebUITabStripContainerViewTest, TabStripStartsClosed) { + EXPECT_TRUE(WebUITabStripContainerView::UseTouchableTabStrip( + browser_view()->browser())); + ASSERT_NE(nullptr, browser_view()->webui_tab_strip()); + EXPECT_FALSE(browser_view()->webui_tab_strip()->GetVisible()); +} + +TEST_F(WebUITabStripContainerViewTest, TouchModeTransition) { + EXPECT_TRUE(WebUITabStripContainerView::UseTouchableTabStrip( + browser_view()->browser())); + EXPECT_NE(nullptr, browser_view()->webui_tab_strip()); + EXPECT_FALSE(browser_view()->GetTabStripVisible()); + + ui::TouchUiController::TouchUiScoperForTesting disable_touch_mode(false); + EXPECT_FALSE(WebUITabStripContainerView::UseTouchableTabStrip( + browser_view()->browser())); + EXPECT_TRUE(browser_view()->GetTabStripVisible()); + + ui::TouchUiController::TouchUiScoperForTesting reenable_touch_mode(true); + EXPECT_TRUE(WebUITabStripContainerView::UseTouchableTabStrip( + browser_view()->browser())); + EXPECT_FALSE(browser_view()->GetTabStripVisible()); + ASSERT_NE(nullptr, browser_view()->webui_tab_strip()); +} + +TEST_F(WebUITabStripContainerViewTest, ButtonsPresentInToolbar) { + ASSERT_NE(nullptr, browser_view()->toolbar()->new_tab_button_for_testing()); + EXPECT_TRUE(browser_view()->toolbar()->Contains( + browser_view()->toolbar()->new_tab_button_for_testing())); + EXPECT_TRUE( + browser_view()->toolbar()->new_tab_button_for_testing()->GetVisible()); + ASSERT_NE(nullptr, browser_view()->webui_tab_strip()->tab_counter()); + EXPECT_TRUE(browser_view()->toolbar()->Contains( + browser_view()->webui_tab_strip()->tab_counter())); +} + +TEST_F(WebUITabStripContainerViewTest, CloseContainerOnRendererCrash) { + auto* webui_tab_strip = browser_view()->webui_tab_strip(); + webui_tab_strip->PrimaryMainFrameRenderProcessGone( + base::TerminationStatus::TERMINATION_STATUS_PROCESS_CRASHED); + EXPECT_EQ(false, webui_tab_strip->GetVisible()); + webui_tab_strip->SetVisibleForTesting(true); + EXPECT_EQ(true, webui_tab_strip->GetVisible()); +} + +class WebUITabStripDevToolsTest : public WebUITabStripContainerViewTest { + public: + WebUITabStripDevToolsTest() + : WebUITabStripContainerViewTest(Browser::TYPE_DEVTOOLS) {} + ~WebUITabStripDevToolsTest() override = default; +}; + +// Regression test for crbug.com/1010247, crbug.com/1090208. +TEST_F(WebUITabStripDevToolsTest, DevToolsWindowHasNoTabStrip) { + EXPECT_FALSE(WebUITabStripContainerView::UseTouchableTabStrip( + browser_view()->browser())); + EXPECT_EQ(nullptr, browser_view()->webui_tab_strip()); + + ui::TouchUiController::TouchUiScoperForTesting disable_touch_mode(false); + ui::TouchUiController::TouchUiScoperForTesting reenable_touch_mode(true); + EXPECT_EQ(nullptr, browser_view()->webui_tab_strip()); +} + +// TODO(crbug.com/40124617): add coverage of open and close gestures.
diff --git a/chrome/browser/ui/views/tab_contents/chrome_web_contents_view_delegate_views_mac.mm b/chrome/browser/ui/views/tab_contents/chrome_web_contents_view_delegate_views_mac.mm index 0ae31ab..fd828c74e 100644 --- a/chrome/browser/ui/views/tab_contents/chrome_web_contents_view_delegate_views_mac.mm +++ b/chrome/browser/ui/views/tab_contents/chrome_web_contents_view_delegate_views_mac.mm
@@ -5,6 +5,7 @@ #import "chrome/browser/ui/views/tab_contents/chrome_web_contents_view_delegate_views_mac.h" #include <memory> +#include <optional> #import "chrome/browser/renderer_host/chrome_render_widget_host_view_mac_delegate.h" #include "chrome/browser/ui/browser.h" @@ -67,7 +68,9 @@ // manually configured. This is tied to the `kSideBySide` experiment because // it is common to right click an inactive `WebContents` in split view. if (base::FeatureList::IsEnabled(features::kSideBySide)) { - if (!tabs::TabInterface::GetFromContents(web_contents_)->IsActivated()) { + std::optional<tabs::TabInterface*> tab_interface = + tabs::TabInterface::MaybeGetFromContents(web_contents_); + if (tab_interface.has_value() && !tab_interface.value()->IsActivated()) { web_contents_->Focus(); } }
diff --git a/chrome/browser/ui/views/test/tab_strip_interactive_test_mixin.h b/chrome/browser/ui/views/test/tab_strip_interactive_test_mixin.h index ad6e9cb..f1e5736 100644 --- a/chrome/browser/ui/views/test/tab_strip_interactive_test_mixin.h +++ b/chrome/browser/ui/views/test/tab_strip_interactive_test_mixin.h
@@ -65,6 +65,18 @@ group_id)), T::MoveMouseTo(kTabGroupHeaderToHover)); } + + auto WaitForActiveTabChange(int index) { + DEFINE_LOCAL_STATE_IDENTIFIER_VALUE(ui::test::PollingStateObserver<int>, + kTabActiveChangeObserver); + return T::Steps( + T::PollState(kTabActiveChangeObserver, + base::BindRepeating( + &TabStripModel::active_index, + base::Unretained(T::browser()->tab_strip_model()))), + T::WaitForState(kTabActiveChangeObserver, index), + T::StopObservingState(kTabActiveChangeObserver)); + } }; #endif // CHROME_BROWSER_UI_VIEWS_TEST_TAB_STRIP_INTERACTIVE_TEST_MIXIN_H_
diff --git a/chrome/browser/ui/views/user_education/custom_webui_help_bubble.h b/chrome/browser/ui/views/user_education/custom_webui_help_bubble.h index d5354da7..2e37f960 100644 --- a/chrome/browser/ui/views/user_education/custom_webui_help_bubble.h +++ b/chrome/browser/ui/views/user_education/custom_webui_help_bubble.h
@@ -16,6 +16,7 @@ #include "components/strings/grit/components_strings.h" #include "components/user_education/common/feature_promo/feature_promo_specification.h" #include "components/user_education/common/help_bubble/help_bubble_params.h" +#include "components/user_education/views/help_bubble_factory_views.h" #include "components/user_education/views/help_bubble_views.h" #include "ui/base/interaction/element_identifier.h" #include "ui/base/interaction/element_tracker.h" @@ -137,8 +138,25 @@ user_education::HelpBubbleViews::TranslateArrow(arrow), wrapper->GetWeakPtr()); auto* const bubble = bubble_ptr.get(); + + // Ensure that the bubble gets the correct background and frame color. + bubble->SetBackgroundColor( + wrapper->GetWebUIController()->GetBackgroundAndFrameColor()); + + // Specific shadow types are required for help bubbles in order to properly + // render visible bubble arrows. + bubble->set_shadow( + user_education::HelpBubbleFactoryViews::GetDefaultBubbleShadow()); + auto widget = base::WrapUnique(views::BubbleDialogDelegateView::CreateBubble( std::move(bubble_ptr), views::Widget::InitParams::CLIENT_OWNS_WIDGET)); + + // Maybe set the arrow. This may require recalculating the bubble bounds. + if (arrow != user_education::HelpBubbleArrow::kNone) { + bubble->GetBubbleFrameView()->SetDisplayVisibleArrow(true); + bubble->SizeToContents(); + } + wrapper->ShowUI(); return base::WrapUnique(new CustomWebUIHelpBubble( std::move(widget), bubble, std::move(wrapper), params.anchor_element));
diff --git a/chrome/browser/ui/views/user_education/custom_webui_help_bubble_controller.cc b/chrome/browser/ui/views/user_education/custom_webui_help_bubble_controller.cc index e590a6c1..9d4c121 100644 --- a/chrome/browser/ui/views/user_education/custom_webui_help_bubble_controller.cc +++ b/chrome/browser/ui/views/user_education/custom_webui_help_bubble_controller.cc
@@ -5,7 +5,9 @@ #include "chrome/browser/ui/views/user_education/custom_webui_help_bubble_controller.h" #include "base/memory/raw_ref.h" +#include "chrome/browser/ui/views/user_education/browser_user_education_service.h" #include "components/user_education/common/help_bubble/custom_help_bubble.h" +#include "components/user_education/views/help_bubble_delegate.h" #include "mojo/public/cpp/bindings/receiver.h" #include "ui/webui/resources/cr_components/help_bubble/custom_help_bubble.mojom.h" @@ -62,6 +64,11 @@ std::move(pending_receiver)); } +ui::ColorId CustomWebUIHelpBubbleController::GetBackgroundAndFrameColor() + const { + return GetHelpBubbleDelegate()->GetHelpBubbleBackgroundColorId(); +} + void CustomWebUIHelpBubbleController::CreateCustomHelpBubbleHandler( mojo::PendingReceiver<custom_help_bubble::mojom::CustomHelpBubbleHandler> handler) {
diff --git a/chrome/browser/ui/views/user_education/custom_webui_help_bubble_controller.h b/chrome/browser/ui/views/user_education/custom_webui_help_bubble_controller.h index f7b4fe2..7ecb865 100644 --- a/chrome/browser/ui/views/user_education/custom_webui_help_bubble_controller.h +++ b/chrome/browser/ui/views/user_education/custom_webui_help_bubble_controller.h
@@ -14,6 +14,7 @@ #include "content/public/browser/web_ui_controller.h" #include "content/public/common/url_constants.h" #include "mojo/public/cpp/bindings/receiver.h" +#include "ui/color/color_id.h" #include "ui/webui/resources/cr_components/help_bubble/custom_help_bubble.mojom.h" // Derive your WebUIController from this if you want it to be used as a Custom @@ -33,6 +34,10 @@ custom_help_bubble::mojom::CustomHelpBubbleHandlerFactory> pending_receiver); + // Gets the background, frame, and arrow color for the bubble. Defaults to the + // normal help bubble background color. + virtual ui::ColorId GetBackgroundAndFrameColor() const; + // This is required for wrapping help bubbles for Top Chrome. static constexpr std::string_view GetWebUIName() { return "UserEducation"; }
diff --git a/chrome/browser/ui/views/user_education/custom_webui_help_bubble_interactive_uitest.cc b/chrome/browser/ui/views/user_education/custom_webui_help_bubble_interactive_uitest.cc index 239a56fc..51bf3560 100644 --- a/chrome/browser/ui/views/user_education/custom_webui_help_bubble_interactive_uitest.cc +++ b/chrome/browser/ui/views/user_education/custom_webui_help_bubble_interactive_uitest.cc
@@ -11,6 +11,8 @@ #include "chrome/browser/chrome_content_browser_client.h" #include "chrome/browser/ui/browser_element_identifiers.h" #include "chrome/browser/ui/user_education/browser_user_education_interface.h" +#include "chrome/browser/ui/views/toolbar/browser_app_menu_button.h" +#include "chrome/browser/ui/views/user_education/browser_user_education_service.h" #include "chrome/browser/ui/views/user_education/custom_webui_help_bubble.h" #include "chrome/browser/ui/views/user_education/custom_webui_help_bubble_controller.h" #include "chrome/browser/ui/webui/top_chrome/top_chrome_web_ui_controller.h" @@ -23,7 +25,9 @@ #include "components/user_education/common/help_bubble/custom_help_bubble.h" #include "components/user_education/common/help_bubble/help_bubble.h" #include "components/user_education/common/help_bubble/help_bubble_params.h" +#include "components/user_education/common/user_education_class_properties.h" #include "components/user_education/common/user_education_data.h" +#include "components/user_education/views/help_bubble_delegate.h" #include "content/public/browser/render_frame_host.h" #include "content/public/browser/web_ui.h" #include "content/public/browser/web_ui_controller.h" @@ -44,6 +48,9 @@ #include "ui/events/event_modifiers.h" #include "ui/events/keycodes/keyboard_codes.h" #include "ui/gfx/native_widget_types.h" +#include "ui/views/animation/ink_drop.h" +#include "ui/views/animation/ink_drop_host.h" +#include "ui/views/bubble/bubble_dialog_delegate_view.h" #include "ui/webui/resources/cr_components/help_bubble/custom_help_bubble.mojom.h" #include "ui/webui/webui_util.h" @@ -238,6 +245,42 @@ .SetDescription("CheckIsDismissed()"); } + static auto CheckIsAnchor(ElementSpecifier el, bool is_anchor) { + return Steps(CheckView( + kToolbarAppMenuButtonElementId, + [](BrowserAppMenuButton* button) { + return button->GetProperty( + user_education::kHasInProductHelpPromoKey); + }, + is_anchor) + .SetDescription("Check IPH key property."), + CheckView( + kToolbarAppMenuButtonElementId, + [](BrowserAppMenuButton* button) { + return views::InkDrop::Get(button) + ->in_attention_state_for_testing(); + }, + is_anchor) + .SetDescription("Check in attention state.")); + } + + static auto CheckFrame() { + return Steps( + CheckView( + CustomWebUIHelpBubble::kHelpBubbleIdForTesting, + [](views::BubbleDialogDelegateView* bubble) { + return bubble->GetBubbleFrameView()->GetDisplayVisibleArrow(); + }) + .SetDescription("Check frame has visible arrow."), + CheckView( + CustomWebUIHelpBubble::kHelpBubbleIdForTesting, + [](views::BubbleDialogDelegateView* bubble) { + return bubble->GetBubbleFrameView()->background_color(); + }, + GetHelpBubbleDelegate()->GetHelpBubbleBackgroundColorId()) + .SetDescription("Check frame color.")); + } + const DeepQuery kCancelButton{"test-custom-help-bubble", "#cancel"}; const DeepQuery kDismissButton{"test-custom-help-bubble", "#dismiss"}; const DeepQuery kSnoozeButton{"test-custom-help-bubble", "#snooze"}; @@ -277,12 +320,14 @@ return help_bubble && help_bubble->is_open(); }), WaitForShow(CustomWebUIHelpBubble::kHelpBubbleIdForTesting), + CheckIsAnchor(kToolbarAppMenuButtonElementId, true), CheckFrame(), InstrumentNonTabWebView(kWebViewElementId, CustomWebUIHelpBubble::kWebViewIdForTesting), ClickElement(kWebViewElementId, kCancelButton), WaitForEvent(kToolbarAppMenuButtonElementId, kCallbackEvent), Do([&help_bubble]() { help_bubble->Close(); }), - WaitForHide(CustomWebUIHelpBubble::kHelpBubbleIdForTesting)); + WaitForHide(CustomWebUIHelpBubble::kHelpBubbleIdForTesting), + CheckIsAnchor(kToolbarAppMenuButtonElementId, false)); } IN_PROC_BROWSER_TEST_F(CustomWebUIHelpBubbleUiTest, ShowPromo_Cancel) {
diff --git a/chrome/browser/ui/views/user_education/impl/browser_feature_promo_controller_2x_interactive_uitest.cc b/chrome/browser/ui/views/user_education/impl/browser_feature_promo_controller_2x_interactive_uitest.cc index 5012ece..4c0c58af 100644 --- a/chrome/browser/ui/views/user_education/impl/browser_feature_promo_controller_2x_interactive_uitest.cc +++ b/chrome/browser/ui/views/user_education/impl/browser_feature_promo_controller_2x_interactive_uitest.cc
@@ -420,6 +420,10 @@ user_education::test::TestCustomHelpBubbleView::kBubbleId; RunTestSequence( MaybeShowPromo(kCustomUiTestFeature, CustomHelpBubbleShown{kBubbleId}), + CheckView(kBubbleId, + [](views::BubbleDialogDelegateView* bubble) { + return bubble->GetBubbleFrameView()->GetDisplayVisibleArrow(); + }), WithView(kBubbleId, [](views::View* view) { view->GetWidget()->Close(); }), WaitForHide(kBubbleId), CheckPromoRequested(kCustomUiTestFeature, false),
diff --git a/chrome/browser/ui/webui/ash/emulator/device_emulator_message_handler.cc b/chrome/browser/ui/webui/ash/emulator/device_emulator_message_handler.cc index 973e0fb5..1f2dadf 100644 --- a/chrome/browser/ui/webui/ash/emulator/device_emulator_message_handler.cc +++ b/chrome/browser/ui/webui/ash/emulator/device_emulator_message_handler.cc
@@ -226,7 +226,7 @@ void DeviceEmulatorMessageHandler::HandleRemoveBluetoothDevice( const base::Value::List& args) { CHECK(!args.empty()); - std::string path = args[0].GetString(); + const std::string& path = args[0].GetString(); fake_bluetooth_device_client_->RemoveDevice( dbus::ObjectPath(bluez::FakeBluetoothAdapterClient::kAdapterPath), dbus::ObjectPath(path)); @@ -327,7 +327,7 @@ void DeviceEmulatorMessageHandler::HandleRemoveAudioNode( const base::Value::List& args) { CHECK(!args.empty()); - std::string tmp_id = args[0].GetString(); + const std::string& tmp_id = args[0].GetString(); uint64_t id; CHECK(base::StringToUint64(tmp_id, &id)); @@ -462,7 +462,7 @@ void DeviceEmulatorMessageHandler::UpdatePowerSourceId( const base::Value::List& args) { CHECK(!args.empty() && args[0].is_string()); - std::string id = args[0].GetString(); + const std::string& id = args[0].GetString(); fake_power_manager_client_->SetPowerSource(id); }
diff --git a/chrome/browser/ui/webui/ash/floating_workspace/floating_workspace_handler.cc b/chrome/browser/ui/webui/ash/floating_workspace/floating_workspace_handler.cc index 421a619..f946657 100644 --- a/chrome/browser/ui/webui/ash/floating_workspace/floating_workspace_handler.cc +++ b/chrome/browser/ui/webui/ash/floating_workspace/floating_workspace_handler.cc
@@ -106,7 +106,7 @@ void FloatingWorkspaceDialogHandler::ShowNetworkDetails( const base::Value::List& args) { CHECK_EQ(1u, args.size()); - std::string guid = args[0].GetString(); + const std::string& guid = args[0].GetString(); // We need to pass NativeWindow to the network dialog here, because otherwise // the network dialog would be shown behind our main modal dialog. @@ -119,7 +119,7 @@ void FloatingWorkspaceDialogHandler::ShowNetworkConfig( const base::Value::List& args) { CHECK_EQ(1u, args.size()); - std::string guid = args[0].GetString(); + const std::string& guid = args[0].GetString(); // We need to pass NativeWindow to the network dialog here, because otherwise // the network dialog would be shown behind our main modal dialog. @@ -131,7 +131,7 @@ void FloatingWorkspaceDialogHandler::AddNetwork(const base::Value::List& args) { CHECK_EQ(1u, args.size()); - std::string onc_type = args[0].GetString(); + const std::string& onc_type = args[0].GetString(); // We need to pass NativeWindow to the network dialog here, because otherwise // the network dialog would be shown behind our main modal dialog. @@ -145,7 +145,7 @@ void FloatingWorkspaceDialogHandler::GetHostname( const base::Value::List& args) { CHECK_EQ(1u, args.size()); - std::string callback_id = args[0].GetString(); + const std::string& callback_id = args[0].GetString(); std::string hostname = NetworkHandler::Get()->network_state_handler()->hostname();
diff --git a/chrome/browser/ui/webui/ash/lock_screen_reauth/lock_screen_network_handler.cc b/chrome/browser/ui/webui/ash/lock_screen_reauth/lock_screen_network_handler.cc index 79d503a4..b99f1e8 100644 --- a/chrome/browser/ui/webui/ash/lock_screen_reauth/lock_screen_network_handler.cc +++ b/chrome/browser/ui/webui/ash/lock_screen_reauth/lock_screen_network_handler.cc
@@ -85,7 +85,7 @@ void NetworkConfigMessageHandler::ShowNetworkDetails( const base::Value::List& args) { CHECK_EQ(1u, args.size()); - std::string guid = args[0].GetString(); + const std::string& guid = args[0].GetString(); InternetDetailDialog::ShowDialog(guid); } @@ -93,21 +93,21 @@ void NetworkConfigMessageHandler::ShowNetworkConfig( const base::Value::List& args) { CHECK_EQ(1u, args.size()); - std::string guid = args[0].GetString(); + const std::string& guid = args[0].GetString(); InternetConfigDialog::ShowDialogForNetworkId(guid); } void NetworkConfigMessageHandler::AddNetwork(const base::Value::List& args) { CHECK_EQ(1u, args.size()); - std::string onc_type = args[0].GetString(); + const std::string& onc_type = args[0].GetString(); InternetConfigDialog::ShowDialogForNetworkType(onc_type); } void NetworkConfigMessageHandler::GetHostname(const base::Value::List& args) { CHECK_EQ(1u, args.size()); - std::string callback_id = args[0].GetString(); + const std::string& callback_id = args[0].GetString(); std::string hostname = NetworkHandler::Get()->network_state_handler()->hostname(); Respond(callback_id, hostname);
diff --git a/chrome/browser/ui/webui/ash/lock_screen_reauth/lock_screen_reauth_handler.cc b/chrome/browser/ui/webui/ash/lock_screen_reauth/lock_screen_reauth_handler.cc index 61f431b..c1ce6dd 100644 --- a/chrome/browser/ui/webui/ash/lock_screen_reauth/lock_screen_reauth_handler.cc +++ b/chrome/browser/ui/webui/ash/lock_screen_reauth/lock_screen_reauth_handler.cc
@@ -310,8 +310,8 @@ CHECK_EQ(params.size(), 7u); bool using_saml; GaiaId gaia_id(params[0].GetString()); - std::string email = params[1].GetString(); - std::string password = params[2].GetString(); + const std::string& email = params[1].GetString(); + const std::string& password = params[2].GetString(); auto scraped_saml_passwords = ::login::ConvertToStringList(params[3].GetList()); using_saml = params[4].GetBool(); @@ -414,7 +414,7 @@ void LockScreenReauthHandler::HandleUpdateUserPassword( const base::Value::List& value) { DCHECK(!value.empty()); - std::string old_password = value[0].GetString(); + const std::string& old_password = value[0].GetString(); lock_screen_reauth_manager_->UpdateUserPassword(old_password); }
diff --git a/chrome/browser/ui/webui/ash/login/welcome_screen_handler.cc b/chrome/browser/ui/webui/ash/login/welcome_screen_handler.cc index 0501040..e50ccbb 100644 --- a/chrome/browser/ui/webui/ash/login/welcome_screen_handler.cc +++ b/chrome/browser/ui/webui/ash/login/welcome_screen_handler.cc
@@ -321,8 +321,8 @@ CHECK(value.is_list()); const base::Value::List& timezone = value.GetList(); - std::string timezone_id = timezone[0].GetString(); - std::string timezone_name = timezone[1].GetString(); + const std::string& timezone_id = timezone[0].GetString(); + const std::string& timezone_name = timezone[1].GetString(); base::Value::Dict timezone_option; timezone_option.Set("value", timezone_id);
diff --git a/chrome/browser/ui/webui/ash/multidevice_setup/multidevice_setup_handler.cc b/chrome/browser/ui/webui/ash/multidevice_setup/multidevice_setup_handler.cc index 5c92006..8869276 100644 --- a/chrome/browser/ui/webui/ash/multidevice_setup/multidevice_setup_handler.cc +++ b/chrome/browser/ui/webui/ash/multidevice_setup/multidevice_setup_handler.cc
@@ -71,7 +71,7 @@ AllowJavascript(); DCHECK(!args.empty()); - std::string callback_id = args[0].GetString(); + const std::string& callback_id = args[0].GetString(); const user_manager::User* user = ProfileHelper::Get()->GetUserByProfile(Profile::FromWebUI(web_ui()));
diff --git a/chrome/browser/ui/webui/ash/network_ui/network_logs_message_handler.cc b/chrome/browser/ui/webui/ash/network_ui/network_logs_message_handler.cc index 64688b88..d694052 100644 --- a/chrome/browser/ui/webui/ash/network_ui/network_logs_message_handler.cc +++ b/chrome/browser/ui/webui/ash/network_ui/network_logs_message_handler.cc
@@ -90,7 +90,7 @@ void NetworkLogsMessageHandler::OnStoreLogs(const base::Value::List& list) { CHECK_EQ(2u, list.size()); - std::string callback_id = list[0].GetString(); + const std::string& callback_id = list[0].GetString(); const base::Value::Dict& options = list[1].GetDict(); AllowJavascript(); @@ -185,8 +185,8 @@ void NetworkLogsMessageHandler::OnSetShillDebugging( const base::Value::List& list) { CHECK_EQ(2u, list.size()); - std::string callback_id = list[0].GetString(); - std::string subsystem = list[1].GetString(); + const std::string& callback_id = list[0].GetString(); + const std::string& subsystem = list[1].GetString(); AllowJavascript(); DebugDaemonClient::Get()->SetDebugMode( subsystem,
diff --git a/chrome/browser/ui/webui/ash/network_ui/onc_import_message_handler.cc b/chrome/browser/ui/webui/ash/network_ui/onc_import_message_handler.cc index 059a67c..0352359 100644 --- a/chrome/browser/ui/webui/ash/network_ui/onc_import_message_handler.cc +++ b/chrome/browser/ui/webui/ash/network_ui/onc_import_message_handler.cc
@@ -72,8 +72,8 @@ void OncImportMessageHandler::OnImportONC(const base::Value::List& list) { CHECK_EQ(2u, list.size()); - std::string callback_id = list[0].GetString(); - std::string onc_blob = list[1].GetString(); + const std::string& callback_id = list[0].GetString(); + const std::string& onc_blob = list[1].GetString(); AllowJavascript(); // TODO(crbug.com/40753707): Pass the `NssCertDatabaseGetter` to
diff --git a/chrome/browser/ui/webui/ash/settings/pages/crostini/guest_os_handler.cc b/chrome/browser/ui/webui/ash/settings/pages/crostini/guest_os_handler.cc index 33ab97d..18572b0 100644 --- a/chrome/browser/ui/webui/ash/settings/pages/crostini/guest_os_handler.cc +++ b/chrome/browser/ui/webui/ash/settings/pages/crostini/guest_os_handler.cc
@@ -83,7 +83,7 @@ const base::Value::List& args) { AllowJavascript(); CHECK_EQ(2U, args.size()); - std::string callback_id = args[0].GetString(); + const std::string& callback_id = args[0].GetString(); base::Value::List texts; for (const auto& path : args[1].GetList()) { @@ -96,9 +96,9 @@ void GuestOsHandler::HandleRemoveGuestOsSharedPath( const base::Value::List& args) { CHECK_EQ(3U, args.size()); - std::string callback_id = args[0].GetString(); - std::string vm_name = args[1].GetString(); - std::string path = args[2].GetString(); + const std::string& callback_id = args[0].GetString(); + const std::string& vm_name = args[1].GetString(); + const std::string& path = args[2].GetString(); guest_os::GuestOsSharePathFactory::GetForProfile(profile_)->UnsharePath( vm_name, base::FilePath(path),
diff --git a/chrome/browser/ui/webui/ash/settings/pages/multidevice/multidevice_handler.cc b/chrome/browser/ui/webui/ash/settings/pages/multidevice/multidevice_handler.cc index a3052bd..2977cbe 100644 --- a/chrome/browser/ui/webui/ash/settings/pages/multidevice/multidevice_handler.cc +++ b/chrome/browser/ui/webui/ash/settings/pages/multidevice/multidevice_handler.cc
@@ -340,7 +340,7 @@ const base::Value::List& args) { const auto& list = args; DCHECK_GE(list.size(), 3u); - std::string callback_id = list[0].GetString(); + const std::string& callback_id = list[0].GetString(); int feature_as_int = list[1].GetInt();
diff --git a/chrome/browser/ui/webui/ash/settings/pages/people/fingerprint_handler.cc b/chrome/browser/ui/webui/ash/settings/pages/people/fingerprint_handler.cc index b8376a06..5efb0d36 100644 --- a/chrome/browser/ui/webui/ash/settings/pages/people/fingerprint_handler.cc +++ b/chrome/browser/ui/webui/ash/settings/pages/people/fingerprint_handler.cc
@@ -235,7 +235,7 @@ const base::Value::List& args) { const auto& list = args; CHECK_EQ(2U, list.size()); - std::string callback_id = list[0].GetString(); + const std::string& callback_id = list[0].GetString(); int index = list[1].GetInt(); CHECK_GE(index, 0); CHECK_LT(index, static_cast<int>(fingerprints_paths_.size())); @@ -256,7 +256,7 @@ const auto& list = args; // TODO(b/261412646): add unit tests to this class CHECK_EQ(3U, list.size()); - std::string callback_id = list[0].GetString(); + const std::string& callback_id = list[0].GetString(); const std::string& auth_token = list[2].GetString(); int index = list[1].GetInt(); CHECK_GE(index, 0); @@ -287,12 +287,12 @@ const auto& list = args; CHECK_EQ(3U, list.size()); - std::string callback_id = list[0].GetString(); + const std::string& callback_id = list[0].GetString(); int index = list[1].GetInt(); CHECK_GE(index, 0); CHECK_LT(index, static_cast<int>(fingerprints_paths_.size())); - std::string new_label = list[2].GetString(); + const std::string& new_label = list[2].GetString(); AllowJavascript(); fp_service_->SetRecordLabel(
diff --git a/chrome/browser/ui/webui/ash/settings/pages/power/power_section.cc b/chrome/browser/ui/webui/ash/settings/pages/power/power_section.cc index 94472834..ac6123f 100644 --- a/chrome/browser/ui/webui/ash/settings/pages/power/power_section.cc +++ b/chrome/browser/ui/webui/ash/settings/pages/power/power_section.cc
@@ -195,6 +195,9 @@ Shell::Get() ->adaptive_charging_controller() ->IsAdaptiveChargingSupported()); + + html_source->AddBoolean("isBatteryChargeLimitAvailable", + ash::features::IsBatteryChargeLimitAvailable()); } void PowerSection::AddHandlers(content::WebUI* web_ui) {
diff --git a/chrome/browser/ui/webui/ash/settings/pages/printing/cups_printers_handler.cc b/chrome/browser/ui/webui/ash/settings/pages/printing/cups_printers_handler.cc index 2637aa7..a6e6c51 100644 --- a/chrome/browser/ui/webui/ash/settings/pages/printing/cups_printers_handler.cc +++ b/chrome/browser/ui/webui/ash/settings/pages/printing/cups_printers_handler.cc
@@ -400,7 +400,7 @@ AllowJavascript(); CHECK_EQ(1U, args.size()); - std::string callback_id = args[0].GetString(); + const std::string& callback_id = args[0].GetString(); std::vector<Printer> printers = printers_manager_->GetPrinters(PrinterClass::kEnterprise); @@ -832,7 +832,7 @@ void CupsPrintersHandler::AddOrReconfigurePrinter(const base::Value::List& args, bool is_printer_edit) { CHECK_EQ(2U, args.size()); - std::string callback_id = args[0].GetString(); + const std::string& callback_id = args[0].GetString(); const base::Value& printer_value = args[1]; CHECK(printer_value.is_dict()); const base::Value::Dict& printer_dict = printer_value.GetDict();
diff --git a/chrome/browser/ui/webui/ash/smb_shares/smb_handler.cc b/chrome/browser/ui/webui/ash/smb_shares/smb_handler.cc index 4521d982..2c35121 100644 --- a/chrome/browser/ui/webui/ash/smb_shares/smb_handler.cc +++ b/chrome/browser/ui/webui/ash/smb_shares/smb_handler.cc
@@ -75,11 +75,11 @@ void SmbHandler::HandleSmbMount(const base::Value::List& args) { CHECK_EQ(8U, args.size()); - std::string callback_id = args[0].GetString(); - std::string mount_url = args[1].GetString(); - std::string mount_name = args[2].GetString(); - std::string username = args[3].GetString(); - std::string password = args[4].GetString(); + const std::string& callback_id = args[0].GetString(); + const std::string& mount_url = args[1].GetString(); + const std::string& mount_name = args[2].GetString(); + const std::string& username = args[3].GetString(); + const std::string& password = args[4].GetString(); bool use_kerberos = args[5].GetBool(); bool should_open_file_manager_after_mount = args[6].GetBool(); bool save_credentials = args[7].GetBool(); @@ -136,7 +136,7 @@ void SmbHandler::HandleHasAnySmbMountedBefore(const base::Value::List& args) { CHECK_EQ(1U, args.size()); - std::string callback_id = args[0].GetString(); + const std::string& callback_id = args[0].GetString(); smb_client::SmbService* const service = GetLocalSmbService(); AllowJavascript();
diff --git a/chrome/browser/ui/webui/bookmarks/bookmarks_message_handler.cc b/chrome/browser/ui/webui/bookmarks/bookmarks_message_handler.cc index ef016d3a..f939cd10 100644 --- a/chrome/browser/ui/webui/bookmarks/bookmarks_message_handler.cc +++ b/chrome/browser/ui/webui/bookmarks/bookmarks_message_handler.cc
@@ -303,7 +303,7 @@ const base::Value::List& args) { CHECK_EQ(2U, args.size()); const base::Value& callback_id = args[0]; - std::string id = args[1].GetString(); + const std::string& id = args[1].GetString(); AllowJavascript(); @@ -314,7 +314,7 @@ void BookmarksMessageHandler::HandleSingleUploadClicked( const base::Value::List& args) { CHECK_EQ(1U, args.size()); - std::string id_string = args[0].GetString(); + const std::string& id_string = args[0].GetString(); int64_t id; base::StringToInt64(id_string, &id);
diff --git a/chrome/browser/ui/webui/metrics_handler.cc b/chrome/browser/ui/webui/metrics_handler.cc index 64675006..fa07238 100644 --- a/chrome/browser/ui/webui/metrics_handler.cc +++ b/chrome/browser/ui/webui/metrics_handler.cc
@@ -49,7 +49,7 @@ void MetricsHandler::HandleRecordAction(const base::Value::List& args) { CHECK_EQ(1U, args.size()); - std::string string_action = args[0].GetString(); + const std::string& string_action = args[0].GetString(); base::RecordComputedAction(string_action); }
diff --git a/chrome/browser/ui/webui/nearby_internals/nearby_internals_ui_trigger_handler.cc b/chrome/browser/ui/webui/nearby_internals/nearby_internals_ui_trigger_handler.cc index 043eb43..12d4dfc 100644 --- a/chrome/browser/ui/webui/nearby_internals/nearby_internals_ui_trigger_handler.cc +++ b/chrome/browser/ui/webui/nearby_internals/nearby_internals_ui_trigger_handler.cc
@@ -478,7 +478,7 @@ return; } - std::string share_target_id = args[1].GetString(); + const std::string& share_target_id = args[1].GetString(); auto it = id_to_share_target_map_.find(share_target_id); if (it == id_to_share_target_map_.end()) { CD_LOG(ERROR, Feature::NS) @@ -507,7 +507,7 @@ return; } - std::string share_target_id = args[0].GetString(); + const std::string& share_target_id = args[0].GetString(); auto it = id_to_share_target_map_.find(share_target_id); if (it == id_to_share_target_map_.end()) { CD_LOG(ERROR, Feature::NS) @@ -529,7 +529,7 @@ return; } - std::string share_target_id = args[0].GetString(); + const std::string& share_target_id = args[0].GetString(); auto it = id_to_share_target_map_.find(share_target_id); if (it == id_to_share_target_map_.end()) { CD_LOG(ERROR, Feature::NS) @@ -550,7 +550,7 @@ return; } - std::string share_target_id = args[0].GetString(); + const std::string& share_target_id = args[0].GetString(); auto it = id_to_share_target_map_.find(share_target_id); if (it == id_to_share_target_map_.end()) { CD_LOG(ERROR, Feature::NS) @@ -572,7 +572,7 @@ return; } - std::string share_target_id = args[0].GetString(); + const std::string& share_target_id = args[0].GetString(); auto it = id_to_share_target_map_.find(share_target_id); if (it == id_to_share_target_map_.end()) { CD_LOG(ERROR, Feature::NS)
diff --git a/chrome/browser/ui/webui/password_manager/promo_cards_handler.cc b/chrome/browser/ui/webui/password_manager/promo_cards_handler.cc index b58c668b..7bb4db0 100644 --- a/chrome/browser/ui/webui/password_manager/promo_cards_handler.cc +++ b/chrome/browser/ui/webui/password_manager/promo_cards_handler.cc
@@ -130,7 +130,7 @@ const base::Value::List& args) { AllowJavascript(); CHECK_EQ(1U, args.size()); - std::string promo_id = args[0].GetString(); + const std::string& promo_id = args[0].GetString(); for (auto& promo_card : promo_cards_) { if (promo_card->GetPromoID() == promo_id) {
diff --git a/chrome/browser/ui/webui/plural_string_handler.cc b/chrome/browser/ui/webui/plural_string_handler.cc index 70e01a9..8c31b5c 100644 --- a/chrome/browser/ui/webui/plural_string_handler.cc +++ b/chrome/browser/ui/webui/plural_string_handler.cc
@@ -44,7 +44,7 @@ CHECK_EQ(3U, args.size()); const base::Value& callback_id = args[0]; - std::string message_name = args[1].GetString(); + const std::string& message_name = args[1].GetString(); int count = args[2].GetInt(); auto string = GetPluralizedStringForMessageName(message_name, count); @@ -68,9 +68,9 @@ CHECK_EQ(5U, args.size()); const base::Value& callback_id = args[0]; - std::string message_name1 = args[1].GetString(); + const std::string& message_name1 = args[1].GetString(); int count1 = args[2].GetInt(); - std::string message_name2 = args[3].GetString(); + const std::string& message_name2 = args[3].GetString(); int count2 = args[4].GetInt(); auto string1 = GetPluralizedStringForMessageName(message_name1, count1);
diff --git a/chrome/browser/ui/webui/policy/policy_ui_handler.cc b/chrome/browser/ui/webui/policy/policy_ui_handler.cc index 3165750f..e3279c1 100644 --- a/chrome/browser/ui/webui/policy/policy_ui_handler.cc +++ b/chrome/browser/ui/webui/policy/policy_ui_handler.cc
@@ -351,7 +351,7 @@ void PolicyUIHandler::HandleSetLocalTestPolicies( const base::Value::List& args) { - std::string policies = args[1].GetString(); + const std::string& policies = args[1].GetString(); AllowJavascript(); if (!PolicyUI::ShouldLoadTestPage(Profile::FromWebUI(web_ui()))) { @@ -367,7 +367,7 @@ CHECK(local_test_provider); #if !BUILDFLAG(IS_ANDROID) && !BUILDFLAG(IS_CHROMEOS) - std::string profile_separation_policy_response = args[2].GetString(); + const std::string& profile_separation_policy_response = args[2].GetString(); Profile::FromWebUI(web_ui())->GetPrefs()->ClearPref( prefs::kUserCloudSigninPolicyResponseFromPolicyTestPage); Profile::FromWebUI(web_ui())->GetPrefs()->SetDefaultPrefValue( @@ -402,7 +402,7 @@ void PolicyUIHandler::HandleRestartBrowser(const base::Value::List& args) { CHECK(args.size() == 2); - std::string policies = args[1].GetString(); + const std::string& policies = args[1].GetString(); // Set policies to preference PrefService* prefs = g_browser_process->local_state(); @@ -447,7 +447,7 @@ void PolicyUIHandler::HandleUploadReport(const base::Value::List& args) { upload_report_count_ += 1; DCHECK_EQ(1u, args.size()); - std::string callback_id = args[0].GetString(); + const std::string& callback_id = args[0].GetString(); auto* report_scheduler = g_browser_process->browser_policy_connector() ->chrome_browser_cloud_management_controller() ->report_scheduler(); @@ -513,7 +513,7 @@ AllowJavascript(); #if !BUILDFLAG(IS_ANDROID) Profile* profile = Profile::FromWebUI(web_ui()); - std::string callback_id = args[0].GetString(); + const std::string& callback_id = args[0].GetString(); if (!base::FeatureList::IsEnabled(features::kEnablePolicyPromotionBanner) || profile->IsIncognitoProfile() || profile->IsGuestSession() ||
diff --git a/chrome/browser/ui/webui/settings/people_handler.cc b/chrome/browser/ui/webui/settings/people_handler.cc index f3d69bb..70c97b8b 100644 --- a/chrome/browser/ui/webui/settings/people_handler.cc +++ b/chrome/browser/ui/webui/settings/people_handler.cc
@@ -1407,7 +1407,7 @@ CHECK_NE(user_choice, ChromeSigninUserChoice::kNoChoice); CHECK(args[1].is_string()); - std::string signed_in_email = args[1].GetString(); + const std::string& signed_in_email = args[1].GetString(); CHECK(!signed_in_email.empty()); AccountInfo account =
diff --git a/chrome/browser/ui/webui/settings/protocol_handlers_handler.cc b/chrome/browser/ui/webui/settings/protocol_handlers_handler.cc index 22bcb17a..c310209 100644 --- a/chrome/browser/ui/webui/settings/protocol_handlers_handler.cc +++ b/chrome/browser/ui/webui/settings/protocol_handlers_handler.cc
@@ -245,8 +245,8 @@ if (!ok) { return custom_handlers::ProtocolHandler::EmptyProtocolHandler(); } - std::string protocol = args[0].GetString(); - std::string url = args[1].GetString(); + const std::string& protocol = args[0].GetString(); + const std::string& url = args[1].GetString(); return custom_handlers::ProtocolHandler::CreateProtocolHandler(protocol, GURL(url)); }
diff --git a/chrome/browser/ui/webui/settings/reset_settings_handler.cc b/chrome/browser/ui/webui/settings/reset_settings_handler.cc index 2557154..00d6a771 100644 --- a/chrome/browser/ui/webui/settings/reset_settings_handler.cc +++ b/chrome/browser/ui/webui/settings/reset_settings_handler.cc
@@ -145,7 +145,7 @@ CHECK_EQ(3U, args.size()); const std::string& callback_id = args[0].GetString(); const bool& send_settings = args[1].GetBool(); - std::string request_origin_string = args[2].GetString(); + const std::string& request_origin_string = args[2].GetString(); reset_report::ChromeResetReport::ResetRequestOrigin request_origin = ResetRequestOriginFromString(request_origin_string);
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 207b236..c35685b 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
@@ -174,7 +174,7 @@ void ClearBrowsingDataHandler::HandleClearBrowsingData( const base::Value::List& args_list) { CHECK_EQ(3U, args_list.size()); - std::string webui_callback_id = args_list[0].GetString(); + const std::string& webui_callback_id = args_list[0].GetString(); PrefService* prefs = profile_->GetPrefs(); uint64_t remove_mask = 0;
diff --git a/chrome/browser/ui/webui/settings/settings_secure_dns_handler.cc b/chrome/browser/ui/webui/settings/settings_secure_dns_handler.cc index f1c2b21..a90d4d17 100644 --- a/chrome/browser/ui/webui/settings/settings_secure_dns_handler.cc +++ b/chrome/browser/ui/webui/settings/settings_secure_dns_handler.cc
@@ -163,7 +163,7 @@ void SecureDnsHandler::HandleGetSecureDnsResolverList( const base::Value::List& args) { AllowJavascript(); - std::string callback_id = args[0].GetString(); + const std::string& callback_id = args[0].GetString(); ResolveJavascriptCallback(base::Value(callback_id), GetSecureDnsResolverList());
diff --git a/chrome/browser/ui/webui/settings/settings_startup_pages_handler.cc b/chrome/browser/ui/webui/settings/settings_startup_pages_handler.cc index e099baef..a1302ad1 100644 --- a/chrome/browser/ui/webui/settings/settings_startup_pages_handler.cc +++ b/chrome/browser/ui/webui/settings/settings_startup_pages_handler.cc
@@ -116,7 +116,7 @@ NOTREACHED(); } - std::string url_string = args[1].GetString(); + const std::string& url_string = args[1].GetString(); GURL url; if (!settings_utils::FixupAndValidateStartupPage(url_string, &url)) { @@ -141,7 +141,7 @@ NOTREACHED(); } - std::string url_string = args[2].GetString(); + const std::string& url_string = args[2].GetString(); GURL fixed_url; if (settings_utils::FixupAndValidateStartupPage(url_string, &fixed_url)) {
diff --git a/chrome/browser/ui/webui/settings/site_settings_handler.cc b/chrome/browser/ui/webui/settings/site_settings_handler.cc index daacf720..3035c50 100644 --- a/chrome/browser/ui/webui/settings/site_settings_handler.cc +++ b/chrome/browser/ui/webui/settings/site_settings_handler.cc
@@ -1001,9 +1001,9 @@ AllowJavascript(); CHECK_EQ(3U, args.size()); - std::string callback_id = args[0].GetString(); + const std::string& callback_id = args[0].GetString(); int num_members = args[1].GetInt(); - std::string rws_owner = args[2].GetString(); + const std::string& rws_owner = args[2].GetString(); const std::string label = base::UTF16ToUTF8(base::i18n::MessageFormatter::FormatWithNamedArgs( @@ -1136,7 +1136,7 @@ AllowJavascript(); CHECK_EQ(1U, args.size()); - std::string callback_id = args[0].GetString(); + const std::string& callback_id = args[0].GetString(); all_sites_map_.clear(); origin_permission_set_.clear(); @@ -1240,7 +1240,7 @@ AllowJavascript(); CHECK_EQ(2U, args.size()); - std::string callback_id = args[0].GetString(); + const std::string& callback_id = args[0].GetString(); const std::string& origin_string = args[1].GetString(); base::Value::List result; @@ -1257,7 +1257,7 @@ AllowJavascript(); CHECK_EQ(2U, args.size()); - std::string callback_id = args[0].GetString(); + const std::string& callback_id = args[0].GetString(); size_t max_sources = base::checked_cast<size_t>(args[1].GetInt()); const std::vector<ContentSettingsType>& content_types = @@ -1454,7 +1454,7 @@ CHECK_EQ(3U, args.size()); const base::Value& callback_id = args[0]; - std::string origin = args[1].GetString(); + const std::string& origin = args[1].GetString(); const base::Value::List& types = args[2].GetList(); // Note: Invalid URLs will just result in default settings being shown. @@ -1564,7 +1564,7 @@ CHECK_EQ(3U, args.size()); const std::string& origin_string = args[0].GetString(); const std::string* type_string = args[1].GetIfString(); - std::string value = args[2].GetString(); + const std::string& value = args[2].GetString(); const GURL origin(origin_string); if (!origin.is_valid()) { @@ -2058,7 +2058,7 @@ void SiteSettingsHandler::HandleRemoveZoomLevel(const base::Value::List& args) { CHECK_EQ(1U, args.size()); - std::string host_or_spec = args[0].GetString(); + const std::string& host_or_spec = args[0].GetString(); GURL url(host_or_spec); if (url.is_valid() && url.scheme() == chrome::kIsolatedAppScheme) {
diff --git a/chrome/browser/ui/webui/top_chrome/webui_contents_preload_manager_browsertest.cc b/chrome/browser/ui/webui/top_chrome/webui_contents_preload_manager_browsertest.cc index db42de0..09ceaa6e 100644 --- a/chrome/browser/ui/webui/top_chrome/webui_contents_preload_manager_browsertest.cc +++ b/chrome/browser/ui/webui/top_chrome/webui_contents_preload_manager_browsertest.cc
@@ -276,8 +276,14 @@ // Tests that the time from the WebUI is requested to when First Contentful // Paint (FCP) is recorded. +// TODO(crbug.com/40168622): this times out on Chromium OS ASan LSan Tests. +#if BUILDFLAG(IS_CHROMEOS) && defined(ADDRESS_SANITIZER) +#define MAYBE_RequestToFCPAndLCP DISABLED_RequestToFCPAndLCP +#else +#define MAYBE_RequestToFCPAndLCP RequestToFCPAndLCP +#endif IN_PROC_BROWSER_TEST_F(WebUIContentsPreloadManagerPageLoadMetricsTest, - RequestToFCPAndLCP) { + MAYBE_RequestToFCPAndLCP) { // Serves the test origin with files from the test data folder. auto url_loader_interceptor = content::URLLoaderInterceptor::ServeFilesFromDirectoryAtOrigin(
diff --git a/chrome/build/android-arm32.pgo.txt b/chrome/build/android-arm32.pgo.txt index c668686..a25e9d98 100644 --- a/chrome/build/android-arm32.pgo.txt +++ b/chrome/build/android-arm32.pgo.txt
@@ -1 +1 @@ -chrome-android32-main-1750075037-9fdd93ded420c6659efa2be98a33e5db289a50ae-e4f8e195a8345123a44875816a9e4f0d6e81cc76.profdata +chrome-android32-main-1750096673-b3c92c4113b6bf9569bdd4f339bbaa39a09c604d-c9b0244ea9263753a08d76d364047eb5ce63ba3a.profdata
diff --git a/chrome/build/android-arm64.pgo.txt b/chrome/build/android-arm64.pgo.txt index 69dd992..a58408c0 100644 --- a/chrome/build/android-arm64.pgo.txt +++ b/chrome/build/android-arm64.pgo.txt
@@ -1 +1 @@ -chrome-android64-main-1750081143-02a1187a76c1b51afe472fba8e61184aa7e931bc-e8210b0c49f70985863715d21f6b080ce7a9960a.profdata +chrome-android64-main-1750092216-054bd26d04f2954849fc55ae7aa45cfddb1ae253-027844e56e587fa64df77c376df2c94f14b354a7.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt index 287de5a..c577095 100644 --- a/chrome/build/mac-arm.pgo.txt +++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@ -chrome-mac-arm-main-1750082360-981f89a10895f9029b8453d757e8e2c883b21ed9-c84d5761297ba5c1fd1c78c3556878e2d5ac8bbb.profdata +chrome-mac-arm-main-1750096673-b94f71e0eb48851f936650f4ed55e63ef9e60df0-c9b0244ea9263753a08d76d364047eb5ce63ba3a.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt index 393bc0e7..d339165 100644 --- a/chrome/build/win32.pgo.txt +++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@ -chrome-win32-main-1750053232-7d69de9c36d51e9ae0238330d322e0e70e4929c2-1e7bd3c1484bb4a9e8c3ff5e58bcfe93f4fe86ba.profdata +chrome-win32-main-1750064332-37e93b5e6c3c17929ce69ce32527533c44856ccb-ea889c052c9544f31174a229c79bacaa0fd36694.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index 52ec6260..3efcee2 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-main-1750064332-46c982fa88d5c2af61bc4b896d231c91708afebc-ea889c052c9544f31174a229c79bacaa0fd36694.profdata +chrome-win64-main-1750075037-6ed8d89febffa68ca3472c6ac867f1f568bfb7f1-e4f8e195a8345123a44875816a9e4f0d6e81cc76.profdata
diff --git a/chrome/common/actor.mojom b/chrome/common/actor.mojom index 8aca4ea8..b85868dc 100644 --- a/chrome/common/actor.mojom +++ b/chrome/common/actor.mojom
@@ -183,6 +183,9 @@ // executing. kExecutorDestroyed = 24, + // The target window no longer exists. + kWindowWentAway = 25, + /////////////////////////////////////////////////////////////////////// // Codes 100-199: Errors for navigation. (Not part of the ToolAction union // as it's a browser-side tool.)
diff --git a/chrome/common/extensions/api/enterprise_reporting_private.idl b/chrome/common/extensions/api/enterprise_reporting_private.idl index 6d580d2..2490d65 100644 --- a/chrome/common/extensions/api/enterprise_reporting_private.idl +++ b/chrome/common/extensions/api/enterprise_reporting_private.idl
@@ -319,10 +319,14 @@ enum DetectorType { PREDEFINED_DLP, USER_DEFINED }; // Information for a data detector used to apply data masking functionality. + // The fields of this dictionary correspond to the proto fields of + // `MatchedUrlNavigationRule::DataMaskingAction`. dictionary MatchedDetector { DOMString detectorId; DOMString displayName; - DetectorType detectorType; + DOMString? maskType; + DOMString? pattern; + DetectorType? detectorType; }; // Information for a data leak prevention rule that was used to mask data. @@ -437,21 +441,15 @@ DoneCallback callback); }; - dictionary DataMaskingRule { - // Corresponds to `MatchedUrlNavigationRule::DataMaskingAction::mask_type`. - DOMString level; - - // Corresponds to `MatchedUrlNavigationRule::DataMaskingAction::pattern`. - DOMString regex_pattern; - - // The URL being navigated to that triggered the rule. + dictionary DataMaskingRules { + // The URL being navigated to that triggered the rules. DOMString url; - TriggeredRuleInfo triggeredRuleInfo; + TriggeredRuleInfo[] triggeredRuleInfo; }; interface Events { - static void onDataMaskingRulesTriggered(DataMaskingRule[] rules); + static void onDataMaskingRulesTriggered(DataMaskingRules rules); }; };
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h index c2c4af0..27a94f3 100644 --- a/chrome/common/pref_names.h +++ b/chrome/common/pref_names.h
@@ -3265,6 +3265,11 @@ // sessions. inline constexpr char kKioskChromeAppsForceAllowed[] = "kiosk_chrome_apps_force_allowed"; + +// A boolean pref which determines whether kiosk application level logs would be +// collected and stored. +inline constexpr char kKioskApplicationLogCollectionEnabled[] = + "kiosk_application_log_collection_enabled"; #endif // BUILDFLAG(IS_CHROMEOS) #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_MAC) || BUILDFLAG(IS_WIN) || \
diff --git a/chrome/enterprise_companion/BUILD.gn b/chrome/enterprise_companion/BUILD.gn index 3b4c4aac..b6e8d24 100644 --- a/chrome/enterprise_companion/BUILD.gn +++ b/chrome/enterprise_companion/BUILD.gn
@@ -468,9 +468,10 @@ } if (is_mac && !is_component_build && enable_dsyms) { + _symbols_sources = [ "$root_out_dir/$enterprise_companion_product_full_name.app/Contents/MacOS/$enterprise_companion_product_full_name" ] action("syms") { script = "//build/redirect_stdout.py" - sources = [ "$root_out_dir/$enterprise_companion_product_full_name.app/Contents/MacOS/$enterprise_companion_product_full_name" ] + sources = _symbols_sources _dump_syms = "//third_party/breakpad:dump_syms($host_system_allocator_toolchain)" public_deps = [ @@ -494,6 +495,19 @@ root_build_dir), ] } + + action("syms_archive") { + script = "//chrome/tools/build/mac/archive_symbols.py" + sources = _symbols_sources + deps = [ ":syms" ] + _output = + "$root_out_dir/$enterprise_companion_product_full_name.dSYM.tar.bz2" + outputs = [ _output ] + args = [ rebase_path(_output, root_out_dir) ] + + rebase_path( + [ "$root_out_dir/$enterprise_companion_product_full_name.dSYM" ], + root_out_dir) + } } # The contents of this zip are uploaded by archivers (//infra/archive_config). @@ -517,9 +531,10 @@ ] if (!is_component_build && enable_dsyms) { # Build symbols but do not include them in the archive. In official - # builds, the symbols built alongside the archive will be uploaded to the - # crash servers via symupload. - deps += [ ":syms" ] + # builds, breakpad symbols built alongside the archive will be uploaded to + # the crash servers via symupload and native symbols will be archived in + # chrome-unsigned. + deps += [ ":syms_archive" ] } } else if (is_win) { inputs = [ "$root_build_dir/enterprise_companion.exe" ]
diff --git a/chrome/renderer/accessibility/phrase_segmentation/dependency_parser_model.cc b/chrome/renderer/accessibility/phrase_segmentation/dependency_parser_model.cc index 1841e55..fe0b85d 100644 --- a/chrome/renderer/accessibility/phrase_segmentation/dependency_parser_model.cc +++ b/chrome/renderer/accessibility/phrase_segmentation/dependency_parser_model.cc
@@ -4,6 +4,7 @@ #include "chrome/renderer/accessibility/phrase_segmentation/dependency_parser_model.h" +#include "base/logging.h" #include "base/metrics/histogram_functions.h" #include "base/metrics/histogram_macros.h" #include "base/metrics/histogram_macros_local.h"
diff --git a/chrome/renderer/actor/page_stability_monitor.cc b/chrome/renderer/actor/page_stability_monitor.cc index 615d425..8000267 100644 --- a/chrome/renderer/actor/page_stability_monitor.cc +++ b/chrome/renderer/actor/page_stability_monitor.cc
@@ -48,24 +48,23 @@ } // namespace -PageStabilityMonitor::PageStabilityMonitor(RenderFrame& frame, - int32_t task_id, - Journal& journal) +PageStabilityMonitor::PageStabilityMonitor(RenderFrame& frame) : RenderFrameObserver(&frame) { CHECK(render_frame()); CHECK(render_frame()->GetWebFrame()); starting_request_count_ = render_frame()->GetWebFrame()->GetDocument().ActiveResourceRequestCount(); - - journal_entry_ = - journal.CreatePendingAsyncEntry(task_id, "PageStability", ""); } PageStabilityMonitor::~PageStabilityMonitor() = default; -void PageStabilityMonitor::WaitForStable(base::OnceClosure callback) { +void PageStabilityMonitor::WaitForStable(int32_t task_id, + Journal& journal, + base::OnceClosure callback) { CHECK_EQ(state_, State::kInitial); CHECK(!is_stable_callback_); + journal_entry_ = + journal.CreatePendingAsyncEntry(task_id, "PageStability", ""); is_stable_callback_ = std::move(callback);
diff --git a/chrome/renderer/actor/page_stability_monitor.h b/chrome/renderer/actor/page_stability_monitor.h index 7592ccc..9fdee068 100644 --- a/chrome/renderer/actor/page_stability_monitor.h +++ b/chrome/renderer/actor/page_stability_monitor.h
@@ -24,14 +24,14 @@ public: // Constructs the monitor and takes a baseline observation of the document in // the given RenderFrame. - PageStabilityMonitor(content::RenderFrame& frame, - int32_t task_id, - Journal& journal); + explicit PageStabilityMonitor(content::RenderFrame& frame); ~PageStabilityMonitor() override; // Invokes the given callback when the page is deemed stable enough for an // observation to take place or when the document is no longer active. - void WaitForStable(base::OnceClosure callback); + void WaitForStable(int32_t task_id, + Journal& journal, + base::OnceClosure callback); // RenderFrameObserver void DidCommitProvisionalLoad(ui::PageTransition transition) override;
diff --git a/chrome/renderer/actor/tool_executor.cc b/chrome/renderer/actor/tool_executor.cc index b6a0a09..0e99615 100644 --- a/chrome/renderer/actor/tool_executor.cc +++ b/chrome/renderer/actor/tool_executor.cc
@@ -39,6 +39,8 @@ ToolExecutorCallback callback) { CHECK(!completion_callback_); completion_callback_ = std::move(callback); + journal_entry_ = + journal_->CreatePendingAsyncEntry(request->task_id, "InvokeTool", ""); WebLocalFrame* web_frame = frame_->GetWebFrame(); // Check LocalRoot in case the frame is a subframe. @@ -100,21 +102,24 @@ NOTREACHED(); } - journal_->Log(request->task_id, "Renderer InvokeTool", tool->DebugString()); + page_stability_monitor_ = std::make_unique<PageStabilityMonitor>(*frame_); - page_stability_monitor_ = std::make_unique<PageStabilityMonitor>( - *frame_, request->task_id, *journal_); - + auto execute_journal = journal_->CreatePendingAsyncEntry( + request->task_id, "ExecuteTool", tool->DebugString()); mojom::ActionResultPtr result = tool->Execute(); + execute_journal.reset(); - page_stability_monitor_->WaitForStable(base::BindOnce( - &ToolExecutor::ToolFinished, base::Unretained(this), std::move(result))); + page_stability_monitor_->WaitForStable( + request->task_id, *journal_, + base::BindOnce(&ToolExecutor::ToolFinished, base::Unretained(this), + std::move(result))); } void ToolExecutor::ToolFinished(mojom::ActionResultPtr result) { CHECK(completion_callback_); page_stability_monitor_.reset(); std::move(completion_callback_).Run(std::move(result)); + journal_entry_.reset(); } } // namespace actor
diff --git a/chrome/renderer/actor/tool_executor.h b/chrome/renderer/actor/tool_executor.h index 7a69e35..9b7a1ae 100644 --- a/chrome/renderer/actor/tool_executor.h +++ b/chrome/renderer/actor/tool_executor.h
@@ -47,6 +47,7 @@ base::raw_ref<Journal> journal_; std::unique_ptr<PageStabilityMonitor> page_stability_monitor_; ToolExecutorCallback completion_callback_; + std::unique_ptr<Journal::PendingAsyncEntry> journal_entry_; base::WeakPtrFactory<ToolExecutor> weak_ptr_factory_{this}; };
diff --git a/chrome/renderer/chrome_content_renderer_client.cc b/chrome/renderer/chrome_content_renderer_client.cc index 3d67ccaa..e022ae83 100644 --- a/chrome/renderer/chrome_content_renderer_client.cc +++ b/chrome/renderer/chrome_content_renderer_client.cc
@@ -1752,7 +1752,7 @@ #endif } -void ChromeContentRendererClient::WillPrepareForEvaluationOnWorkerThread( +void ChromeContentRendererClient::WillEvaluateServiceWorkerOnWorkerThread( blink::WebServiceWorkerContextProxy* context_proxy, v8::Local<v8::Context> v8_context, int64_t service_worker_version_id, @@ -1762,20 +1762,12 @@ #if BUILDFLAG(ENABLE_EXTENSIONS_CORE) extensions::ExtensionsRendererClient::Get() ->dispatcher() - ->WillPrepareForEvaluationOnWorkerThread( + ->WillEvaluateServiceWorkerOnWorkerThread( context_proxy, v8_context, service_worker_version_id, service_worker_scope, script_url, service_worker_token); #endif } -void ChromeContentRendererClient::WillEvaluateServiceWorkerOnWorkerThread() { -#if BUILDFLAG(ENABLE_EXTENSIONS_CORE) - extensions::ExtensionsRendererClient::Get() - ->dispatcher() - ->WillEvaluateServiceWorkerOnWorkerThread(); -#endif -} - void ChromeContentRendererClient::DidStartServiceWorkerContextOnWorkerThread( int64_t service_worker_version_id, const GURL& service_worker_scope,
diff --git a/chrome/renderer/chrome_content_renderer_client.h b/chrome/renderer/chrome_content_renderer_client.h index 5b4a0f2..8c08514 100644 --- a/chrome/renderer/chrome_content_renderer_client.h +++ b/chrome/renderer/chrome_content_renderer_client.h
@@ -207,14 +207,13 @@ blink::WebServiceWorkerContextProxy* context_proxy, const GURL& service_worker_scope, const GURL& script_url) override; - void WillPrepareForEvaluationOnWorkerThread( + void WillEvaluateServiceWorkerOnWorkerThread( blink::WebServiceWorkerContextProxy* context_proxy, v8::Local<v8::Context> v8_context, int64_t service_worker_version_id, const GURL& service_worker_scope, const GURL& script_url, const blink::ServiceWorkerToken& service_worker_token) override; - void WillEvaluateServiceWorkerOnWorkerThread() override; void DidStartServiceWorkerContextOnWorkerThread( int64_t service_worker_version_id, const GURL& service_worker_scope,
diff --git a/chrome/test/BUILD.gn b/chrome/test/BUILD.gn index 2a74de7..c877b9d0 100644 --- a/chrome/test/BUILD.gn +++ b/chrome/test/BUILD.gn
@@ -4635,7 +4635,6 @@ sources += [ "../browser/extensions/api/identity/launch_web_auth_flow_delegate_ash_browsertest.cc", - "../browser/extensions/component_extension_browsertest.cc", "../browser/ui/views/extensions/web_file_handlers/web_file_handlers_file_launch_browsertest.cc", ] } @@ -5744,7 +5743,6 @@ if (enable_webui_tab_strip) { sources += [ - "../browser/ui/views/frame/webui_tab_strip_container_view_browsertest.cc", "../browser/ui/views/frame/webui_tab_strip_field_trial_browsertest.cc", "../browser/ui/views/toolbar/webui_tab_counter_button_browsertest.cc", "../browser/ui/webui/tab_strip/tab_strip_ui_browsertest.cc", @@ -6614,6 +6612,7 @@ if (enable_webui_tab_strip) { sources += [ + "../browser/ui/views/frame/webui_tab_strip_container_view_unittest.cc", "../browser/ui/webui/tab_strip/tab_strip_page_handler_unittest.cc", "../browser/ui/webui/tab_strip/tab_strip_ui_layout_unittest.cc", "../browser/ui/webui/tab_strip/thumbnail_tracker_unittest.cc", @@ -12209,10 +12208,13 @@ "//components/bookmarks/browser:test_support", "//components/bookmarks/managed", "//components/browser_sync", + "//components/commerce/core:feature_list", "//components/favicon/core", "//components/invalidation/impl", "//components/invalidation/impl:test_support", "//components/os_crypt/sync:test_support", + "//components/password_manager/core/browser:password_manager_buildflags", + "//components/plus_addresses:features", "//components/saved_tab_groups/public", "//components/signin/public/identity_manager:test_support", "//components/sync", @@ -12270,6 +12272,7 @@ ":sync_integration_test_support_jni_headers", ":test_support_jni_headers", "//chrome/browser/android/webapk:webapk_sources", + "//chrome/browser/password_manager/android:utils", "//chrome/browser/ui/android/tab_model", "//components/saved_tab_groups/public:conversion_utils", ]
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 d30d7ea3..e7e1302b 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
@@ -37,7 +37,12 @@ mTest.appendCommandLineFlags( "--remote-debugging-socket-name android_browsertests_devtools_remote"); - NativeBrowserTest.deletePrivateDataDirectory(getPrivateDataDirectory()); + // TODO(crbug.com/40200835): Enable PRE_ tests in android_browsertests + // Note that android_browsertests does not use this data directory. It + // uses a temp dir created by c++ code since https://crrev.com/c/1677591 + if (!mTest.shouldKeepUserDataDir()) { + NativeBrowserTest.deletePrivateDataDirectory(getPrivateDataDirectory()); + } // Replace ContentMain() with running our NativeTest suite. BrowserStartupController.getInstance()
diff --git a/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/dom_distiller/ReaderModePreferencesDialog.java b/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/dom_distiller/ReaderModePreferencesDialog.java index 1c65440..2c16c48 100644 --- a/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/dom_distiller/ReaderModePreferencesDialog.java +++ b/chrome/test/android/javatests/src/org/chromium/chrome/test/transit/dom_distiller/ReaderModePreferencesDialog.java
@@ -11,7 +11,6 @@ import android.widget.SeekBar; import android.widget.Spinner; -import androidx.test.espresso.Espresso; import androidx.test.espresso.action.GeneralClickAction; import androidx.test.espresso.action.GeneralLocation; import androidx.test.espresso.action.Press; @@ -19,7 +18,8 @@ import androidx.test.platform.app.InstrumentationRegistry; import org.chromium.base.test.transit.CarryOn; -import org.chromium.base.test.transit.Condition; +import org.chromium.base.test.transit.Triggers; +import org.chromium.base.test.transit.TripBuilder; import org.chromium.base.test.transit.ViewElement; import org.chromium.chrome.browser.app.ChromeActivity; import org.chromium.chrome.test.R; @@ -67,46 +67,26 @@ fontSizeSliderElement = declareView(SeekBar.class, withId(R.id.font_size)); } - public void pickColorLight(Condition condition) { - Condition.runAndWaitFor(lightButtonElement.getClickTrigger(), condition); - } - - public void pickColorDark(Condition condition) { - Condition.runAndWaitFor(darkButtonElement.getClickTrigger(), condition); - } - - public void pickColorSepia(Condition condition) { - Condition.runAndWaitFor(sepiaButtonElement.getClickTrigger(), condition); - } - - public void setFontSizeSliderToMin(Condition condition) { + public TripBuilder setFontSizeSliderToMinTo() { // Min is 50% font size. - Condition.runAndWaitFor( - fontSizeSliderElement.getPerformTrigger( - new GeneralClickAction( - Tap.SINGLE, GeneralLocation.CENTER_LEFT, Press.FINGER)), - condition); + return fontSizeSliderElement.performViewActionTo( + new GeneralClickAction(Tap.SINGLE, GeneralLocation.CENTER_LEFT, Press.FINGER)); } - public void setFontSizeSliderToMax(Condition condition) { - Condition.runAndWaitFor( - fontSizeSliderElement.getPerformTrigger( - new GeneralClickAction( - Tap.SINGLE, GeneralLocation.CENTER_RIGHT, Press.FINGER)), - condition); - } - - public void pressBackToClose() { - drop(Espresso::pressBack); + public TripBuilder setFontSizeSliderToMaxTo() { + return fontSizeSliderElement.performViewActionTo( + new GeneralClickAction(Tap.SINGLE, GeneralLocation.CENTER_RIGHT, Press.FINGER)); } public static ReaderModePreferencesDialog open(ChromeActivity activity) { - return CarryOn.pickUp( - new ReaderModePreferencesDialog(), - () -> - MenuUtils.invokeCustomMenuActionSync( - InstrumentationRegistry.getInstrumentation(), - activity, - R.id.reader_mode_prefs_id)); + // TODO(crbug.com/350074837): when this is a Facility, use + // ChromeTriggers#invokeCustomMenuActionTo(). + return Triggers.runTo( + () -> + MenuUtils.invokeCustomMenuActionSync( + InstrumentationRegistry.getInstrumentation(), + activity, + R.id.reader_mode_prefs_id)) + .pickUpCarryOn(new ReaderModePreferencesDialog()); } }
diff --git a/chrome/test/data/extensions/service_worker/mojo/manifest.json b/chrome/test/data/extensions/service_worker/mojo/manifest.json deleted file mode 100644 index 51c919b..0000000 --- a/chrome/test/data/extensions/service_worker/mojo/manifest.json +++ /dev/null
@@ -1,12 +0,0 @@ -{ - "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA22ThlvdzIV2u5FrtEP9ab+EjrI/nMcrY9NPoBqIannUPKpB4RjcKWNwsjyiHC/n5x1FQ6xNQ2LT9PSgOqk6hn1tIYkdrKYKGzpWHDaIsRqtIDPj0htcV1QvXB1Ct3xzR54Dn1OtZceoxPxtTOOD4po8I8zfos59TSyZk3XKSBlP8/laxo33Lze9gadH2wF6u1crBtbNq4O1Wj6DB5o7YKwu/KjY8MUcL4Eks8cAfvR+GXEgCqS5l4x2nnfAYdu/YhzeVCYKbwqUB+trCeYdtc20zLExOm9ruwJs9moD6wmAOBtgiTBqFb7iN4EpbvoupD0FFB/FWU1MzlkZXm/x+eQIDAQAB", - "name": "Test component extension", - "version": "1.0", - "manifest_version": 3, - "background": { - "service_worker": "sw.js" - }, - "permissions": [ - "mojoPrivate" - ] -}
diff --git a/chrome/test/data/extensions/service_worker/mojo/sw.js b/chrome/test/data/extensions/service_worker/mojo/sw.js deleted file mode 100644 index d7697b2..0000000 --- a/chrome/test/data/extensions/service_worker/mojo/sw.js +++ /dev/null
@@ -1,12 +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. - -chrome.test.runTests([ - function createMojoMessagePipe() { - let {handle0, handle1} = Mojo.createMessagePipe(); - handle0.close(); - handle1.close(); - chrome.test.succeed(); - } -]);
diff --git a/chrome/test/data/webui/settings/site_details_test.ts b/chrome/test/data/webui/settings/site_details_test.ts index 0678b04..4c544fb 100644 --- a/chrome/test/data/webui/settings/site_details_test.ts +++ b/chrome/test/data/webui/settings/site_details_test.ts
@@ -53,6 +53,9 @@ let websiteUsageProxy: TestWebsiteUsageBrowserProxy; // Initialize a site-details before each test. + // + // It may also be required to add the ContentSettingsType in the constructor + // in test_site_settings_prefs_browser_proxy.ts. setup(function() { loadTimeData.overrideValues({ enableWebPrintingContentSetting: true, @@ -191,6 +194,9 @@ createContentSettingTypeToValuePair( ContentSettingsTypes.POINTER_LOCK, [createRawSiteException('https://foo.com:443')]), + createContentSettingTypeToValuePair( + ContentSettingsTypes.LOCAL_NETWORK_ACCESS, + [createRawSiteException('https://foo.com:443')]), ], [ createContentSettingTypeToValuePair(
diff --git a/chrome/test/data/webui/settings/test_site_settings_prefs_browser_proxy.ts b/chrome/test/data/webui/settings/test_site_settings_prefs_browser_proxy.ts index 66adee1..90bc7dc 100644 --- a/chrome/test/data/webui/settings/test_site_settings_prefs_browser_proxy.ts +++ b/chrome/test/data/webui/settings/test_site_settings_prefs_browser_proxy.ts
@@ -140,6 +140,10 @@ } // </if> + if (loadTimeData.getBoolean('enableLocalNetworkAccessSetting')) { + this.categoryList_.push(ContentSettingsTypes.LOCAL_NETWORK_ACCESS); + } + this.prefs_ = createSiteSettingsPrefs([], [], []); }
diff --git a/chromecast/browser/android/junit/src/org/chromium/chromecast/shell/CastWebContentsActivityTest.java b/chromecast/browser/android/junit/src/org/chromium/chromecast/shell/CastWebContentsActivityTest.java index ffc5015..4a22295 100644 --- a/chromecast/browser/android/junit/src/org/chromium/chromecast/shell/CastWebContentsActivityTest.java +++ b/chromecast/browser/android/junit/src/org/chromium/chromecast/shell/CastWebContentsActivityTest.java
@@ -31,7 +31,6 @@ import android.content.pm.PackageManager; import android.media.AudioManager; import android.net.Uri; -import android.os.Build; import android.os.PatternMatcher; import android.view.KeyEvent; import android.view.MotionEvent; @@ -282,23 +281,6 @@ } @Test - @Config(sdk = {Build.VERSION_CODES.O}) - public void testTurnsScreenOnIfTurnOnScreen_AndroidO() { - mActivityLifecycle = - Robolectric.buildActivity( - CastWebContentsActivity.class, - CastWebContentsIntentUtils.requestStartCastActivity( - mWebContents, true, false, true, false, "0")); - mActivity = mActivityLifecycle.get(); - mActivity.testingModeForTesting(); - mActivityLifecycle.create(); - - Assert.assertTrue( - Shadows.shadowOf(mActivity.getWindow()) - .getFlag(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON)); - } - - @Test @Config(shadows = {ExtendedShadowActivity.class}) public void testDoesNotTurnScreenOnIfNotTurnOnScreen() { mActivityLifecycle = @@ -316,23 +298,6 @@ } @Test - @Config(sdk = {Build.VERSION_CODES.O}) - public void testDoesNotTurnScreenOnIfNotTurnOnScreen_AndroidO() { - mActivityLifecycle = - Robolectric.buildActivity( - CastWebContentsActivity.class, - CastWebContentsIntentUtils.requestStartCastActivity( - mWebContents, true, false, true, false, "0")); - mActivity = mActivityLifecycle.get(); - mActivity.testingModeForTesting(); - mActivityLifecycle.create(); - - Assert.assertTrue( - Shadows.shadowOf(mActivity.getWindow()) - .getFlag(WindowManager.LayoutParams.FLAG_TURN_SCREEN_ON)); - } - - @Test public void testKeepsScreenOnIfRequested() { mActivityLifecycle = Robolectric.buildActivity( @@ -464,9 +429,7 @@ } @Test - @Config( - shadows = {ExtendedShadowActivity.class}, - sdk = {Build.VERSION_CODES.O}) + @Config(shadows = {ExtendedShadowActivity.class}) public void testStopWhileNotInPipModeDoesNotCloseActivity() { mShadowActivityManager.setLockTaskModeState(ActivityManager.LOCK_TASK_MODE_NONE); mActivityLifecycle.create().start().resume(); @@ -480,9 +443,7 @@ } @Test - @Config( - shadows = {ExtendedShadowActivity.class}, - sdk = {Build.VERSION_CODES.O}) + @Config(shadows = {ExtendedShadowActivity.class}) public void testStopWhileInPipModeDoesNotClosesActivity() { mShadowActivityManager.setLockTaskModeState(ActivityManager.LOCK_TASK_MODE_NONE); mActivityLifecycle.create().start().resume();
diff --git a/chromeos/ash/components/report/device_metrics/actives/one_day_impl.cc b/chromeos/ash/components/report/device_metrics/actives/one_day_impl.cc index 1c8000e..68e6340 100644 --- a/chromeos/ash/components/report/device_metrics/actives/one_day_impl.cc +++ b/chromeos/ash/components/report/device_metrics/actives/one_day_impl.cc
@@ -117,7 +117,7 @@ } void OneDayImpl::OnCheckMembershipOprfComplete( - std::unique_ptr<std::string> response_body) { + std::optional<std::string> response_body) { // Use RAII to reset |url_loader_| after current function scope. auto url_loader = std::move(url_loader_); @@ -127,18 +127,17 @@ // Convert serialized response body to oprf response protobuf. FresnelPsmRlweOprfResponse psm_oprf_response; - bool is_response_body_set = response_body.get() != nullptr; base::UmaHistogramBoolean(kHistogramsIsPsm1DAOprfResponseBodySet, - is_response_body_set); + response_body.has_value()); - if (!is_response_body_set || + if (!response_body.has_value() || !psm_oprf_response.ParseFromString(*response_body)) { base::UmaHistogramBoolean(kHistogramsIsPsm1DAOprfResponseParsedCorrectly, false); LOG(ERROR) << "Oprf response net code = " << net_code; LOG(ERROR) << "Response body was not set or could not be parsed into " << "FresnelPsmRlweOprfResponse proto. " - << "Is response body set = " << is_response_body_set; + << "Is response body set = " << response_body.has_value(); utils::RecordCheckMembershipCases( utils::PsmUseCase::k1DA, utils::CheckMembershipResponseCases::kOprfResponseBodyFailed); @@ -208,7 +207,7 @@ } void OneDayImpl::OnCheckMembershipQueryComplete( - std::unique_ptr<std::string> response_body) { + std::optional<std::string> response_body) { // Use RAII to reset |url_loader_| after current function scope. auto url_loader = std::move(url_loader_); @@ -218,14 +217,12 @@ // Convert serialized response body to fresnel query response protobuf. FresnelPsmRlweQueryResponse psm_query_response; - bool is_response_body_set = response_body.get() != nullptr; - - if (!is_response_body_set || + if (!response_body.has_value() || !psm_query_response.ParseFromString(*response_body)) { LOG(ERROR) << "Query response net code = " << net_code; LOG(ERROR) << "Response body was not set or could not be parsed into " << "FresnelPsmRlweQueryResponse proto. " - << "Is response body set = " << is_response_body_set; + << "Is response body set = " << response_body.has_value(); utils::RecordCheckMembershipCases( utils::PsmUseCase::k1DA, utils::CheckMembershipResponseCases::kQueryResponseBodyFailed); @@ -318,7 +315,7 @@ utils::GetMaxFresnelResponseSizeBytes()); } -void OneDayImpl::OnCheckInComplete(std::unique_ptr<std::string> response_body) { +void OneDayImpl::OnCheckInComplete(std::optional<std::string> response_body) { // Use RAII to reset |url_loader_| after current function scope. auto url_loader = std::move(url_loader_);
diff --git a/chromeos/ash/components/report/device_metrics/actives/one_day_impl.h b/chromeos/ash/components/report/device_metrics/actives/one_day_impl.h index 0ff016f93..8fa4c9905 100644 --- a/chromeos/ash/components/report/device_metrics/actives/one_day_impl.h +++ b/chromeos/ash/components/report/device_metrics/actives/one_day_impl.h
@@ -33,14 +33,14 @@ // UseCase: void CheckMembershipOprf() override; void OnCheckMembershipOprfComplete( - std::unique_ptr<std::string> response_body) override; + std::optional<std::string> response_body) override; void CheckMembershipQuery( const private_membership::rlwe::PrivateMembershipRlweOprfResponse& oprf_response) override; void OnCheckMembershipQueryComplete( - std::unique_ptr<std::string> response_body) override; + std::optional<std::string> response_body) override; void CheckIn() override; - void OnCheckInComplete(std::unique_ptr<std::string> response_body) override; + void OnCheckInComplete(std::optional<std::string> response_body) override; base::Time GetLastPingTimestamp() override; void SetLastPingTimestamp(base::Time ts) override; std::vector<private_membership::rlwe::RlwePlaintextId>
diff --git a/chromeos/ash/components/report/device_metrics/actives/twenty_eight_day_impl.cc b/chromeos/ash/components/report/device_metrics/actives/twenty_eight_day_impl.cc index dff70cae..d50f081 100644 --- a/chromeos/ash/components/report/device_metrics/actives/twenty_eight_day_impl.cc +++ b/chromeos/ash/components/report/device_metrics/actives/twenty_eight_day_impl.cc
@@ -72,7 +72,7 @@ } void TwentyEightDayImpl::OnCheckMembershipOprfComplete( - std::unique_ptr<std::string> response_body) { + std::optional<std::string> response_body) { NOTREACHED(); } @@ -82,7 +82,7 @@ } void TwentyEightDayImpl::OnCheckMembershipQueryComplete( - std::unique_ptr<std::string> response_body) { + std::optional<std::string> response_body) { NOTREACHED(); } @@ -113,13 +113,13 @@ } void TwentyEightDayImpl::OnCheckInComplete( - std::unique_ptr<std::string> response_body) { + std::optional<std::string> response_body) { NOTREACHED(); } void TwentyEightDayImpl::OnCheckInCompleteCustom( const FresnelImportDataRequest import_request, - std::unique_ptr<std::string> response_body) { + std::optional<std::string> response_body) { // Use RAII to reset |url_loader_| after current function scope. auto url_loader = std::move(url_loader_); @@ -421,7 +421,7 @@ } void TwentyEightDayImpl::OnCheckMembershipOprfCompleteFirstPhase( - std::unique_ptr<std::string> response_body) { + std::optional<std::string> response_body) { // Use RAII to reset |url_loader_| after current function scope. auto url_loader = std::move(url_loader_); @@ -431,14 +431,12 @@ // Convert serialized response body to oprf response protobuf. FresnelPsmRlweOprfResponse psm_oprf_response; - bool is_response_body_set = response_body.get() != nullptr; - - if (!is_response_body_set || + if (!response_body.has_value() || !psm_oprf_response.ParseFromString(*response_body)) { LOG(ERROR) << "First phase OPRF response net code = " << net_code; LOG(ERROR) << "Response body was not set or could not be parsed into " << "FresnelPsmRlweOprfResponse proto. " - << "Is response body set = " << is_response_body_set; + << "Is response body set = " << response_body.has_value(); std::move(callback_).Run(); return; } @@ -499,7 +497,7 @@ } void TwentyEightDayImpl::OnCheckMembershipQueryCompleteFirstPhase( - std::unique_ptr<std::string> response_body) { + std::optional<std::string> response_body) { // Use RAII to reset |url_loader_| after current function scope. auto url_loader = std::move(url_loader_); @@ -509,14 +507,12 @@ // Convert serialized response body to fresnel query response protobuf. FresnelPsmRlweQueryResponse psm_query_response; - bool is_response_body_set = response_body.get() != nullptr; - - if (!is_response_body_set || + if (!response_body.has_value() || !psm_query_response.ParseFromString(*response_body)) { LOG(ERROR) << "First phase query response net code = " << net_code; LOG(ERROR) << "Response body was not set or could not be parsed into " << "FresnelPsmRlweQueryResponse proto. " - << "Is response body set = " << is_response_body_set; + << "Is response body set = " << response_body.has_value(); std::move(callback_).Run(); return; } @@ -756,7 +752,7 @@ } void TwentyEightDayImpl::OnCheckMembershipOprfCompleteSecondPhase( - std::unique_ptr<std::string> response_body) { + std::optional<std::string> response_body) { // Use RAII to reset |url_loader_| after current function scope. auto url_loader = std::move(url_loader_); @@ -766,14 +762,12 @@ // Convert serialized response body to oprf response protobuf. FresnelPsmRlweOprfResponse psm_oprf_response; - bool is_response_body_set = response_body.get() != nullptr; - - if (!is_response_body_set || + if (!response_body.has_value() || !psm_oprf_response.ParseFromString(*response_body)) { LOG(ERROR) << "Second phase OPRF response net code = " << net_code; LOG(ERROR) << "Response body was not set or could not be parsed into " << "FresnelPsmRlweOprfResponse proto. " - << "Is response body set = " << is_response_body_set; + << "Is response body set = " << response_body.has_value(); std::move(callback_).Run(); return; } @@ -835,7 +829,7 @@ } void TwentyEightDayImpl::OnCheckMembershipQueryCompleteSecondPhase( - std::unique_ptr<std::string> response_body) { + std::optional<std::string> response_body) { // Use RAII to reset |url_loader_| after current function scope. auto url_loader = std::move(url_loader_); @@ -845,14 +839,12 @@ // Convert serialized response body to fresnel query response protobuf. FresnelPsmRlweQueryResponse psm_query_response; - bool is_response_body_set = response_body.get() != nullptr; - - if (!is_response_body_set || + if (!response_body.has_value() || !psm_query_response.ParseFromString(*response_body)) { LOG(ERROR) << "Second phase query response net code = " << net_code; LOG(ERROR) << "Response body was not set or could not be parsed into " << "FresnelPsmRlweQueryResponse proto. " - << "Is response body set = " << is_response_body_set; + << "Is response body set = " << response_body.has_value(); std::move(callback_).Run(); return; }
diff --git a/chromeos/ash/components/report/device_metrics/actives/twenty_eight_day_impl.h b/chromeos/ash/components/report/device_metrics/actives/twenty_eight_day_impl.h index 97866c8..0a8f547 100644 --- a/chromeos/ash/components/report/device_metrics/actives/twenty_eight_day_impl.h +++ b/chromeos/ash/components/report/device_metrics/actives/twenty_eight_day_impl.h
@@ -34,18 +34,18 @@ // UseCase: void CheckMembershipOprf() override; void OnCheckMembershipOprfComplete( - std::unique_ptr<std::string> response_body) override; + std::optional<std::string> response_body) override; void CheckMembershipQuery( const private_membership::rlwe::PrivateMembershipRlweOprfResponse& oprf_response) override; void OnCheckMembershipQueryComplete( - std::unique_ptr<std::string> response_body) override; + std::optional<std::string> response_body) override; void CheckIn() override; // 28DA use case passes the import request back to callback completion. - void OnCheckInComplete(std::unique_ptr<std::string> response_body) override; + void OnCheckInComplete(std::optional<std::string> response_body) override; void OnCheckInCompleteCustom(const FresnelImportDataRequest import_request, - std::unique_ptr<std::string> response_body); + std::optional<std::string> response_body); base::Time GetLastPingTimestamp() override; void SetLastPingTimestamp(base::Time ts) override; @@ -87,12 +87,12 @@ GetPsmIdentifiersToQueryPhaseOne(); void CheckMembershipOprfFirstPhase(); void OnCheckMembershipOprfCompleteFirstPhase( - std::unique_ptr<std::string> response_body); + std::optional<std::string> response_body); void CheckMembershipQueryFirstPhase( const private_membership::rlwe::PrivateMembershipRlweOprfResponse& oprf_response); void OnCheckMembershipQueryCompleteFirstPhase( - std::unique_ptr<std::string> response_body); + std::optional<std::string> response_body); // Second phase of check membership should binary search for a single // identifier between day 2 and 26. @@ -101,12 +101,12 @@ GetPsmIdentifiersToQueryPhaseTwo(); void CheckMembershipOprfSecondPhase(); void OnCheckMembershipOprfCompleteSecondPhase( - std::unique_ptr<std::string> response_body); + std::optional<std::string> response_body); void CheckMembershipQuerySecondPhase( const private_membership::rlwe::PrivateMembershipRlweOprfResponse& oprf_response); void OnCheckMembershipQueryCompleteSecondPhase( - std::unique_ptr<std::string> response_body); + std::optional<std::string> response_body); // Maintains callback that is executed once this use case is done running. base::OnceCallback<void()> callback_;
diff --git a/chromeos/ash/components/report/device_metrics/churn/cohort_impl.cc b/chromeos/ash/components/report/device_metrics/churn/cohort_impl.cc index 467b90f..3a12caf 100644 --- a/chromeos/ash/components/report/device_metrics/churn/cohort_impl.cc +++ b/chromeos/ash/components/report/device_metrics/churn/cohort_impl.cc
@@ -109,7 +109,7 @@ } void CohortImpl::OnCheckMembershipOprfComplete( - std::unique_ptr<std::string> response_body) { + std::optional<std::string> response_body) { // Use RAII to reset |url_loader_| after current function scope. auto url_loader = std::move(url_loader_); @@ -119,14 +119,12 @@ // Convert serialized response body to oprf response protobuf. FresnelPsmRlweOprfResponse psm_oprf_response; - bool is_response_body_set = response_body.get() != nullptr; - - if (!is_response_body_set || + if (!response_body.has_value() || !psm_oprf_response.ParseFromString(*response_body)) { LOG(ERROR) << "Oprf response net code = " << net_code; LOG(ERROR) << "Response body was not set or could not be parsed into " << "FresnelPsmRlweOprfResponse proto. " - << "Is response body set = " << is_response_body_set; + << "Is response body set = " << response_body.has_value(); std::move(callback_).Run(); return; } @@ -183,7 +181,7 @@ } void CohortImpl::OnCheckMembershipQueryComplete( - std::unique_ptr<std::string> response_body) { + std::optional<std::string> response_body) { // Use RAII to reset |url_loader_| after current function scope. auto url_loader = std::move(url_loader_); @@ -193,14 +191,12 @@ // Convert serialized response body to fresnel query response protobuf. FresnelPsmRlweQueryResponse psm_query_response; - bool is_response_body_set = response_body.get() != nullptr; - - if (!is_response_body_set || + if (!response_body.has_value() || !psm_query_response.ParseFromString(*response_body)) { LOG(ERROR) << "Query response net code = " << net_code; LOG(ERROR) << "Response body was not set or could not be parsed into " << "FresnelPsmRlweQueryResponse proto. " - << "Is response body set = " << is_response_body_set; + << "Is response body set = " << response_body.has_value(); std::move(callback_).Run(); return; } @@ -277,7 +273,7 @@ utils::GetMaxFresnelResponseSizeBytes()); } -void CohortImpl::OnCheckInComplete(std::unique_ptr<std::string> response_body) { +void CohortImpl::OnCheckInComplete(std::optional<std::string> response_body) { // Use RAII to reset |url_loader_| after current function scope. auto url_loader = std::move(url_loader_);
diff --git a/chromeos/ash/components/report/device_metrics/churn/cohort_impl.h b/chromeos/ash/components/report/device_metrics/churn/cohort_impl.h index dc1c5e5..139cc3876f 100644 --- a/chromeos/ash/components/report/device_metrics/churn/cohort_impl.h +++ b/chromeos/ash/components/report/device_metrics/churn/cohort_impl.h
@@ -35,14 +35,14 @@ // UseCase: void CheckMembershipOprf() override; void OnCheckMembershipOprfComplete( - std::unique_ptr<std::string> response_body) override; + std::optional<std::string> response_body) override; void CheckMembershipQuery( const private_membership::rlwe::PrivateMembershipRlweOprfResponse& oprf_response) override; void OnCheckMembershipQueryComplete( - std::unique_ptr<std::string> response_body) override; + std::optional<std::string> response_body) override; void CheckIn() override; - void OnCheckInComplete(std::unique_ptr<std::string> response_body) override; + void OnCheckInComplete(std::optional<std::string> response_body) override; base::Time GetLastPingTimestamp() override; void SetLastPingTimestamp(base::Time ts) override; std::vector<private_membership::rlwe::RlwePlaintextId>
diff --git a/chromeos/ash/components/report/device_metrics/churn/observation_impl.cc b/chromeos/ash/components/report/device_metrics/churn/observation_impl.cc index fee829ea..714e7fe 100644 --- a/chromeos/ash/components/report/device_metrics/churn/observation_impl.cc +++ b/chromeos/ash/components/report/device_metrics/churn/observation_impl.cc
@@ -114,7 +114,7 @@ } void ObservationImpl::OnCheckMembershipOprfComplete( - std::unique_ptr<std::string> response_body) { + std::optional<std::string> response_body) { // Use RAII to reset |url_loader_| after current function scope. auto url_loader = std::move(url_loader_); @@ -124,14 +124,12 @@ // Convert serialized response body to oprf response protobuf. FresnelPsmRlweOprfResponse psm_oprf_response; - bool is_response_body_set = response_body.get() != nullptr; - - if (!is_response_body_set || + if (!response_body.has_value() || !psm_oprf_response.ParseFromString(*response_body)) { LOG(ERROR) << "Oprf response net code = " << net_code; LOG(ERROR) << "Response body was not set or could not be parsed into " << "FresnelPsmRlweOprfResponse proto. " - << "Is response body set = " << is_response_body_set; + << "Is response body set = " << response_body.has_value(); std::move(callback_).Run(); return; } @@ -189,7 +187,7 @@ } void ObservationImpl::OnCheckMembershipQueryComplete( - std::unique_ptr<std::string> response_body) { + std::optional<std::string> response_body) { // Use RAII to reset |url_loader_| after current function scope. auto url_loader = std::move(url_loader_); @@ -199,14 +197,12 @@ // Convert serialized response body to fresnel query response protobuf. FresnelPsmRlweQueryResponse psm_query_response; - bool is_response_body_set = response_body.get() != nullptr; - - if (!is_response_body_set || + if (!response_body.has_value() || !psm_query_response.ParseFromString(*response_body)) { LOG(ERROR) << "Query response net code = " << net_code; LOG(ERROR) << "Response body was not set or could not be parsed into " << "FresnelPsmRlweQueryResponse proto. " - << "Is response body set = " << is_response_body_set; + << "Is response body set = " << response_body.has_value(); std::move(callback_).Run(); return; } @@ -286,7 +282,7 @@ } void ObservationImpl::OnCheckInComplete( - std::unique_ptr<std::string> response_body) { + std::optional<std::string> response_body) { // Use RAII to reset |url_loader_| after current function scope. auto url_loader = std::move(url_loader_);
diff --git a/chromeos/ash/components/report/device_metrics/churn/observation_impl.h b/chromeos/ash/components/report/device_metrics/churn/observation_impl.h index 3843c27..afc98c5 100644 --- a/chromeos/ash/components/report/device_metrics/churn/observation_impl.h +++ b/chromeos/ash/components/report/device_metrics/churn/observation_impl.h
@@ -38,14 +38,14 @@ // UseCase: void CheckMembershipOprf() override; void OnCheckMembershipOprfComplete( - std::unique_ptr<std::string> response_body) override; + std::optional<std::string> response_body) override; void CheckMembershipQuery( const private_membership::rlwe::PrivateMembershipRlweOprfResponse& oprf_response) override; void OnCheckMembershipQueryComplete( - std::unique_ptr<std::string> response_body) override; + std::optional<std::string> response_body) override; void CheckIn() override; - void OnCheckInComplete(std::unique_ptr<std::string> response_body) override; + void OnCheckInComplete(std::optional<std::string> response_body) override; base::Time GetLastPingTimestamp() override; void SetLastPingTimestamp(base::Time ts) override; std::vector<private_membership::rlwe::RlwePlaintextId>
diff --git a/chromeos/ash/components/report/device_metrics/use_case/use_case.h b/chromeos/ash/components/report/device_metrics/use_case/use_case.h index 16b4cd41..4612056 100644 --- a/chromeos/ash/components/report/device_metrics/use_case/use_case.h +++ b/chromeos/ash/components/report/device_metrics/use_case/use_case.h
@@ -119,7 +119,7 @@ // Handle the response from the Oprf request. virtual void OnCheckMembershipOprfComplete( - std::unique_ptr<std::string> response_body) = 0; + std::optional<std::string> response_body) = 0; // Second phase of PSM check membership. // Get the result of whether the queried element(s) are in the set. @@ -129,14 +129,13 @@ // Handle the response from the Query request. virtual void OnCheckMembershipQueryComplete( - std::unique_ptr<std::string> response_body) = 0; + std::optional<std::string> response_body) = 0; // Import data to the Fresnel, and PSM database backend. virtual void CheckIn() = 0; // Handle the response from the Check-in request. - virtual void OnCheckInComplete( - std::unique_ptr<std::string> response_body) = 0; + virtual void OnCheckInComplete(std::optional<std::string> response_body) = 0; // Retrieve the last known ping timestamp for the use case from local state. virtual base::Time GetLastPingTimestamp() = 0;
diff --git a/clank b/clank index 36c23c8..1dace63 160000 --- a/clank +++ b/clank
@@ -1 +1 @@ -Subproject commit 36c23c84ecbd0d6f2633e7aae5f64cf4245061c4 +Subproject commit 1dace63d589c82eb30da99b3579c15199e4d0c69
diff --git a/components/BUILD.gn b/components/BUILD.gn index d06ef3ae..fc2f440 100644 --- a/components/BUILD.gn +++ b/components/BUILD.gn
@@ -65,6 +65,7 @@ "dom_distiller/core/javascript/dom_distiller_viewer.js", "dom_distiller/core/javascript/domdistiller.js", "dom_distiller/core/javascript/extract_features.js", + "dom_distiller/core/javascript/readability_distiller.js", ] outputs = [ "{{bundle_resources_dir}}/" + "{{source_root_relative_dir}}/{{source_file_part}}" ]
diff --git a/components/autofill/core/browser/payments/ANDROID_OWNERS b/components/autofill/core/browser/payments/ANDROID_OWNERS new file mode 100644 index 0000000..b461a73 --- /dev/null +++ b/components/autofill/core/browser/payments/ANDROID_OWNERS
@@ -0,0 +1 @@ +vishwasuppoor@google.com
diff --git a/components/cronet/gn2bp/gen_android_bp.py b/components/cronet/gn2bp/gen_android_bp.py index 91f7c35b..a940caf 100755 --- a/components/cronet/gn2bp/gen_android_bp.py +++ b/components/cronet/gn2bp/gen_android_bp.py
@@ -1373,7 +1373,6 @@ source_module.genrule_srcs.add(':' + source_module.name) source_module.genrule_headers.add(header_module.name) - source_module.genrule_shared_libs.add('libprotobuf-cpp-lite') cmd += [f'--cpp_out=lite=true:{absolute_cpp_out_dir}'] cmd += absolute_sources
diff --git a/components/dom_distiller/core/android/java/src/org/chromium/components/dom_distiller/core/DomDistillerFeatures.java b/components/dom_distiller/core/android/java/src/org/chromium/components/dom_distiller/core/DomDistillerFeatures.java index 9e85228..74bb8dc6 100644 --- a/components/dom_distiller/core/android/java/src/org/chromium/components/dom_distiller/core/DomDistillerFeatures.java +++ b/components/dom_distiller/core/android/java/src/org/chromium/components/dom_distiller/core/DomDistillerFeatures.java
@@ -32,11 +32,14 @@ // Feature names -- alphabetical ordering. public static final String READER_MODE_AUTO_DISTILL = "ReaderModeAutoDistill"; + public static final String READER_MODE_DISTILL_IN_APP = "ReaderModeDistillInApp"; public static final String READER_MODE_IMPROVEMENTS = "ReaderModeImprovements"; // Feature flags -- alphabetical ordering. public static final MutableFlagWithSafeDefault sReaderModeAutoDistill = newMutableFlagWithSafeDefault(READER_MODE_AUTO_DISTILL, /* defaultValue= */ false); + public static final MutableFlagWithSafeDefault sReaderModeDistillInApp = + newMutableFlagWithSafeDefault(READER_MODE_DISTILL_IN_APP, /* defaultValue= */ false); public static final MutableFlagWithSafeDefault sReaderModeImprovements = newMutableFlagWithSafeDefault(READER_MODE_IMPROVEMENTS, /* defaultValue= */ false);
diff --git a/components/dom_distiller/core/distiller_page.cc b/components/dom_distiller/core/distiller_page.cc index 2ee387b8..4a9dcec 100644 --- a/components/dom_distiller/core/distiller_page.cc +++ b/components/dom_distiller/core/distiller_page.cc
@@ -6,9 +6,11 @@ #include <stddef.h> +#include <algorithm> #include <utility> #include "base/debug/dump_without_crashing.h" +#include "base/feature_list.h" #include "base/functional/bind.h" #include "base/json/json_writer.h" #include "base/location.h" @@ -18,6 +20,8 @@ #include "base/strings/to_string.h" #include "base/strings/utf_string_conversions.h" #include "base/task/single_thread_task_runner.h" +#include "base/values.h" +#include "components/dom_distiller/core/dom_distiller_features.h" #include "components/dom_distiller/core/extraction_utils.h" #include "components/grit/components_resources.h" #include "third_party/dom_distiller_js/dom_distiller.pb.h" @@ -27,6 +31,64 @@ namespace dom_distiller { +namespace { + +// Counts the number of words in the text_content portion, used to record how +// many words are present for a readability distillation. Note this won't work +// as well on languages like Chinese where the space separation isn't the +// same as in english. +int CountWords(const std::string& text_content) { + int result = 0; + bool prev_char_whitespace = false; + for (const char& it : text_content) { + bool cur_char_whitespace = it == ' '; + if (prev_char_whitespace && !cur_char_whitespace) { + result++; + } + prev_char_whitespace = cur_char_whitespace; + } + + return result + 1; +} + +// Converts the js object returned by the readability distiller into the +// DomDistillerResult expected by the distillation infra. +bool ReadabilityDistillerResultToDomDistillerResult( + const base::Value& value, + proto::DomDistillerResult* result) { + if (!value.is_dict()) { + return false; + } + + const base::DictValue* dict_value = value.GetIfDict(); + + if (dict_value->contains("title")) { + result->set_title(dict_value->Find("title")->GetString()); + } + if (dict_value->contains("content")) { + auto* distilled_content = new proto::DistilledContent(); + distilled_content->set_html(dict_value->Find("content")->GetString()); + result->set_allocated_distilled_content(std::move(distilled_content)); + } + + if (dict_value->contains("dir")) { + result->set_text_direction(dict_value->Find("content")->GetString()); + } else { + result->set_text_direction("auto"); + } + + if (dict_value->contains("textContent")) { + auto* statistics_info = new proto::StatisticsInfo(); + std::string text_content = dict_value->Find("textContent")->GetString(); + statistics_info->set_word_count(CountWords(text_content)); + result->set_allocated_statistics_info(statistics_info); + } + + return true; +} + +} // namespace + DistillerPageFactory::~DistillerPageFactory() = default; DistillerPage::DistillerPage() : ready_(true) {} @@ -44,7 +106,10 @@ // the callback to OnDistillationDone happens. ready_ = false; distiller_page_callback_ = std::move(callback); - DistillPageImpl(gurl, GetDistillerScriptWithOptions(options)); + + DistillPageImpl(gurl, ShouldUseReadabilityDistiller() + ? GetReadabilityDistillerScript() + : GetDistillerScriptWithOptions(options)); } void DistillerPage::OnDistillationDone(const GURL& page_url, @@ -59,8 +124,11 @@ found_content = false; } else { found_content = - dom_distiller::proto::json::DomDistillerResult::ReadFromValue( - *value, distiller_result.get()); + ShouldUseReadabilityDistiller() + ? ReadabilityDistillerResultToDomDistillerResult( + *value, distiller_result.get()) + : dom_distiller::proto::json::DomDistillerResult::ReadFromValue( + *value, distiller_result.get()); if (!found_content) { DVLOG(1) << "Unable to parse DomDistillerResult."; }
diff --git a/components/dom_distiller/core/dom_distiller_features.cc b/components/dom_distiller/core/dom_distiller_features.cc index cf3f1502..7ce15d4 100644 --- a/components/dom_distiller/core/dom_distiller_features.cc +++ b/components/dom_distiller/core/dom_distiller_features.cc
@@ -38,7 +38,7 @@ &kReaderModeUseReadability, /*name=*/"use_distiller", /*default_value=*/false}; -bool ShouldReadabilityDistiller() { +bool ShouldUseReadabilityDistiller() { return base::FeatureList::IsEnabled(kReaderModeUseReadability) && kReaderModeUseReadabilityUseDisiller.Get(); } @@ -58,6 +58,10 @@ "ReaderModeAutoDistill", base::FEATURE_DISABLED_BY_DEFAULT); +BASE_FEATURE(kReaderModeDistillInApp, + "ReaderModeDistillInApp", + base::FEATURE_DISABLED_BY_DEFAULT); + BASE_FEATURE(kReaderModeImprovements, "ReaderModeImprovements", base::FEATURE_DISABLED_BY_DEFAULT); @@ -65,8 +69,8 @@ namespace android { static jlong JNI_DomDistillerFeatureMap_GetNativeMap(JNIEnv* env) { static const base::Feature* const kFeaturesExposedToJava[] = { - &kReaderModeAutoDistill, &kReaderModeImprovements, - &kReaderModeUseReadability}; + &kReaderModeAutoDistill, &kReaderModeDistillInApp, + &kReaderModeImprovements, &kReaderModeUseReadability}; static base::NoDestructor<base::android::FeatureMap> kFeatureMap( kFeaturesExposedToJava); return reinterpret_cast<jlong>(kFeatureMap.get());
diff --git a/components/dom_distiller/core/dom_distiller_features.h b/components/dom_distiller/core/dom_distiller_features.h index f9617e8..236e457 100644 --- a/components/dom_distiller/core/dom_distiller_features.h +++ b/components/dom_distiller/core/dom_distiller_features.h
@@ -22,6 +22,7 @@ #if BUILDFLAG(IS_ANDROID) // Feature declarations below -- alphabetical order. BASE_DECLARE_FEATURE(kReaderModeAutoDistill); +BASE_DECLARE_FEATURE(kReaderModeDistillInApp); BASE_DECLARE_FEATURE(kReaderModeImprovements); #endif
diff --git a/components/dom_distiller/core/extraction_utils.cc b/components/dom_distiller/core/extraction_utils.cc index bea79bd0..72276a2 100644 --- a/components/dom_distiller/core/extraction_utils.cc +++ b/components/dom_distiller/core/extraction_utils.cc
@@ -38,4 +38,12 @@ options_json); } +std::string GetReadabilityDistillerScript() { + std::string script = + ui::ResourceBundle::GetSharedInstance().LoadDataResourceString( + IDR_READABILITY_DISTILLER_JS); + CHECK(!script.empty()); + return script; +} + } // namespace dom_distiller
diff --git a/components/dom_distiller/core/extraction_utils.h b/components/dom_distiller/core/extraction_utils.h index 16468a90..9d7cb44 100644 --- a/components/dom_distiller/core/extraction_utils.h +++ b/components/dom_distiller/core/extraction_utils.h
@@ -11,11 +11,15 @@ namespace dom_distiller { -// Returns the JavaScript web page distillation script with selected -// distallation `options`. +// Returns the DomDistiller JavaScript web page distillation script with +// selected distallation `options`. std::string GetDistillerScriptWithOptions( const dom_distiller::proto::DomDistillerOptions& options); +// Returns the Javascript heuristic to determine if web pages are suitable for +// reader mode. +std::string GetReadabilityDistillerScript(); + } // namespace dom_distiller #endif // COMPONENTS_DOM_DISTILLER_CORE_EXTRACTION_UTILS_H_
diff --git a/components/dom_distiller/core/javascript/readability_distiller.js b/components/dom_distiller/core/javascript/readability_distiller.js new file mode 100644 index 0000000..6937c327 --- /dev/null +++ b/components/dom_distiller/core/javascript/readability_distiller.js
@@ -0,0 +1,29 @@ +// 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. + +// Runs readability heuristic on the page and return the result. +(function() { +try { + function initialize() { + // This include will be processed at build time by grit. + // clang-format off + // <include src="../../../../third_party/readability/src/Readability.js"> + // clang-format on + window.Readability = Readability; + } + window.setTimeout = function() {}; + window.clearTimeout = function() {}; + initialize(); + + const article = new Readability(document.cloneNode(/*deep=*/ true)).parse(); + return article; + +} catch (e) { + window.console.error('Error during distillation: ' + e); + if (e.stack !== undefined) { + window.console.error(e.stack); + } +} +return undefined; +})();
diff --git a/components/external_intents/android/java/src/org/chromium/components/external_intents/InterceptNavigationDelegateClient.java b/components/external_intents/android/java/src/org/chromium/components/external_intents/InterceptNavigationDelegateClient.java index 2d5223c1..fa8b17b 100644 --- a/components/external_intents/android/java/src/org/chromium/components/external_intents/InterceptNavigationDelegateClient.java +++ b/components/external_intents/android/java/src/org/chromium/components/external_intents/InterceptNavigationDelegateClient.java
@@ -19,7 +19,7 @@ public interface InterceptNavigationDelegateClient { /* Returns the WebContents in the context of which this InterceptNavigationDelegateImpl instance * is operating. */ - WebContents getWebContents(); + @Nullable WebContents getWebContents(); /* Creates an ExternalNavigationHandler instance that is configured for this client. */ @Nullable ExternalNavigationHandler createExternalNavigationHandler(); @@ -32,7 +32,7 @@ boolean isIncognito(); /* Returns the Activity associated with this client. */ - Activity getActivity(); + @Nullable Activity getActivity(); /* Returns true if the tab associated with this client was launched from an external app. */ boolean wasTabLaunchedFromExternalApp();
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 89e311b5..27bf813 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
@@ -6,6 +6,7 @@ import static org.chromium.build.NullUtil.assumeNonNull; +import android.app.Activity; import android.util.Pair; import androidx.annotation.IntDef; @@ -441,7 +442,7 @@ // may have been closed. boolean onInitialNavigationChain = isTabOnInitialNavigationChain(); boolean isWebContentsVisible = - mClient.getWebContents().getVisibility() == Visibility.VISIBLE; + assumeNonNull(mClient.getWebContents()).getVisibility() == Visibility.VISIBLE; ExternalNavigationParams params = new ExternalNavigationParams.Builder( escapedUrl, @@ -516,7 +517,8 @@ ExternalNavigationParams params, boolean isExternalProtocol) { try (TraceEvent e = TraceEvent.scoped("shouldOverrideUrlLoading")) { OverrideUrlLoadingResult result = null; - if (shouldReparentTab(mClient.getWebContents())) { + WebContents webContents = assumeNonNull(mClient.getWebContents()); + if (shouldReparentTab(webContents)) { // Catches all cases where a navigation that starts in a PWA should cause a Tab // reparenting towards the Chrome browser. // TODO(crbug.com/416562397): eventually consider in-scope PWAs in the reparenting @@ -561,8 +563,7 @@ } else if (MDOC_SCHEME.equals(params.getUrl().getScheme())) { scheme = InterceptScheme.MDOC_SCHEME; ContentWebFeatureUsageUtils.logWebFeatureForCurrentPage( - mClient.getWebContents(), - WebFeature.IDENTITY_DIGITAL_CREDENTIALS_DEEP_LINK); + webContents, WebFeature.IDENTITY_DIGITAL_CREDENTIALS_DEEP_LINK); // Record spread of `result` in order to get an idea of by how much the // IDENTITY_DIGITAL_CREDENTIALS_DEEP_LINK use counter is over counting as a user may // cancel the OverrideUrlLoadingResultType.OVERRIDE_WITH_ASYNC_ACTION dialog. @@ -573,8 +574,7 @@ } else if (params.getUrl().getScheme().endsWith(OPENID4VP_SCHEME_SUFFIX)) { scheme = InterceptScheme.OPENID4VP_SCHEME; ContentWebFeatureUsageUtils.logWebFeatureForCurrentPage( - mClient.getWebContents(), - WebFeature.IDENTITY_DIGITAL_CREDENTIALS_DEEP_LINK); + webContents, WebFeature.IDENTITY_DIGITAL_CREDENTIALS_DEEP_LINK); // Record spread of `result` in order to get an idea of by how much the // IDENTITY_DIGITAL_CREDENTIALS_DEEP_LINK use counter is over counting as a user may // cancel the OverrideUrlLoadingResultType.OVERRIDE_WITH_ASYNC_ACTION dialog. @@ -606,6 +606,7 @@ */ public void maybeUpdateNavigationHistory() { WebContents webContents = mClient.getWebContents(); + assumeNonNull(webContents); NavigationController navigationController = webContents.getNavigationController(); if (mClearAllForwardHistoryRequired && webContents != null) { navigationController.pruneForwardEntries(); @@ -659,9 +660,10 @@ } private boolean isBrowserAuxiliaryNavigation() { + WebContents webContents = assumeNonNull(mClient.getWebContents()); return mClient.isTabInBrowser() - && mClient.getWebContents().hasOpener() - && mClient.getWebContents().getOriginalWindowOpenDisposition() + && webContents.hasOpener() + && webContents.getOriginalWindowOpenDisposition() == WindowOpenDisposition.NEW_FOREGROUND_TAB; } @@ -733,14 +735,15 @@ // background and acted as an intermediate link redirector between two // apps (crbug.com/487938). if (mClient.wasTabLaunchedFromExternalApp()) { + Activity activity = assumeNonNull(mClient.getActivity()); if (mClient.getOrCreateRedirectHandler() .wasTaskStartedByExternalIntent()) { // If Chrome was only launched to perform a redirect, don't keep // its task in history. - mClient.getActivity().finishAndRemoveTask(); + activity.finishAndRemoveTask(); } else { // Takes Chrome out of the back stack. - mClient.getActivity().moveTaskToBack(false); + activity.moveTaskToBack(false); } } // Closing tab must happen after we potentially call @@ -772,7 +775,7 @@ // index which was saved before this navigation, and remove the empty // entries from the navigation history. mClearAllForwardHistoryRequired = true; - mClient.getWebContents() + assumeNonNull(mClient.getWebContents()) .getNavigationController() .goToNavigationIndex(lastCommittedEntryIndexBeforeNavigation); } @@ -820,7 +823,7 @@ assumeNonNull(mExternalNavHandler).canExternalAppHandleUrl(url) ? R.string.blocked_navigation_warning : R.string.unreachable_navigation_warning; - mClient.getWebContents() + assumeNonNull(mClient.getWebContents()) .addMessageToDevToolsConsole( ConsoleMessageLevel.WARNING, ContextUtils.getApplicationContext().getString(resId, url.getSpec()));
diff --git a/components/messages/android/internal/java/res/color/message_bg_color.xml b/components/messages/android/internal/java/res/color/message_bg_color.xml index 465a419..5c71170 100644 --- a/components/messages/android/internal/java/res/color/message_bg_color.xml +++ b/components/messages/android/internal/java/res/color/message_bg_color.xml
@@ -6,5 +6,5 @@ --> <selector xmlns:android="http://schemas.android.com/apk/res/android"> - <item android:color="?attr/colorSurface"/> + <item android:color="?attr/colorSurfaceBright"/> </selector> \ No newline at end of file
diff --git a/components/omnibox/browser/omnibox_client.h b/components/omnibox/browser/omnibox_client.h index e65413d9..caed159b 100644 --- a/components/omnibox/browser/omnibox_client.h +++ b/components/omnibox/browser/omnibox_client.h
@@ -289,6 +289,10 @@ // Returns true if history embeddings is enabled and user has opted in. virtual bool IsHistoryEmbeddingsEnabled() const; + // Optionally warm-up for the default search engine so that we can navigate to + // the search result page effectively. + virtual void MaybePrewarmForDefaultSearchEngine() {} + virtual base::WeakPtr<OmniboxClient> AsWeakPtr() = 0; };
diff --git a/components/omnibox/browser/omnibox_controller.cc b/components/omnibox/browser/omnibox_controller.cc index 509ea7a7..2fe9792 100644 --- a/components/omnibox/browser/omnibox_controller.cc +++ b/components/omnibox/browser/omnibox_controller.cc
@@ -72,6 +72,8 @@ void OmniboxController::StartZeroSuggestPrefetch() { TRACE_EVENT0("omnibox", "OmniboxController::StartZeroSuggestPrefetch"); + client_->MaybePrewarmForDefaultSearchEngine(); + auto page_classification = client_->GetPageClassification(/*is_prefetch=*/true);
diff --git a/components/optimization_guide/core/BUILD.gn b/components/optimization_guide/core/BUILD.gn index 28bcc7c2..6c6f948 100644 --- a/components/optimization_guide/core/BUILD.gn +++ b/components/optimization_guide/core/BUILD.gn
@@ -724,6 +724,7 @@ ":filters_unit_tests", ":hints_unit_tests", ":model_execution_unit_tests", + ":unit_tests_bundle_data", "//base", "//base/test:test_support", "//components/optimization_guide/proto:optimization_guide_proto",
diff --git a/components/optimization_guide/core/hints/hints_manager.cc b/components/optimization_guide/core/hints/hints_manager.cc index 10317ac8..986035e 100644 --- a/components/optimization_guide/core/hints/hints_manager.cc +++ b/components/optimization_guide/core/hints/hints_manager.cc
@@ -388,7 +388,6 @@ base::BindOnce(&HintsManager::OnHintCacheInitialized, weak_ptr_factory_.GetWeakPtr())); } - HintsManager::~HintsManager() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); } @@ -761,6 +760,17 @@ return std::vector<GURL>(urls_to_refresh.begin(), urls_to_refresh.end()); } +// Helper method to check if any registered optimization type is allowed for +// proactive personalization +bool HintsManager::HasPersonalizableTypesRegistered() { + return std::any_of( + registered_optimization_types_.begin(), + registered_optimization_types_.end(), [this](auto opt_type) { + return allowed_optimization_types_for_proactive_personalization_.Has( + opt_type); + }); +} + void HintsManager::FetchHintsForActiveTabs() { active_tabs_hints_fetch_timer_.Stop(); active_tabs_hints_fetch_timer_.Start( @@ -811,6 +821,35 @@ proto::CONTEXT_BATCH_UPDATE_ACTIVE_TABS, registered_optimization_types_, active_tab_urls_to_refresh, top_hosts, optimization_guide_logger_); + auto hints_fetched_callback = + base::BindOnce(&HintsManager::OnHintsForActiveTabsFetched, + weak_ptr_factory_.GetWeakPtr(), top_hosts_set, + base::flat_set<GURL>(active_tab_urls_to_refresh.begin(), + active_tab_urls_to_refresh.end())); + auto do_fetch_callback = base::BindOnce( + &HintsManager::FetchHintsForActiveTabsInternal, + weak_ptr_factory_.GetWeakPtr(), top_hosts, active_tab_urls_to_refresh, + proto::CONTEXT_BATCH_UPDATE_ACTIVE_TABS, + /*skip_cache=*/false, std::move(hints_fetched_callback), + /*request_context_metadata=*/std::nullopt); + if (HasPersonalizableTypesRegistered()) { + RequestAccessToken( + identity_manager_, + {GaiaConstants::kOptimizationGuideServiceGetHintsOAuth2Scope}, + std::move(do_fetch_callback)); + } else { + std::move(do_fetch_callback).Run(/*access_token=*/std::string()); + } +} + +void HintsManager::FetchHintsForActiveTabsInternal( + const std::vector<std::string>& top_hosts, + const std::vector<GURL>& active_tab_urls_to_refresh, + optimization_guide::proto::RequestContext request_context, + bool skip_cache, + HintsFetchedCallback hints_fetched_callback, + std::optional<proto::RequestContextMetadata> request_context_metadata, + const std::string& access_token) { if (!active_tabs_batch_update_hints_fetcher_) { DCHECK(hints_fetcher_factory_); active_tabs_batch_update_hints_fetcher_ = @@ -819,13 +858,9 @@ active_tabs_batch_update_hints_fetcher_->FetchOptimizationGuideServiceHints( top_hosts, active_tab_urls_to_refresh, registered_optimization_types_, proto::CONTEXT_BATCH_UPDATE_ACTIVE_TABS, application_locale_, - /*access_token=*/std::string(), - /*skip_cache=*/false, - base::BindOnce(&HintsManager::OnHintsForActiveTabsFetched, - weak_ptr_factory_.GetWeakPtr(), top_hosts_set, - base::flat_set<GURL>(active_tab_urls_to_refresh.begin(), - active_tab_urls_to_refresh.end())), - std::nullopt); + access_token, + /*skip_cache=*/false, std::move(hints_fetched_callback), + /*request_context_metadata=*/std::nullopt); } void HintsManager::OnHintsForActiveTabsFetched( @@ -1695,12 +1730,7 @@ return; } - if (std::any_of( - registered_optimization_types_.begin(), - registered_optimization_types_.end(), [&](auto opt_type) { - return allowed_optimization_types_for_proactive_personalization_ - .Has(opt_type); - })) { + if (HasPersonalizableTypesRegistered()) { // Request access token before fetching hints. RequestAccessToken( identity_manager_,
diff --git a/components/optimization_guide/core/hints/hints_manager.h b/components/optimization_guide/core/hints/hints_manager.h index d59bc9a..719a41f 100644 --- a/components/optimization_guide/core/hints/hints_manager.h +++ b/components/optimization_guide/core/hints/hints_manager.h
@@ -280,6 +280,8 @@ // fetch attempt was made. void ScheduleActiveTabsHintsFetch(); + bool HasPersonalizableTypesRegistered(); + // Called to make a request to fetch hints from the remote Optimization Guide // Service. Used to fetch hints for origins frequently visited by the user and // URLs open in the active tab model. @@ -592,6 +594,17 @@ // Used to get |weak_ptr_| to self. base::WeakPtrFactory<HintsManager> weak_ptr_factory_{this}; + + // Wrapper that immediately invokes HintsFetcher for the purposes of fetching + // hints for active tabs. + void FetchHintsForActiveTabsInternal( + const std::vector<std::string>& top_hosts, + const std::vector<GURL>& active_tab_urls_to_refresh, + optimization_guide::proto::RequestContext request_context, + bool skip_cache, + HintsFetchedCallback hints_fetched_callback, + std::optional<proto::RequestContextMetadata> request_context_metadata, + const std::string& access_token); }; } // namespace optimization_guide
diff --git a/components/optimization_guide/core/hints/hints_manager_unittest.cc b/components/optimization_guide/core/hints/hints_manager_unittest.cc index 6d495943..c8ba022e 100644 --- a/components/optimization_guide/core/hints/hints_manager_unittest.cc +++ b/components/optimization_guide/core/hints/hints_manager_unittest.cc
@@ -3759,9 +3759,10 @@ OptimizationGuideAccessTokenResult::kUserNotSignedIn, 1); } -class HintsManagerProactivePersonalizedFetchingTest : public HintsManagerTest { +class HintsManagerProactivePersonalizationFetchingTest + : public HintsManagerTest { public: - HintsManagerProactivePersonalizedFetchingTest() { + HintsManagerProactivePersonalizationFetchingTest() { scoped_list_.InitWithFeaturesAndParameters( { { @@ -3799,7 +3800,7 @@ base::test::ScopedFeatureList scoped_list_; }; -TEST_F(HintsManagerProactivePersonalizedFetchingTest, +TEST_F(HintsManagerProactivePersonalizationFetchingTest, NotAnAllowedOptimizationTypeHintsFetchedAtNavigationTime) { base::CommandLine::ForCurrentProcess()->AppendSwitch( switches::kDisableCheckingUserPermissionsForTesting); @@ -3821,7 +3822,7 @@ RaceNavigationFetchAttemptStatus::kRaceNavigationFetchHostAndURL, 1); } -TEST_F(HintsManagerProactivePersonalizedFetchingTest, +TEST_F(HintsManagerProactivePersonalizationFetchingTest, AllowedOptimizationTypeHintsFetchedAtNavigationTime) { ASSERT_TRUE(identity_test_env()->identity_manager()); AccountInfo account_info = identity_test_env()->MakePrimaryAccountAvailable( @@ -3848,7 +3849,7 @@ RaceNavigationFetchAttemptStatus::kRaceNavigationFetchHostAndURL, 1); } -TEST_F(HintsManagerProactivePersonalizedFetchingTest, TokenFailure) { +TEST_F(HintsManagerProactivePersonalizationFetchingTest, TokenFailure) { ASSERT_TRUE(identity_test_env()->identity_manager()); AccountInfo account_info = identity_test_env()->MakePrimaryAccountAvailable( "test_email", signin::ConsentLevel::kSignin); @@ -3870,4 +3871,142 @@ OptimizationGuideAccessTokenResult::kTransientError, 1); } +TEST_F(HintsManagerProactivePersonalizationFetchingTest, + FetchHintsForActiveTabsWithoutPersonalizableTypes) { + auto scoped_feature_list = SetUpDeferStartupActiveTabsHintsFetch(true); + base::HistogramTester histogram_tester; + + base::CommandLine::ForCurrentProcess()->AppendSwitch( + switches::kDisableCheckingUserPermissionsForTesting); + + ASSERT_TRUE(identity_test_env()->identity_manager()); + AccountInfo account_info = identity_test_env()->MakePrimaryAccountAvailable( + "test_email", signin::ConsentLevel::kSignin); + + CreateHintsManager( + std::make_unique<FakeTopHostProvider>(std::vector<std::string>({})), + identity_test_env()->identity_manager()); + hints_manager()->RegisterOptimizationTypes({proto::DEFER_ALL_SCRIPT}); + hints_manager()->SetHintsFetcherFactoryForTesting( + BuildTestHintsFetcherFactory( + {HintsFetcherEndState::kFetchSuccessWithHostHints})); + InitializeWithDefaultConfig("1.0.0"); + + tab_url_provider()->SetUrls( + {GURL("https://a.com"), GURL("https://b.com"), GURL("chrome://new-tab")}); + + // No hints fetch should happen on startup. + RunUntilIdle(); + histogram_tester.ExpectTotalCount( + "OptimizationGuide.HintsManager.ActiveTabUrlsToFetchFor", 0); + EXPECT_EQ(0, tab_url_provider()->get_num_urls_called()); + + // Hints fetch should be triggered on deferred startup. + hints_manager()->OnDeferredStartup(); + + // No access token request is expected when there are no personalized types. + + RunUntilIdle(); + histogram_tester.ExpectBucketCount( + "OptimizationGuide.HintsManager.ActiveTabUrlsToFetchFor", 2, 1); + EXPECT_EQ(1, tab_url_provider()->get_num_urls_called()); + EXPECT_EQ(1, + active_tabs_batch_update_hints_fetcher()->num_fetches_requested()); + EXPECT_EQ( + proto::RequestContext::CONTEXT_BATCH_UPDATE_ACTIVE_TABS, + active_tabs_batch_update_hints_fetcher()->request_context_requested()); +} + +TEST_F(HintsManagerProactivePersonalizationFetchingTest, + FetchHintsForActiveTabsWithPersonalizableTypes) { + auto scoped_feature_list = SetUpDeferStartupActiveTabsHintsFetch(true); + base::HistogramTester histogram_tester; + + base::CommandLine::ForCurrentProcess()->AppendSwitch( + switches::kDisableCheckingUserPermissionsForTesting); + + ASSERT_TRUE(identity_test_env()->identity_manager()); + AccountInfo account_info = identity_test_env()->MakePrimaryAccountAvailable( + "test_email", signin::ConsentLevel::kSignin); + + CreateHintsManager( + std::make_unique<FakeTopHostProvider>(std::vector<std::string>({})), + identity_test_env()->identity_manager()); + hints_manager()->RegisterOptimizationTypes({proto::SHOPPING_DISCOUNTS}); + hints_manager()->SetHintsFetcherFactoryForTesting( + BuildTestHintsFetcherFactory( + {HintsFetcherEndState::kFetchSuccessWithHostHints})); + InitializeWithDefaultConfig("1.0.0"); + + tab_url_provider()->SetUrls( + {GURL("https://a.com"), GURL("https://b.com"), GURL("chrome://new-tab")}); + + // No hints fetch should happen on startup. + RunUntilIdle(); + histogram_tester.ExpectTotalCount( + "OptimizationGuide.HintsManager.ActiveTabUrlsToFetchFor", 0); + EXPECT_EQ(0, tab_url_provider()->get_num_urls_called()); + + // Hints fetch should be triggered on deferred startup. + hints_manager()->OnDeferredStartup(); + RunUntilIdle(); + // An access token request is expected with personalized types. + identity_test_env()->WaitForAccessTokenRequestIfNecessaryAndRespondWithToken( + "access_token", base::Time::Max()); + histogram_tester.ExpectBucketCount( + "OptimizationGuide.HintsManager.ActiveTabUrlsToFetchFor", 2, 1); + EXPECT_EQ(1, tab_url_provider()->get_num_urls_called()); + EXPECT_EQ(1, + active_tabs_batch_update_hints_fetcher()->num_fetches_requested()); + EXPECT_EQ( + proto::RequestContext::CONTEXT_BATCH_UPDATE_ACTIVE_TABS, + active_tabs_batch_update_hints_fetcher()->request_context_requested()); +} + +TEST_F(HintsManagerProactivePersonalizationFetchingTest, + FetchHintsForActiveTabsWithPersonalizableTypesWithTokenFailure) { + auto scoped_feature_list = SetUpDeferStartupActiveTabsHintsFetch(true); + base::HistogramTester histogram_tester; + + base::CommandLine::ForCurrentProcess()->AppendSwitch( + switches::kDisableCheckingUserPermissionsForTesting); + + ASSERT_TRUE(identity_test_env()->identity_manager()); + AccountInfo account_info = identity_test_env()->MakePrimaryAccountAvailable( + "test_email", signin::ConsentLevel::kSignin); + + CreateHintsManager( + std::make_unique<FakeTopHostProvider>(std::vector<std::string>({})), + identity_test_env()->identity_manager()); + hints_manager()->RegisterOptimizationTypes({proto::SHOPPING_DISCOUNTS}); + hints_manager()->SetHintsFetcherFactoryForTesting( + BuildTestHintsFetcherFactory( + {HintsFetcherEndState::kFetchSuccessWithHostHints})); + InitializeWithDefaultConfig("1.0.0"); + + tab_url_provider()->SetUrls( + {GURL("https://a.com"), GURL("https://b.com"), GURL("chrome://new-tab")}); + + // No hints fetch should happen on startup. + RunUntilIdle(); + histogram_tester.ExpectTotalCount( + "OptimizationGuide.HintsManager.ActiveTabUrlsToFetchFor", 0); + EXPECT_EQ(0, tab_url_provider()->get_num_urls_called()); + + // Hints fetch should be triggered on deferred startup. + hints_manager()->OnDeferredStartup(); + RunUntilIdle(); + // An access token request is expected with personalized types. + identity_test_env()->WaitForAccessTokenRequestIfNecessaryAndRespondWithError( + GoogleServiceAuthError(GoogleServiceAuthError::CONNECTION_FAILED)); + histogram_tester.ExpectUniqueSample( + "OptimizationGuide.AccessTokenHelper.Result", + OptimizationGuideAccessTokenResult::kTransientError, 1); + EXPECT_EQ(1, + active_tabs_batch_update_hints_fetcher()->num_fetches_requested()); + EXPECT_EQ( + proto::RequestContext::CONTEXT_BATCH_UPDATE_ACTIVE_TABS, + active_tabs_batch_update_hints_fetcher()->request_context_requested()); +} + } // namespace optimization_guide
diff --git a/components/optimization_guide/core/optimization_guide_features.h b/components/optimization_guide/core/optimization_guide_features.h index 70cb093..a3f188d 100644 --- a/components/optimization_guide/core/optimization_guide_features.h +++ b/components/optimization_guide/core/optimization_guide_features.h
@@ -19,7 +19,6 @@ #include "base/metrics/field_trial_params.h" #include "base/time/time.h" #include "build/build_config.h" -#include "components/optimization_guide/core/model_execution/feature_keys.h" #include "components/optimization_guide/core/optimization_guide_enums.h" #include "components/optimization_guide/proto/hints.pb.h" #include "components/optimization_guide/proto/model_execution.pb.h"
diff --git a/components/policy/resources/templates/policies.yaml b/components/policy/resources/templates/policies.yaml index 0160191c..f6ba852 100644 --- a/components/policy/resources/templates/policies.yaml +++ b/components/policy/resources/templates/policies.yaml
@@ -1367,6 +1367,7 @@ 1366: '' 1367: AIModeSettings 1368: WatermarkStyle + 1369: KioskApplicationLogCollectionEnabled atomic_groups: 1: Homepage
diff --git a/components/policy/resources/templates/policy_definitions/Kiosk/KioskApplicationLogCollectionEnabled.yaml b/components/policy/resources/templates/policy_definitions/Kiosk/KioskApplicationLogCollectionEnabled.yaml new file mode 100644 index 0000000..8c0ab1f --- /dev/null +++ b/components/policy/resources/templates/policy_definitions/Kiosk/KioskApplicationLogCollectionEnabled.yaml
@@ -0,0 +1,25 @@ +owners: +- macinashutosh@google.com +- irfedorova@google.com +- file://chromeos/components/kiosk/OWNERS +caption: Enable kiosk application log collection +default: false +desc: |- + Setting the policy to Enabled means Kiosk application level logs would be collected when a kiosk application is running on the device. Logs would be collected for all kiosk application types. + These logs would be stored in a separate kiosk_apps.log file. + Leaving this policy unset or setting it to Disabled means the Kiosk application level logs would not be collected. +features: + dynamic_refresh: true + per_profile: true +type: main +schema: + type: boolean +items: +- caption: Enable Kiosk application logs + value: true +- caption: Disable Kiosk application logs + value: false +example_value: false +future_on: +- chrome_os +tags: []
diff --git a/components/policy/test/data/pref_mapping/KioskApplicationLogCollectionEnabled.json b/components/policy/test/data/pref_mapping/KioskApplicationLogCollectionEnabled.json new file mode 100644 index 0000000..1081b29 --- /dev/null +++ b/components/policy/test/data/pref_mapping/KioskApplicationLogCollectionEnabled.json
@@ -0,0 +1,16 @@ +[ + { + "os": [ + "chromeos" + ], + "simple_policy_pref_mapping_test": { + "pref_name": "kiosk_application_log_collection_enabled", + "pref_location": "user_profile", + "default_value": false, + "values_to_test": [ + true, + false + ] + } + } +] \ No newline at end of file
diff --git a/components/resources/dom_distiller_resources.grdp b/components/resources/dom_distiller_resources.grdp index 3e2f084..5c0cd01 100644 --- a/components/resources/dom_distiller_resources.grdp +++ b/components/resources/dom_distiller_resources.grdp
@@ -9,4 +9,5 @@ <include name="IDR_EXTRACT_PAGE_FEATURES_JS" file="../dom_distiller/core/javascript/extract_features.js" type="BINDATA" /> <include name="IDR_DISTILLABLE_PAGE_SERIALIZED_MODEL_NEW" file="../dom_distiller/core/data/distillable_page_model_new.bin" type="BINDATA" compress="gzip" /> <include name="IDR_LONG_PAGE_SERIALIZED_MODEL" file="../dom_distiller/core/data/long_page_model.bin" type="BINDATA" compress="gzip" /> + <include name="IDR_READABILITY_DISTILLER_JS" file="../dom_distiller/core/javascript/readability_distiller.js" flattenhtml="true" type="BINDATA" /> </grit-part>
diff --git a/components/safe_browsing/core/common/proto/realtimeapi.proto b/components/safe_browsing/core/common/proto/realtimeapi.proto index 2f2b75d..3951d52a 100644 --- a/components/safe_browsing/core/common/proto/realtimeapi.proto +++ b/components/safe_browsing/core/common/proto/realtimeapi.proto
@@ -297,6 +297,7 @@ optional bool block_screenshot = 8; message DataMaskingAction { + // The display name of the data masking detector. optional string display_name = 1; // The type of masking to be applied. This is either "LIGHT", "HARD" or @@ -307,6 +308,9 @@ // This is a regex pattern that will be used to match the URL. optional string pattern = 3; + + // The id of the data masking detector. + optional string detector_id = 4; } // The set of data masking actions that should be applied to the URL due to
diff --git a/components/sensitive_content/android/java/src/org/chromium/components/sensitive_content/SensitiveContentClient.java b/components/sensitive_content/android/java/src/org/chromium/components/sensitive_content/SensitiveContentClient.java index c63b462..d2ae777 100644 --- a/components/sensitive_content/android/java/src/org/chromium/components/sensitive_content/SensitiveContentClient.java +++ b/components/sensitive_content/android/java/src/org/chromium/components/sensitive_content/SensitiveContentClient.java
@@ -20,6 +20,7 @@ import org.chromium.base.ObserverList; import org.chromium.build.annotations.NullMarked; +import org.chromium.build.annotations.Nullable; import org.chromium.content_public.browser.WebContents; import org.chromium.ui.base.ViewAndroidDelegate; @@ -167,7 +168,7 @@ * @param view The new container view. */ @Override - public void onUpdateContainerView(ViewGroup view) { + public void onUpdateContainerView(@Nullable ViewGroup view) { assert view == assumeNonNull(mViewAndroidDelegate.get()).getContainerView(); setContentSensitivity(mContentIsSensitive); }
diff --git a/components/tab_groups/BUILD.gn b/components/tab_groups/BUILD.gn index 6c3b137..184fd8d 100644 --- a/components/tab_groups/BUILD.gn +++ b/components/tab_groups/BUILD.gn
@@ -54,6 +54,7 @@ sources = [ "android/java/res/values-night/colors.xml", "android/java/res/values/colors.xml", + "android/java/res/values/dimens.xml", ] } }
diff --git a/components/tab_groups/android/java/res/values/colors.xml b/components/tab_groups/android/java/res/values/colors.xml index 42197e8..54248eb4 100644 --- a/components/tab_groups/android/java/res/values/colors.xml +++ b/components/tab_groups/android/java/res/values/colors.xml
@@ -84,4 +84,5 @@ <color name="tab_group_card_placeholder_color_yellow">@color/tab_group_card_secondary_color_yellow_light_gm3</color> <color name="tab_group_card_placeholder_color_yellow_incognito">@color/tab_group_card_secondary_color_yellow_dark_gm3</color> + <color name="tab_group_color_picker_incognito_ripple_color">@color/baseline_neutral_90</color> </resources> \ No newline at end of file
diff --git a/components/tab_groups/android/java/res/values/dimens.xml b/components/tab_groups/android/java/res/values/dimens.xml new file mode 100644 index 0000000..e2820ebc --- /dev/null +++ b/components/tab_groups/android/java/res/values/dimens.xml
@@ -0,0 +1,12 @@ +<?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. +--> + +<resources> + <item name="tab_group_color_picker_hovered_alpha" format="float" type="dimen">0.08</item> + <item name="tab_group_color_picker_focused_alpha" format="float" type="dimen">0.1</item> + <item name="tab_group_color_picker_pressed_alpha" format="float" type="dimen">0.12</item> +</resources> \ No newline at end of file
diff --git a/components/tab_groups/android/java/src/org/chromium/components/tab_groups/TabGroupColorPickerUtils.java b/components/tab_groups/android/java/src/org/chromium/components/tab_groups/TabGroupColorPickerUtils.java index ef94e15..306a3bf3 100644 --- a/components/tab_groups/android/java/src/org/chromium/components/tab_groups/TabGroupColorPickerUtils.java +++ b/components/tab_groups/android/java/src/org/chromium/components/tab_groups/TabGroupColorPickerUtils.java
@@ -5,10 +5,13 @@ package org.chromium.components.tab_groups; import android.content.Context; +import android.content.res.ColorStateList; import android.content.res.Resources; +import android.graphics.Color; import androidx.annotation.ColorInt; import androidx.annotation.ColorRes; +import androidx.annotation.DimenRes; import androidx.core.content.ContextCompat; import com.google.android.material.color.MaterialColors; @@ -16,10 +19,20 @@ import org.chromium.build.annotations.NullMarked; import org.chromium.components.browser_ui.styles.SemanticColorUtils; import org.chromium.ui.util.ColorUtils; +import org.chromium.ui.util.ValueUtils; /** Helper class to handle tab group color picker related utilities. */ @NullMarked public class TabGroupColorPickerUtils { + + private static final int[][] HOVERED_FOCUSED_PRESSED_AND_NORMAL_STATES = + new int[][] { + new int[] {android.R.attr.state_hovered}, + new int[] {android.R.attr.state_focused}, + new int[] {android.R.attr.state_pressed}, + new int[] {} + }; + /** * Get the color corresponding to the color id that is passed in. Adjust the color depending on * light/dark/incognito mode as well as dynamic color themes. This function should only be used @@ -36,6 +49,35 @@ } /** + * Builds a {@link ColorStateList} for the ripple effect in the tab group color picker. The + * ripple color adapts based on whether the current context is incognito or not, and applies + * different alpha values for hovered, focused, and pressed states. + * + * @param context The {@link Context} used to retrieve colors and dimensions. + * @param isIncognito A boolean indicating whether the current mode is incognito. + * @return A {@link ColorStateList} configured for the ripple effect. + */ + public static ColorStateList buildTabGroupColorPickerRippleColorStateList( + Context context, boolean isIncognito) { + @DimenRes int hoveredAlpha = R.dimen.tab_group_color_picker_hovered_alpha; + @DimenRes int focusedAlpha = R.dimen.tab_group_color_picker_focused_alpha; + @DimenRes int pressedAlpha = R.dimen.tab_group_color_picker_pressed_alpha; + @ColorInt + int onSurfaceColor = + isIncognito + ? ContextCompat.getColor( + context, R.color.tab_group_color_picker_incognito_ripple_color) + : SemanticColorUtils.getColorOnSurface(context); + + int hoveredColor = getColorWithAlphaApplied(context, onSurfaceColor, hoveredAlpha); + int focusedColor = getColorWithAlphaApplied(context, onSurfaceColor, focusedAlpha); + int pressedColor = getColorWithAlphaApplied(context, onSurfaceColor, pressedAlpha); + + int[] colors = new int[] {hoveredColor, focusedColor, pressedColor, Color.TRANSPARENT}; + return new ColorStateList(HOVERED_FOCUSED_PRESSED_AND_NORMAL_STATES, colors); + } + + /** * Get the color resource corresponding to the respective color item. This function should only * be used for retrieving items from the tab group color picker. * @@ -298,4 +340,13 @@ return MaterialColors.harmonizeWithPrimary(context, color); } } + + private static @ColorInt int getColorWithAlphaApplied( + Context context, int color, @DimenRes int alphaRes) { + Resources resources = context.getResources(); + float alpha = ValueUtils.getFloat(resources, alphaRes); + int alphaScaled = Math.round(alpha * 255); + + return ColorUtils.setAlphaComponent(color, alphaScaled); + } }
diff --git a/components/tracing/common/etw_consumer_win.cc b/components/tracing/common/etw_consumer_win.cc index f3be490..4194c950 100644 --- a/components/tracing/common/etw_consumer_win.cc +++ b/components/tracing/common/etw_consumer_win.cc
@@ -188,11 +188,15 @@ DLOG(ERROR) << "Error decoding CSwitch Event"; } break; + case 50: // ReadyThread + if (!DecodeReadyThreadEvent(header, buffer_context, packet_data)) { + DLOG(ERROR) << "Error decoding ReadyThread Event"; + } + break; case 72: // ThreadSetName (v2) OnThreadSetName(header, buffer_context, packet_data); break; default: - // 50: ReadyThread break; } } @@ -447,6 +451,40 @@ return true; } +bool EtwConsumer::DecodeReadyThreadEvent( + const EVENT_HEADER& header, + const ETW_BUFFER_CONTEXT& buffer_context, + base::span<const uint8_t> packet_data) { + using perfetto::protos::pbzero::ReadyThreadEtwEvent; + + // Size of ReadyThread v2 in bytes (1 x 32-bit plus 4 x 8-bit). + static constexpr size_t kMinimumReadyThreadLength = 1 * 4 + 4; + if (packet_data.size() < kMinimumReadyThreadLength) { + return false; + } + + // Read and validate the contents of `packet_data`. + base::BufferIterator<const uint8_t> iterator{packet_data}; + auto thread_id = *iterator.CopyObject<uint32_t>(); + auto adjust_reason = *iterator.Object<int8_t>(); + auto adjust_increment = *iterator.Object<int8_t>(); + auto flag = *iterator.Object<int8_t>(); + + // Generate a ReadyThreadEtwEvent. + auto* event = MakeNextEvent(header, buffer_context); + if (inclusion_policy_.ShouldIncludeThreadId(header.ThreadId)) { + event->set_thread_id(header.ThreadId); + } + auto* ready_thread = event->set_ready_thread(); + if (inclusion_policy_.ShouldIncludeThreadId(thread_id)) { + ready_thread->set_t_thread_id(thread_id); + } + ready_thread->set_adjust_reason_int(adjust_reason); + ready_thread->set_adjust_increment(adjust_increment); + ready_thread->set_flag_int(flag); + return true; +} + perfetto::protos::pbzero::EtwTraceEvent* EtwConsumer::MakeNextEvent( const EVENT_HEADER& header, const ETW_BUFFER_CONTEXT& buffer_context) {
diff --git a/components/tracing/common/etw_consumer_win.h b/components/tracing/common/etw_consumer_win.h index adb7838..7c511186 100644 --- a/components/tracing/common/etw_consumer_win.h +++ b/components/tracing/common/etw_consumer_win.h
@@ -123,6 +123,14 @@ base::span<const uint8_t> packet_data) VALID_CONTEXT_REQUIRED(sequence_checker_); + // Decodes a ReadyThread Event and emits a Perfetto trace event; see + // https://learn.microsoft.com/en-us/windows/win32/etw/readythread. + // Returns true on success, or false if `packet_data` is invalid. + bool DecodeReadyThreadEvent(const EVENT_HEADER& header, + const ETW_BUFFER_CONTEXT& buffer_context, + base::span<const uint8_t> packet_data) + VALID_CONTEXT_REQUIRED(sequence_checker_); + // Returns a new perfetto trace event to be emitted for an ETW event with a // given event header. The timestamp and cpu fields of the returned event are // prepopulated.
diff --git a/components/tracing/common/etw_consumer_win_unittest.cc b/components/tracing/common/etw_consumer_win_unittest.cc index c071143..912ee2b 100644 --- a/components/tracing/common/etw_consumer_win_unittest.cc +++ b/components/tracing/common/etw_consumer_win_unittest.cc
@@ -93,6 +93,10 @@ uint32_t old_thread_id; }; +struct ReadyThreadData { + uint32_t t_thread_id; +}; + // Returns the MOF encoding of a sid, including the leading uint32_t and // TOKEN_USER. base::HeapArray<uint8_t> EncodeSid(size_t pointer_size) { @@ -245,6 +249,19 @@ return base::HeapArray<uint8_t>::CopiedFrom({buffer}); } +// Returns the MOF encoding of a v2 ReadyThread event. +base::HeapArray<uint8_t> EncodeReadyThread( + const ReadyThreadData& ready_thread) { + std::vector<uint8_t> buffer; + auto iter = std::back_inserter(buffer); + std::ranges::copy(base::byte_span_from_ref(ready_thread.t_thread_id), iter); + buffer.insert(buffer.end(), 0x01); // AdjustReason + buffer.insert(buffer.end(), 0); // AdjustIncrement + buffer.insert(buffer.end(), 0x01); // Flag = THREAD_READIED + buffer.insert(buffer.end(), sizeof(uint8_t), 0x42); // Reserved + return base::HeapArray<uint8_t>::CopiedFrom({buffer}); +} + } // namespace // A test fixture that instantiates an EtwConsumer and sends it some events to @@ -324,20 +341,11 @@ SendProcessDcEndEvent(EncodeProcess({.process_id = kSystemPid})); } - // Generates an ETW CSwitch event with `packet_data` as its payload and sends - // it to the EtwConsumer for processing. If the EtwConsumer generates a - // TracePacket containing a `CSwitchEtwEvent`, `cswitch_decoder` is - // constructed from it. - void ProcessCSwitchEvent(base::span<const uint8_t> packet_data) { - SendThreadEvent(/*version=*/2u, /*opcode=*/36u, packet_data); - } - - // Validates the TracePacket processed by `decoder` and populates `c_switch` + // Validates the TracePacket processed by `decoder` and populates `event` // with a decoder for the first ETW event contained therein. - void ValidateAndDecodeCSwitch( + void ValidateAndDecodeEtwEvent( const MessageAndDecoder& decoder, - std::optional<perfetto::protos::pbzero::CSwitchEtwEvent::Decoder>& - c_switch) { + std::optional<perfetto::protos::pbzero::EtwTraceEvent::Decoder>& event) { auto& trace_packet_decoder = decoder.decoder(); ASSERT_TRUE(trace_packet_decoder.has_timestamp()); @@ -346,50 +354,91 @@ perfetto::protos::pbzero::EtwTraceEventBundle::Decoder bundle( trace_packet_decoder.etw_events()); ASSERT_TRUE(bundle.has_event()); - perfetto::protos::pbzero::EtwTraceEvent::Decoder event(*bundle.event()); - ASSERT_TRUE(event.has_timestamp()); - ASSERT_TRUE(event.has_cpu()); - ASSERT_EQ(event.cpu(), kTestProcessorIndex); - ASSERT_TRUE(event.has_c_switch()); - c_switch.emplace(event.c_switch()); + event.emplace(*bundle.event()); + ASSERT_TRUE(event->has_timestamp()); + ASSERT_TRUE(event->has_cpu()); + ASSERT_EQ(event->cpu(), kTestProcessorIndex); + } + + // Generates an ETW CSwitch event with `packet_data` as its payload and sends + // it to the EtwConsumer for processing. If the EtwConsumer generates a + // TracePacket containing a `CSwitchEtwEvent`, a new decoder is constructed + // from it. + void ProcessCSwitchEvent(base::span<const uint8_t> packet_data) { + SendThreadEvent(/*version=*/2u, /*opcode=*/36u, kSystemTid, packet_data); + } + + // Validates the TracePacket processed by `decoder` and populates `c_switch` + // with a decoder for the first ETW event contained therein. + void ValidateAndDecodeCSwitch( + const MessageAndDecoder& decoder, + std::optional<perfetto::protos::pbzero::CSwitchEtwEvent::Decoder>& + c_switch) { + std::optional<perfetto::protos::pbzero::EtwTraceEvent::Decoder> event; + ValidateAndDecodeEtwEvent(decoder, event); + + ASSERT_TRUE(event->has_c_switch()); + c_switch.emplace(event->c_switch()); + } + + // Generates an ETW ReadyThread event with `packet_data` as its payload and + // sends it to the EtwConsumer for processing. If the EtwConsumer generates a + // TracePacket containing a `ReadyThreadEtwEvent`, a new decoder is + // constructed from it. + void ProcessReadyThreadEvent(uint32_t thread_id, + base::span<const uint8_t> packet_data) { + SendThreadEvent(/*version=*/2u, /*opcode=*/50u, thread_id, packet_data); + } + + // Validates the TracePacket processed by `decoder` and populates + // `ready_thread` with a decoder for the first ETW event contained therein. + void ValidateAndDecodeReadyThread( + const MessageAndDecoder& decoder, + std::optional<perfetto::protos::pbzero::EtwTraceEvent::Decoder>& event, + std::optional<perfetto::protos::pbzero::ReadyThreadEtwEvent::Decoder>& + ready_thread) { + ValidateAndDecodeEtwEvent(decoder, event); + + ASSERT_TRUE(event->has_ready_thread()); + ready_thread.emplace(event->ready_thread()); } void SendProcessStartEvent(base::span<const uint8_t> packet_data) { - SendProcessEvent(/*version=*/4u, /*opcode=*/1u, packet_data); + SendProcessEvent(/*version=*/4u, /*opcode=*/1u, kSystemTid, packet_data); } void SendProcessEndEvent(base::span<const uint8_t> packet_data) { - SendProcessEvent(/*version=*/4u, /*opcode=*/2u, packet_data); + SendProcessEvent(/*version=*/4u, /*opcode=*/2u, kSystemTid, packet_data); } void SendProcessDcStartEvent(base::span<const uint8_t> packet_data) { - SendProcessEvent(/*version=*/4u, /*opcode=*/3u, packet_data); + SendProcessEvent(/*version=*/4u, /*opcode=*/3u, kSystemTid, packet_data); } void SendProcessDcEndEvent(base::span<const uint8_t> packet_data) { - SendProcessEvent(/*version=*/4u, /*opcode=*/4u, packet_data); + SendProcessEvent(/*version=*/4u, /*opcode=*/4u, kSystemTid, packet_data); } void SendThreadStartEvent(base::span<const uint8_t> packet_data) { - SendThreadEvent(/*version=*/4u, /*opcode=*/1u, packet_data); + SendThreadEvent(/*version=*/4u, /*opcode=*/1u, kSystemTid, packet_data); } void SendThreadEndEvent(base::span<const uint8_t> packet_data) { - SendThreadEvent(/*version=*/4u, /*opcode=*/2u, packet_data); + SendThreadEvent(/*version=*/4u, /*opcode=*/2u, kSystemTid, packet_data); } void SendThreadDcStartEvent(base::span<const uint8_t> packet_data) { - SendThreadEvent(/*version=*/4u, /*opcode=*/3u, packet_data); + SendThreadEvent(/*version=*/4u, /*opcode=*/3u, kSystemTid, packet_data); } void SendThreadDcEndEvent(base::span<const uint8_t> packet_data) { - SendThreadEvent(/*version=*/4u, /*opcode=*/4u, packet_data); + SendThreadEvent(/*version=*/4u, /*opcode=*/4u, kSystemTid, packet_data); } void SendThreadSetName(uint32_t process_id, uint32_t thread_id, base::wcstring_view thread_name) { - SendThreadEvent(/*version=*/2, /*opcode=*/72, + SendThreadEvent(/*version=*/2, /*opcode=*/72, kSystemTid, EncodeThreadSetName(process_id, thread_id, thread_name)); } @@ -409,24 +458,26 @@ // `decoder` is constructed from it. void SendThreadEvent(uint8_t version, uint8_t opcode, + uint32_t thread_id, base::span<const uint8_t> packet_data) { ProcessEvent({0x3d6fa8d1, 0xfe05, 0x11d0, {0x9d, 0xda, 0x00, 0xc0, 0x4f, 0xd7, 0xba, 0x7c}}, - version, opcode, packet_data); + version, opcode, thread_id, packet_data); } // Generates an ETW Process event with `packet_data` as its payload and sends // it to the EtwConsumer for processing. void SendProcessEvent(uint8_t version, uint8_t opcode, + uint32_t thread_id, base::span<const uint8_t> packet_data) { ProcessEvent({0x3d6fa8d0, 0xfe05, 0x11d0, {0x9d, 0xda, 0x00, 0xc0, 0x4f, 0xd7, 0xba, 0x7c}}, - version, opcode, packet_data); + version, opcode, thread_id, packet_data); } // Returns the MOF encoding of a Process event (v4 by default). @@ -450,9 +501,11 @@ void ProcessEvent(const GUID& provider, uint8_t version, uint8_t opcode, + uint32_t thread_id, base::span<const uint8_t> packet_data) { EVENT_RECORD event_record = { .EventHeader = {.Flags = kEventHeaderFlags, + .ThreadId = thread_id, .ProviderId = provider, .EventDescriptor = {.Version = version, .Opcode = opcode}}, @@ -551,6 +604,73 @@ EXPECT_TRUE(c_switch->has_old_thread_id()); } +// Tests that no ReadyThreadEtwEvent is emitted for an empty ReadyThread ETW +// event. +TEST_F(EtwConsumerTest, ReadyThreadEventIsEmpty) { + ProcessReadyThreadEvent(kClientTid, {}); + ASSERT_TRUE(decoders().empty()); +} + +// Tests that no ReadyThreadEtwEvent is emitted for a small ReadyThread ETW +// event. +TEST_F(EtwConsumerTest, ReadyThreadEventIsTooShort) { + static constexpr uint8_t kData[] = {0x00, 23}; + ProcessReadyThreadEvent(kClientTid, {kData}); + ASSERT_TRUE(decoders().empty()); +} + +// Tests that CSwitchEtwEvent is emitted for a CSwitch ETW event. +TEST_F(EtwConsumerTest, ReadyThreadEvent) { + ProcessReadyThreadEvent(kClientTid, + EncodeReadyThread({.t_thread_id = kClientTid2})); + ASSERT_EQ(decoders().size(), 1u); + + std::optional<perfetto::protos::pbzero::EtwTraceEvent::Decoder> event; + std::optional<perfetto::protos::pbzero::ReadyThreadEtwEvent::Decoder> + ready_thread; + ASSERT_NO_FATAL_FAILURE( + ValidateAndDecodeReadyThread(*decoders().front(), event, ready_thread)); + + EXPECT_EQ(kClientTid, event->thread_id()); + EXPECT_EQ(kClientTid2, ready_thread->t_thread_id()); + EXPECT_EQ(0x01, ready_thread->adjust_reason_int()); + EXPECT_EQ(0, ready_thread->adjust_increment()); + EXPECT_EQ(0x01, ready_thread->flag_int()); +} + +// Tests that ReadyThread events have the thread IDs filtered as appropriate. +TEST_F(EtwConsumerTest, ReadyThreadFiltering) { + // Target TID is masked if it doesn't belong to Chrome. + ProcessReadyThreadEvent(kClientTid, + EncodeReadyThread({.t_thread_id = kSystemTid})); + ASSERT_EQ(decoders().size(), 1u); + std::optional<perfetto::protos::pbzero::EtwTraceEvent::Decoder> event; + std::optional<perfetto::protos::pbzero::ReadyThreadEtwEvent::Decoder> + ready_thread; + ASSERT_NO_FATAL_FAILURE( + ValidateAndDecodeReadyThread(*decoders().back(), event, ready_thread)); + EXPECT_TRUE(event->has_thread_id()); + EXPECT_FALSE(ready_thread->has_t_thread_id()); + + // Both TID and target TID are masked if neither belongs to Chrome. + ProcessReadyThreadEvent(kOtherTid, + EncodeReadyThread({.t_thread_id = kSystemTid})); + ASSERT_EQ(decoders().size(), 2u); + ASSERT_NO_FATAL_FAILURE( + ValidateAndDecodeReadyThread(*decoders().back(), event, ready_thread)); + EXPECT_FALSE(event->has_thread_id()); + EXPECT_FALSE(ready_thread->has_t_thread_id()); + + // TID is masked if it doesn't belong to Chrome. + ProcessReadyThreadEvent(kOtherTid, + EncodeReadyThread({.t_thread_id = kClientTid})); + ASSERT_EQ(decoders().size(), 3u); + ASSERT_NO_FATAL_FAILURE( + ValidateAndDecodeReadyThread(*decoders().back(), event, ready_thread)); + EXPECT_FALSE(event->has_thread_id()); + EXPECT_TRUE(ready_thread->has_t_thread_id()); +} + TEST_F(EtwConsumerTest, ThreadSetName) { SendThreadSetName(kClientPid, kClientTid, L"kaboom"); ASSERT_EQ(active_processes().GetThreadName(kClientTid), L"kaboom"); @@ -570,9 +690,11 @@ .parent_id = kSystemPid, .image_file_name = "himom"}, /*version=*/version); - SendProcessEvent(/*version=*/version, /*opcode=*/1u, payload); // Start + SendProcessEvent(/*version=*/version, /*opcode=*/1u, kSystemTid, + payload); // Start ASSERT_EQ(active_processes().GetProcessImageFileName(kPid), "himom"); - SendProcessEvent(/*version=*/version, /*opcode=*/2u, payload); // End + SendProcessEvent(/*version=*/version, /*opcode=*/2u, kSystemTid, + payload); // End ASSERT_TRUE(active_processes().GetProcessImageFileName(kPid).empty()); } } @@ -586,10 +708,12 @@ auto payload = EncodeThread( {.process_id = kClientPid, .thread_id = kTid, .thread_name = {}}, /*version=*/version); - SendThreadEvent(/*version=*/version, /*opcode=*/1u, payload); // Start + SendThreadEvent(/*version=*/version, /*opcode=*/1u, kSystemTid, + payload); // Start ASSERT_EQ(active_processes().GetThreadCategory(kTid), ActiveProcesses::Category::kClient); - SendThreadEvent(/*version=*/version, /*opcode=*/2u, payload); // End + SendThreadEvent(/*version=*/version, /*opcode=*/2u, kSystemTid, + payload); // End ASSERT_EQ(active_processes().GetThreadCategory(kTid), ActiveProcesses::Category::kOther); }
diff --git a/components/user_education/views/custom_help_bubble_view.h b/components/user_education/views/custom_help_bubble_view.h index ecc747a..d48d158 100644 --- a/components/user_education/views/custom_help_bubble_view.h +++ b/components/user_education/views/custom_help_bubble_view.h
@@ -14,6 +14,7 @@ #include "components/user_education/common/feature_promo/feature_promo_specification.h" #include "components/user_education/common/help_bubble/custom_help_bubble.h" #include "components/user_education/common/help_bubble/help_bubble_params.h" +#include "components/user_education/views/help_bubble_factory_views.h" #include "components/user_education/views/help_bubble_views.h" #include "ui/base/interaction/element_identifier.h" #include "ui/base/interaction/element_tracker.h" @@ -68,11 +69,25 @@ auto* const anchor_element = build_params.anchor_element.get(); auto bubble = bubble_factory_callback.Run(from_context, arrow, std::move(build_params)); - auto* const bubble_ptr = bubble.get(); + T* const bubble_ptr = bubble.get(); + + // Specific shadow types are required for help bubbles in order to + // properly render visible bubble arrows. + bubble_ptr->set_shadow( + HelpBubbleFactoryViews::GetDefaultBubbleShadow()); + auto widget = base::WrapUnique(views::BubbleDialogDelegateView::CreateBubble( std::move(bubble), views::Widget::InitParams::CLIENT_OWNS_WIDGET)); + + // Maybe set the arrow. This may require recalculating the bubble + // bounds. + if (arrow != HelpBubbleArrow::kNone) { + bubble_ptr->GetBubbleFrameView()->SetDisplayVisibleArrow(true); + bubble_ptr->SizeToContents(); + } + widget->Show(); return std::make_unique<CustomHelpBubbleViews>( std::move(widget), bubble_ptr, anchor_element, accept_button_action,
diff --git a/components/user_education/views/help_bubble_factory_views.cc b/components/user_education/views/help_bubble_factory_views.cc index 692d33ac..c2d9612 100644 --- a/components/user_education/views/help_bubble_factory_views.cc +++ b/components/user_education/views/help_bubble_factory_views.cc
@@ -7,6 +7,7 @@ #include <memory> #include <utility> +#include "build/build_config.h" #include "components/user_education/common/help_bubble/help_bubble_params.h" #include "components/user_education/common/user_education_class_properties.h" #include "components/user_education/views/help_bubble_delegate.h" @@ -17,6 +18,7 @@ #include "ui/base/accelerators/accelerator.h" #include "ui/base/accelerators/accelerator_manager.h" #include "ui/base/interaction/element_tracker.h" +#include "ui/views/bubble/bubble_border.h" #include "ui/views/controls/menu/menu_item_view.h" #include "ui/views/interaction/element_tracker_views.h" @@ -73,4 +75,18 @@ return result; } +// static +views::BubbleBorder::Shadow HelpBubbleFactoryViews::GetDefaultBubbleShadow() { +#if BUILDFLAG(IS_MAC) + // On Mac, the default DIALOG_SHADOW is system-drawn, which is + // incompatible with visible bubble arrows. Therefore, always use + // STANDARD_SHADOW. + return views::BubbleBorder::STANDARD_SHADOW; +#else + // On other platforms, all shadows are Views-drawn; use the (slightly + // better-looking) default DIALOG_SHADOW. + return views::BubbleBorder::DIALOG_SHADOW; +#endif +} + } // namespace user_education
diff --git a/components/user_education/views/help_bubble_factory_views.h b/components/user_education/views/help_bubble_factory_views.h index 524f446..caa7f81 100644 --- a/components/user_education/views/help_bubble_factory_views.h +++ b/components/user_education/views/help_bubble_factory_views.h
@@ -14,6 +14,7 @@ #include "ui/base/interaction/element_identifier.h" #include "ui/base/interaction/element_tracker.h" #include "ui/base/interaction/framework_specific_implementation.h" +#include "ui/views/bubble/bubble_border.h" #include "ui/views/widget/widget.h" namespace user_education { @@ -39,6 +40,9 @@ bool CanBuildBubbleForTrackedElement( const ui::TrackedElement* element) const override; + // Returns the default border type for help bubbles. + static views::BubbleBorder::Shadow GetDefaultBubbleShadow(); + protected: std::unique_ptr<HelpBubble> CreateBubbleImpl( ui::TrackedElement* element,
diff --git a/components/user_education/views/help_bubble_view.cc b/components/user_education/views/help_bubble_view.cc index 1f5f361d..049cea2 100644 --- a/components/user_education/views/help_bubble_view.cc +++ b/components/user_education/views/help_bubble_view.cc
@@ -22,6 +22,7 @@ #include "components/user_education/common/help_bubble/help_bubble_params.h" #include "components/user_education/views/help_bubble_delegate.h" #include "components/user_education/views/help_bubble_event_relay.h" +#include "components/user_education/views/help_bubble_factory_views.h" #include "components/user_education/views/help_bubble_views.h" #include "components/variations/variations_associated_data.h" #include "components/vector_icons/vector_icons.h" @@ -324,21 +325,10 @@ const internal::HelpBubbleAnchorParams& anchor, HelpBubbleParams params, std::unique_ptr<HelpBubbleEventRelay> event_relay) - : BubbleDialogDelegateView( - anchor.view, - HelpBubbleViews::TranslateArrow(params.arrow), -#if BUILDFLAG(IS_MAC) - // On Mac, the default DIALOG_SHADOW is system-drawn, which is - // incompatible with visible bubble arrows. Therefore, always use - // STANDARD_SHADOW. - views::BubbleBorder::STANDARD_SHADOW -#else - // On other platforms, all shadows are Views-drawn; use the (slightly - // better-looking) default DIALOG_SHADOW. - views::BubbleBorder::DIALOG_SHADOW -#endif - , - true), + : BubbleDialogDelegateView(anchor.view, + HelpBubbleViews::TranslateArrow(params.arrow), + HelpBubbleFactoryViews::GetDefaultBubbleShadow(), + true), delegate_(delegate), event_relay_(std::move(event_relay)) { SetBackgroundColor(delegate_->GetHelpBubbleBackgroundColorId());
diff --git a/components/user_education/views/help_bubble_views.cc b/components/user_education/views/help_bubble_views.cc index 350fcfa..512fccb 100644 --- a/components/user_education/views/help_bubble_views.cc +++ b/components/user_education/views/help_bubble_views.cc
@@ -260,6 +260,11 @@ bubble->GetWidget()->MakeCloseSynchronous(base::BindOnce( &CustomHelpBubbleViews::OnHelpBubbleClosing, base::Unretained(this))); + + // Custom help bubble should always have an anchor view. + auto* const anchor_view = bubble->GetAnchorView(); + anchor_view->SetProperty(user_education::kHasInProductHelpPromoKey, true); + user_education::MaybeApplyAttentionStateToTrackedElement(anchor_view); } CustomHelpBubbleViews::~CustomHelpBubbleViews() {
diff --git a/components/visited_url_ranking/internal/history_url_visit_data_fetcher.cc b/components/visited_url_ranking/internal/history_url_visit_data_fetcher.cc index c66f7ede..21d2b9c 100644 --- a/components/visited_url_ranking/internal/history_url_visit_data_fetcher.cc +++ b/components/visited_url_ranking/internal/history_url_visit_data_fetcher.cc
@@ -83,10 +83,10 @@ } visited_url_ranking::URLVisit::Source GetVisitSource( - std::map<std::string, - std::pair<std::string, syncer::DeviceInfo::FormFactor>> + const std::map<std::string, + std::pair<std::string, syncer::DeviceInfo::FormFactor>>& sync_device_info, - history::AnnotatedVisit annotated_visit, + const history::AnnotatedVisit& annotated_visit, raw_ptr<syncer::DeviceInfoSyncService> device_info_sync_service) { // The `originator_cache_guid` field is only set for foreign session visits // but some foreign visits are actually local as they can come from different @@ -98,6 +98,7 @@ if (annotated_visit.visit_row.originator_cache_guid.empty() || (it != sync_device_info.end() && (local_device_info_provider && + local_device_info_provider->GetLocalDeviceInfo() && it->second.first == local_device_info_provider->GetLocalDeviceInfo()->client_name()))) { return visited_url_ranking::URLVisit::Source::kLocal;
diff --git a/components/viz/service/frame_sinks/frame_sink_manager_impl.cc b/components/viz/service/frame_sinks/frame_sink_manager_impl.cc index 1e371e7e..a31410f 100644 --- a/components/viz/service/frame_sinks/frame_sink_manager_impl.cc +++ b/components/viz/service/frame_sinks/frame_sink_manager_impl.cc
@@ -18,10 +18,7 @@ #include "base/containers/contains.h" #include "base/containers/queue.h" #include "base/debug/alias.h" -#include "base/debug/crash_logging.h" -#include "base/debug/dump_without_crashing.h" #include "base/functional/bind.h" -#include "base/json/values_util.h" #include "base/logging.h" #include "base/metrics/histogram_functions.h" #include "base/observer_list.h" @@ -29,7 +26,6 @@ #include "base/task/single_thread_task_runner.h" #include "base/time/time.h" #include "base/trace_event/trace_event.h" -#include "base/values.h" #include "components/input/utils.h" #include "components/viz/common/performance_hint_utils.h" #include "components/viz/common/surfaces/subtree_capture_id.h" @@ -315,23 +311,9 @@ void FrameSinkManagerImpl::DestroyCompositorFrameSink( const FrameSinkId& frame_sink_id, DestroyCompositorFrameSinkCallback callback) { - const bool is_root = - root_sink_map_.find(frame_sink_id) != root_sink_map_.end(); - base::TimeTicks start = base::TimeTicks::Now(); - frame_sinks_detached_ = 0; - sink_map_.erase(frame_sink_id); root_sink_map_.erase(frame_sink_id); std::move(callback).Run(); - - base::TimeDelta time_taken_to_destroy = base::TimeTicks::Now() - start; - if (is_root && frame_sinks_detached_ != 0 && - time_taken_to_destroy > base::Milliseconds(30)) { - base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask( - FROM_HERE, - base::BindOnce(&FrameSinkManagerImpl::DumpCrashKeys, - weak_factory_.GetWeakPtr(), time_taken_to_destroy)); - } } void FrameSinkManagerImpl::RegisterFrameSinkHierarchy( @@ -691,16 +673,6 @@ RecursivelyAttachBeginFrameSource(source_iter.second, source_iter.first); } -void FrameSinkManagerImpl::DumpCrashKeys( - base::TimeDelta time_taken_to_destroy) { - base::Value::Dict dict = base::Value::Dict(); - dict.Set("num_frame_sinks_detached", frame_sinks_detached_); - dict.Set("time_taken_us", base::TimeDeltaToValue(time_taken_to_destroy)); - SCOPED_CRASH_KEY_STRING1024("crbug414568877", "crbug414568877", - dict.DebugString()); - base::debug::DumpWithoutCrashing(); -} - void FrameSinkManagerImpl::RecursivelyAttachBeginFrameSource( const FrameSinkId& frame_sink_id, BeginFrameSource* source) { @@ -744,7 +716,6 @@ // RenderInputRouter (for layer tree frame sinks associated CFSS) and // updating it earlier may cause UAF bugs. if (GetInputManager()) { - frame_sinks_detached_++; GetInputManager()->SetBeginFrameSource(frame_sink_id, nullptr); } client_iter->second->SetBeginFrameSource(nullptr);
diff --git a/components/viz/service/frame_sinks/frame_sink_manager_impl.h b/components/viz/service/frame_sinks/frame_sink_manager_impl.h index e2a54f89..3ebefa4 100644 --- a/components/viz/service/frame_sinks/frame_sink_manager_impl.h +++ b/components/viz/service/frame_sinks/frame_sink_manager_impl.h
@@ -398,9 +398,6 @@ friend class CompositorFrameSinkSupportTestBase; friend class FlingSchedulerTest; - // TOOD(6635304): Remove once the crash investigation is complete. - void DumpCrashKeys(base::TimeDelta time_taken_to_destroy); - // Metadata for a CompositorFrameSink. struct FrameSinkData { explicit FrameSinkData(bool report_activation); @@ -617,8 +614,6 @@ ReservedResourceIdTracker reserved_resource_id_tracker_; - int frame_sinks_detached_ = 0; - gfx::Size copy_output_request_result_size_for_testing_; base::WeakPtrFactory<FrameSinkManagerImpl> weak_factory_{this};
diff --git a/components/viz/service/main/viz_compositor_thread_runner_impl.cc b/components/viz/service/main/viz_compositor_thread_runner_impl.cc index 1fd24576..1e9ea74 100644 --- a/components/viz/service/main/viz_compositor_thread_runner_impl.cc +++ b/components/viz/service/main/viz_compositor_thread_runner_impl.cc
@@ -46,6 +46,11 @@ auto thread = std::make_unique<base::android::JavaHandlerThread>(kThreadName, thread_type); thread->Start(); + thread->task_runner()->PostTask( + FROM_HERE, base::BindOnce([]() { + mojo::InterfaceEndpointClient::SetThreadNameSuffixForMetrics( + "VizCompositor"); + })); return thread; #else // !BUILDFLAG(IS_ANDROID) @@ -74,6 +79,12 @@ CHECK(thread->StartWithOptions(std::move(thread_options))); + thread->task_runner()->PostTask( + FROM_HERE, base::BindOnce([]() { + mojo::InterfaceEndpointClient::SetThreadNameSuffixForMetrics( + "VizCompositor"); + })); + return thread; #endif // !BUILDFLAG(IS_ANDROID) }
diff --git a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc index 87335792..c5a52f4 100644 --- a/content/browser/accessibility/dump_accessibility_tree_browsertest.cc +++ b/content/browser/accessibility/dump_accessibility_tree_browsertest.cc
@@ -503,7 +503,7 @@ } IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, AccessibilityCSSMarkerCrash) { - RunCSSTest(FILE_PATH_LITERAL("marker-crash.html")); + RunCrashTest(FILE_PATH_LITERAL("marker-crash.html")); } IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, @@ -745,12 +745,12 @@ } IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, AccessibilityAreaCrash) { - RunHtmlTest(FILE_PATH_LITERAL("area-crash.html")); + RunCrashTest(FILE_PATH_LITERAL("area-crash.html")); } IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, AccessibilityAreaSerializationCrash) { - RunHtmlTest(FILE_PATH_LITERAL("area-serialization-crash.html")); + RunCrashTest(FILE_PATH_LITERAL("area-serialization-crash.html")); } IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, @@ -1619,11 +1619,11 @@ } IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, AccessibilityAriaOwnsCrash) { - RunAriaTest(FILE_PATH_LITERAL("aria-owns-crash.html")); + RunCrashTest(FILE_PATH_LITERAL("aria-owns-crash.html")); } IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, AccessibilityAriaOwnsCrash2) { - RunAriaTest(FILE_PATH_LITERAL("aria-owns-crash-2.html")); + RunCrashTest(FILE_PATH_LITERAL("aria-owns-crash-2.html")); } IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, @@ -1633,8 +1633,9 @@ IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, AccessibilityAriaOwnsChildAndHiddenDescendantCrash) { - RunFormControlsTest( - FILE_PATH_LITERAL("aria-owns-child-and-hidden-descendant-crash.html")); + RunCrashTest( + FILE_PATH_LITERAL("aria-owns-child-and-hidden-descendant-crash.html"), + ui::kAXModeFormControls); } IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, @@ -1658,7 +1659,7 @@ IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, AccessibilityAriaOwnsReparentAboveOtherChangeCrash) { - RunRegressionTest( + RunCrashTest( FILE_PATH_LITERAL("aria-owns-reparent-above-other-change-crash.html")); } @@ -2707,7 +2708,7 @@ IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, AccessibilityHiddenNamedSlotNoSubtreeCrash) { - RunHtmlTest(FILE_PATH_LITERAL("hidden-named-slot-no-subtree-crash.html")); + RunCrashTest(FILE_PATH_LITERAL("hidden-named-slot-no-subtree-crash.html")); } IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, AccessibilityHR) { @@ -3663,7 +3664,8 @@ IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, AccessibilityProgressMeterCrash) { - RunFormControlsTest(FILE_PATH_LITERAL("progress-meter-crash.html")); + RunCrashTest(FILE_PATH_LITERAL("progress-meter-crash.html"), + ui::kAXModeFormControls); } IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, AccessibilityQ) { @@ -3675,7 +3677,7 @@ } IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, AccessibilityReparentCrash) { - RunHtmlTest(FILE_PATH_LITERAL("reparent-crash.html")); + RunCrashTest(FILE_PATH_LITERAL("reparent-crash.html")); } IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, AccessibilityReplaceData) { @@ -4143,7 +4145,7 @@ IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, AccessibilityNodeChangedCrashInEditableText) { - RunHtmlTest(FILE_PATH_LITERAL("node-changed-crash-in-editable-text.html")); + RunCrashTest(FILE_PATH_LITERAL("node-changed-crash-in-editable-text.html")); } // TODO(crbug.com/40866942): This test is failing on Android. @@ -4238,12 +4240,12 @@ } IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, DeleteSelectionCrash) { - RunHtmlTest(FILE_PATH_LITERAL("delete-selection-crash.html")); + RunCrashTest(FILE_PATH_LITERAL("delete-selection-crash.html")); } IN_PROC_BROWSER_TEST_P(YieldingParserDumpAccessibilityTreeTest, DeleteSelectionCrash) { - RunHtmlTest(FILE_PATH_LITERAL("delete-selection-crash.html")); + RunCrashTest(FILE_PATH_LITERAL("delete-selection-crash.html")); } IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, NameImgLabelledbyInputsTree) { @@ -4258,12 +4260,12 @@ #endif IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, MAYBE_ReloadSelectionCrash) { - RunRegressionTest(FILE_PATH_LITERAL("reload-selection-crash.html")); + RunCrashTest(FILE_PATH_LITERAL("reload-selection-crash.html")); } IN_PROC_BROWSER_TEST_P(YieldingParserDumpAccessibilityTreeTest, ReloadSelectionCrash) { - RunRegressionTest(FILE_PATH_LITERAL("reload-selection-crash.html")); + RunCrashTest(FILE_PATH_LITERAL("reload-selection-crash.html")); } // @@ -4410,17 +4412,17 @@ #if !BUILDFLAG(IS_MAC) IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, SelectExpandManyOptionsCrash) { - RunRegressionTest(FILE_PATH_LITERAL("select-expand-many-options-crash.html")); + RunCrashTest(FILE_PATH_LITERAL("select-expand-many-options-crash.html")); } #endif IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, XmlInIframeCrash) { - RunRegressionTest(FILE_PATH_LITERAL("xml-in-iframe-crash.html")); + RunCrashTest(FILE_PATH_LITERAL("xml-in-iframe-crash.html")); } IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, RelationPointsToInvalidNodesCrash) { - RunRegressionTest( + RunCrashTest( FILE_PATH_LITERAL("relation-points-to-invalid-nodes-crash.html")); } @@ -4464,7 +4466,7 @@ } IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, IgnoredCrash) { - RunRegressionTest(FILE_PATH_LITERAL("ignored-crash.html")); + RunCrashTest(FILE_PATH_LITERAL("ignored-crash.html")); } IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, MissingParent) { @@ -4511,7 +4513,7 @@ IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, AccessibilitySlotCreationCrash) { - RunRegressionTest(FILE_PATH_LITERAL("slot-creation-crash.html")); + RunCrashTest(FILE_PATH_LITERAL("slot-creation-crash.html")); } IN_PROC_BROWSER_TEST_P(DumpAccessibilityTreeTest, TitleInShadow) {
diff --git a/content/browser/accessibility/dump_accessibility_tree_browsertest.h b/content/browser/accessibility/dump_accessibility_tree_browsertest.h index b6fa1d75..c0bb32d 100644 --- a/content/browser/accessibility/dump_accessibility_tree_browsertest.h +++ b/content/browser/accessibility/dump_accessibility_tree_browsertest.h
@@ -17,6 +17,7 @@ constexpr const char kAccName[]{"accname"}; constexpr const char kAria[]{"aria"}; constexpr const char kCSS[]{"css"}; +constexpr const char kCrash[]{"crash"}; constexpr const char kFormControls[]{"form-controls"}; constexpr const char kHtml[]{"html"}; constexpr const char kMathML[]{"mathml"}; @@ -64,6 +65,7 @@ TEST_TYPE(AccName) TEST_TYPE(Aria) TEST_TYPE(CSS) + TEST_TYPE(Crash) TEST_TYPE(Html) TEST_TYPE(MathML) TEST_TYPE(DisplayLocking) @@ -71,6 +73,11 @@ TEST_TYPE(Regression) TEST_TYPE(TestHarness) + void RunCrashTest(const base::FilePath::CharType* file_path, + ui::AXMode mode) { + RunTypedTest<kCrash>(file_path, mode); + } + void RunFormControlsTest(const base::FilePath::CharType* file_path) { RunTypedTest<kFormControls>(file_path, ui::kAXModeFormControls); }
diff --git a/content/browser/indexed_db/BUILD.gn b/content/browser/indexed_db/BUILD.gn index 214e23da..c01b146 100644 --- a/content/browser/indexed_db/BUILD.gn +++ b/content/browser/indexed_db/BUILD.gn
@@ -70,10 +70,6 @@ "instance/lock_request_data.h", "instance/pending_connection.cc", "instance/pending_connection.h", - "instance/record.cc", - "instance/record.h", - "instance/sqlite/backing_store_cursor_impl.cc", - "instance/sqlite/backing_store_cursor_impl.h", "instance/sqlite/backing_store_database_impl.cc", "instance/sqlite/backing_store_database_impl.h", "instance/sqlite/backing_store_impl.cc", @@ -82,8 +78,6 @@ "instance/sqlite/backing_store_transaction_impl.h", "instance/sqlite/database_connection.cc", "instance/sqlite/database_connection.h", - "instance/sqlite/record_iterator.cc", - "instance/sqlite/record_iterator.h", "instance/transaction.cc", "instance/transaction.h", "list_set.h",
diff --git a/content/browser/indexed_db/indexed_db_leveldb_coding.cc b/content/browser/indexed_db/indexed_db_leveldb_coding.cc index cc2f1f4e..bb1ac2a2 100644 --- a/content/browser/indexed_db/indexed_db_leveldb_coding.cc +++ b/content/browser/indexed_db/indexed_db_leveldb_coding.cc
@@ -420,14 +420,13 @@ return EncodeIDBKeyRecursively(value, into, 0); } -void EncodeSortableIDBKeyRecursively(const IndexedDBKey& value, - std::string* into) { +void EncodeSortableIDBKey(const IndexedDBKey& value, std::string* into) { size_t previous_size = into->size(); switch (value.type()) { case blink::mojom::IDBKeyType::Array: { EncodeByte(kOrderedArrayTypeByte, into); for (const IndexedDBKey& key : value.array()) { - EncodeSortableIDBKeyRecursively(key, into); + EncodeSortableIDBKey(key, into); } EncodeByte(kSentinel, into); DCHECK_GT(into->size(), previous_size); @@ -457,12 +456,6 @@ } } -std::string EncodeSortableIDBKey(const IndexedDBKey& value) { - std::string encoded; - EncodeSortableIDBKeyRecursively(value, &encoded); - return encoded; -} - #define COMPILE_ASSERT_MATCHING_VALUES(a, b) \ static_assert( \ static_cast<unsigned char>(a) == static_cast<unsigned char>(b), \
diff --git a/content/browser/indexed_db/indexed_db_leveldb_coding.h b/content/browser/indexed_db/indexed_db_leveldb_coding.h index 829f37b..4716a71b 100644 --- a/content/browser/indexed_db/indexed_db_leveldb_coding.h +++ b/content/browser/indexed_db/indexed_db_leveldb_coding.h
@@ -73,8 +73,8 @@ // collation operation. Unlike `EncodeIDBKey`, which makes use of length bytes, // this operation re-encodes variable-length values in a way that supports // sentinels. -CONTENT_EXPORT std::string EncodeSortableIDBKey( - const blink::IndexedDBKey& value); +CONTENT_EXPORT void EncodeSortableIDBKey(const blink::IndexedDBKey& value, + std::string* into); CONTENT_EXPORT void EncodeIDBKeyPath(const blink::IndexedDBKeyPath& value, std::string* into); CONTENT_EXPORT void EncodeBlobJournal(const BlobJournalType& journal,
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 9f3be06e..7d4f3b2 100644 --- a/content/browser/indexed_db/indexed_db_leveldb_coding_unittest.cc +++ b/content/browser/indexed_db/indexed_db_leveldb_coding_unittest.cc
@@ -852,9 +852,11 @@ EXPECT_TRUE(key_a.IsLessThan(key_b)); - std::string encoded_a = EncodeSortableIDBKey(key_a); + std::string encoded_a; + EncodeSortableIDBKey(key_a, &encoded_a); EXPECT_TRUE(encoded_a.size()); - std::string encoded_b = EncodeSortableIDBKey(key_b); + std::string encoded_b; + EncodeSortableIDBKey(key_b, &encoded_b); EXPECT_TRUE(encoded_b.size()); auto sqlite_compare = [](const std::string& a, const std::string& b) { @@ -874,7 +876,8 @@ } // Also test decoding by treating all test cases as one massive array key. const IndexedDBKey all_keys_key(std::move(keys_vec)); - std::string encoded = EncodeSortableIDBKey(all_keys_key); + std::string encoded; + EncodeSortableIDBKey(all_keys_key, &encoded); IndexedDBKey decoded_value = DecodeSortableIDBKey(encoded); ASSERT_TRUE(decoded_value.IsValid()); EXPECT_TRUE(all_keys_key.Equals(decoded_value)) @@ -934,11 +937,13 @@ SCOPED_TRACE(testing::Message() << "Comparing " << value_a << " and " << value_b); - std::string encoded_a = EncodeSortableIDBKey( - IndexedDBKey(value_a, blink::mojom::IDBKeyType::Number)); + std::string encoded_a; + EncodeSortableIDBKey( + IndexedDBKey(value_a, blink::mojom::IDBKeyType::Number), &encoded_a); EXPECT_TRUE(encoded_a.size()); - std::string encoded_b = EncodeSortableIDBKey( - IndexedDBKey(value_b, blink::mojom::IDBKeyType::Number)); + std::string encoded_b; + EncodeSortableIDBKey( + IndexedDBKey(value_b, blink::mojom::IDBKeyType::Number), &encoded_b); EXPECT_TRUE(encoded_b.size()); EXPECT_EQ(encoded_a.size(), encoded_b.size()); @@ -959,7 +964,8 @@ for (double value : values) { const IndexedDBKey key(value, blink::mojom::IDBKeyType::Number); - std::string encoded = EncodeSortableIDBKey(key); + std::string encoded; + EncodeSortableIDBKey(key, &encoded); IndexedDBKey decoded_value = DecodeSortableIDBKey(encoded); ASSERT_TRUE(decoded_value.IsValid()); EXPECT_TRUE(key.Equals(decoded_value))
diff --git a/content/browser/indexed_db/instance/backing_store.h b/content/browser/indexed_db/instance/backing_store.h index cad6561..8519190 100644 --- a/content/browser/indexed_db/instance/backing_store.h +++ b/content/browser/indexed_db/instance/backing_store.h
@@ -214,12 +214,13 @@ // keys are valid, advances the cursor to the row for `key` or `key` and // `primary_key`. Returns true on success, or false if no eligible row was // found. Returns an error if there was a DB error. - virtual StatusOr<bool> Continue() = 0; virtual StatusOr<bool> Continue(const blink::IndexedDBKey& key, const blink::IndexedDBKey& primary_key) = 0; virtual StatusOr<bool> Advance(uint32_t count) = 0; // Clone may return a nullptr if cloning fails for any reason. virtual std::unique_ptr<Cursor> Clone() const = 0; + + StatusOr<bool> Continue() { return Continue({}, {}); } }; virtual ~BackingStore() = default;
diff --git a/content/browser/indexed_db/instance/leveldb/backing_store.cc b/content/browser/indexed_db/instance/leveldb/backing_store.cc index d02ba75..bf102b3 100644 --- a/content/browser/indexed_db/instance/leveldb/backing_store.cc +++ b/content/browser/indexed_db/instance/leveldb/backing_store.cc
@@ -3247,7 +3247,7 @@ StatusOr<bool> BackingStore::Cursor::Advance(uint32_t count) { while (count--) { - StatusOr<bool> result = Continue(); + StatusOr<bool> result = indexed_db::BackingStore::Cursor::Continue(); if (!result.has_value()) { return base::unexpected(result.error()); } @@ -3259,10 +3259,6 @@ return true; } -StatusOr<bool> BackingStore::Cursor::Continue() { - return Continue({}, {}); -} - StatusOr<bool> BackingStore::Cursor::Continue(const IndexedDBKey& key, const IndexedDBKey& primary_key) { return Continue(key, primary_key, SEEK);
diff --git a/content/browser/indexed_db/instance/leveldb/backing_store.h b/content/browser/indexed_db/instance/leveldb/backing_store.h index eef58b36..98ddfea 100644 --- a/content/browser/indexed_db/instance/leveldb/backing_store.h +++ b/content/browser/indexed_db/instance/leveldb/backing_store.h
@@ -365,7 +365,6 @@ const blink::IndexedDBKey& GetKey() const override; const blink::IndexedDBKey& GetPrimaryKey() const override; blink::IndexedDBKey TakeKey() && override; - StatusOr<bool> Continue() override; StatusOr<bool> Continue(const blink::IndexedDBKey& key, const blink::IndexedDBKey& primary_key) override; StatusOr<bool> Advance(uint32_t count) override;
diff --git a/content/browser/indexed_db/instance/record.cc b/content/browser/indexed_db/instance/record.cc deleted file mode 100644 index 409745a..0000000 --- a/content/browser/indexed_db/instance/record.cc +++ /dev/null
@@ -1,40 +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 "content/browser/indexed_db/instance/record.h" - -#include <utility> - -#include "base/notreached.h" - -namespace content::indexed_db { - -ObjectStoreRecord::ObjectStoreRecord(blink::IndexedDBKey key, - IndexedDBValue value) - : key_(std::move(key)), value_(std::move(value)) {} - -ObjectStoreRecord::~ObjectStoreRecord() = default; - -blink::IndexedDBKey& ObjectStoreRecord::key() { - return key_; -} - -blink::IndexedDBKey& ObjectStoreRecord::primary_key() { - return key_; -} - -IndexedDBValue& ObjectStoreRecord::value() { - return value_; -} - -ObjectStoreKeyOnlyRecord::ObjectStoreKeyOnlyRecord(blink::IndexedDBKey key) - : ObjectStoreRecord(std::move(key), /*value=*/{}) {} - -ObjectStoreKeyOnlyRecord::~ObjectStoreKeyOnlyRecord() = default; - -IndexedDBValue& ObjectStoreKeyOnlyRecord::value() { - NOTREACHED(); -} - -} // namespace content::indexed_db
diff --git a/content/browser/indexed_db/instance/record.h b/content/browser/indexed_db/instance/record.h deleted file mode 100644 index 6956401f..0000000 --- a/content/browser/indexed_db/instance/record.h +++ /dev/null
@@ -1,50 +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 CONTENT_BROWSER_INDEXED_DB_INSTANCE_RECORD_H_ -#define CONTENT_BROWSER_INDEXED_DB_INSTANCE_RECORD_H_ - -#include "content/browser/indexed_db/indexed_db_value.h" -#include "third_party/blink/public/common/indexeddb/indexeddb_key.h" - -namespace content::indexed_db { - -// Base class for an IndexedDB record. -class Record { - public: - virtual ~Record() = default; - - virtual blink::IndexedDBKey& key() = 0; - virtual blink::IndexedDBKey& primary_key() = 0; - virtual IndexedDBValue& value() = 0; -}; - -// An object store record has a key and value, with `primary_key()` being the -// key itself. -class ObjectStoreRecord : public Record { - public: - ObjectStoreRecord(blink::IndexedDBKey key, IndexedDBValue value); - ~ObjectStoreRecord() override; - - blink::IndexedDBKey& key() override; - blink::IndexedDBKey& primary_key() override; - IndexedDBValue& value() override; - - private: - blink::IndexedDBKey key_; - IndexedDBValue value_; -}; - -// It is an error to call `value()` on this type of record. -class ObjectStoreKeyOnlyRecord : public ObjectStoreRecord { - public: - explicit ObjectStoreKeyOnlyRecord(blink::IndexedDBKey key); - ~ObjectStoreKeyOnlyRecord() override; - - IndexedDBValue& value() override; -}; - -} // namespace content::indexed_db - -#endif // CONTENT_BROWSER_INDEXED_DB_INSTANCE_RECORD_H_
diff --git a/content/browser/indexed_db/instance/sqlite/backing_store_cursor_impl.cc b/content/browser/indexed_db/instance/sqlite/backing_store_cursor_impl.cc deleted file mode 100644 index b1bfda1c..0000000 --- a/content/browser/indexed_db/instance/sqlite/backing_store_cursor_impl.cc +++ /dev/null
@@ -1,69 +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 "content/browser/indexed_db/instance/sqlite/backing_store_cursor_impl.h" - -#include <memory> -#include <utility> - -#include "base/types/expected.h" -#include "content/browser/indexed_db/instance/record.h" -#include "content/browser/indexed_db/instance/sqlite/record_iterator.h" -#include "content/browser/indexed_db/status.h" - -namespace content::indexed_db::sqlite { - -content::indexed_db::sqlite::BackingStoreCursorImpl::BackingStoreCursorImpl( - std::unique_ptr<RecordIterator> iterator, - std::unique_ptr<Record> initial_record) - : iterator_(std::move(iterator)), - current_record_(std::move(initial_record)) {} - -BackingStoreCursorImpl::~BackingStoreCursorImpl() = default; - -const blink::IndexedDBKey& BackingStoreCursorImpl::GetKey() const { - return current_record_->key(); -} - -blink::IndexedDBKey BackingStoreCursorImpl::TakeKey() && { - return std::move(current_record_->key()); -} - -const blink::IndexedDBKey& BackingStoreCursorImpl::GetPrimaryKey() const { - return current_record_->primary_key(); -} - -IndexedDBValue& BackingStoreCursorImpl::GetValue() { - return current_record_->value(); -} - -std::unique_ptr<BackingStore::Cursor> BackingStoreCursorImpl::Clone() const { - // This is needed by `Cursor::PrefetchIterationOperation()`. - // TODO(crbug.com/419208481): Implement prefetch without using `Clone()`. - return nullptr; -} - -StatusOr<bool> BackingStoreCursorImpl::Continue() { - return Advance(1); -} - -StatusOr<bool> BackingStoreCursorImpl::Continue( - const blink::IndexedDBKey& key, - const blink::IndexedDBKey& primary_key) { - return iterator_->Iterate(key, primary_key) - .transform([this](std::unique_ptr<Record> new_record) { - current_record_ = std::move(new_record); - return current_record_ != nullptr; - }); -} - -StatusOr<bool> BackingStoreCursorImpl::Advance(uint32_t count) { - return iterator_->Iterate(count).transform( - [this](std::unique_ptr<Record> new_record) { - current_record_ = std::move(new_record); - return current_record_ != nullptr; - }); -} - -} // namespace content::indexed_db::sqlite
diff --git a/content/browser/indexed_db/instance/sqlite/backing_store_cursor_impl.h b/content/browser/indexed_db/instance/sqlite/backing_store_cursor_impl.h deleted file mode 100644 index 4f136e6..0000000 --- a/content/browser/indexed_db/instance/sqlite/backing_store_cursor_impl.h +++ /dev/null
@@ -1,46 +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 CONTENT_BROWSER_INDEXED_DB_INSTANCE_SQLITE_BACKING_STORE_CURSOR_IMPL_H_ -#define CONTENT_BROWSER_INDEXED_DB_INSTANCE_SQLITE_BACKING_STORE_CURSOR_IMPL_H_ - -#include <memory> - -#include "base/types/pass_key.h" -#include "content/browser/indexed_db/instance/backing_store.h" - -namespace content::indexed_db { -class Record; - -namespace sqlite { -class RecordIterator; - -class BackingStoreCursorImpl : public BackingStore::Cursor { - public: - using PassKey = base::PassKey<BackingStoreCursorImpl>; - - BackingStoreCursorImpl(std::unique_ptr<RecordIterator> iterator, - std::unique_ptr<Record> initial_record); - ~BackingStoreCursorImpl() override; - - // BackingStore::Cursor: - const blink::IndexedDBKey& GetKey() const override; - blink::IndexedDBKey TakeKey() && override; - const blink::IndexedDBKey& GetPrimaryKey() const override; - IndexedDBValue& GetValue() override; - std::unique_ptr<Cursor> Clone() const override; - StatusOr<bool> Continue() override; - StatusOr<bool> Continue(const blink::IndexedDBKey& key, - const blink::IndexedDBKey& primary_key) override; - StatusOr<bool> Advance(uint32_t count) override; - - private: - std::unique_ptr<RecordIterator> iterator_; - std::unique_ptr<Record> current_record_; -}; - -} // namespace sqlite -} // namespace content::indexed_db - -#endif // CONTENT_BROWSER_INDEXED_DB_INSTANCE_SQLITE_BACKING_STORE_CURSOR_IMPL_H_
diff --git a/content/browser/indexed_db/instance/sqlite/backing_store_transaction_impl.cc b/content/browser/indexed_db/instance/sqlite/backing_store_transaction_impl.cc index 9faf1f4..fde8437f 100644 --- a/content/browser/indexed_db/instance/sqlite/backing_store_transaction_impl.cc +++ b/content/browser/indexed_db/instance/sqlite/backing_store_transaction_impl.cc
@@ -188,18 +188,18 @@ BackingStoreTransactionImpl::OpenObjectStoreKeyCursor( int64_t object_store_id, const blink::IndexedDBKeyRange& key_range, - blink::mojom::IDBCursorDirection direction) { - return db_->OpenObjectStoreCursor(PassKey(), object_store_id, key_range, - direction, /*key_only=*/true); + blink::mojom::IDBCursorDirection) { + NOTIMPLEMENTED(); + return base::unexpected(Status::InvalidArgument("Not implemented")); } StatusOr<std::unique_ptr<indexed_db::BackingStore::Cursor>> BackingStoreTransactionImpl::OpenObjectStoreCursor( int64_t object_store_id, const blink::IndexedDBKeyRange& key_range, - blink::mojom::IDBCursorDirection direction) { - return db_->OpenObjectStoreCursor(PassKey(), object_store_id, key_range, - direction, /*key_only=*/false); + blink::mojom::IDBCursorDirection) { + NOTIMPLEMENTED(); + return base::unexpected(Status::InvalidArgument("Not implemented")); } StatusOr<std::unique_ptr<indexed_db::BackingStore::Cursor>>
diff --git a/content/browser/indexed_db/instance/sqlite/database_connection.cc b/content/browser/indexed_db/instance/sqlite/database_connection.cc index 11228b63f..effa745 100644 --- a/content/browser/indexed_db/instance/sqlite/database_connection.cc +++ b/content/browser/indexed_db/instance/sqlite/database_connection.cc
@@ -9,7 +9,6 @@ #include <utility> #include "base/check.h" -#include "base/functional/callback.h" #include "base/memory/ptr_util.h" #include "base/notimplemented.h" #include "base/notreached.h" @@ -19,10 +18,7 @@ #include "base/types/expected.h" #include "content/browser/indexed_db/indexed_db_value.h" #include "content/browser/indexed_db/instance/backing_store.h" -#include "content/browser/indexed_db/instance/record.h" -#include "content/browser/indexed_db/instance/sqlite/backing_store_cursor_impl.h" #include "content/browser/indexed_db/instance/sqlite/backing_store_transaction_impl.h" -#include "content/browser/indexed_db/instance/sqlite/record_iterator.h" #include "content/browser/indexed_db/status.h" #include "sql/database.h" #include "sql/meta_table.h" @@ -174,113 +170,6 @@ return metadata; } -// Returns a `RecordIterator` and the initial `Record` for the range of object -// store records determined by the parameters. Returns nullptrs if the range is -// empty or an error if one occurs. -StatusOr<std::pair<std::unique_ptr<RecordIterator>, std::unique_ptr<Record>>> -CreateObjectStoreRecordIterator(sql::Database* db, - int64_t object_store_id, - const blink::IndexedDBKeyRange& key_range, - bool ascending_order, - bool key_only) { - std::vector<std::string_view> query_pieces{ - "SELECT ", key_only ? "key" : "key, value", - " FROM records WHERE object_store_id = @object_store_id"}; - if (key_range.lower().IsValid()) { - query_pieces.push_back(key_range.lower_open() ? " AND key > @lower" - : " AND key >= @lower"); - } - if (key_range.upper().IsValid()) { - query_pieces.push_back(key_range.upper_open() ? " AND key < @upper" - : " AND key <= @upper"); - } - if (ascending_order) { - query_pieces.push_back( - " AND (@is_first_seek = 1 OR key > @position)" - " AND (@target_key IS NULL OR key >= @target_key)" - " ORDER BY key ASC"); - } else { - query_pieces.push_back( - " AND (@is_first_seek = 1 OR key < @position)" - " AND (@target_key IS NULL OR key <= @target_key)" - " ORDER BY key DESC"); - } - // LIMIT is needed to use OFFSET. A negative LIMIT implies no limit on the - // number of rows returned: - // https://www.sqlite.org/lang_select.html#the_limit_clause. - query_pieces.push_back(" LIMIT -1 OFFSET @offset"); - - auto statement = std::make_unique<sql::Statement>( - db->GetReadonlyStatement(base::StrCat(query_pieces))); - int param_index = 0; - statement->BindInt64(param_index++, object_store_id); - if (key_range.lower().IsValid()) { - statement->BindBlob(param_index++, EncodeSortableIDBKey(key_range.lower())); - } - if (key_range.upper().IsValid()) { - statement->BindBlob(param_index++, EncodeSortableIDBKey(key_range.upper())); - } - int is_first_seek_index = param_index++; - int position_index = param_index++; - int target_key_index = param_index++; - int offset_index = param_index++; - - RecordIterator::BindCallback bind_parameters = base::BindRepeating( - [](int is_first_seek_index, int position_index, int target_key_index, - int offset_index, sql::Statement& statement, - const std::string& position, const blink::IndexedDBKey& target_key, - const blink::IndexedDBKey& _, uint32_t offset) { - statement.BindBool(is_first_seek_index, false); - statement.BindBlob(position_index, position); - if (target_key.IsValid()) { - statement.BindBlob(target_key_index, - EncodeSortableIDBKey(target_key)); - } else { - statement.BindNull(target_key_index); - } - statement.BindInt64(offset_index, offset); - }, - is_first_seek_index, position_index, target_key_index, offset_index); - - RecordIterator::ReadCallback read_row = base::BindRepeating( - [](bool key_only, sql::Statement& statement) - -> StatusOr<RecordIterator::PositionAndRecord> { - std::string position; - TRANSIENT_CHECK(statement.ColumnBlobAsString(0, &position)); - blink::IndexedDBKey key = DecodeSortableIDBKey(position); - if (key_only) { - return std::make_pair( - std::move(position), - std::make_unique<ObjectStoreKeyOnlyRecord>(std::move(key))); - } - IndexedDBValue value; - TRANSIENT_CHECK(statement.ColumnBlobAsVector(1, &value.bits)); - return std::make_pair(std::move(position), - std::make_unique<ObjectStoreRecord>( - std::move(key), std::move(value))); - }, - key_only); - - // Attempt to find the initial record in the range. - statement->BindBool(is_first_seek_index, true); - statement->BindNull(position_index); - statement->BindNull(target_key_index); - statement->BindInt(offset_index, 0); - if (!statement->Step()) { - TRANSIENT_CHECK(statement->Succeeded()); - // Empty range. - return std::make_pair(nullptr, nullptr); - } - return read_row.Run(*statement) - .transform([&](RecordIterator::PositionAndRecord result) { - return std::make_pair( - std::make_unique<RecordIterator>( - std::move(statement), std::move(bind_parameters), - std::move(read_row), std::move(result.first)), - std::move(result.second)); - }); -} - } // namespace // static @@ -473,8 +362,10 @@ db_->GetCachedStatement(SQL_FROM_HERE, "SELECT row_id FROM records " "WHERE object_store_id = ? AND key = ?")); + std::string encoded_key; + EncodeSortableIDBKey(key, &encoded_key); statement.BindInt64(0, object_store_id); - statement.BindBlob(1, EncodeSortableIDBKey(key)); + statement.BindBlob(1, std::move(encoded_key)); if (statement.Step()) { return BackingStore::RecordIdentifier{statement.ColumnInt64(0)}; } @@ -490,8 +381,10 @@ db_->GetCachedStatement(SQL_FROM_HERE, "SELECT value FROM records " "WHERE object_store_id = ? AND key = ?")); + std::string encoded_key; + EncodeSortableIDBKey(key, &encoded_key); statement.BindInt64(0, object_store_id); - statement.BindBlob(1, EncodeSortableIDBKey(key)); + statement.BindBlob(1, std::move(encoded_key)); if (statement.Step()) { IndexedDBValue value; TRANSIENT_CHECK(statement.ColumnBlobAsVector(0, &value.bits)); @@ -511,7 +404,9 @@ "INSERT OR REPLACE INTO records " "(object_store_id, key, value) VALUES (?, ?, ?)")); statement.BindInt64(0, object_store_id); - statement.BindBlob(1, EncodeSortableIDBKey(key)); + std::string encoded_key; + EncodeSortableIDBKey(key, &encoded_key); + statement.BindBlob(1, std::move(encoded_key)); statement.BindBlob(2, std::move(value.bits)); TRANSIENT_CHECK(statement.Run()); return BackingStore::RecordIdentifier{db_->GetLastInsertRowId()}; @@ -523,13 +418,19 @@ blink::IndexedDBKeyRange key_range) { std::vector<std::string_view> query_pieces{ "SELECT COUNT() FROM records WHERE object_store_id = ?"}; + std::string lower_encoded; + std::string upper_encoded; if (key_range.lower().IsValid()) { - query_pieces.push_back(key_range.lower_open() ? " AND key > ?" - : " AND key >= ?"); + EncodeSortableIDBKey(key_range.lower(), &lower_encoded); + query_pieces.insert( + query_pieces.end(), + {" AND key ", key_range.lower_open() ? ">" : ">=", " ?"}); } if (key_range.upper().IsValid()) { - query_pieces.push_back(key_range.upper_open() ? " AND key < ?" - : " AND key <= ?"); + EncodeSortableIDBKey(key_range.upper(), &upper_encoded); + query_pieces.insert( + query_pieces.end(), + {" AND key ", key_range.upper_open() ? "<" : "<=", " ?"}); } // TODO(crbug.com/40253999): Evaluate performance benefit of using @@ -538,36 +439,14 @@ db_->GetReadonlyStatement(base::StrCat(query_pieces))); int param_index = 0; statement.BindInt64(param_index++, object_store_id); - if (key_range.lower().IsValid()) { - statement.BindBlob(param_index++, EncodeSortableIDBKey(key_range.lower())); + if (!lower_encoded.empty()) { + statement.BindBlob(param_index++, lower_encoded); } - if (key_range.upper().IsValid()) { - statement.BindBlob(param_index++, EncodeSortableIDBKey(key_range.upper())); + if (!upper_encoded.empty()) { + statement.BindBlob(param_index++, upper_encoded); } TRANSIENT_CHECK(statement.Step()); return statement.ColumnInt(0); } -StatusOr<std::unique_ptr<BackingStore::Cursor>> -DatabaseConnection::OpenObjectStoreCursor( - base::PassKey<BackingStoreTransactionImpl>, - int64_t object_store_id, - const blink::IndexedDBKeyRange& key_range, - blink::mojom::IDBCursorDirection direction, - bool key_only) { - bool ascending_order = - (direction == blink::mojom::IDBCursorDirection::Next || - direction == blink::mojom::IDBCursorDirection::NextNoDuplicate); - return CreateObjectStoreRecordIterator(db_.get(), object_store_id, key_range, - ascending_order, key_only) - .transform([](std::pair<std::unique_ptr<RecordIterator>, - std::unique_ptr<Record>> result) { - return result.first - ? std::make_unique<BackingStoreCursorImpl>( - std::move(result.first), std::move(result.second)) - // Empty range. - : nullptr; - }); -} - } // namespace content::indexed_db::sqlite
diff --git a/content/browser/indexed_db/instance/sqlite/database_connection.h b/content/browser/indexed_db/instance/sqlite/database_connection.h index 211e989f..baab3d5 100644 --- a/content/browser/indexed_db/instance/sqlite/database_connection.h +++ b/content/browser/indexed_db/instance/sqlite/database_connection.h
@@ -111,13 +111,6 @@ int64_t object_store_id, blink::IndexedDBKeyRange key_range); - StatusOr<std::unique_ptr<BackingStore::Cursor>> OpenObjectStoreCursor( - base::PassKey<BackingStoreTransactionImpl>, - int64_t object_store_id, - const blink::IndexedDBKeyRange& key_range, - blink::mojom::IDBCursorDirection direction, - bool key_only); - private: DatabaseConnection(std::unique_ptr<sql::Database> db, std::unique_ptr<sql::MetaTable> meta_table,
diff --git a/content/browser/indexed_db/instance/sqlite/record_iterator.cc b/content/browser/indexed_db/instance/sqlite/record_iterator.cc deleted file mode 100644 index ea8c2ea..0000000 --- a/content/browser/indexed_db/instance/sqlite/record_iterator.cc +++ /dev/null
@@ -1,77 +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 "content/browser/indexed_db/instance/sqlite/record_iterator.h" - -#include <memory> -#include <optional> -#include <string> -#include <utility> - -#include "base/check.h" -#include "base/functional/callback.h" -#include "base/types/expected.h" -#include "content/browser/indexed_db/instance/record.h" -#include "content/browser/indexed_db/status.h" -#include "sql/statement.h" -#include "third_party/blink/public/common/indexeddb/indexeddb_key.h" - -// TODO(crbug.com/40253999): Remove after handling all error cases. -#define TRANSIENT_CHECK(condition) CHECK(condition) - -namespace content::indexed_db::sqlite { - -RecordIterator::RecordIterator(std::unique_ptr<sql::Statement> statement, - BindCallback bind_parameters, - ReadCallback read_row, - std::string initial_position) - : statement_(std::move(statement)), - bind_parameters_(std::move(bind_parameters)), - read_row_(std::move(read_row)), - current_position_(std::move(initial_position)) {} - -RecordIterator::~RecordIterator() = default; - -StatusOr<std::unique_ptr<Record>> RecordIterator::Iterate( - const blink::IndexedDBKey& key, - const blink::IndexedDBKey& primary_key) { - statement_->Reset(/*clear_bound_vars=*/false); - bind_parameters_.Run(*statement_, *current_position_, key, primary_key, - /*offset=*/0); - if (!statement_->Step()) { - TRANSIENT_CHECK(statement_->Succeeded()); - // End of range. - current_position_.reset(); - return nullptr; - } - return read_row_.Run(*statement_).transform([this](PositionAndRecord result) { - current_position_ = std::move(result.first); - return std::move(result.second); - }); -} - -StatusOr<std::unique_ptr<Record>> RecordIterator::Iterate(uint32_t count) { - TRANSIENT_CHECK(count > 0); - - // TODO(crbug.com/419208481): Implement a fast path where `statement_` is - // stepped without being reset when no record has changed in the range. - statement_->Reset(/*clear_bound_vars=*/false); - - // Iterate count times => offset by (i.e., skip) [count - 1] rows. - bind_parameters_.Run(*statement_, *current_position_, /*key=*/{}, - /*primary_key=*/{}, - /*offset=*/count - 1); - if (!statement_->Step()) { - TRANSIENT_CHECK(statement_->Succeeded()); - // End of range. - current_position_.reset(); - return nullptr; - } - return read_row_.Run(*statement_).transform([this](PositionAndRecord result) { - current_position_ = std::move(result.first); - return std::move(result.second); - }); -} - -} // namespace content::indexed_db::sqlite
diff --git a/content/browser/indexed_db/instance/sqlite/record_iterator.h b/content/browser/indexed_db/instance/sqlite/record_iterator.h deleted file mode 100644 index f0cf89e..0000000 --- a/content/browser/indexed_db/instance/sqlite/record_iterator.h +++ /dev/null
@@ -1,85 +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 CONTENT_BROWSER_INDEXED_DB_INSTANCE_SQLITE_RECORD_ITERATOR_H_ -#define CONTENT_BROWSER_INDEXED_DB_INSTANCE_SQLITE_RECORD_ITERATOR_H_ - -#include <memory> -#include <optional> -#include <string> -#include <utility> - -#include "base/functional/callback.h" -#include "content/browser/indexed_db/status.h" - -namespace blink { -class IndexedDBKey; -} // namespace blink - -namespace sql { -class Statement; -} - -namespace content::indexed_db { -class Record; - -namespace sqlite { - -// Iterates over a non-empty range of object store/index records, maintaining -// the position in the range and emitting `Record`s. -class RecordIterator { - public: - using PositionAndRecord = std::pair<std::string, std::unique_ptr<Record>>; - using BindCallback = base::RepeatingCallback<void( - sql::Statement& statement, - const std::string& position, - const blink::IndexedDBKey& target_key, - const blink::IndexedDBKey& target_primary_key, - uint32_t offset)>; - using ReadCallback = base::RepeatingCallback<StatusOr<PositionAndRecord>( - sql::Statement& statement)>; - - RecordIterator(std::unique_ptr<sql::Statement> statement, - BindCallback bind_parameters, - ReadCallback read_row, - std::string initial_position); - - ~RecordIterator(); - - // Iterates from the current position until the target `key` and `primary_key` - // are reached. Use when at least one of these is valid. - StatusOr<std::unique_ptr<Record>> Iterate( - const blink::IndexedDBKey& key, - const blink::IndexedDBKey& primary_key); - - // Iterates `count` times from the current position. - StatusOr<std::unique_ptr<Record>> Iterate(uint32_t count); - - private: - // The parsed and bound statement that embeds the SQL query for this iterator. - // Because the records contained in the range can change between `Iterate()` - // calls, the query needs to be typically re-executed every time. The query - // itself is immutable for the duration of `this`, however, and contains a mix - // of fixed and variable bound parameters. To avoid re-parsing the query and - // rebinding the fixed parameters every time, hold on to the prepared - // statement and rebind only the variable parameters as needed. - std::unique_ptr<sql::Statement> statement_; - - // Callback to bind variable parameters to the statement. - BindCallback bind_parameters_; - - // Callback to read the position and `Record` corresponding to the current row - // of the statement. - ReadCallback read_row_; - - // Opaque value tracking the position in the range. Typically, this is the - // encoded key from the current record. Null when and only when `this` has - // iterated past the end of its range. - std::optional<std::string> current_position_; -}; - -} // namespace sqlite -} // namespace content::indexed_db - -#endif // CONTENT_BROWSER_INDEXED_DB_INSTANCE_SQLITE_RECORD_ITERATOR_H_
diff --git a/content/browser/navigation_browsertest.cc b/content/browser/navigation_browsertest.cc index a588237..bdbbee5 100644 --- a/content/browser/navigation_browsertest.cc +++ b/content/browser/navigation_browsertest.cc
@@ -1640,7 +1640,14 @@ // when history.pushState() and history.back() are called in a loop. // Failing to do so causes the browser to become unresponsive. // See https://crbug.com/882238 -IN_PROC_BROWSER_TEST_F(NavigationBrowserTest, IPCFlood_GoToEntryAtOffset) { +// TODO(crbug.com/379844650): Disabled on Linux sanitizer bots due to flakiness. +#if BUILDFLAG(IS_LINUX) && defined(ADDRESS_SANITIZER) +#define MAYBE_IPCFlood_GoToEntryAtOffset DISABLED_IPCFlood_GoToEntryAtOffset +#else +#define MAYBE_IPCFlood_GoToEntryAtOffset IPCFlood_GoToEntryAtOffset +#endif +IN_PROC_BROWSER_TEST_F(NavigationBrowserTest, + MAYBE_IPCFlood_GoToEntryAtOffset) { GURL url(embedded_test_server()->GetURL("/title1.html")); EXPECT_TRUE(NavigateToURL(shell(), url));
diff --git a/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java b/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java index 89ab26a0..8cb65267 100644 --- a/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java +++ b/content/public/android/java/src/org/chromium/content/browser/accessibility/WebContentsAccessibilityImpl.java
@@ -760,7 +760,7 @@ } @Override - public void onUpdateContainerView(ViewGroup view) { + public void onUpdateContainerView(@Nullable ViewGroup view) { // When the ContainerView is updated, we must update the |mView| variable and remove all // previous references to it. We clear the AccessibilityEventDispatcher queue, which may // have posted Runnable(s) to the old view. We also clear the AccessibilityNodeInfo cache @@ -768,6 +768,7 @@ // do not want to delete |this| because the object is (largely) not ContainerView dependent. mEventDispatcher.clearQueue(); mNodeInfoCache.clear(); + assumeNonNull(view); mView = view; } @@ -1444,13 +1445,8 @@ @Override public void restoreFocus() { if (isAccessibilityEnabled() && mLastAccessibilityFocusId != View.NO_ID) { - if (ContentFeatureList.sAccessibilityDeprecateJavaNodeCacheOptimizeScroll.getValue()) { - scrollToMakeNodeVisible(mLastAccessibilityFocusId); - moveAccessibilityFocusToId(mLastAccessibilityFocusId); - } else { - moveAccessibilityFocusToId(mLastAccessibilityFocusId); - scrollToMakeNodeVisible(mLastAccessibilityFocusId); - } + moveAccessibilityFocusToId(mLastAccessibilityFocusId); + scrollToMakeNodeVisible(mLastAccessibilityFocusId); } } @@ -1501,13 +1497,8 @@ WebContentsAccessibilityImplJni.get().setSequentialFocusStartingPoint(mNativeObj, id); } - if (ContentFeatureList.sAccessibilityDeprecateJavaNodeCacheOptimizeScroll.getValue()) { - scrollToMakeNodeVisible(mAccessibilityFocusId); - moveAccessibilityFocusToId(id); - } else { - moveAccessibilityFocusToId(id); - scrollToMakeNodeVisible(mAccessibilityFocusId); - } + moveAccessibilityFocusToId(id); + scrollToMakeNodeVisible(mAccessibilityFocusId); return true; } @@ -1699,7 +1690,6 @@ mDelegate.scrollToMakeNodeVisible(getAbsolutePositionForNode(virtualViewId)); } else { mPendingScrollToMakeNodeVisible = true; - mHistogramRecorder.updateTimeOfScrollToMakeVisible(); WebContentsAccessibilityImplJni.get() .scrollToMakeNodeVisible(mNativeObj, virtualViewId); } @@ -2028,7 +2018,6 @@ sendAccessibilityEvent(id, AccessibilityEvent.TYPE_VIEW_SCROLLED); if (mPendingScrollToMakeNodeVisible) { sendAccessibilityEvent(id, AccessibilityEvent.TYPE_WINDOW_CONTENT_CHANGED); - mHistogramRecorder.recordTimeOfScrollToMakeVisible(); mPendingScrollToMakeNodeVisible = false; } }
diff --git a/content/public/android/java/src/org/chromium/content/browser/input/SelectPopup.java b/content/public/android/java/src/org/chromium/content/browser/input/SelectPopup.java index 5682567..c8a4315 100644 --- a/content/public/android/java/src/org/chromium/content/browser/input/SelectPopup.java +++ b/content/public/android/java/src/org/chromium/content/browser/input/SelectPopup.java
@@ -4,7 +4,6 @@ package org.chromium.content.browser.input; -import static org.chromium.build.NullUtil.assumeNonNull; import android.content.Context; import android.view.View; @@ -53,7 +52,7 @@ } private final WebContentsImpl mWebContents; - private View mContainerView; + private @Nullable View mContainerView; private @Nullable Ui mPopupView; private long mNativeSelectPopup; private long mNativeSelectPopupSourceFrame; @@ -90,7 +89,7 @@ mWebContents = (WebContentsImpl) webContents; ViewAndroidDelegate viewDelegate = mWebContents.getViewAndroidDelegate(); assert viewDelegate != null; - mContainerView = assumeNonNull(viewDelegate.getContainerView()); + mContainerView = viewDelegate.getContainerView(); viewDelegate.addObserver(this); PopupController.register(mWebContents, this); WindowEventObserverManager.from(mWebContents).addObserver(this); @@ -113,7 +112,7 @@ // ViewAndroidDelegate.ContainerViewObserver @Override - public void onUpdateContainerView(ViewGroup view) { + public void onUpdateContainerView(@Nullable ViewGroup view) { mContainerView = view; hide(); } @@ -144,7 +143,9 @@ boolean multiple, int[] selectedIndices, boolean rightAligned) { - if (mContainerView.getParent() == null || mContainerView.getVisibility() != View.VISIBLE) { + if (mContainerView == null + || mContainerView.getParent() == null + || mContainerView.getVisibility() != View.VISIBLE) { mNativeSelectPopupSourceFrame = nativeSelectPopupSourceFrame; selectMenuItems(null); return;
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 bf33d37..40c689a 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
@@ -383,7 +383,7 @@ // ViewAndroidDelegate.ContainerViewObserver @Override - public void onUpdateContainerView(ViewGroup containerView) { + public void onUpdateContainerView(@Nullable ViewGroup containerView) { // Cleans up action mode before switching to a new container view. if (isActionModeValid()) finishActionMode(); mUnselectAllOnDismiss = true;
diff --git a/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java b/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java index 88455a1..ea6c872 100644 --- a/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java +++ b/content/public/android/java/src/org/chromium/content/browser/webcontents/WebContentsImpl.java
@@ -223,7 +223,7 @@ public void setDelegates( String productVersion, ViewAndroidDelegate viewDelegate, - InternalAccessDelegate accessDelegate, + @Nullable InternalAccessDelegate accessDelegate, @Nullable WindowAndroid windowAndroid, InternalsHolder internalsHolder) { assert internalsHolder != null;
diff --git a/content/public/android/java/src/org/chromium/content_public/browser/LoadUrlParams.java b/content/public/android/java/src/org/chromium/content_public/browser/LoadUrlParams.java index 4cf80059..7225a0c 100644 --- a/content/public/android/java/src/org/chromium/content_public/browser/LoadUrlParams.java +++ b/content/public/android/java/src/org/chromium/content_public/browser/LoadUrlParams.java
@@ -605,7 +605,7 @@ * @param additionalNavigationParams Additional navigation params associated with the load. */ public void setAdditionalNavigationParams( - AdditionalNavigationParams additionalNavigationParams) { + @Nullable AdditionalNavigationParams additionalNavigationParams) { mAdditionalNavigationParams = additionalNavigationParams; }
diff --git a/content/public/android/java/src/org/chromium/content_public/browser/WebContents.java b/content/public/android/java/src/org/chromium/content_public/browser/WebContents.java index 454a896..1af0ee6 100644 --- a/content/public/android/java/src/org/chromium/content_public/browser/WebContents.java +++ b/content/public/android/java/src/org/chromium/content_public/browser/WebContents.java
@@ -82,10 +82,9 @@ } /** - * * Initialize various content objects of {@link WebContents} lifetime. * - * Note: This method is more of to set the {@link ViewAndroidDelegate} and {@link + * <p>Note: This method is more of to set the {@link ViewAndroidDelegate} and {@link * ViewEventSink.InternalAccessDelegate}, most of the embedder should only call this once during * the whole lifecycle of the {@link WebContents}, but it is safe to call it multiple times. * @@ -98,7 +97,7 @@ void setDelegates( String productVersion, ViewAndroidDelegate viewDelegate, - ViewEventSink.InternalAccessDelegate accessDelegate, + ViewEventSink.@Nullable InternalAccessDelegate accessDelegate, @Nullable WindowAndroid windowAndroid, InternalsHolder internalsHolder);
diff --git a/content/public/renderer/content_renderer_client.h b/content/public/renderer/content_renderer_client.h index f58a8706..7a2d251b 100644 --- a/content/public/renderer/content_renderer_client.h +++ b/content/public/renderer/content_renderer_client.h
@@ -381,11 +381,11 @@ const GURL& service_worker_scope, const GURL& script_url) {} - // Notifies that a service work is about to prepare for script evaluation. + // Notifies that the main script of a service worker is about to evaluate. // This function is called from the worker thread. // |context_proxy| is valid until // WillDestroyServiceWorkerContextOnWorkerThread() is called. - virtual void WillPrepareForEvaluationOnWorkerThread( + virtual void WillEvaluateServiceWorkerOnWorkerThread( blink::WebServiceWorkerContextProxy* context_proxy, v8::Local<v8::Context> v8_context, int64_t service_worker_version_id, @@ -393,9 +393,6 @@ const GURL& script_url, const blink::ServiceWorkerToken& service_worker_token) {} - // Notifies that the main script of a service worker is about to evaluate. - virtual void WillEvaluateServiceWorkerOnWorkerThread() {} - // Notifies that a service worker context has finished executing its top-level // JavaScript. This function is called from the worker thread. virtual void DidStartServiceWorkerContextOnWorkerThread(
diff --git a/content/renderer/service_worker/service_worker_context_client.cc b/content/renderer/service_worker/service_worker_context_client.cc index 1afd40c..eff9f90 100644 --- a/content/renderer/service_worker/service_worker_context_client.cc +++ b/content/renderer/service_worker/service_worker_context_client.cc
@@ -313,14 +313,6 @@ proxy_, service_worker_scope_, script_url_); } -void ServiceWorkerContextClient::WillPrepareForEvaluation( - v8::Local<v8::Context> v8_context) { - DCHECK(worker_task_runner_->RunsTasksInCurrentSequence()); - GetContentClient()->renderer()->WillPrepareForEvaluationOnWorkerThread( - proxy_, v8_context, service_worker_version_id_, service_worker_scope_, - script_url_, service_worker_token_); -} - void ServiceWorkerContextClient::WillEvaluateScript( v8::Local<v8::Context> v8_context) { DCHECK(worker_task_runner_->RunsTasksInCurrentSequence()); @@ -339,7 +331,9 @@ instance_host_->OnScriptEvaluationStart(); DCHECK(proxy_); - GetContentClient()->renderer()->WillEvaluateServiceWorkerOnWorkerThread(); + GetContentClient()->renderer()->WillEvaluateServiceWorkerOnWorkerThread( + proxy_, v8_context, service_worker_version_id_, service_worker_scope_, + script_url_, service_worker_token_); } void ServiceWorkerContextClient::DidEvaluateScript(bool success) {
diff --git a/content/renderer/service_worker/service_worker_context_client.h b/content/renderer/service_worker/service_worker_context_client.h index 5e964a9..ecff6ff7 100644 --- a/content/renderer/service_worker/service_worker_context_client.h +++ b/content/renderer/service_worker/service_worker_context_client.h
@@ -166,7 +166,6 @@ void WorkerContextStarted( blink::WebServiceWorkerContextProxy* proxy, scoped_refptr<base::SequencedTaskRunner> worker_task_runner) override; - void WillPrepareForEvaluation(v8::Local<v8::Context> v8_context) override; void WillEvaluateScript(v8::Local<v8::Context> v8_context) override; void DidEvaluateScript(bool success) override; void WillInitializeWorkerContext() override;
diff --git a/content/test/content_test_bundle_data.filelist b/content/test/content_test_bundle_data.filelist index c7471b8..17a803f7 100644 --- a/content/test/content_test_bundle_data.filelist +++ b/content/test/content_test_bundle_data.filelist
@@ -806,6 +806,13 @@ data/accessibility/aria/aria-flowto-target-id-change-expected-blink.txt data/accessibility/aria/aria-flowto-target-id-change.html data/accessibility/aria/aria-flowto.html +data/accessibility/aria/aria-focusable-menu-expected-android-external.txt +data/accessibility/aria/aria-focusable-menu-expected-android.txt +data/accessibility/aria/aria-focusable-menu-expected-auralinux.txt +data/accessibility/aria/aria-focusable-menu-expected-blink.txt +data/accessibility/aria/aria-focusable-menu-expected-mac.txt +data/accessibility/aria/aria-focusable-menu-expected-win.txt +data/accessibility/aria/aria-focusable-menu.html data/accessibility/aria/aria-focusable-subwidget-not-editable-expected-win.txt data/accessibility/aria/aria-focusable-subwidget-not-editable.html data/accessibility/aria/aria-form-expected-android-assist-data.txt @@ -1154,13 +1161,6 @@ data/accessibility/aria/aria-menu-expected-mac.txt data/accessibility/aria/aria-menu-expected-win.txt data/accessibility/aria/aria-menu.html -data/accessibility/aria/aria-focusable-menu-expected-android-external.txt -data/accessibility/aria/aria-focusable-menu-expected-android.txt -data/accessibility/aria/aria-focusable-menu-expected-auralinux.txt -data/accessibility/aria/aria-focusable-menu-expected-blink.txt -data/accessibility/aria/aria-focusable-menu-expected-mac.txt -data/accessibility/aria/aria-focusable-menu-expected-win.txt -data/accessibility/aria/aria-focusable-menu.html data/accessibility/aria/aria-menubar-expected-android-assist-data.txt data/accessibility/aria/aria-menubar-expected-android-external.txt data/accessibility/aria/aria-menubar-expected-android.txt @@ -1303,9 +1303,9 @@ data/accessibility/aria/aria-orientation-expected-win.txt data/accessibility/aria/aria-orientation.html data/accessibility/aria/aria-owns-crash-2-expected-blink.txt -data/accessibility/aria/aria-owns-crash-2.html +data/accessibility/crash/aria-owns-crash-2.html data/accessibility/aria/aria-owns-crash-expected-blink.txt -data/accessibility/aria/aria-owns-crash.html +data/accessibility/crash/aria-owns-crash.html data/accessibility/aria/aria-owns-expected-android-assist-data.txt data/accessibility/aria/aria-owns-expected-android-external.txt data/accessibility/aria/aria-owns-expected-android.txt @@ -2098,7 +2098,7 @@ data/accessibility/css/list-marker-styles-custom-expected-win.txt data/accessibility/css/list-marker-styles-custom.html data/accessibility/css/marker-crash-expected-blink.txt -data/accessibility/css/marker-crash.html +data/accessibility/crash/marker-crash.html data/accessibility/css/marker-hyphens-expected-blink.txt data/accessibility/css/marker-hyphens.html data/accessibility/css/next-on-line-check-failure-expected-blink.txt @@ -2669,8 +2669,10 @@ data/accessibility/event/immediate-refresh-expected-auralinux.txt data/accessibility/event/immediate-refresh.html data/accessibility/event/individual-nodes-become-ignored-but-included-expected-auralinux.txt +data/accessibility/event/individual-nodes-become-ignored-but-included-expected-mac.txt data/accessibility/event/individual-nodes-become-ignored-but-included.html data/accessibility/event/individual-nodes-become-ignored-expected-auralinux.txt +data/accessibility/event/individual-nodes-become-ignored-expected-mac.txt data/accessibility/event/individual-nodes-become-ignored.html data/accessibility/event/inner-html-change-expected-android.txt data/accessibility/event/inner-html-change-expected-uia-win.txt @@ -3011,7 +3013,7 @@ data/accessibility/event/visibility-hidden-changed-expected-auralinux.txt data/accessibility/event/visibility-hidden-changed-expected-uia-win.txt data/accessibility/event/visibility-hidden-changed.html -data/accessibility/form-controls/aria-owns-child-and-hidden-descendant-crash.html +data/accessibility/crash/aria-owns-child-and-hidden-descendant-crash.html data/accessibility/form-controls/bdo-table-cell.html data/accessibility/form-controls/contenteditable-descendants-expected-android.txt data/accessibility/form-controls/contenteditable-descendants-expected-blink.txt @@ -3021,7 +3023,7 @@ data/accessibility/form-controls/img-form.html data/accessibility/form-controls/img-map-pseudo.html data/accessibility/form-controls/map-inside-map.html -data/accessibility/form-controls/progress-meter-crash.html +data/accessibility/crash/progress-meter-crash.html data/accessibility/form-controls/role-group-expected-android.txt data/accessibility/form-controls/role-group-expected-blink.txt data/accessibility/form-controls/role-group.html @@ -3147,7 +3149,7 @@ data/accessibility/html/area-alone-expected-blink.txt data/accessibility/html/area-alone.html data/accessibility/html/area-crash-expected-blink.txt -data/accessibility/html/area-crash.html +data/accessibility/crash/area-crash.html data/accessibility/html/area-expected-android-assist-data.txt data/accessibility/html/area-expected-android-external.txt data/accessibility/html/area-expected-android.txt @@ -3158,7 +3160,7 @@ data/accessibility/html/area-expected-uia-win.txt data/accessibility/html/area-expected-win.txt data/accessibility/html/area-serialization-crash-expected-blink.txt -data/accessibility/html/area-serialization-crash.html +data/accessibility/crash/area-serialization-crash.html data/accessibility/html/area-with-aria-owns-expected-blink.txt data/accessibility/html/area-with-aria-owns.html data/accessibility/html/area.html @@ -3662,7 +3664,7 @@ data/accessibility/html/del.html data/accessibility/html/delete-selection-crash-expected-blink.txt data/accessibility/html/delete-selection-crash-expected-win.txt -data/accessibility/html/delete-selection-crash.html +data/accessibility/crash/delete-selection-crash.html data/accessibility/html/design-mode-expected-blink.txt data/accessibility/html/design-mode.html data/accessibility/html/details-expected-android-assist-data.txt @@ -3944,7 +3946,7 @@ data/accessibility/html/hgroup-expected-blink.txt data/accessibility/html/hgroup.html data/accessibility/html/hidden-named-slot-no-subtree-crash-expected-blink.txt -data/accessibility/html/hidden-named-slot-no-subtree-crash.html +data/accessibility/crash/hidden-named-slot-no-subtree-crash.html data/accessibility/html/hr-expected-android-assist-data.txt data/accessibility/html/hr-expected-android-external.txt data/accessibility/html/hr-expected-android.txt @@ -4920,7 +4922,7 @@ data/accessibility/html/node-changed-crash-in-editable-text-expected-mac.txt data/accessibility/html/node-changed-crash-in-editable-text-expected-uia-win.txt data/accessibility/html/node-changed-crash-in-editable-text-expected-win.txt -data/accessibility/html/node-changed-crash-in-editable-text.html +data/accessibility/crash/node-changed-crash-in-editable-text.html data/accessibility/html/noscript-expected-android.txt data/accessibility/html/noscript-expected-auralinux.txt data/accessibility/html/noscript-expected-fuchsia.txt @@ -5119,7 +5121,7 @@ data/accessibility/html/relevant-space-expected-blink.txt data/accessibility/html/relevant-space.html data/accessibility/html/reparent-crash-expected-blink.txt -data/accessibility/html/reparent-crash.html +data/accessibility/crash/reparent-crash.html data/accessibility/html/replace-data-expected-blink.txt data/accessibility/html/replace-data.html data/accessibility/html/replaced-node-across-trees-expected-android-assist-data.txt @@ -6167,7 +6169,7 @@ data/accessibility/regression/aria-hidden-tabindex-change-expected-blink.txt data/accessibility/regression/aria-hidden-tabindex-change.html data/accessibility/regression/aria-owns-from-textarea.html -data/accessibility/regression/aria-owns-reparent-above-other-change-crash.html +data/accessibility/crash/aria-owns-reparent-above-other-change-crash.html data/accessibility/regression/aria-pressed-changes-button-role-expected-blink.txt data/accessibility/regression/aria-pressed-changes-button-role.html data/accessibility/regression/clear-children-while-computing-name-expected-blink.txt @@ -6190,7 +6192,7 @@ data/accessibility/regression/hidden-table.html data/accessibility/regression/iframe-navigation.html data/accessibility/regression/ignored-crash-expected-blink.txt -data/accessibility/regression/ignored-crash.html +data/accessibility/crash/ignored-crash.html data/accessibility/regression/inner1.html data/accessibility/regression/inner2.html data/accessibility/regression/language-changed-on-html-expected-blink.txt @@ -6203,9 +6205,9 @@ data/accessibility/regression/progress-with-background-exposes-values.html data/accessibility/regression/reentrant-add-children.html data/accessibility/regression/relation-points-to-invalid-nodes-crash-expected-blink.txt -data/accessibility/regression/relation-points-to-invalid-nodes-crash.html +data/accessibility/crash/relation-points-to-invalid-nodes-crash.html data/accessibility/regression/reload-selection-crash-expected-blink.txt -data/accessibility/regression/reload-selection-crash.html +data/accessibility/crash/reload-selection-crash.html data/accessibility/regression/remove-aria-owner-expected-auralinux.txt data/accessibility/regression/remove-aria-owner-expected-blink.txt data/accessibility/regression/remove-aria-owner.html @@ -6224,13 +6226,13 @@ data/accessibility/regression/reused-map-move-image.html data/accessibility/regression/reused-map.html data/accessibility/regression/root-becomes-leaf.html -data/accessibility/regression/select-expand-many-options-crash.html +data/accessibility/crash/select-expand-many-options-crash.html data/accessibility/regression/slot-creation-crash-expected-blink.txt -data/accessibility/regression/slot-creation-crash.html +data/accessibility/crash/slot-creation-crash.html data/accessibility/regression/title-in-shadow-expected-blink.txt data/accessibility/regression/title-in-shadow.html data/accessibility/regression/workplace.jpg -data/accessibility/regression/xml-in-iframe-crash.html +data/accessibility/crash/xml-in-iframe-crash.html data/accessibility/relations/ignore-duplicate-relation-ids-expected-auralinux.txt data/accessibility/relations/ignore-duplicate-relation-ids-expected-win.txt data/accessibility/relations/ignore-duplicate-relation-ids.html
diff --git a/content/test/data/accessibility/PRESUBMIT.py b/content/test/data/accessibility/PRESUBMIT.py index b506f78d..eaa2b09 100644 --- a/content/test/data/accessibility/PRESUBMIT.py +++ b/content/test/data/accessibility/PRESUBMIT.py
@@ -10,13 +10,15 @@ When adding/modify an accessibility test, the following rules apply: 1. If [name].html file exists, then at least one [name]-expected*.txt file must also exist, - and vice-versa. + and vice-versa, excluding crash related tests. This is not enforced for the /html/frame/ and /aria/frames/ directories, which contain .html files referenced by other .html files and don't have their own expectations. Note: This is not enforced for the /mac/ and /win/ directories (see TODOs). Note: This looks for files within a CL, not in the repo, which may cause false positives (see TODOs). + Note: Crash related tests have "crash" in the html file name and should be placed under /crash/ folder + without any corresponding expectations. See: CheckAccessibilityHtmlExpectationsPair 2. Every txt file must be suffixed with one of the following: @@ -134,7 +136,6 @@ # as the other expectation file requirements are met. # TODO(accessibility): Fix Test #7 - [Maybe] This test should consider matching against more platforms. # -# TODO(accessibility): Create rules (and sub-directory) for crash tests, or add expectations for them. # TODO(accessibility): Create rules (and sub-directory) for android-only tests, or add expectations for them. # TODO(accessibility): Combine the /frame(s)/ directories, and/or give them consistent naming. # TODO(accessibility): Investigate and determine rules for remaining folders (e.g. /mathml/, /form-controls/) @@ -557,6 +558,25 @@ # Check HTML files for corresponding expectations for name, html_path in html_files.items(): + # Crash related HTMLs do not have expectations files but need to be placed in the right folder + is_crash_test = "-crash" in name + is_in_crash_dir = "content/test/data/accessibility/crash/" in html_path + + if is_crash_test: + if not is_in_crash_dir: + problems.append( + f"{html_path} (has the name suggesting crash test but is not in " + f"'content/test/data/accessibility/crash/' directory)" + ) + # We skip the expectation file check for crash related tests + continue + elif is_in_crash_dir: + # Non-crash tests should not be placed in crash folder + problems.append( + f"{html_path} (is in 'content/test/data/accessibility/crash/' directory " + f"but the name suggests it is not a crash test)" + ) + continue hasMatch = False for key, _ in txt_files.items(): if name in key: @@ -567,6 +587,15 @@ # Check expectation files for corresponding HTML for name, txt_path in txt_files.items(): + # Crash related HTMLs do not have expectations files and should raise warning if they are found + is_crash_test = "-crash" in name + is_in_crash_dir = "content/test/data/accessibility/crash/" in txt_path + + if is_crash_test and is_in_crash_dir: + problems.append( + f"Unexpected crash related expectation file found: {txt_path}" + ) + continue hasMatch = False for key, _ in html_files.items(): if key in name: @@ -578,8 +607,10 @@ if problems: return [ output_api.PresubmitPromptWarning( - "HTML accessibility test files must have a corresponding" - "\nexpectation file (and vice-versa). Note this may be a" + "HTML accessibility test files, excluding crash related" + "\ntests, must have a corresponding expectation file" + "\n(and vice-versa). Crash tests should be placed in" + "\nthe separate crash folders. Note this may be a" "\nfalse positive if the html file already existed." "\nProblems found:\n", problems,
diff --git a/content/test/data/accessibility/PRESUBMIT_test.py b/content/test/data/accessibility/PRESUBMIT_test.py index 21adbff..fbe5190 100755 --- a/content/test/data/accessibility/PRESUBMIT_test.py +++ b/content/test/data/accessibility/PRESUBMIT_test.py
@@ -784,6 +784,75 @@ results = PRESUBMIT.CheckFrameHtmlFilesDontHaveExpectations(mock_input_api, MockOutputApi()) self.assertEqual(0, len(results)) +class CheckAccessibilityCrashRelatedTest(unittest.TestCase): + + # Test no warning if crash related test HTML is placed in the crash folder + def testCrashHtmlCorrectlyHandled(self): + mock_input_api = MockInputApi() + mock_input_api.files = [ + MockFile("content/test/data/accessibility/crash/page-crash.html", []) + ] + results = PRESUBMIT.CheckAccessibilityHtmlExpectationsPair(mock_input_api, MockOutputApi()) + self.assertEqual(0, len(results)) + + # Test warning raised if crash related test HTML is placed in the wrong folder + def testCrashHtmlWrongFolder(self): + mock_input_api = MockInputApi() + mock_input_api.files = [ + MockFile("content/test/data/accessibility/html/page-crash.html", []) + ] + results = PRESUBMIT.CheckAccessibilityHtmlExpectationsPair(mock_input_api, MockOutputApi()) + self.assertEqual(1, len(results), + "Expected one PresubmitError object for crash related warning." + + f"Found {len(results)}: {results}") + self.assertEqual(1, len(results[0].items), + "Expected 1 warning item for crash related warning." + + f"Found {len(results[0].items)}: {results[0].items}") + self.assertIn("page-crash.html", results[0].items[0]) + self.assertIn("has the name suggesting crash test but is not in", results[0].items[0]) + self.assertIn("'content/test/data/accessibility/crash/' directory)", results[0].items[0]) + + # Test warning raised if non-crash related test HTML is placed in the crash folder + def testNonCrashHtmlInCrashFolder(self): + mock_input_api = MockInputApi() + mock_input_api.files = [ + MockFile("content/test/data/accessibility/crash/normal-test.html", []) + ] + results = PRESUBMIT.CheckAccessibilityHtmlExpectationsPair(mock_input_api, MockOutputApi()) + self.assertEqual(1, len(results), + "Expected one PresubmitError object for crash related warning." + + f"Found {len(results)}: {results}") + self.assertEqual(1, len(results[0].items), + "Expected 1 warning item for crash related warning." + + f"Found {len(results[0].items)}: {results[0].items}") + self.assertIn("normal-test.html", results[0].items[0]) + self.assertIn("is in 'content/test/data/accessibility/crash/' directory", results[0].items[0]) + self.assertIn("but the name suggests it is not a crash test)", results[0].items[0]) + + # Test warning raised if crash expectation file is found + def testCrashTxtFileFound(self): + mock_input_api = MockInputApi() + mock_input_api.files = [ + MockFile("content/test/data/accessibility/crash/page-crash-expected-android.txt", []) + ] + results = PRESUBMIT.CheckAccessibilityHtmlExpectationsPair(mock_input_api, MockOutputApi()) + self.assertEqual(1, len(results), + "Expected one PresubmitError object for crash related warning." + + f"Found {len(results)}: {results}") + self.assertEqual(1, len(results[0].items), + "Expected 1 warning item for crash related warning." + + f"Found {len(results[0].items)}: {results[0].items}") + self.assertIn("page-crash-expected-android.txt", results[0].items[0]) + self.assertIn("Unexpected crash related expectation file found:", results[0].items[0]) + + # Test crash files outside the //content/test/data/accessibility directory are not relevant + def testCrashNonMatchingFiles(self): + mock_input_api = MockInputApi() + mock_input_api.files = [ + MockFile("content/test/data/crash/page-crash.html", []) + ] + results = PRESUBMIT.CheckAccessibilityHtmlExpectationsPair(mock_input_api, MockOutputApi()) + self.assertEqual(0, len(results)) if __name__ == '__main__': unittest.main()
diff --git a/content/test/data/accessibility/html/area-crash.html b/content/test/data/accessibility/crash/area-crash.html similarity index 100% rename from content/test/data/accessibility/html/area-crash.html rename to content/test/data/accessibility/crash/area-crash.html
diff --git a/content/test/data/accessibility/html/area-serialization-crash.html b/content/test/data/accessibility/crash/area-serialization-crash.html similarity index 100% rename from content/test/data/accessibility/html/area-serialization-crash.html rename to content/test/data/accessibility/crash/area-serialization-crash.html
diff --git a/content/test/data/accessibility/form-controls/aria-owns-child-and-hidden-descendant-crash.html b/content/test/data/accessibility/crash/aria-owns-child-and-hidden-descendant-crash.html similarity index 100% rename from content/test/data/accessibility/form-controls/aria-owns-child-and-hidden-descendant-crash.html rename to content/test/data/accessibility/crash/aria-owns-child-and-hidden-descendant-crash.html
diff --git a/content/test/data/accessibility/aria/aria-owns-crash-2.html b/content/test/data/accessibility/crash/aria-owns-crash-2.html similarity index 100% rename from content/test/data/accessibility/aria/aria-owns-crash-2.html rename to content/test/data/accessibility/crash/aria-owns-crash-2.html
diff --git a/content/test/data/accessibility/aria/aria-owns-crash.html b/content/test/data/accessibility/crash/aria-owns-crash.html similarity index 100% rename from content/test/data/accessibility/aria/aria-owns-crash.html rename to content/test/data/accessibility/crash/aria-owns-crash.html
diff --git a/content/test/data/accessibility/regression/aria-owns-reparent-above-other-change-crash.html b/content/test/data/accessibility/crash/aria-owns-reparent-above-other-change-crash.html similarity index 100% rename from content/test/data/accessibility/regression/aria-owns-reparent-above-other-change-crash.html rename to content/test/data/accessibility/crash/aria-owns-reparent-above-other-change-crash.html
diff --git a/content/test/data/accessibility/html/delete-selection-crash.html b/content/test/data/accessibility/crash/delete-selection-crash.html similarity index 100% rename from content/test/data/accessibility/html/delete-selection-crash.html rename to content/test/data/accessibility/crash/delete-selection-crash.html
diff --git a/content/test/data/accessibility/html/hidden-named-slot-no-subtree-crash.html b/content/test/data/accessibility/crash/hidden-named-slot-no-subtree-crash.html similarity index 100% rename from content/test/data/accessibility/html/hidden-named-slot-no-subtree-crash.html rename to content/test/data/accessibility/crash/hidden-named-slot-no-subtree-crash.html
diff --git a/content/test/data/accessibility/regression/ignored-crash.html b/content/test/data/accessibility/crash/ignored-crash.html similarity index 100% rename from content/test/data/accessibility/regression/ignored-crash.html rename to content/test/data/accessibility/crash/ignored-crash.html
diff --git a/content/test/data/accessibility/css/marker-crash.html b/content/test/data/accessibility/crash/marker-crash.html similarity index 100% rename from content/test/data/accessibility/css/marker-crash.html rename to content/test/data/accessibility/crash/marker-crash.html
diff --git a/content/test/data/accessibility/html/node-changed-crash-in-editable-text.html b/content/test/data/accessibility/crash/node-changed-crash-in-editable-text.html similarity index 100% rename from content/test/data/accessibility/html/node-changed-crash-in-editable-text.html rename to content/test/data/accessibility/crash/node-changed-crash-in-editable-text.html
diff --git a/content/test/data/accessibility/form-controls/progress-meter-crash.html b/content/test/data/accessibility/crash/progress-meter-crash.html similarity index 100% rename from content/test/data/accessibility/form-controls/progress-meter-crash.html rename to content/test/data/accessibility/crash/progress-meter-crash.html
diff --git a/content/test/data/accessibility/regression/relation-points-to-invalid-nodes-crash.html b/content/test/data/accessibility/crash/relation-points-to-invalid-nodes-crash.html similarity index 100% rename from content/test/data/accessibility/regression/relation-points-to-invalid-nodes-crash.html rename to content/test/data/accessibility/crash/relation-points-to-invalid-nodes-crash.html
diff --git a/content/test/data/accessibility/regression/reload-selection-crash.html b/content/test/data/accessibility/crash/reload-selection-crash.html similarity index 100% rename from content/test/data/accessibility/regression/reload-selection-crash.html rename to content/test/data/accessibility/crash/reload-selection-crash.html
diff --git a/content/test/data/accessibility/html/reparent-crash.html b/content/test/data/accessibility/crash/reparent-crash.html similarity index 100% rename from content/test/data/accessibility/html/reparent-crash.html rename to content/test/data/accessibility/crash/reparent-crash.html
diff --git a/content/test/data/accessibility/regression/select-expand-many-options-crash.html b/content/test/data/accessibility/crash/select-expand-many-options-crash.html similarity index 100% rename from content/test/data/accessibility/regression/select-expand-many-options-crash.html rename to content/test/data/accessibility/crash/select-expand-many-options-crash.html
diff --git a/content/test/data/accessibility/regression/slot-creation-crash.html b/content/test/data/accessibility/crash/slot-creation-crash.html similarity index 100% rename from content/test/data/accessibility/regression/slot-creation-crash.html rename to content/test/data/accessibility/crash/slot-creation-crash.html
diff --git a/content/test/data/accessibility/regression/xml-in-iframe-crash.html b/content/test/data/accessibility/crash/xml-in-iframe-crash.html similarity index 100% rename from content/test/data/accessibility/regression/xml-in-iframe-crash.html rename to content/test/data/accessibility/crash/xml-in-iframe-crash.html
diff --git a/content/test/data/accessibility/event/aria-selected-changed-new-subtree-expected-mac.txt b/content/test/data/accessibility/event/aria-selected-changed-new-subtree-expected-mac.txt index 28aa54e..3a24c6e 100644 --- a/content/test/data/accessibility/event/aria-selected-changed-new-subtree-expected-mac.txt +++ b/content/test/data/accessibility/event/aria-selected-changed-new-subtree-expected-mac.txt
@@ -1,7 +1,6 @@ AXSelectedRowsChanged on AXTable AXTitleChanged on AXRow AXTitle='Grid, GridCell1 Grid, GridCell2 Grid, GridCell3' === Start Continuation === -AXSelectedChildrenChanged on AXMenu AXValueChanged on AXPopUpButton AXValue='Select, Option3' === Start Continuation === -AXSelectedChildrenChanged on AXList +AXSelectedChildrenChanged on AXList \ No newline at end of file
diff --git a/content/test/data/accessibility/event/individual-nodes-become-ignored-but-included-expected-mac.txt b/content/test/data/accessibility/event/individual-nodes-become-ignored-but-included-expected-mac.txt new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/content/test/data/accessibility/event/individual-nodes-become-ignored-but-included-expected-mac.txt
diff --git a/content/test/data/accessibility/event/individual-nodes-become-ignored-expected-mac.txt b/content/test/data/accessibility/event/individual-nodes-become-ignored-expected-mac.txt new file mode 100644 index 0000000..e69de29 --- /dev/null +++ b/content/test/data/accessibility/event/individual-nodes-become-ignored-expected-mac.txt
diff --git a/content/test/data/accessibility/event/individual-nodes-become-ignored.html b/content/test/data/accessibility/event/individual-nodes-become-ignored.html index 36b84c3c..1400d00d 100644 --- a/content/test/data/accessibility/event/individual-nodes-become-ignored.html +++ b/content/test/data/accessibility/event/individual-nodes-become-ignored.html
@@ -14,8 +14,7 @@ </div> <script> function go() { - // Setting the role to "none" makes the node ignored, while the lang - // attribute makes it "ignored but included in tree". + // Setting the role to "none" makes the node ignored. document.querySelector('#child1').role = 'none'; document.querySelector('#child2').role = 'none'; document.querySelector('#grandchild2').role = 'none';
diff --git a/content/test/data/accessibility/event/menulist-collapse-expected-mac.txt b/content/test/data/accessibility/event/menulist-collapse-expected-mac.txt index fcc4000..fa62d975 100644 --- a/content/test/data/accessibility/event/menulist-collapse-expected-mac.txt +++ b/content/test/data/accessibility/event/menulist-collapse-expected-mac.txt
@@ -1,4 +1,3 @@ AXFocusedUIElementChanged on AXPopUpButton AXValue='Apple' === Start Continuation === -AXSelectedChildrenChanged on AXMenu AXValueChanged on AXPopUpButton
diff --git a/content/test/data/accessibility/event/menulist-collapse-next-expected-mac.txt b/content/test/data/accessibility/event/menulist-collapse-next-expected-mac.txt index 0c3bcb2..741a1c2 100644 --- a/content/test/data/accessibility/event/menulist-collapse-next-expected-mac.txt +++ b/content/test/data/accessibility/event/menulist-collapse-next-expected-mac.txt
@@ -1,4 +1,3 @@ AXFocusedUIElementChanged on AXPopUpButton AXValue='Apple' === Start Continuation === -AXSelectedChildrenChanged on AXMenu AXValueChanged on AXPopUpButton AXValue='Orange'
diff --git a/content/test/data/accessibility/event/menulist-custom-expand-collapse-expected-mac.txt b/content/test/data/accessibility/event/menulist-custom-expand-collapse-expected-mac.txt index 602d085..bff6b53 100644 --- a/content/test/data/accessibility/event/menulist-custom-expand-collapse-expected-mac.txt +++ b/content/test/data/accessibility/event/menulist-custom-expand-collapse-expected-mac.txt
@@ -1,3 +1,3 @@ AXExpandedChanged on AXPopUpButton AXDescription='Fruit' AXValue='^' AXFocusedUIElementChanged on AXMenuItem AXValue='Apple' -AXMenuItemSelected on AXMenuItem AXValue='Apple' +AXMenuItemSelected on AXMenuItem AXValue='Apple' \ No newline at end of file
diff --git a/content/test/data/accessibility/event/menulist-custom-next-expected-mac.txt b/content/test/data/accessibility/event/menulist-custom-next-expected-mac.txt index 08ac28e..9563112c 100644 --- a/content/test/data/accessibility/event/menulist-custom-next-expected-mac.txt +++ b/content/test/data/accessibility/event/menulist-custom-next-expected-mac.txt
@@ -2,4 +2,4 @@ AXFocusedUIElementChanged on AXMenuItem AXValue='Apple' AXMenuItemSelected on AXMenuItem AXValue='Orange' AXSelectedChildrenChanged on AXMenu -AXValueChanged on AXPopUpButton AXDescription='Fruit' AXValue='Orange' +AXValueChanged on AXPopUpButton AXDescription='Fruit' AXValue='Orange' \ No newline at end of file
diff --git a/content/test/data/accessibility/event/select-selected-add-remove-expected-mac.txt b/content/test/data/accessibility/event/select-selected-add-remove-expected-mac.txt index 86da05a..ef172db 100644 --- a/content/test/data/accessibility/event/select-selected-add-remove-expected-mac.txt +++ b/content/test/data/accessibility/event/select-selected-add-remove-expected-mac.txt
@@ -6,7 +6,6 @@ === Start Continuation === AXSelectedChildrenChanged on AXList AXDescription='Combo2' === Start Continuation === -AXSelectedChildrenChanged on AXMenu AXValueChanged on AXPopUpButton AXDescription='Combo3' AXValue='Option8' === Start Continuation === AXSelectedChildrenChanged on AXList AXDescription='Combo4'
diff --git a/content/test/data/accessibility/html/commandfor-api-popover-expected-auralinux.txt b/content/test/data/accessibility/html/commandfor-api-popover-expected-auralinux.txt index ac78b02d..d0bf04a 100644 --- a/content/test/data/accessibility/html/commandfor-api-popover-expected-auralinux.txt +++ b/content/test/data/accessibility/html/commandfor-api-popover-expected-auralinux.txt
@@ -1,49 +1,49 @@ [document web] ++[section] +++++[push button] name='d1 button - outside & next - show-popover' +++++[push button] name='d1 button - outside - hide-popover' ++++[push button] name='d1 button - outside - toggle-popover' ++++[push button] name='d1 button - outside - unrelated action' ++++[push button] name='d1 button - outside - custom action' -++++[push button] name='d1 button - outside - toggle-popover' -++++[push button] name='d1 button - outside & next - show-popover' +++++[push button] name='d2 button - outside & next - show-popover' expanded details=[panel] details-from:command-for details-roles:popover +++++[push button] name='d2 button - outside - hide-popover' expanded details=[panel] details-from:command-for details-roles:popover ++++[push button] name='d2 button - outside - toggle-popover' expanded details=[panel] details-from:command-for details-roles:popover ++++[push button] name='d2 button - outside - unrelated action' ++++[push button] name='d2 button - outside - custom action' -++++[push button] name='d2 button - outside - toggle-popover' expanded details=[panel] details-from:command-for details-roles:popover -++++[push button] name='d2 button - outside & next - show-popover' expanded -++++[panel] details-for=[push button,push button] +++++[panel] details-for=[push button,push button,push button] ++++++[push button] name='d2 button - inside - show-popover' ++++++[push button] name='d2 button - inside - hide-popover' ++++++[push button] name='d2 button - inside - toggle-popover' ++++++[push button] name='d2 button - inside - related action' ++++++[push button] name='d2 button - inside - custom action' +++++[push button] name='d3 button - outside & next - show-popover' expanded details=[panel] details-from:command-for details-roles:popover +++++[push button] name='d3 button - outside - hide-popover' expanded details=[panel] details-from:command-for details-roles:popover ++++[push button] name='d3 button - outside - toggle-popover' expanded details=[panel] details-from:command-for details-roles:popover ++++[push button] name='d3 button - outside - unrelated action' ++++[push button] name='d3 button - outside - custom action' -++++[push button] name='d3 button - outside - toggle-popover' expanded details=[panel] details-from:command-for details-roles:popover -++++[push button] name='d3 button - outside & next - show-popover' expanded -++++[panel] details-for=[push button,push button] +++++[panel] details-for=[push button,push button,push button] ++++++[push button] name='d3 button - inside - show-popover' ++++++[push button] name='d3 button - inside - hide-popover' ++++++[push button] name='d3 button - inside - toggle-popover' ++++++[push button] name='d3 button - inside - related action' ++++++[push button] name='d3 button - inside - custom action' +++++[push button] name='d4 button - outside & next - show-popover' +++++[push button] name='d4 button - outside - hide-popover' ++++[push button] name='d4 button - outside - toggle-popover' ++++[push button] name='d4 button - outside - unrelated action' ++++[push button] name='d4 button - outside - custom action' -++++[push button] name='d4 button - outside - toggle-popover' -++++[push button] name='d4 button - outside & next - show-popover' +++++[push button] name='d5 button - outside & next - show-popover' +++++[push button] name='d5 button - outside - hide-popover' ++++[push button] name='d5 button - outside - toggle-popover' ++++[push button] name='d5 button - outside - unrelated action' ++++[push button] name='d5 button - outside - custom action' -++++[push button] name='d5 button - outside - toggle-popover' -++++[push button] name='d5 button - outside & next - show-popover' -++++[push button] name='d1 button - outside - unrelated action' -++++[push button] name='d1 button - outside - custom action' -++++[push button] name='d1 button - outside - hide-popover' ++++[push button] name='d1 button - outside & next - show-popover' +++++[push button] name='d1 button - outside - hide-popover' ++++[push button] name='d1 button - outside - toggle-popover' ++++[push button] name='d1 button - outside - unrelated action' ++++[push button] name='d1 button - outside - custom action' -++++[push button] name='d1 button - outside - toggle-popover' ++++[push button] name='d1 button - outside & next - show-popover' ++++[push button] name='d1 button - outside - hide-popover' +++++[push button] name='d1 button - outside - toggle-popover' +++++[push button] name='d1 button - outside - unrelated action' +++++[push button] name='d1 button - outside - custom action'
diff --git a/content/test/data/accessibility/html/commandfor-api-popover-expected-blink.txt b/content/test/data/accessibility/html/commandfor-api-popover-expected-blink.txt index a2363c9..6cfd466 100644 --- a/content/test/data/accessibility/html/commandfor-api-popover-expected-blink.txt +++ b/content/test/data/accessibility/html/commandfor-api-popover-expected-blink.txt
@@ -1,6 +1,12 @@ rootWebArea ++genericContainer ignored ++++genericContainer +++++++button collapsed name='d1 button - outside & next - show-popover' +++++++++staticText name='d1 button - outside & next - show-popover' +++++++++++inlineTextBox name='d1 button - outside & next - show-popover' +++++++button collapsed name='d1 button - outside - hide-popover' +++++++++staticText name='d1 button - outside - hide-popover' +++++++++++inlineTextBox name='d1 button - outside - hide-popover' ++++++button collapsed name='d1 button - outside - toggle-popover' ++++++++staticText name='d1 button - outside - toggle-popover' ++++++++++inlineTextBox name='d1 button - outside - toggle-popover' @@ -10,12 +16,12 @@ ++++++button name='d1 button - outside - custom action' ++++++++staticText name='d1 button - outside - custom action' ++++++++++inlineTextBox name='d1 button - outside - custom action' -++++++button collapsed name='d1 button - outside - toggle-popover' -++++++++staticText name='d1 button - outside - toggle-popover' -++++++++++inlineTextBox name='d1 button - outside - toggle-popover' -++++++button collapsed name='d1 button - outside & next - show-popover' -++++++++staticText name='d1 button - outside & next - show-popover' -++++++++++inlineTextBox name='d1 button - outside & next - show-popover' +++++++button expanded name='d2 button - outside & next - show-popover' detailsIds=group +++++++++staticText name='d2 button - outside & next - show-popover' +++++++++++inlineTextBox name='d2 button - outside & next - show-popover' +++++++button expanded name='d2 button - outside - hide-popover' detailsIds=group +++++++++staticText name='d2 button - outside - hide-popover' +++++++++++inlineTextBox name='d2 button - outside - hide-popover' ++++++button expanded name='d2 button - outside - toggle-popover' detailsIds=group ++++++++staticText name='d2 button - outside - toggle-popover' ++++++++++inlineTextBox name='d2 button - outside - toggle-popover' @@ -25,12 +31,6 @@ ++++++button name='d2 button - outside - custom action' ++++++++staticText name='d2 button - outside - custom action' ++++++++++inlineTextBox name='d2 button - outside - custom action' -++++++button expanded name='d2 button - outside - toggle-popover' detailsIds=group -++++++++staticText name='d2 button - outside - toggle-popover' -++++++++++inlineTextBox name='d2 button - outside - toggle-popover' -++++++button expanded name='d2 button - outside & next - show-popover' -++++++++staticText name='d2 button - outside & next - show-popover' -++++++++++inlineTextBox name='d2 button - outside & next - show-popover' ++++++group ispopup=auto ++++++++button name='d2 button - inside - show-popover' ++++++++++staticText name='d2 button - inside - show-popover' @@ -47,6 +47,12 @@ ++++++++button name='d2 button - inside - custom action' ++++++++++staticText name='d2 button - inside - custom action' ++++++++++++inlineTextBox name='d2 button - inside - custom action' +++++++button expanded name='d3 button - outside & next - show-popover' detailsIds=group +++++++++staticText name='d3 button - outside & next - show-popover' +++++++++++inlineTextBox name='d3 button - outside & next - show-popover' +++++++button expanded name='d3 button - outside - hide-popover' detailsIds=group +++++++++staticText name='d3 button - outside - hide-popover' +++++++++++inlineTextBox name='d3 button - outside - hide-popover' ++++++button expanded name='d3 button - outside - toggle-popover' detailsIds=group ++++++++staticText name='d3 button - outside - toggle-popover' ++++++++++inlineTextBox name='d3 button - outside - toggle-popover' @@ -56,12 +62,6 @@ ++++++button name='d3 button - outside - custom action' ++++++++staticText name='d3 button - outside - custom action' ++++++++++inlineTextBox name='d3 button - outside - custom action' -++++++button expanded name='d3 button - outside - toggle-popover' detailsIds=group -++++++++staticText name='d3 button - outside - toggle-popover' -++++++++++inlineTextBox name='d3 button - outside - toggle-popover' -++++++button expanded name='d3 button - outside & next - show-popover' -++++++++staticText name='d3 button - outside & next - show-popover' -++++++++++inlineTextBox name='d3 button - outside & next - show-popover' ++++++group ispopup=manual ++++++++button name='d3 button - inside - show-popover' ++++++++++staticText name='d3 button - inside - show-popover' @@ -78,6 +78,12 @@ ++++++++button name='d3 button - inside - custom action' ++++++++++staticText name='d3 button - inside - custom action' ++++++++++++inlineTextBox name='d3 button - inside - custom action' +++++++button name='d4 button - outside & next - show-popover' +++++++++staticText name='d4 button - outside & next - show-popover' +++++++++++inlineTextBox name='d4 button - outside & next - show-popover' +++++++button name='d4 button - outside - hide-popover' +++++++++staticText name='d4 button - outside - hide-popover' +++++++++++inlineTextBox name='d4 button - outside - hide-popover' ++++++button name='d4 button - outside - toggle-popover' ++++++++staticText name='d4 button - outside - toggle-popover' ++++++++++inlineTextBox name='d4 button - outside - toggle-popover' @@ -87,12 +93,12 @@ ++++++button name='d4 button - outside - custom action' ++++++++staticText name='d4 button - outside - custom action' ++++++++++inlineTextBox name='d4 button - outside - custom action' -++++++button name='d4 button - outside - toggle-popover' -++++++++staticText name='d4 button - outside - toggle-popover' -++++++++++inlineTextBox name='d4 button - outside - toggle-popover' -++++++button name='d4 button - outside & next - show-popover' -++++++++staticText name='d4 button - outside & next - show-popover' -++++++++++inlineTextBox name='d4 button - outside & next - show-popover' +++++++button collapsed name='d5 button - outside & next - show-popover' +++++++++staticText name='d5 button - outside & next - show-popover' +++++++++++inlineTextBox name='d5 button - outside & next - show-popover' +++++++button collapsed name='d5 button - outside - hide-popover' +++++++++staticText name='d5 button - outside - hide-popover' +++++++++++inlineTextBox name='d5 button - outside - hide-popover' ++++++button collapsed name='d5 button - outside - toggle-popover' ++++++++staticText name='d5 button - outside - toggle-popover' ++++++++++inlineTextBox name='d5 button - outside - toggle-popover' @@ -102,24 +108,12 @@ ++++++button name='d5 button - outside - custom action' ++++++++staticText name='d5 button - outside - custom action' ++++++++++inlineTextBox name='d5 button - outside - custom action' -++++++button collapsed name='d5 button - outside - toggle-popover' -++++++++staticText name='d5 button - outside - toggle-popover' -++++++++++inlineTextBox name='d5 button - outside - toggle-popover' -++++++button collapsed name='d5 button - outside & next - show-popover' -++++++++staticText name='d5 button - outside & next - show-popover' -++++++++++inlineTextBox name='d5 button - outside & next - show-popover' -++++++button name='d1 button - outside - unrelated action' -++++++++staticText name='d1 button - outside - unrelated action' -++++++++++inlineTextBox name='d1 button - outside - unrelated action' -++++++button name='d1 button - outside - custom action' -++++++++staticText name='d1 button - outside - custom action' -++++++++++inlineTextBox name='d1 button - outside - custom action' -++++++button collapsed name='d1 button - outside - hide-popover' -++++++++staticText name='d1 button - outside - hide-popover' -++++++++++inlineTextBox name='d1 button - outside - hide-popover' ++++++button collapsed name='d1 button - outside & next - show-popover' ++++++++staticText name='d1 button - outside & next - show-popover' ++++++++++inlineTextBox name='d1 button - outside & next - show-popover' +++++++button collapsed name='d1 button - outside - hide-popover' +++++++++staticText name='d1 button - outside - hide-popover' +++++++++++inlineTextBox name='d1 button - outside - hide-popover' ++++++button collapsed name='d1 button - outside - toggle-popover' ++++++++staticText name='d1 button - outside - toggle-popover' ++++++++++inlineTextBox name='d1 button - outside - toggle-popover' @@ -129,12 +123,18 @@ ++++++button name='d1 button - outside - custom action' ++++++++staticText name='d1 button - outside - custom action' ++++++++++inlineTextBox name='d1 button - outside - custom action' -++++++button collapsed name='d1 button - outside - toggle-popover' -++++++++staticText name='d1 button - outside - toggle-popover' -++++++++++inlineTextBox name='d1 button - outside - toggle-popover' ++++++button collapsed name='d1 button - outside & next - show-popover' ++++++++staticText name='d1 button - outside & next - show-popover' ++++++++++inlineTextBox name='d1 button - outside & next - show-popover' ++++++button collapsed name='d1 button - outside - hide-popover' ++++++++staticText name='d1 button - outside - hide-popover' ++++++++++inlineTextBox name='d1 button - outside - hide-popover' +++++++button collapsed name='d1 button - outside - toggle-popover' +++++++++staticText name='d1 button - outside - toggle-popover' +++++++++++inlineTextBox name='d1 button - outside - toggle-popover' +++++++button name='d1 button - outside - unrelated action' +++++++++staticText name='d1 button - outside - unrelated action' +++++++++++inlineTextBox name='d1 button - outside - unrelated action' +++++++button name='d1 button - outside - custom action' +++++++++staticText name='d1 button - outside - custom action' +++++++++++inlineTextBox name='d1 button - outside - custom action'
diff --git a/content/test/data/accessibility/html/commandfor-api-popover-expected-mac.txt b/content/test/data/accessibility/html/commandfor-api-popover-expected-mac.txt index d729ef4e..823e342e 100644 --- a/content/test/data/accessibility/html/commandfor-api-popover-expected-mac.txt +++ b/content/test/data/accessibility/html/commandfor-api-popover-expected-mac.txt
@@ -1,49 +1,49 @@ AXWebArea ++AXGroup +++++AXButton AXExpanded=0 AXTitle='d1 button - outside & next - show-popover' +++++AXButton AXExpanded=0 AXTitle='d1 button - outside - hide-popover' ++++AXButton AXExpanded=0 AXTitle='d1 button - outside - toggle-popover' ++++AXButton AXTitle='d1 button - outside - unrelated action' ++++AXButton AXTitle='d1 button - outside - custom action' -++++AXButton AXExpanded=0 AXTitle='d1 button - outside - toggle-popover' -++++AXButton AXExpanded=0 AXTitle='d1 button - outside & next - show-popover' +++++AXButton AXExpanded=1 AXTitle='d2 button - outside & next - show-popover' +++++AXButton AXExpanded=1 AXTitle='d2 button - outside - hide-popover' ++++AXButton AXExpanded=1 AXTitle='d2 button - outside - toggle-popover' ++++AXButton AXTitle='d2 button - outside - unrelated action' ++++AXButton AXTitle='d2 button - outside - custom action' -++++AXButton AXExpanded=1 AXTitle='d2 button - outside - toggle-popover' -++++AXButton AXExpanded=1 AXTitle='d2 button - outside & next - show-popover' ++++AXGroup AXSubrole=AXApplicationGroup ++++++AXButton AXTitle='d2 button - inside - show-popover' ++++++AXButton AXTitle='d2 button - inside - hide-popover' ++++++AXButton AXTitle='d2 button - inside - toggle-popover' ++++++AXButton AXTitle='d2 button - inside - related action' ++++++AXButton AXTitle='d2 button - inside - custom action' +++++AXButton AXExpanded=1 AXTitle='d3 button - outside & next - show-popover' +++++AXButton AXExpanded=1 AXTitle='d3 button - outside - hide-popover' ++++AXButton AXExpanded=1 AXTitle='d3 button - outside - toggle-popover' ++++AXButton AXTitle='d3 button - outside - unrelated action' ++++AXButton AXTitle='d3 button - outside - custom action' -++++AXButton AXExpanded=1 AXTitle='d3 button - outside - toggle-popover' -++++AXButton AXExpanded=1 AXTitle='d3 button - outside & next - show-popover' ++++AXGroup AXSubrole=AXApplicationGroup ++++++AXButton AXTitle='d3 button - inside - show-popover' ++++++AXButton AXTitle='d3 button - inside - hide-popover' ++++++AXButton AXTitle='d3 button - inside - toggle-popover' ++++++AXButton AXTitle='d3 button - inside - related action' ++++++AXButton AXTitle='d3 button - inside - custom action' +++++AXButton AXTitle='d4 button - outside & next - show-popover' +++++AXButton AXTitle='d4 button - outside - hide-popover' ++++AXButton AXTitle='d4 button - outside - toggle-popover' ++++AXButton AXTitle='d4 button - outside - unrelated action' ++++AXButton AXTitle='d4 button - outside - custom action' -++++AXButton AXTitle='d4 button - outside - toggle-popover' -++++AXButton AXTitle='d4 button - outside & next - show-popover' +++++AXButton AXExpanded=0 AXTitle='d5 button - outside & next - show-popover' +++++AXButton AXExpanded=0 AXTitle='d5 button - outside - hide-popover' ++++AXButton AXExpanded=0 AXTitle='d5 button - outside - toggle-popover' ++++AXButton AXTitle='d5 button - outside - unrelated action' ++++AXButton AXTitle='d5 button - outside - custom action' -++++AXButton AXExpanded=0 AXTitle='d5 button - outside - toggle-popover' -++++AXButton AXExpanded=0 AXTitle='d5 button - outside & next - show-popover' -++++AXButton AXTitle='d1 button - outside - unrelated action' -++++AXButton AXTitle='d1 button - outside - custom action' -++++AXButton AXExpanded=0 AXTitle='d1 button - outside - hide-popover' ++++AXButton AXExpanded=0 AXTitle='d1 button - outside & next - show-popover' +++++AXButton AXExpanded=0 AXTitle='d1 button - outside - hide-popover' ++++AXButton AXExpanded=0 AXTitle='d1 button - outside - toggle-popover' ++++AXButton AXTitle='d1 button - outside - unrelated action' ++++AXButton AXTitle='d1 button - outside - custom action' -++++AXButton AXExpanded=0 AXTitle='d1 button - outside - toggle-popover' ++++AXButton AXExpanded=0 AXTitle='d1 button - outside & next - show-popover' ++++AXButton AXExpanded=0 AXTitle='d1 button - outside - hide-popover' +++++AXButton AXExpanded=0 AXTitle='d1 button - outside - toggle-popover' +++++AXButton AXTitle='d1 button - outside - unrelated action' +++++AXButton AXTitle='d1 button - outside - custom action'
diff --git a/content/test/data/accessibility/html/commandfor-api-popover-expected-uia-win.txt b/content/test/data/accessibility/html/commandfor-api-popover-expected-uia-win.txt index 849878d..e2bb14de 100644 --- a/content/test/data/accessibility/html/commandfor-api-popover-expected-uia-win.txt +++ b/content/test/data/accessibility/html/commandfor-api-popover-expected-uia-win.txt
@@ -1,49 +1,49 @@ Document ++Group IsControlElement=false +++++Button Name='d1 button - outside & next - show-popover' ExpandCollapse.ExpandCollapseState='Collapsed' +++++Button Name='d1 button - outside - hide-popover' ExpandCollapse.ExpandCollapseState='Collapsed' ++++Button Name='d1 button - outside - toggle-popover' ExpandCollapse.ExpandCollapseState='Collapsed' ++++Button Name='d1 button - outside - unrelated action' ++++Button Name='d1 button - outside - custom action' -++++Button Name='d1 button - outside - toggle-popover' ExpandCollapse.ExpandCollapseState='Collapsed' -++++Button Name='d1 button - outside & next - show-popover' ExpandCollapse.ExpandCollapseState='Collapsed' +++++Button Name='d2 button - outside & next - show-popover' ExpandCollapse.ExpandCollapseState='Expanded' +++++Button Name='d2 button - outside - hide-popover' ExpandCollapse.ExpandCollapseState='Expanded' ++++Button Name='d2 button - outside - toggle-popover' ExpandCollapse.ExpandCollapseState='Expanded' ++++Button Name='d2 button - outside - unrelated action' ++++Button Name='d2 button - outside - custom action' -++++Button Name='d2 button - outside - toggle-popover' ExpandCollapse.ExpandCollapseState='Expanded' -++++Button Name='d2 button - outside & next - show-popover' ExpandCollapse.ExpandCollapseState='Expanded' ++++Group IsControlElement=false ++++++Button Name='d2 button - inside - show-popover' ++++++Button Name='d2 button - inside - hide-popover' ++++++Button Name='d2 button - inside - toggle-popover' ++++++Button Name='d2 button - inside - related action' ++++++Button Name='d2 button - inside - custom action' +++++Button Name='d3 button - outside & next - show-popover' ExpandCollapse.ExpandCollapseState='Expanded' +++++Button Name='d3 button - outside - hide-popover' ExpandCollapse.ExpandCollapseState='Expanded' ++++Button Name='d3 button - outside - toggle-popover' ExpandCollapse.ExpandCollapseState='Expanded' ++++Button Name='d3 button - outside - unrelated action' ++++Button Name='d3 button - outside - custom action' -++++Button Name='d3 button - outside - toggle-popover' ExpandCollapse.ExpandCollapseState='Expanded' -++++Button Name='d3 button - outside & next - show-popover' ExpandCollapse.ExpandCollapseState='Expanded' ++++Group IsControlElement=false ++++++Button Name='d3 button - inside - show-popover' ++++++Button Name='d3 button - inside - hide-popover' ++++++Button Name='d3 button - inside - toggle-popover' ++++++Button Name='d3 button - inside - related action' ++++++Button Name='d3 button - inside - custom action' +++++Button Name='d4 button - outside & next - show-popover' +++++Button Name='d4 button - outside - hide-popover' ++++Button Name='d4 button - outside - toggle-popover' ++++Button Name='d4 button - outside - unrelated action' ++++Button Name='d4 button - outside - custom action' -++++Button Name='d4 button - outside - toggle-popover' -++++Button Name='d4 button - outside & next - show-popover' +++++Button Name='d5 button - outside & next - show-popover' ExpandCollapse.ExpandCollapseState='Collapsed' +++++Button Name='d5 button - outside - hide-popover' ExpandCollapse.ExpandCollapseState='Collapsed' ++++Button Name='d5 button - outside - toggle-popover' ExpandCollapse.ExpandCollapseState='Collapsed' ++++Button Name='d5 button - outside - unrelated action' ++++Button Name='d5 button - outside - custom action' -++++Button Name='d5 button - outside - toggle-popover' ExpandCollapse.ExpandCollapseState='Collapsed' -++++Button Name='d5 button - outside & next - show-popover' ExpandCollapse.ExpandCollapseState='Collapsed' -++++Button Name='d1 button - outside - unrelated action' -++++Button Name='d1 button - outside - custom action' -++++Button Name='d1 button - outside - hide-popover' ExpandCollapse.ExpandCollapseState='Collapsed' ++++Button Name='d1 button - outside & next - show-popover' ExpandCollapse.ExpandCollapseState='Collapsed' +++++Button Name='d1 button - outside - hide-popover' ExpandCollapse.ExpandCollapseState='Collapsed' ++++Button Name='d1 button - outside - toggle-popover' ExpandCollapse.ExpandCollapseState='Collapsed' ++++Button Name='d1 button - outside - unrelated action' ++++Button Name='d1 button - outside - custom action' -++++Button Name='d1 button - outside - toggle-popover' ExpandCollapse.ExpandCollapseState='Collapsed' ++++Button Name='d1 button - outside & next - show-popover' ExpandCollapse.ExpandCollapseState='Collapsed' ++++Button Name='d1 button - outside - hide-popover' ExpandCollapse.ExpandCollapseState='Collapsed' +++++Button Name='d1 button - outside - toggle-popover' ExpandCollapse.ExpandCollapseState='Collapsed' +++++Button Name='d1 button - outside - unrelated action' +++++Button Name='d1 button - outside - custom action'
diff --git a/content/test/data/accessibility/html/commandfor-api-popover-expected-win.txt b/content/test/data/accessibility/html/commandfor-api-popover-expected-win.txt index 4899f7b..0eb27f6 100644 --- a/content/test/data/accessibility/html/commandfor-api-popover-expected-win.txt +++ b/content/test/data/accessibility/html/commandfor-api-popover-expected-win.txt
@@ -1,49 +1,49 @@ ROLE_SYSTEM_DOCUMENT READONLY FOCUSABLE ++IA2_ROLE_SECTION +++++ROLE_SYSTEM_PUSHBUTTON name='d1 button - outside & next - show-popover' COLLAPSED FOCUSABLE +++++ROLE_SYSTEM_PUSHBUTTON name='d1 button - outside - hide-popover' COLLAPSED FOCUSABLE ++++ROLE_SYSTEM_PUSHBUTTON name='d1 button - outside - toggle-popover' COLLAPSED FOCUSABLE ++++ROLE_SYSTEM_PUSHBUTTON name='d1 button - outside - unrelated action' FOCUSABLE ++++ROLE_SYSTEM_PUSHBUTTON name='d1 button - outside - custom action' FOCUSABLE -++++ROLE_SYSTEM_PUSHBUTTON name='d1 button - outside - toggle-popover' COLLAPSED FOCUSABLE -++++ROLE_SYSTEM_PUSHBUTTON name='d1 button - outside & next - show-popover' COLLAPSED FOCUSABLE +++++ROLE_SYSTEM_PUSHBUTTON name='d2 button - outside & next - show-popover' EXPANDED FOCUSABLE details-from:command-for details-roles:popover +++++ROLE_SYSTEM_PUSHBUTTON name='d2 button - outside - hide-popover' EXPANDED FOCUSABLE details-from:command-for details-roles:popover ++++ROLE_SYSTEM_PUSHBUTTON name='d2 button - outside - toggle-popover' EXPANDED FOCUSABLE details-from:command-for details-roles:popover ++++ROLE_SYSTEM_PUSHBUTTON name='d2 button - outside - unrelated action' FOCUSABLE ++++ROLE_SYSTEM_PUSHBUTTON name='d2 button - outside - custom action' FOCUSABLE -++++ROLE_SYSTEM_PUSHBUTTON name='d2 button - outside - toggle-popover' EXPANDED FOCUSABLE details-from:command-for details-roles:popover -++++ROLE_SYSTEM_PUSHBUTTON name='d2 button - outside & next - show-popover' EXPANDED FOCUSABLE ++++ROLE_SYSTEM_GROUPING ispopup:auto ++++++ROLE_SYSTEM_PUSHBUTTON name='d2 button - inside - show-popover' FOCUSABLE ++++++ROLE_SYSTEM_PUSHBUTTON name='d2 button - inside - hide-popover' FOCUSABLE ++++++ROLE_SYSTEM_PUSHBUTTON name='d2 button - inside - toggle-popover' FOCUSABLE ++++++ROLE_SYSTEM_PUSHBUTTON name='d2 button - inside - related action' FOCUSABLE ++++++ROLE_SYSTEM_PUSHBUTTON name='d2 button - inside - custom action' FOCUSABLE +++++ROLE_SYSTEM_PUSHBUTTON name='d3 button - outside & next - show-popover' EXPANDED FOCUSABLE details-from:command-for details-roles:popover +++++ROLE_SYSTEM_PUSHBUTTON name='d3 button - outside - hide-popover' EXPANDED FOCUSABLE details-from:command-for details-roles:popover ++++ROLE_SYSTEM_PUSHBUTTON name='d3 button - outside - toggle-popover' EXPANDED FOCUSABLE details-from:command-for details-roles:popover ++++ROLE_SYSTEM_PUSHBUTTON name='d3 button - outside - unrelated action' FOCUSABLE ++++ROLE_SYSTEM_PUSHBUTTON name='d3 button - outside - custom action' FOCUSABLE -++++ROLE_SYSTEM_PUSHBUTTON name='d3 button - outside - toggle-popover' EXPANDED FOCUSABLE details-from:command-for details-roles:popover -++++ROLE_SYSTEM_PUSHBUTTON name='d3 button - outside & next - show-popover' EXPANDED FOCUSABLE ++++ROLE_SYSTEM_GROUPING ispopup:manual ++++++ROLE_SYSTEM_PUSHBUTTON name='d3 button - inside - show-popover' FOCUSABLE ++++++ROLE_SYSTEM_PUSHBUTTON name='d3 button - inside - hide-popover' FOCUSABLE ++++++ROLE_SYSTEM_PUSHBUTTON name='d3 button - inside - toggle-popover' FOCUSABLE ++++++ROLE_SYSTEM_PUSHBUTTON name='d3 button - inside - related action' FOCUSABLE ++++++ROLE_SYSTEM_PUSHBUTTON name='d3 button - inside - custom action' FOCUSABLE +++++ROLE_SYSTEM_PUSHBUTTON name='d4 button - outside & next - show-popover' FOCUSABLE +++++ROLE_SYSTEM_PUSHBUTTON name='d4 button - outside - hide-popover' FOCUSABLE ++++ROLE_SYSTEM_PUSHBUTTON name='d4 button - outside - toggle-popover' FOCUSABLE ++++ROLE_SYSTEM_PUSHBUTTON name='d4 button - outside - unrelated action' FOCUSABLE ++++ROLE_SYSTEM_PUSHBUTTON name='d4 button - outside - custom action' FOCUSABLE -++++ROLE_SYSTEM_PUSHBUTTON name='d4 button - outside - toggle-popover' FOCUSABLE -++++ROLE_SYSTEM_PUSHBUTTON name='d4 button - outside & next - show-popover' FOCUSABLE +++++ROLE_SYSTEM_PUSHBUTTON name='d5 button - outside & next - show-popover' COLLAPSED FOCUSABLE +++++ROLE_SYSTEM_PUSHBUTTON name='d5 button - outside - hide-popover' COLLAPSED FOCUSABLE ++++ROLE_SYSTEM_PUSHBUTTON name='d5 button - outside - toggle-popover' COLLAPSED FOCUSABLE ++++ROLE_SYSTEM_PUSHBUTTON name='d5 button - outside - unrelated action' FOCUSABLE ++++ROLE_SYSTEM_PUSHBUTTON name='d5 button - outside - custom action' FOCUSABLE -++++ROLE_SYSTEM_PUSHBUTTON name='d5 button - outside - toggle-popover' COLLAPSED FOCUSABLE -++++ROLE_SYSTEM_PUSHBUTTON name='d5 button - outside & next - show-popover' COLLAPSED FOCUSABLE -++++ROLE_SYSTEM_PUSHBUTTON name='d1 button - outside - unrelated action' FOCUSABLE -++++ROLE_SYSTEM_PUSHBUTTON name='d1 button - outside - custom action' FOCUSABLE -++++ROLE_SYSTEM_PUSHBUTTON name='d1 button - outside - hide-popover' COLLAPSED FOCUSABLE ++++ROLE_SYSTEM_PUSHBUTTON name='d1 button - outside & next - show-popover' COLLAPSED FOCUSABLE +++++ROLE_SYSTEM_PUSHBUTTON name='d1 button - outside - hide-popover' COLLAPSED FOCUSABLE ++++ROLE_SYSTEM_PUSHBUTTON name='d1 button - outside - toggle-popover' COLLAPSED FOCUSABLE ++++ROLE_SYSTEM_PUSHBUTTON name='d1 button - outside - unrelated action' FOCUSABLE ++++ROLE_SYSTEM_PUSHBUTTON name='d1 button - outside - custom action' FOCUSABLE -++++ROLE_SYSTEM_PUSHBUTTON name='d1 button - outside - toggle-popover' COLLAPSED FOCUSABLE ++++ROLE_SYSTEM_PUSHBUTTON name='d1 button - outside & next - show-popover' COLLAPSED FOCUSABLE ++++ROLE_SYSTEM_PUSHBUTTON name='d1 button - outside - hide-popover' COLLAPSED FOCUSABLE +++++ROLE_SYSTEM_PUSHBUTTON name='d1 button - outside - toggle-popover' COLLAPSED FOCUSABLE +++++ROLE_SYSTEM_PUSHBUTTON name='d1 button - outside - unrelated action' FOCUSABLE +++++ROLE_SYSTEM_PUSHBUTTON name='d1 button - outside - custom action' FOCUSABLE
diff --git a/content/test/data/accessibility/html/commandfor-api-popover.html b/content/test/data/accessibility/html/commandfor-api-popover.html index ed62bb62..7fcc26f 100644 --- a/content/test/data/accessibility/html/commandfor-api-popover.html +++ b/content/test/data/accessibility/html/commandfor-api-popover.html
@@ -12,11 +12,11 @@ --> <!-- Closed popover --> +<button commandfor="d1" command="show-popover">d1 button - outside & next - show-popover</button> +<button commandfor="d1" command="hide-popover">d1 button - outside - hide-popover</button> <button commandfor="d1" command="toggle-popover">d1 button - outside - toggle-popover</button> <button commandfor="d1" command="close">d1 button - outside - unrelated action</button> <button commandfor="d1" command="--frobulate">d1 button - outside - custom action</button> -<button commandfor="d1" command="toggle-popover">d1 button - outside - toggle-popover</button> -<button commandfor="d1" command="show-popover">d1 button - outside & next - show-popover</button> <div id="d1" popover> <button commandfor="d1" command="show-popover">d1 button - inside - show-popover</button> <button commandfor="d1" command="hide-popover">d1 button - inside - hide-popover</button> @@ -26,11 +26,11 @@ </div> <!-- Opened popover --> +<button commandfor="d2" command="show-popover">d2 button - outside & next - show-popover</button> +<button commandfor="d2" command="hide-popover">d2 button - outside - hide-popover</button> <button commandfor="d2" command="toggle-popover">d2 button - outside - toggle-popover</button> <button commandfor="d2" command="close">d2 button - outside - unrelated action</button> <button commandfor="d2" command="--frobulate">d2 button - outside - custom action</button> -<button commandfor="d2" command="toggle-popover">d2 button - outside - toggle-popover</button> -<button commandfor="d2" command="show-popover">d2 button - outside & next - show-popover</button> <div id="d2" popover> <button commandfor="d2" command="show-popover">d2 button - inside - show-popover</button> <button commandfor="d2" command="hide-popover">d2 button - inside - hide-popover</button> @@ -40,11 +40,11 @@ </div> <!-- Opened manual popover --> +<button commandfor="d3" command="show-popover">d3 button - outside & next - show-popover</button> +<button commandfor="d3" command="hide-popover">d3 button - outside - hide-popover</button> <button commandfor="d3" command="toggle-popover">d3 button - outside - toggle-popover</button> <button commandfor="d3" command="close">d3 button - outside - unrelated action</button> <button commandfor="d3" command="--frobulate">d3 button - outside - custom action</button> -<button commandfor="d3" command="toggle-popover">d3 button - outside - toggle-popover</button> -<button commandfor="d3" command="show-popover">d3 button - outside & next - show-popover</button> <div id="d3" popover="manual"> <button commandfor="d3" command="show-popover">d3 button - inside - show-popover</button> <button commandfor="d3" command="hide-popover">d3 button - inside - hide-popover</button> @@ -54,18 +54,18 @@ </div> <!-- Non-existent popover --> +<button commandfor="d4" command="show-popover">d4 button - outside & next - show-popover</button> +<button commandfor="d4" command="hide-popover">d4 button - outside - hide-popover</button> <button commandfor="d4" command="toggle-popover">d4 button - outside - toggle-popover</button> <button commandfor="d4" command="close">d4 button - outside - unrelated action</button> <button commandfor="d4" command="--frobulate">d4 button - outside - custom action</button> -<button commandfor="d4" command="toggle-popover">d4 button - outside - toggle-popover</button> -<button commandfor="d4" command="show-popover">d4 button - outside & next - show-popover</button> <!-- Hide Popover --> +<button commandfor="d5" command="show-popover">d5 button - outside & next - show-popover</button> +<button commandfor="d5" command="hide-popover">d5 button - outside - hide-popover</button> <button commandfor="d5" command="toggle-popover">d5 button - outside - toggle-popover</button> <button commandfor="d5" command="close">d5 button - outside - unrelated action</button> <button commandfor="d5" command="--frobulate">d5 button - outside - custom action</button> -<button commandfor="d5" command="toggle-popover">d5 button - outside - toggle-popover</button> -<button commandfor="d5" command="show-popover">d5 button - outside & next - show-popover</button> <div popover id="d5"> <button commandfor="d5" command="show-popover">d5 button - inside - show-popover</button> <button commandfor="d5" command="hide-popover">d5 button - inside - hide-popover</button> @@ -75,11 +75,11 @@ </div> <!-- Closed popover with toggle as next --> +<button commandfor="d6" command="show-popover">d1 button - outside & next - show-popover</button> +<button commandfor="d6" command="hide-popover">d1 button - outside - hide-popover</button> +<button commandfor="d6" command="toggle-popover">d1 button - outside - toggle-popover</button> <button commandfor="d6" command="close">d1 button - outside - unrelated action</button> <button commandfor="d6" command="--frobulate">d1 button - outside - custom action</button> -<button commandfor="d6" command="hide-popover">d1 button - outside - hide-popover</button> -<button commandfor="d6" command="show-popover">d1 button - outside & next - show-popover</button> -<button commandfor="d6" command="toggle-popover">d1 button - outside - toggle-popover</button> <div id="d6" popover> <button commandfor="d6" command="show-popover">d1 button - inside - show-popover</button> <button commandfor="d6" command="hide-popover">d1 button - inside - hide-popover</button> @@ -89,11 +89,11 @@ </div> <!-- Closed popover with hide as next --> -<button commandfor="d6" command="close">d1 button - outside - unrelated action</button> -<button commandfor="d6" command="--frobulate">d1 button - outside - custom action</button> -<button commandfor="d6" command="toggle-popover">d1 button - outside - toggle-popover</button> <button commandfor="d6" command="show-popover">d1 button - outside & next - show-popover</button> <button commandfor="d6" command="hide-popover">d1 button - outside - hide-popover</button> +<button commandfor="d6" command="toggle-popover">d1 button - outside - toggle-popover</button> +<button commandfor="d6" command="close">d1 button - outside - unrelated action</button> +<button commandfor="d6" command="--frobulate">d1 button - outside - custom action</button> <div id="d6" popover> <button commandfor="d6" command="show-popover">d1 button - inside - show-popover</button> <button commandfor="d6" command="hide-popover">d1 button - inside - hide-popover</button>
diff --git a/content/test/data/gpu/pixel_video_test.js b/content/test/data/gpu/pixel_video_test.js index 96f22e1..cf0d1ff3 100644 --- a/content/test/data/gpu/pixel_video_test.js +++ b/content/test/data/gpu/pixel_video_test.js
@@ -61,7 +61,7 @@ getParametersTesting(); video.onerror = e => { - logOutput(`Video playback error occurred: ${e.message}`); + logOutput(`Video playback error occurred: ${video.error.message}`); abort = true; domAutomationController.send('FAIL'); };
diff --git a/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt index 4922471f..ccae9d5 100644 --- a/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/pixel_expectations.txt
@@ -513,6 +513,13 @@ crbug.com/421948893 [ android android-corsola ] Pixel_Video_MP4_Rounded_Corner [ Failure ] crbug.com/422226030 [ android android-corsola ] Pixel_Video_HEVC [ Failure ] +# Flaky on Mac Intel +crbug.com/417899571 [ mac intel-0x3e9b angle-metal ] Pixel_VideoStreamFrom2DAlphaCanvas_DisableReadbackFromTexture [ Failure ] +crbug.com/417899571 [ mac intel-0x3e9b angle-metal ] Pixel_VideoStreamFrom2DCanvas [ Failure ] +crbug.com/417899571 [ mac intel-0x3e9b angle-metal ] Pixel_VideoStreamFromWebGLCanvas [ Failure ] +crbug.com/417899571 [ mac intel-0x3e9b angle-metal ] Pixel_VideoStreamFromWebGLCanvas_OneCopy [ Failure ] +crbug.com/417899571 [ mac intel-0x3e9b angle-metal ] Pixel_VideoStreamFromWebGLCanvas_TwoCopy_Accelerated [ Failure ] + ####################################################################### # Automated Entries After This Point - Do Not Manually Add Below Here # #######################################################################
diff --git a/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt b/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt index 89eaf36e..ae29812 100644 --- a/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt +++ b/content/test/gpu/gpu_tests/test_expectations/webgl2_conformance_expectations.txt
@@ -728,6 +728,8 @@ crbug.com/658724 [ angle-opengl intel mac ] deqp/functional/gles3/framebufferblit/rect_03.html [ Failure ] crbug.com/658724 [ angle-opengl intel mac ] deqp/functional/gles3/framebufferblit/rect_04.html [ Failure ] crbug.com/1334684 [ mac intel angle-metal ] deqp/functional/gles3/shaderbuiltinvar.html [ Failure ] +crbug.com/425369464 [ mac intel angle-metal ] conformance2/textures/image_bitmap_from_video/tex-2d-r32f-red-float.html [ Failure ] +crbug.com/425369464 [ mac intel angle-metal ] conformance2/textures/video/tex-3d-r11f_g11f_b10f-rgb-float.html [ Failure ] crbug.com/angleproject/5222 [ mac passthrough angle-opengl intel ] conformance2/textures/misc/tex-unpack-params.html [ Failure ] crbug.com/angleproject/5226 [ mac passthrough angle-opengl intel ] deqp/functional/gles3/texturespecification/basic_copyteximage2d.html [ Failure ]
diff --git a/content/web_test/renderer/test_plugin.cc b/content/web_test/renderer/test_plugin.cc index f52f006..960ab55 100644 --- a/content/web_test/renderer/test_plugin.cc +++ b/content/web_test/renderer/test_plugin.cc
@@ -307,6 +307,7 @@ // display compositor later. shared_image_ = sii->CreateSharedImage( {viz::SinglePlaneFormat::kRGBA_8888, rect_.size(), gfx::ColorSpace(), + kBottomLeft_GrSurfaceOrigin, kPremul_SkAlphaType, gpu::SHARED_IMAGE_USAGE_GLES2_WRITE | gpu::SHARED_IMAGE_USAGE_DISPLAY_READ, "TestLabel"}, @@ -336,6 +337,7 @@ shared_image_ = shared_image_interface_->CreateSharedImageForSoftwareCompositor( {format, rect_.size(), gfx::ColorSpace(), + kBottomLeft_GrSurfaceOrigin, kPremul_SkAlphaType, gpu::SHARED_IMAGE_USAGE_CPU_WRITE_ONLY, "TestPluginSharedBitmap"}); sync_token_ = shared_image_interface_->GenVerifiedSyncToken(); @@ -368,27 +370,16 @@ viz::ReleaseCallback* release_callback) { if (!content_changed_) return false; - gfx::Size size(rect_.size()); - if (shared_image_ && !gl_) { - *resource = viz::TransferableResource::MakeSoftwareSharedImage( - shared_image_, sync_token_, shared_image_->size(), - viz::SinglePlaneFormat::kBGRA_8888, - viz::TransferableResource::ResourceSource::kCanvas); - *release_callback = - base::BindOnce(&ReleaseSharedImage, std::move(shared_image_)); - sync_token_ = gpu::SyncToken(); - } else if (shared_image_) { - *resource = viz::TransferableResource::MakeGpu( - shared_image_, GL_TEXTURE_2D, sync_token_, size, - viz::SinglePlaneFormat::kRGBA_8888, false /* is_overlay_candidate */); - // We pass ownership of the shared image to the callback. - *release_callback = base::BindOnce(&ReleaseSharedImage, - std::exchange(shared_image_, nullptr)); - sync_token_ = gpu::SyncToken(); - } - resource->origin = kBottomLeft_GrSurfaceOrigin; - resource->size = size; + *resource = viz::TransferableResource::Make( + shared_image_, viz::TransferableResource::ResourceSource::kCanvas, + sync_token_); + // We pass ownership of the shared image to the callback. + *release_callback = base::BindOnce(&ReleaseSharedImage, + std::exchange(shared_image_, nullptr)); + + sync_token_ = gpu::SyncToken(); + content_changed_ = false; return true; }
diff --git a/crypto/PLAN.md b/crypto/PLAN.md new file mode 100644 index 0000000..d47cd67 --- /dev/null +++ b/crypto/PLAN.md
@@ -0,0 +1,196 @@ +# //crypto plan + +This doc outlines what the current maintainers of //crypto are doing with this +directory and why. If you feel like pitching in with any of these tasks, please +do. All of them are happening across the entire //crypto directory, tracked by +bugs in [Chromium > Internals > Crypto](https://issues.chromium.org/issues?q=status:open%20componentid:1768937&s=created_time:desc) +and by the overall [tend to //crypto bug](https://issues.chromium.org/issues/367888389). + +If you have questions that aren't answered here, or would just like to help out, +visit [#security in slack](https://app.slack.com/client/T039UTRBS/CGK7KLZD4). + +## Use Spans & Arrays When Possible + +Convert functions that use (pointer, length) pairs to functions that use spans. +Also, favor return types that indicate that the contained data is bytes rather +than text, use fixed-size types when possible, and favor returning values rather +than using out parameters. + +In general, crypto functions accept and return bytes, so for inputs: + +* `base::span<const uint8_t, N>` for fixed-size inputs +* `base::span<const uint8_t>` for variably-sized inputs +* `std::string_view` overloads if there are many callers that need to pass text + in directly + +And for outputs: + +* Returning `std::array<uint8_t, N>` for fixed-size outputs +* Returning `std::vector<uint8_t>` for variably-sized outputs + +If an out parameter is needed, `std::span<uint8_t, N>` or `std::span<uint8_t>` +should be used, but generally you can avoid these. + +If a function can fail (eg, decryption for an AEAD) but also needs to return a +value, it should return a `std::optional<std::array<uint8_t, N>>` or ` +std::optional<std::vector<uint8_t>>` so that callers can't fail to check the +result. Don't return a success/failure bool and use an out parameter. + +In all cases, never use (pointer, length) in //crypto APIs - there are always +better choices. + +## Reduce Heap Allocations + +As a general rule, let callers pass in spans of raw bytes, and return +std::arrays when returning new values, which gives the caller the most control +over allocation behavior. Let callers that need long-lived copies of return +values make those copies themselves. + +Also, avoid factory functions that return `unique_ptr<T>` unless you really need +the caller to have a separate heap-allocated object - prefer factory functions +that return a `T` directly, or a `std::optional<T>` if creation has to be +fallible. + +## Prefer Statelessness + +For API design, prefer a free function over an object - don't have an object +unless the operations being done actually are stateful (eg, a streaming hash / +encryption API) or have expensive setup work that shouldn't be repeated (eg, +parsing an ASN.1 structure). Also, prefer objects that just hold state and are +used by free functions over adding methods to those objects. + +For example, instead of: + +``` +class RSAEncryptor { + public: + RSAEncryptor(); + bool ImportKey(base::span<const uint8_t> key); + void GenerateKey(size_t length); + + std::vector<uint8_t> EncryptPKCS1v15(base::span<const uint8_t> message); + std::vector<uint8_t> EncryptOAEP(base::span<const uint8_t> message, ...); + private: + bssl::ScopedEVP_PKEY key_; +}; +``` + +prefer something like: + +``` +class RSAKey { + public: + // Note that these are both static, so these are both also basically free + // functions. + static RSAKey Generate(size_t length); + static std::optional<RSAKey> Import(base::span<const uint8_t> key); + private: + RSAKey(); + bssl::ScopedEVP_PKEY key_; +}; + +std::vector<uint8_t> EncryptPKCS1v15(const RSAKey& key, + base::span<const uint8_t> message); +std::vector<uint8_t> EncryptOAEP(const RSAKey& key, + base::span<const uint8_t> message, + ...); +``` + +Since places that need to handle cryptographic state are far more common than +places that need to do cryptographic operations, it's helpful to separate the +state from the operations like this. In some cases, the operations are actually +in a separate header file (eg [crypto/keypair.h](keypair.h) vs +[crypto/sign.h](sign.h). + +## Don't Handle OOM Conditions + +Older //crypto APIs often tolerate `nullptr` returns from BoringSSL, even in +situations where these can only happen as a result of lack of memory. To +tolerate that, the //crypto APIs were made "fallible" in that they themselves +could return `nullptr` or `false` or otherwise fail to do what they were +supposed to. + +In production chromium code, BoringSSL can never return an OOM failure: OOMs +cause an orderly runtime crash in the memory allocator. That means that any OOM +return is a can't-happen case in //crypto, and we should `CHECK()` that they +never happen (in case `nullptr` gets returned from some other reason, which +might indicate a bug on our part). + +That means that old code which looks like this: + +``` + bssl::UniquePtr<RSA> rsa_key(RSA_new()); + bssl::UniquePtr<BIGNUM> bn(BN_new()); + if (!rsa_key.get() || !bn.get() || !BN_set_word(bn.get(), 65537L)) + return nullptr; +``` + +would instead just be: + +``` + bssl::UniquePtr<RSA> rsa_key(RSA_new()); + bssl::UniquePtr<BIGNUM> bn(BN_new()); + + CHECK(rsa_key.get()); + CHECK(bn.get()); + CHECK(BN_set_word(bn.get(), 65537L)); +``` + +with the result that, from the caller's perspective, generating an RSA key now +cannot fail. That simplifies client code a lot. + +## Don't Support Obsolete Crypto + +In general, //crypto should not expose broken or obsolete mechanisms to callers. +Unfortunately Chromium is sometimes required to use these mechanisms anyway for +compatibility; when we do have to add them, prefer to put them in +//crypto/obsolete with explicit restrictions on who can use them. See for +example [crypto/obsolete/md5.h](obsolete/md5.h). + +Right now we consider these mechanisms obsolete, but they are still used in some +places in the codebase: + +* MD5 +* SHA-1 +* RSA with key lengths less than 2048 + +## Be Explicit About What Primitives Are Used + +Don't build an API like: + +``` +std::vector<uint8_t> SecureHash(base::span<const uint8_t> input); +``` + +This might seem appealing at first because it looks like it might allow us to +upgrade the hash function callers are using without changing call sites, but in +practice, you will have to implement it with a specific underlying hash +function. Once you do that, callers who actually do require *specifically that +hash function* will begin calling your wrapper function instead, thus forcing +you never to switch hash functions anyway. At the //crypto layer, it's better to +instead just expose: + +``` +std::array<uint8_t, ...> Sha256(base::span<const uint8_t> input); +std::array<uint8_t, ...> Sha512(base::span<const uint8_t> input); +``` + +... and so on, and force callers to explicitly specify what they want. Leave +opinionated wrappers like the hypothetical `SecureHash` to higher layers. + +## Write Unit Tests + +Some of the older //crypto code has few or no tests. When you're adding a new +API, try to write thorough test cases for it. Using existing known-answer tests +is best - often the relevant spec will include these, and you can be very +confident that they are correct. + +If your API is too difficult to unit-test, it is probably poorly designed and +you should rethink it. + +Also, you can reasonably assume the underlying BoringSSL primitive works +correctly, so it's not necessary to write tests asserting that BoringSSL itself +rejects invalid inputs / etc (although it is fine to write tests for the failure +behavior of //crypto APIs). In general one or two known-answer tests are +sufficient to ensure that data is being passed into and out of BoringSSL +correctly.
diff --git a/crypto/README.md b/crypto/README.md new file mode 100644 index 0000000..9d18d6a3 --- /dev/null +++ b/crypto/README.md
@@ -0,0 +1,15 @@ +# //crypto README + +This directory contains implementations of crypto primitives for use in +Chromium. Most of these are either: + +* Wrappers around platform-specific APIs (DPAPI, libsecret, etc), so that code + elsewhere in Chromium can use cross-platform abstractions, or +* Wrappers around BoringSSL APIs that use Chromium-native types like base::span + and similar + +There is very little actual cryptographic code in //crypto - it is mostly +wrappers. + +This directory is actively being refactored as of 2025-06. See +[PLAN.md](PLAN.md).
diff --git a/device/fido/fido_discovery_factory.h b/device/fido/fido_discovery_factory.h index a1ea2ca..efa9e4c 100644 --- a/device/fido/fido_discovery_factory.h +++ b/device/fido/fido_discovery_factory.h
@@ -15,7 +15,6 @@ #include "base/containers/span.h" #include "base/memory/raw_ptr.h" #include "build/build_config.h" -#include "components/sync/protocol/webauthn_credential_specifics.pb.h" #include "device/fido/cable/cable_discovery_data.h" #include "device/fido/cable/v2_constants.h" #include "device/fido/ctap_get_assertion_request.h"
diff --git a/docs/adding_to_third_party.md b/docs/adding_to_third_party.md index 4453757..db5663d 100644 --- a/docs/adding_to_third_party.md +++ b/docs/adding_to_third_party.md
@@ -71,6 +71,13 @@ as existing, will it be easy for another developer to understand which should be used where? Will you commit to consolidating uses in Chromium and remove the alternative libraries? +* Is the library memory safe? If not, is there an alternative library +available that is memory safe and meets Chromium's needs? + * You will be responsible for [owning the library](#add-owners), which + includes updating it for security and stability fixes. For C/C++, this is + your responsibility. For [Rust](#rust), minor version updates are regularly + handled by a rotation, so you are only responsible for major version updates + (and minor version updates which result in `gnrt` or Chromium CQ failures). * For desktop (Win/Mac/Linux/ChromeOS), does the dependency introduce closed source components (e.g., binaries, WASM binaries, obfuscated code)? If yes, please reach out to Chrome ATLs.
diff --git a/extensions/renderer/dispatcher.cc b/extensions/renderer/dispatcher.cc index a984cf8c..2bcc217 100644 --- a/extensions/renderer/dispatcher.cc +++ b/extensions/renderer/dispatcher.cc
@@ -81,7 +81,6 @@ #include "extensions/renderer/module_system.h" #include "extensions/renderer/native_extension_bindings_system.h" #include "extensions/renderer/renderer_extension_registry.h" -#include "extensions/renderer/renderer_frame_context_data.h" #include "extensions/renderer/safe_builtins.h" #include "extensions/renderer/script_context.h" #include "extensions/renderer/script_context_set.h" @@ -603,7 +602,7 @@ } } -void Dispatcher::WillPrepareForEvaluationOnWorkerThread( +void Dispatcher::WillEvaluateServiceWorkerOnWorkerThread( blink::WebServiceWorkerContextProxy* context_proxy, v8::Local<v8::Context> v8_context, int64_t service_worker_version_id, @@ -731,6 +730,7 @@ RequireGuestViewModules(context); #endif + WorkerThreadDispatcher::GetServiceWorkerData()->Init(); g_worker_script_context_set.Get().Insert(base::WrapUnique(context)); const base::TimeDelta elapsed = base::TimeTicks::Now() - start_time; @@ -739,22 +739,6 @@ service_worker_context_state = ServiceWorkerContextState::kInitialized; } -void Dispatcher::WillEvaluateServiceWorkerOnWorkerThread() { - const int thread_id = content::WorkerThread::GetCurrentId(); - CHECK_NE(thread_id, kMainThreadId); - - // `WillPrepareForEvaluationOnWorkerThread` should have run and updated - // `service_worker_context_state`. - CHECK_NE(service_worker_context_state, - extensions::ServiceWorkerContextState::kDefault); - - if (service_worker_context_state != ServiceWorkerContextState::kInitialized) { - return; - } - - WorkerThreadDispatcher::GetServiceWorkerData()->Init(); -} - void Dispatcher::WillReleaseScriptContext( blink::WebLocalFrame* frame, const v8::Local<v8::Context>& v8_context,
diff --git a/extensions/renderer/dispatcher.h b/extensions/renderer/dispatcher.h index dad2104..9d4c74b7 100644 --- a/extensions/renderer/dispatcher.h +++ b/extensions/renderer/dispatcher.h
@@ -144,12 +144,12 @@ const GURL& service_worker_scope, const GURL& script_url); - // This is called before a service worker prepares script engine for - // evaluation. + // This is called immediately before a service worker evaluates the + // toplevel script. This method installs extension API bindings. // // Runs on a different thread and should only use thread-safe member // variables. - void WillPrepareForEvaluationOnWorkerThread( + void WillEvaluateServiceWorkerOnWorkerThread( blink::WebServiceWorkerContextProxy* context_proxy, v8::Local<v8::Context> v8_context, int64_t service_worker_version_id, @@ -157,13 +157,6 @@ const GURL& script_url, const blink::ServiceWorkerToken& service_worker_token); - // This is called immediately before a service worker evaluates the - // toplevel script. This method installs extension API bindings. - // - // Runs on a different thread and should only use thread-safe member - // variables. - void WillEvaluateServiceWorkerOnWorkerThread(); - void WillReleaseScriptContext(blink::WebLocalFrame* frame, const v8::Local<v8::Context>& context, int32_t world_id);
diff --git a/extensions/renderer/module_system.cc b/extensions/renderer/module_system.cc index b4bee1e..66eb37b 100644 --- a/extensions/renderer/module_system.cc +++ b/extensions/renderer/module_system.cc
@@ -198,9 +198,9 @@ CHECK(GetPrivate(global, kModuleSystem, &dummy_value)); } - if (context_->context_type() == mojom::ContextType::kPrivilegedExtension && - ContextNeedsMojoBindings(context_) && - blink::WebV8Features::IsSupported(context->v8_context())) { + if (context_->GetRenderFrame() && + context_->context_type() == mojom::ContextType::kPrivilegedExtension && + !context_->IsForServiceWorker() && ContextNeedsMojoBindings(context_)) { // Valid enablement code path, so need to ensure MojoJS is allowed for the // process before attempting to enable it. blink::WebV8Features::AllowMojoJSForProcess();
diff --git a/infra/config/generated/builder-owners/clank-engprod@google.com.txt b/infra/config/generated/builder-owners/clank-engprod@google.com.txt index b44b163f1..497155f 100644 --- a/infra/config/generated/builder-owners/clank-engprod@google.com.txt +++ b/infra/config/generated/builder-owners/clank-engprod@google.com.txt
@@ -28,6 +28,7 @@ ci/android-15-x64-fyi-rel ci/android-15-x64-rel ci/android-16-x64-fyi-rel +ci/android-16-x64-rel ci/android-archive-rel ci/android-arm64-proguard-rel ci/android-bfcache-rel @@ -64,6 +65,7 @@ try/android-15-x64-fyi-rel try/android-15-x64-rel try/android-16-x64-fyi-rel +try/android-16-x64-rel try/android-clobber-rel try/android-desktop-15-x64-fyi-rel try/android-desktop-15-x64-rel
diff --git a/infra/config/generated/builders/ci/Mac Builder Next/targets/chromium.fyi.json b/infra/config/generated/builders/ci/Mac Builder Next/targets/chromium.fyi.json index 31d3fb2..4bfb18e 100644 --- a/infra/config/generated/builders/ci/Mac Builder Next/targets/chromium.fyi.json +++ b/infra/config/generated/builders/ci/Mac Builder Next/targets/chromium.fyi.json
@@ -12,7 +12,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -27,7 +27,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -42,7 +42,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -58,7 +58,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -73,7 +73,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -88,7 +88,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -103,7 +103,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -118,7 +118,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -141,7 +141,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -156,7 +156,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -171,7 +171,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -186,7 +186,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 25 @@ -205,7 +205,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -220,7 +220,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -235,7 +235,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -250,7 +250,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -265,7 +265,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -280,7 +280,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -295,7 +295,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 @@ -311,7 +311,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 @@ -327,7 +327,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -343,7 +343,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -358,7 +358,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -373,7 +373,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -388,7 +388,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -403,7 +403,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -418,7 +418,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -434,7 +434,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -449,7 +449,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -464,7 +464,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -479,7 +479,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -494,7 +494,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -509,7 +509,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -524,7 +524,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -539,7 +539,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -554,7 +554,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -569,7 +569,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -584,7 +584,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -599,7 +599,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -614,7 +614,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -629,7 +629,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -644,7 +644,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 7 @@ -660,7 +660,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -675,7 +675,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -691,7 +691,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -706,7 +706,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -721,7 +721,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -736,7 +736,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -751,7 +751,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -766,7 +766,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -781,7 +781,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -796,7 +796,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -811,7 +811,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -826,7 +826,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -841,7 +841,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -856,7 +856,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -871,7 +871,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -886,7 +886,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -901,7 +901,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -916,7 +916,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -931,7 +931,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -946,7 +946,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -961,7 +961,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -976,7 +976,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -991,7 +991,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -1006,7 +1006,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -1021,7 +1021,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 @@ -1037,7 +1037,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -1052,7 +1052,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -1067,7 +1067,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -1082,7 +1082,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -1097,7 +1097,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -1112,7 +1112,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -1127,7 +1127,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -1142,7 +1142,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -1157,7 +1157,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -1172,7 +1172,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -1187,7 +1187,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -1202,7 +1202,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -1225,7 +1225,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -1246,7 +1246,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -1261,7 +1261,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -1282,7 +1282,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -1301,7 +1301,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -1320,7 +1320,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -1338,7 +1338,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -1353,7 +1353,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -1371,7 +1371,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -1389,7 +1389,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "idempotent": false, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1411,7 +1411,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "idempotent": false, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -1435,7 +1435,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "idempotent": false, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -1458,7 +1458,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" },
diff --git a/infra/config/generated/builders/ci/android-16-x64-fyi-rel/targets/chromium.android.fyi.json b/infra/config/generated/builders/ci/android-16-x64-fyi-rel/targets/chromium.android.fyi.json index a6a1369..9de9a9e 100644 --- a/infra/config/generated/builders/ci/android-16-x64-fyi-rel/targets/chromium.android.fyi.json +++ b/infra/config/generated/builders/ci/android-16-x64-fyi-rel/targets/chromium.android.fyi.json
@@ -3,3292 +3,6 @@ "gtest_tests": [ { "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "absl_hardening_tests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "absl_hardening_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "absl_hardening_tests", - "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "android_browsertests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "android_browsertests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 4 - }, - "test": "android_browsertests", - "test_id_prefix": "ninja://chrome/test:android_browsertests/" - }, - { - "args": [ - "--disable-field-trial-config", - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "ci_only": true, - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "android_browsertests_no_fieldtrial" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "android_browsertests_no_fieldtrial", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 3 - }, - "test": "android_browsertests", - "test_id_prefix": "ninja://chrome/test:android_browsertests/" - }, - { - "args": [ - "--test-launcher-batch-limit=1", - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "android_sync_integration_tests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "android_sync_integration_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "android_sync_integration_tests", - "test_id_prefix": "ninja://chrome/test:android_sync_integration_tests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "android_webview_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "android_webview_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "android_webview_unittests", - "test_id_prefix": "ninja://android_webview/test:android_webview_unittests/" - }, - { - "args": [ - "-v", - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "angle_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "angle_unittests", - "test_id_prefix": "ninja://third_party/angle/src/tests:angle_unittests/", - "use_isolated_scripts_api": true - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_14_15_16.base_unittests.filter", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "base_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "base_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "base_unittests", - "test_id_prefix": "ninja://base:base_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "blink_common_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "blink_common_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "blink_common_unittests", - "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "blink_heap_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "blink_heap_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "blink_heap_unittests", - "test_id_prefix": "ninja://third_party/blink/renderer/platform/heap:blink_heap_unittests/" - }, - { - "args": [ - "--git-revision=${got_revision}", - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "blink_platform_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "blink_platform_unittests", - "precommit_args": [ - "--gerrit-issue=${patch_issue}", - "--gerrit-patchset=${patch_set}", - "--buildbucket-id=${buildbucket_build_id}" - ], - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "blink_platform_unittests", - "test_id_prefix": "ninja://third_party/blink/renderer/platform:blink_platform_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "boringssl_crypto_tests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "boringssl_crypto_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "boringssl_crypto_tests", - "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "boringssl_ssl_tests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "boringssl_ssl_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "boringssl_ssl_tests", - "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/" - }, - { - "args": [ - "--gtest_filter=-*UsingRealWebcam*", - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "capture_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "capture_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "capture_unittests", - "test_id_prefix": "ninja://media/capture:capture_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "cast_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "cast_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "cast_unittests", - "test_id_prefix": "ninja://media/cast:cast_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "cc_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "cc_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "cc_unittests", - "test_id_prefix": "ninja://cc:cc_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "ci_only": true, - "description": "Run with android_36_google_apis_x64", - "experiment_percentage": 100, - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "chrome_public_apk_profile_tests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "chrome_public_apk_profile_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "chrome_public_apk_baseline_profile_generator", - "test_id_prefix": "ninja://chrome/test/android:chrome_public_apk_baseline_profile_generator/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "chrome_public_smoke_test" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "chrome_public_smoke_test", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "chrome_public_smoke_test", - "test_id_prefix": "ninja://chrome/android:chrome_public_smoke_test/" - }, - { - "args": [ - "--git-revision=${got_revision}", - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "chrome_public_test_apk" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "chrome_public_test_apk", - "precommit_args": [ - "--gerrit-issue=${patch_issue}", - "--gerrit-patchset=${patch_set}", - "--buildbucket-id=${buildbucket_build_id}" - ], - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 20 - }, - "test": "chrome_public_test_apk", - "test_id_prefix": "ninja://chrome/android:chrome_public_test_apk/" - }, - { - "args": [ - "--git-revision=${got_revision}", - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "chrome_public_unit_test_apk" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "chrome_public_unit_test_apk", - "precommit_args": [ - "--gerrit-issue=${patch_issue}", - "--gerrit-patchset=${patch_set}", - "--buildbucket-id=${buildbucket_build_id}" - ], - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 4 - }, - "test": "chrome_public_unit_test_apk", - "test_id_prefix": "ninja://chrome/android:chrome_public_unit_test_apk/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "components_browsertests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "components_browsertests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "components_browsertests", - "test_id_prefix": "ninja://components:components_browsertests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "components_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "components_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 6 - }, - "test": "components_unittests", - "test_id_prefix": "ninja://components:components_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_16.content_browsertests.filter", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "content_browsertests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "content_browsertests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 30 - }, - "test": "content_browsertests", - "test_id_prefix": "ninja://content/test:content_browsertests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_14_15_16.content_shell_test_apk.filter", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "content_shell_test_apk" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "content_shell_test_apk", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 3 - }, - "test": "content_shell_test_apk", - "test_id_prefix": "ninja://content/shell/android:content_shell_test_apk/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_15_16.content_unittests.filter", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "content_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "content_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 3 - }, - "test": "content_unittests", - "test_id_prefix": "ninja://content/test:content_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "crashpad_tests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "crashpad_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "crashpad_tests", - "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "crypto_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "crypto_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "crypto_unittests", - "test_id_prefix": "ninja://crypto:crypto_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "device_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "device_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "device_unittests", - "test_id_prefix": "ninja://device:device_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "display_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "display_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "display_unittests", - "test_id_prefix": "ninja://ui/display:display_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "ci_only": true, - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "env_chromium_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "env_chromium_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "env_chromium_unittests", - "test_id_prefix": "ninja://third_party/leveldatabase:env_chromium_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "events_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "events_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "events_unittests", - "test_id_prefix": "ninja://ui/events:events_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "fuzzing_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "fuzzing_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "fuzzing_unittests", - "test_id_prefix": "ninja://testing/libfuzzer/tests:fuzzing_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "gcm_unit_tests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "gcm_unit_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "gcm_unit_tests", - "test_id_prefix": "ninja://google_apis/gcm:gcm_unit_tests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "gfx_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "gfx_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "gfx_unittests", - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "gin_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "gin_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "gin_unittests", - "test_id_prefix": "ninja://gin:gin_unittests/" - }, - { - "args": [ - "--use-cmd-decoder=validating", - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_12_12l_13.gl_tests.filter", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "gl_tests_validating" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "gl_tests_validating", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "gl_tests", - "test_id_prefix": "ninja://gpu:gl_tests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "gl_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "gl_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "gl_unittests", - "test_id_prefix": "ninja://ui/gl:gl_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "google_apis_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "google_apis_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "google_apis_unittests", - "test_id_prefix": "ninja://google_apis:google_apis_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "gpu_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "gpu_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "gpu_unittests", - "test_id_prefix": "ninja://gpu:gpu_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_15_16.gwp_asan_unittests.filter", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "gwp_asan_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "gwp_asan_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "gwp_asan_unittests", - "test_id_prefix": "ninja://components/gwp_asan:gwp_asan_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "ipc_tests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "ipc_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "ipc_tests", - "test_id_prefix": "ninja://ipc:ipc_tests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "jni_zero_sample_apk_test" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "jni_zero_sample_apk_test", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "jni_zero_sample_apk_test", - "test_id_prefix": "ninja://third_party/jni_zero/sample:jni_zero_sample_apk_test/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "latency_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "latency_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "latency_unittests", - "test_id_prefix": "ninja://ui/latency:latency_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "ci_only": true, - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "leveldb_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "leveldb_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "leveldb_unittests", - "test_id_prefix": "ninja://third_party/leveldatabase:leveldb_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "libjingle_xmpp_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "libjingle_xmpp_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "libjingle_xmpp_unittests", - "test_id_prefix": "ninja://third_party/libjingle_xmpp:libjingle_xmpp_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "liburlpattern_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "liburlpattern_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "liburlpattern_unittests", - "test_id_prefix": "ninja://third_party/liburlpattern:liburlpattern_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator.media_unittests.filter", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "media_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "media_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "media_unittests", - "test_id_prefix": "ninja://media:media_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "midi_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "midi_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "midi_unittests", - "test_id_prefix": "ninja://media/midi:midi_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "minidump_uploader_test" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "minidump_uploader_test", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "minidump_uploader_test", - "test_id_prefix": "ninja://components/minidump_uploader:minidump_uploader_test/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "mojo_test_apk" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "mojo_test_apk", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "mojo_test_apk", - "test_id_prefix": "ninja://mojo/public/java/system:mojo_test_apk/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "mojo_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "mojo_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "mojo_unittests", - "test_id_prefix": "ninja://mojo:mojo_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "net_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "net_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 3 - }, - "test": "net_unittests", - "test_id_prefix": "ninja://net:net_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gtest_filter=-ScopedDirTest.CloseOutOfScope", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "perfetto_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "perfetto_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "perfetto_unittests", - "test_id_prefix": "ninja://third_party/perfetto:perfetto_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "sandbox_linux_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "sandbox_linux_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "sandbox_linux_unittests", - "test_id_prefix": "ninja://sandbox/linux:sandbox_linux_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "services_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "services_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "services_unittests", - "test_id_prefix": "ninja://services:services_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "shell_dialogs_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "shell_dialogs_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "shell_dialogs_unittests", - "test_id_prefix": "ninja://ui/shell_dialogs:shell_dialogs_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "skia_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "skia_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "skia_unittests", - "test_id_prefix": "ninja://skia:skia_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "sql_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "sql_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "sql_unittests", - "test_id_prefix": "ninja://sql:sql_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "storage_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "storage_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "storage_unittests", - "test_id_prefix": "ninja://storage:storage_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "system_webview_shell_layout_test_apk" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "system_webview_shell_layout_test_apk", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "system_webview_shell_layout_test_apk", - "test_id_prefix": "ninja://android_webview/tools/system_webview_shell:system_webview_shell_layout_test_apk/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "trichrome_chrome_bundle_smoke_test" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "trichrome_chrome_bundle_smoke_test", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "trichrome_chrome_bundle_smoke_test", - "test_id_prefix": "ninja://chrome/android:trichrome_chrome_bundle_smoke_test/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "ui_android_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "ui_android_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "ui_android_unittests", - "test_id_prefix": "ninja://ui/android:ui_android_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "ui_base_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "ui_base_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "ui_base_unittests", - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "ui_touch_selection_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "ui_touch_selection_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "ui_touch_selection_unittests", - "test_id_prefix": "ninja://ui/touch_selection:ui_touch_selection_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_14_15_16.unit_tests.filter", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "unit_tests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "unit_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 2 - }, - "test": "unit_tests", - "test_id_prefix": "ninja://chrome/test:unit_tests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "url_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "url_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "url_unittests", - "test_id_prefix": "ninja://url:url_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "video_encode_accelerator_tests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "video_encode_accelerator_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "video_encode_accelerator_tests", - "test_id_prefix": "ninja://media/gpu/test:video_encode_accelerator_tests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "viz_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "viz_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "viz_unittests", - "test_id_prefix": "ninja://components/viz:viz_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "webkit_unit_tests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "webkit_unit_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 6 - }, - "test": "blink_unittests", - "test_id_prefix": "ninja://third_party/blink/renderer/controller:blink_unittests/" - }, - { - "args": [ - "--webview-process-mode=multiple", - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "webview_instrumentation_test_apk_multiple_process_mode" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "webview_instrumentation_test_apk_multiple_process_mode", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 12 - }, - "test": "webview_instrumentation_test_apk", - "test_id_prefix": "ninja://android_webview/test:webview_instrumentation_test_apk/" - }, - { - "args": [ "--store-tombstones", "--emulator-debug-tags=all", "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", @@ -3460,147 +174,6 @@ }, "test": "webview_trichrome_64_cts_tests", "test_id_prefix": "ninja://android_webview/test:webview_trichrome_64_cts_tests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "webview_ui_test_app_test_apk" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "webview_ui_test_app_test_apk", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "webview_ui_test_app_test_apk", - "test_id_prefix": "ninja://android_webview/tools/automated_ui_tests:webview_ui_test_app_test_apk/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "wtf_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "wtf_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "wtf_unittests", - "test_id_prefix": "ninja://third_party/blink/renderer/platform/wtf:wtf_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "zlib_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "zlib_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "zlib_unittests", - "test_id_prefix": "ninja://third_party/zlib:zlib_unittests/" } ] }
diff --git a/infra/config/generated/builders/ci/android-16-x64-rel/gn-args.json b/infra/config/generated/builders/ci/android-16-x64-rel/gn-args.json new file mode 100644 index 0000000..382c163 --- /dev/null +++ b/infra/config/generated/builders/ci/android-16-x64-rel/gn-args.json
@@ -0,0 +1,20 @@ +{ + "gn_args": { + "android_static_analysis": "off", + "dcheck_always_on": false, + "debuggable_apks": false, + "ffmpeg_branding": "Chrome", + "is_component_build": false, + "is_debug": false, + "proprietary_codecs": true, + "strip_debug_info": true, + "symbol_level": 1, + "system_webview_package_name": "com.google.android.webview.debug", + "system_webview_shell_package_name": "org.chromium.my_webview_shell", + "target_cpu": "x64", + "target_os": "android", + "use_reclient": false, + "use_remoteexec": true, + "use_siso": true + } +} \ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-16-x64-rel/properties.json b/infra/config/generated/builders/ci/android-16-x64-rel/properties.json new file mode 100644 index 0000000..0f1fe45 --- /dev/null +++ b/infra/config/generated/builders/ci/android-16-x64-rel/properties.json
@@ -0,0 +1,81 @@ +{ + "$build/chromium_tests_builder_config": { + "builder_config": { + "additional_exclusions": [ + "infra/config/generated/builders/ci/android-16-x64-rel/gn-args.json" + ], + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "android-16-x64-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-android-archive", + "builder_group": "chromium.android", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "base_config" + }, + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "main_builder", + "target_arch": "intel", + "target_bits": 64, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "android-16-x64-rel", + "project": "chromium" + } + ], + "mirroring_builder_group_and_names": [ + { + "builder": "android-16-x64-rel", + "group": "tryserver.chromium.android" + } + ], + "retry_failed_shards": true, + "retry_invalid_shards": true, + "targets_spec_directory": "src/infra/config/generated/builders/ci/android-16-x64-rel/targets" + } + }, + "$build/siso": { + "configs": [ + "builder" + ], + "enable_cloud_monitoring": true, + "enable_cloud_profiler": true, + "enable_cloud_trace": true, + "experiments": [], + "metrics_project": "chromium-reclient-metrics", + "project": "rbe-chromium-trusted", + "remote_jobs": 500 + }, + "$recipe_engine/resultdb/test_presentation": { + "column_keys": [], + "grouping_keys": [ + "status", + "v.test_suite" + ] + }, + "builder_group": "chromium.android", + "recipe": "chromium" +} \ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-16-x64-rel/shadow-properties.json b/infra/config/generated/builders/ci/android-16-x64-rel/shadow-properties.json new file mode 100644 index 0000000..dc0a10e9 --- /dev/null +++ b/infra/config/generated/builders/ci/android-16-x64-rel/shadow-properties.json
@@ -0,0 +1,14 @@ +{ + "$build/siso": { + "configs": [ + "builder" + ], + "enable_cloud_monitoring": true, + "enable_cloud_profiler": true, + "enable_cloud_trace": true, + "experiments": [], + "metrics_project": "chromium-reclient-metrics", + "project": "rbe-chromium-untrusted", + "remote_jobs": 500 + } +} \ No newline at end of file
diff --git a/infra/config/generated/builders/ci/android-16-x64-rel/targets/chromium.android.json b/infra/config/generated/builders/ci/android-16-x64-rel/targets/chromium.android.json new file mode 100644 index 0000000..36da7e5 --- /dev/null +++ b/infra/config/generated/builders/ci/android-16-x64-rel/targets/chromium.android.json
@@ -0,0 +1,3361 @@ +{ + "android-16-x64-rel": { + "gtest_tests": [ + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "absl_hardening_tests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "absl_hardening_tests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "absl_hardening_tests", + "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "android_browsertests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "android_browsertests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 4 + }, + "test": "android_browsertests", + "test_id_prefix": "ninja://chrome/test:android_browsertests/" + }, + { + "args": [ + "--disable-field-trial-config", + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "ci_only": true, + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "android_browsertests_no_fieldtrial" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "android_browsertests_no_fieldtrial", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 3 + }, + "test": "android_browsertests", + "test_id_prefix": "ninja://chrome/test:android_browsertests/" + }, + { + "args": [ + "--test-launcher-batch-limit=1", + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "android_sync_integration_tests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "android_sync_integration_tests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "android_sync_integration_tests", + "test_id_prefix": "ninja://chrome/test:android_sync_integration_tests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "android_webview_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "android_webview_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "android_webview_unittests", + "test_id_prefix": "ninja://android_webview/test:android_webview_unittests/" + }, + { + "args": [ + "-v", + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "angle_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "angle_unittests", + "test_id_prefix": "ninja://third_party/angle/src/tests:angle_unittests/", + "use_isolated_scripts_api": true + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_14_15_16.base_unittests.filter", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "base_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "base_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "base_unittests", + "test_id_prefix": "ninja://base:base_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "blink_common_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "blink_common_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "blink_common_unittests", + "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "blink_heap_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "blink_heap_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "blink_heap_unittests", + "test_id_prefix": "ninja://third_party/blink/renderer/platform/heap:blink_heap_unittests/" + }, + { + "args": [ + "--git-revision=${got_revision}", + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "blink_platform_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "blink_platform_unittests", + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "blink_platform_unittests", + "test_id_prefix": "ninja://third_party/blink/renderer/platform:blink_platform_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "boringssl_crypto_tests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "boringssl_crypto_tests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "boringssl_crypto_tests", + "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "boringssl_ssl_tests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "boringssl_ssl_tests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "boringssl_ssl_tests", + "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/" + }, + { + "args": [ + "--gtest_filter=-*UsingRealWebcam*", + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "capture_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "capture_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "capture_unittests", + "test_id_prefix": "ninja://media/capture:capture_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "cast_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "cast_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "cast_unittests", + "test_id_prefix": "ninja://media/cast:cast_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "cc_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "cc_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "cc_unittests", + "test_id_prefix": "ninja://cc:cc_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "ci_only": true, + "description": "Run with android_36_google_apis_x64", + "experiment_percentage": 100, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "chrome_public_apk_profile_tests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "chrome_public_apk_profile_tests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "chrome_public_apk_baseline_profile_generator", + "test_id_prefix": "ninja://chrome/test/android:chrome_public_apk_baseline_profile_generator/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "chrome_public_smoke_test" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "chrome_public_smoke_test", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "chrome_public_smoke_test", + "test_id_prefix": "ninja://chrome/android:chrome_public_smoke_test/" + }, + { + "args": [ + "--git-revision=${got_revision}", + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "chrome_public_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "chrome_public_test_apk", + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 20 + }, + "test": "chrome_public_test_apk", + "test_id_prefix": "ninja://chrome/android:chrome_public_test_apk/" + }, + { + "args": [ + "--git-revision=${got_revision}", + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "chrome_public_unit_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "chrome_public_unit_test_apk", + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 4 + }, + "test": "chrome_public_unit_test_apk", + "test_id_prefix": "ninja://chrome/android:chrome_public_unit_test_apk/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "components_browsertests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "components_browsertests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "components_browsertests", + "test_id_prefix": "ninja://components:components_browsertests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "components_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "components_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 6 + }, + "test": "components_unittests", + "test_id_prefix": "ninja://components:components_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_16.content_browsertests.filter", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "content_browsertests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "content_browsertests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 30 + }, + "test": "content_browsertests", + "test_id_prefix": "ninja://content/test:content_browsertests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_14_15_16.content_shell_test_apk.filter", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "content_shell_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "content_shell_test_apk", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 3 + }, + "test": "content_shell_test_apk", + "test_id_prefix": "ninja://content/shell/android:content_shell_test_apk/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_15_16.content_unittests.filter", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "content_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "content_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 3 + }, + "test": "content_unittests", + "test_id_prefix": "ninja://content/test:content_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "crashpad_tests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "crashpad_tests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "crashpad_tests", + "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "crypto_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "crypto_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "crypto_unittests", + "test_id_prefix": "ninja://crypto:crypto_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "device_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "device_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "device_unittests", + "test_id_prefix": "ninja://device:device_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "display_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "display_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "display_unittests", + "test_id_prefix": "ninja://ui/display:display_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "ci_only": true, + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "env_chromium_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "env_chromium_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "env_chromium_unittests", + "test_id_prefix": "ninja://third_party/leveldatabase:env_chromium_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "events_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "events_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "events_unittests", + "test_id_prefix": "ninja://ui/events:events_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "fuzzing_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "fuzzing_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "fuzzing_unittests", + "test_id_prefix": "ninja://testing/libfuzzer/tests:fuzzing_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "gcm_unit_tests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "gcm_unit_tests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "gcm_unit_tests", + "test_id_prefix": "ninja://google_apis/gcm:gcm_unit_tests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "gfx_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "gfx_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "gfx_unittests", + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "gin_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "gin_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "gin_unittests", + "test_id_prefix": "ninja://gin:gin_unittests/" + }, + { + "args": [ + "--use-cmd-decoder=validating", + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_12_12l_13.gl_tests.filter", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "gl_tests_validating" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "gl_tests_validating", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "gl_tests", + "test_id_prefix": "ninja://gpu:gl_tests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "gl_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "gl_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "gl_unittests", + "test_id_prefix": "ninja://ui/gl:gl_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "google_apis_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "google_apis_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "google_apis_unittests", + "test_id_prefix": "ninja://google_apis:google_apis_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "gpu_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "gpu_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "gpu_unittests", + "test_id_prefix": "ninja://gpu:gpu_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_15_16.gwp_asan_unittests.filter", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "gwp_asan_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "gwp_asan_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "gwp_asan_unittests", + "test_id_prefix": "ninja://components/gwp_asan:gwp_asan_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "ipc_tests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "ipc_tests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "ipc_tests", + "test_id_prefix": "ninja://ipc:ipc_tests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "jni_zero_sample_apk_test" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "jni_zero_sample_apk_test", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "jni_zero_sample_apk_test", + "test_id_prefix": "ninja://third_party/jni_zero/sample:jni_zero_sample_apk_test/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "latency_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "latency_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "latency_unittests", + "test_id_prefix": "ninja://ui/latency:latency_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "ci_only": true, + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "leveldb_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "leveldb_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "leveldb_unittests", + "test_id_prefix": "ninja://third_party/leveldatabase:leveldb_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "libjingle_xmpp_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "libjingle_xmpp_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "libjingle_xmpp_unittests", + "test_id_prefix": "ninja://third_party/libjingle_xmpp:libjingle_xmpp_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "liburlpattern_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "liburlpattern_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "liburlpattern_unittests", + "test_id_prefix": "ninja://third_party/liburlpattern:liburlpattern_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator.media_unittests.filter", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "media_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "media_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "media_unittests", + "test_id_prefix": "ninja://media:media_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "midi_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "midi_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "midi_unittests", + "test_id_prefix": "ninja://media/midi:midi_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "minidump_uploader_test" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "minidump_uploader_test", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "minidump_uploader_test", + "test_id_prefix": "ninja://components/minidump_uploader:minidump_uploader_test/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "mojo_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "mojo_test_apk", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "mojo_test_apk", + "test_id_prefix": "ninja://mojo/public/java/system:mojo_test_apk/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "mojo_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "mojo_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "mojo_unittests", + "test_id_prefix": "ninja://mojo:mojo_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "net_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "net_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 3 + }, + "test": "net_unittests", + "test_id_prefix": "ninja://net:net_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gtest_filter=-ScopedDirTest.CloseOutOfScope", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "perfetto_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "perfetto_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "perfetto_unittests", + "test_id_prefix": "ninja://third_party/perfetto:perfetto_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "sandbox_linux_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "sandbox_linux_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "sandbox_linux_unittests", + "test_id_prefix": "ninja://sandbox/linux:sandbox_linux_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "services_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "services_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "services_unittests", + "test_id_prefix": "ninja://services:services_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "shell_dialogs_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "shell_dialogs_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "shell_dialogs_unittests", + "test_id_prefix": "ninja://ui/shell_dialogs:shell_dialogs_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "skia_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "skia_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "skia_unittests", + "test_id_prefix": "ninja://skia:skia_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "sql_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "sql_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "sql_unittests", + "test_id_prefix": "ninja://sql:sql_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "storage_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "storage_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "storage_unittests", + "test_id_prefix": "ninja://storage:storage_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "system_webview_shell_layout_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "system_webview_shell_layout_test_apk", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "system_webview_shell_layout_test_apk", + "test_id_prefix": "ninja://android_webview/tools/system_webview_shell:system_webview_shell_layout_test_apk/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "trichrome_chrome_bundle_smoke_test" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "trichrome_chrome_bundle_smoke_test", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "trichrome_chrome_bundle_smoke_test", + "test_id_prefix": "ninja://chrome/android:trichrome_chrome_bundle_smoke_test/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "ui_android_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "ui_android_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "ui_android_unittests", + "test_id_prefix": "ninja://ui/android:ui_android_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "ui_base_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "ui_base_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "ui_base_unittests", + "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "ui_touch_selection_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "ui_touch_selection_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "ui_touch_selection_unittests", + "test_id_prefix": "ninja://ui/touch_selection:ui_touch_selection_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_14_15_16.unit_tests.filter", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "unit_tests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "unit_tests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 2 + }, + "test": "unit_tests", + "test_id_prefix": "ninja://chrome/test:unit_tests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "url_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "url_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "url_unittests", + "test_id_prefix": "ninja://url:url_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "video_encode_accelerator_tests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "video_encode_accelerator_tests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "video_encode_accelerator_tests", + "test_id_prefix": "ninja://media/gpu/test:video_encode_accelerator_tests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "viz_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "viz_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "viz_unittests", + "test_id_prefix": "ninja://components/viz:viz_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "webkit_unit_tests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "webkit_unit_tests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 6 + }, + "test": "blink_unittests", + "test_id_prefix": "ninja://third_party/blink/renderer/controller:blink_unittests/" + }, + { + "args": [ + "--webview-process-mode=multiple", + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "webview_instrumentation_test_apk_multiple_process_mode" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "webview_instrumentation_test_apk_multiple_process_mode", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 12 + }, + "test": "webview_instrumentation_test_apk", + "test_id_prefix": "ninja://android_webview/test:webview_instrumentation_test_apk/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "webview_ui_test_app_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "webview_ui_test_app_test_apk", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "webview_ui_test_app_test_apk", + "test_id_prefix": "ninja://android_webview/tools/automated_ui_tests:webview_ui_test_app_test_apk/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "wtf_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "wtf_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "wtf_unittests", + "test_id_prefix": "ninja://third_party/blink/renderer/platform/wtf:wtf_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "zlib_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "zlib_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "zlib_unittests", + "test_id_prefix": "ninja://third_party/zlib:zlib_unittests/" + } + ] + } +} \ No newline at end of file
diff --git a/infra/config/generated/builders/gn_args_locations.json b/infra/config/generated/builders/gn_args_locations.json index 70edb45..f531c0a 100644 --- a/infra/config/generated/builders/gn_args_locations.json +++ b/infra/config/generated/builders/gn_args_locations.json
@@ -43,6 +43,7 @@ "android-15-tablet-landscape-x64-rel": "ci/android-15-tablet-landscape-x64-rel/gn-args.json", "android-15-tablet-x64-rel": "ci/android-15-tablet-x64-rel/gn-args.json", "android-15-x64-rel": "ci/android-15-x64-rel/gn-args.json", + "android-16-x64-rel": "ci/android-16-x64-rel/gn-args.json", "android-arm64-proguard-rel": "ci/android-arm64-proguard-rel/gn-args.json", "android-bfcache-rel": "ci/android-bfcache-rel/gn-args.json", "android-binary-size-generator": "ci/android-binary-size-generator/gn-args.json", @@ -550,6 +551,7 @@ "android-15-x64-fyi-rel": "try/android-15-x64-fyi-rel/gn-args.json", "android-15-x64-rel": "try/android-15-x64-rel/gn-args.json", "android-16-x64-fyi-rel": "try/android-16-x64-fyi-rel/gn-args.json", + "android-16-x64-rel": "try/android-16-x64-rel/gn-args.json", "android-arm-compile-dbg": "try/android-arm-compile-dbg/gn-args.json", "android-arm64-rel": "try/android-arm64-rel/gn-args.json", "android-bfcache-rel": "try/android-bfcache-rel/gn-args.json",
diff --git a/infra/config/generated/builders/try/android-16-x64-fyi-rel/targets/chromium.android.fyi.json b/infra/config/generated/builders/try/android-16-x64-fyi-rel/targets/chromium.android.fyi.json index a6a1369..9de9a9e 100644 --- a/infra/config/generated/builders/try/android-16-x64-fyi-rel/targets/chromium.android.fyi.json +++ b/infra/config/generated/builders/try/android-16-x64-fyi-rel/targets/chromium.android.fyi.json
@@ -3,3292 +3,6 @@ "gtest_tests": [ { "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "absl_hardening_tests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "absl_hardening_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "absl_hardening_tests", - "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "android_browsertests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "android_browsertests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 4 - }, - "test": "android_browsertests", - "test_id_prefix": "ninja://chrome/test:android_browsertests/" - }, - { - "args": [ - "--disable-field-trial-config", - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "ci_only": true, - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "android_browsertests_no_fieldtrial" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "android_browsertests_no_fieldtrial", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 3 - }, - "test": "android_browsertests", - "test_id_prefix": "ninja://chrome/test:android_browsertests/" - }, - { - "args": [ - "--test-launcher-batch-limit=1", - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "android_sync_integration_tests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "android_sync_integration_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "android_sync_integration_tests", - "test_id_prefix": "ninja://chrome/test:android_sync_integration_tests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "android_webview_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "android_webview_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "android_webview_unittests", - "test_id_prefix": "ninja://android_webview/test:android_webview_unittests/" - }, - { - "args": [ - "-v", - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "script": "//testing/merge_scripts/standard_isolated_script_merge.py" - }, - "name": "angle_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "angle_unittests", - "test_id_prefix": "ninja://third_party/angle/src/tests:angle_unittests/", - "use_isolated_scripts_api": true - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_14_15_16.base_unittests.filter", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "base_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "base_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "base_unittests", - "test_id_prefix": "ninja://base:base_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "blink_common_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "blink_common_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "blink_common_unittests", - "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "blink_heap_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "blink_heap_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "blink_heap_unittests", - "test_id_prefix": "ninja://third_party/blink/renderer/platform/heap:blink_heap_unittests/" - }, - { - "args": [ - "--git-revision=${got_revision}", - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "blink_platform_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "blink_platform_unittests", - "precommit_args": [ - "--gerrit-issue=${patch_issue}", - "--gerrit-patchset=${patch_set}", - "--buildbucket-id=${buildbucket_build_id}" - ], - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "blink_platform_unittests", - "test_id_prefix": "ninja://third_party/blink/renderer/platform:blink_platform_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "boringssl_crypto_tests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "boringssl_crypto_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "boringssl_crypto_tests", - "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "boringssl_ssl_tests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "boringssl_ssl_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "boringssl_ssl_tests", - "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/" - }, - { - "args": [ - "--gtest_filter=-*UsingRealWebcam*", - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "capture_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "capture_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "capture_unittests", - "test_id_prefix": "ninja://media/capture:capture_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "cast_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "cast_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "cast_unittests", - "test_id_prefix": "ninja://media/cast:cast_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "cc_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "cc_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "cc_unittests", - "test_id_prefix": "ninja://cc:cc_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "ci_only": true, - "description": "Run with android_36_google_apis_x64", - "experiment_percentage": 100, - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "chrome_public_apk_profile_tests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "chrome_public_apk_profile_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "chrome_public_apk_baseline_profile_generator", - "test_id_prefix": "ninja://chrome/test/android:chrome_public_apk_baseline_profile_generator/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "chrome_public_smoke_test" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "chrome_public_smoke_test", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "chrome_public_smoke_test", - "test_id_prefix": "ninja://chrome/android:chrome_public_smoke_test/" - }, - { - "args": [ - "--git-revision=${got_revision}", - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "chrome_public_test_apk" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "chrome_public_test_apk", - "precommit_args": [ - "--gerrit-issue=${patch_issue}", - "--gerrit-patchset=${patch_set}", - "--buildbucket-id=${buildbucket_build_id}" - ], - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 20 - }, - "test": "chrome_public_test_apk", - "test_id_prefix": "ninja://chrome/android:chrome_public_test_apk/" - }, - { - "args": [ - "--git-revision=${got_revision}", - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "chrome_public_unit_test_apk" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "chrome_public_unit_test_apk", - "precommit_args": [ - "--gerrit-issue=${patch_issue}", - "--gerrit-patchset=${patch_set}", - "--buildbucket-id=${buildbucket_build_id}" - ], - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 4 - }, - "test": "chrome_public_unit_test_apk", - "test_id_prefix": "ninja://chrome/android:chrome_public_unit_test_apk/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "components_browsertests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "components_browsertests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "components_browsertests", - "test_id_prefix": "ninja://components:components_browsertests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "components_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "components_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 6 - }, - "test": "components_unittests", - "test_id_prefix": "ninja://components:components_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_16.content_browsertests.filter", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "content_browsertests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "content_browsertests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 30 - }, - "test": "content_browsertests", - "test_id_prefix": "ninja://content/test:content_browsertests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_14_15_16.content_shell_test_apk.filter", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "content_shell_test_apk" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "content_shell_test_apk", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 3 - }, - "test": "content_shell_test_apk", - "test_id_prefix": "ninja://content/shell/android:content_shell_test_apk/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_15_16.content_unittests.filter", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "content_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "content_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 3 - }, - "test": "content_unittests", - "test_id_prefix": "ninja://content/test:content_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "crashpad_tests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "crashpad_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "crashpad_tests", - "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "crypto_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "crypto_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "crypto_unittests", - "test_id_prefix": "ninja://crypto:crypto_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "device_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "device_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "device_unittests", - "test_id_prefix": "ninja://device:device_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "display_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "display_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "display_unittests", - "test_id_prefix": "ninja://ui/display:display_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "ci_only": true, - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "env_chromium_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "env_chromium_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "env_chromium_unittests", - "test_id_prefix": "ninja://third_party/leveldatabase:env_chromium_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "events_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "events_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "events_unittests", - "test_id_prefix": "ninja://ui/events:events_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "fuzzing_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "fuzzing_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "fuzzing_unittests", - "test_id_prefix": "ninja://testing/libfuzzer/tests:fuzzing_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "gcm_unit_tests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "gcm_unit_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "gcm_unit_tests", - "test_id_prefix": "ninja://google_apis/gcm:gcm_unit_tests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "gfx_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "gfx_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "gfx_unittests", - "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "gin_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "gin_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "gin_unittests", - "test_id_prefix": "ninja://gin:gin_unittests/" - }, - { - "args": [ - "--use-cmd-decoder=validating", - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_12_12l_13.gl_tests.filter", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "gl_tests_validating" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "gl_tests_validating", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "gl_tests", - "test_id_prefix": "ninja://gpu:gl_tests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "gl_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "gl_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "gl_unittests", - "test_id_prefix": "ninja://ui/gl:gl_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "google_apis_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "google_apis_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "google_apis_unittests", - "test_id_prefix": "ninja://google_apis:google_apis_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "gpu_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "gpu_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "gpu_unittests", - "test_id_prefix": "ninja://gpu:gpu_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_15_16.gwp_asan_unittests.filter", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "gwp_asan_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "gwp_asan_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "gwp_asan_unittests", - "test_id_prefix": "ninja://components/gwp_asan:gwp_asan_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "ipc_tests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "ipc_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "ipc_tests", - "test_id_prefix": "ninja://ipc:ipc_tests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "jni_zero_sample_apk_test" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "jni_zero_sample_apk_test", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "jni_zero_sample_apk_test", - "test_id_prefix": "ninja://third_party/jni_zero/sample:jni_zero_sample_apk_test/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "latency_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "latency_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "latency_unittests", - "test_id_prefix": "ninja://ui/latency:latency_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "ci_only": true, - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "leveldb_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "leveldb_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "leveldb_unittests", - "test_id_prefix": "ninja://third_party/leveldatabase:leveldb_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "libjingle_xmpp_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "libjingle_xmpp_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "libjingle_xmpp_unittests", - "test_id_prefix": "ninja://third_party/libjingle_xmpp:libjingle_xmpp_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "liburlpattern_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "liburlpattern_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "liburlpattern_unittests", - "test_id_prefix": "ninja://third_party/liburlpattern:liburlpattern_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator.media_unittests.filter", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "media_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "media_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "media_unittests", - "test_id_prefix": "ninja://media:media_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "midi_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "midi_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "midi_unittests", - "test_id_prefix": "ninja://media/midi:midi_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "minidump_uploader_test" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "minidump_uploader_test", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "minidump_uploader_test", - "test_id_prefix": "ninja://components/minidump_uploader:minidump_uploader_test/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "mojo_test_apk" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "mojo_test_apk", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "mojo_test_apk", - "test_id_prefix": "ninja://mojo/public/java/system:mojo_test_apk/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "mojo_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "mojo_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "mojo_unittests", - "test_id_prefix": "ninja://mojo:mojo_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "net_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "net_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 3 - }, - "test": "net_unittests", - "test_id_prefix": "ninja://net:net_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gtest_filter=-ScopedDirTest.CloseOutOfScope", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "perfetto_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "perfetto_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "perfetto_unittests", - "test_id_prefix": "ninja://third_party/perfetto:perfetto_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "sandbox_linux_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "sandbox_linux_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "sandbox_linux_unittests", - "test_id_prefix": "ninja://sandbox/linux:sandbox_linux_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "services_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "services_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "services_unittests", - "test_id_prefix": "ninja://services:services_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "shell_dialogs_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "shell_dialogs_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "shell_dialogs_unittests", - "test_id_prefix": "ninja://ui/shell_dialogs:shell_dialogs_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "skia_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "skia_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "skia_unittests", - "test_id_prefix": "ninja://skia:skia_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "sql_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "sql_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "sql_unittests", - "test_id_prefix": "ninja://sql:sql_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "storage_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "storage_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "storage_unittests", - "test_id_prefix": "ninja://storage:storage_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "system_webview_shell_layout_test_apk" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "system_webview_shell_layout_test_apk", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "system_webview_shell_layout_test_apk", - "test_id_prefix": "ninja://android_webview/tools/system_webview_shell:system_webview_shell_layout_test_apk/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "trichrome_chrome_bundle_smoke_test" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "trichrome_chrome_bundle_smoke_test", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "trichrome_chrome_bundle_smoke_test", - "test_id_prefix": "ninja://chrome/android:trichrome_chrome_bundle_smoke_test/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "ui_android_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "ui_android_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "ui_android_unittests", - "test_id_prefix": "ninja://ui/android:ui_android_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "ui_base_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "ui_base_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "ui_base_unittests", - "test_id_prefix": "ninja://ui/base:ui_base_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "ui_touch_selection_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "ui_touch_selection_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "ui_touch_selection_unittests", - "test_id_prefix": "ninja://ui/touch_selection:ui_touch_selection_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_14_15_16.unit_tests.filter", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "unit_tests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "unit_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 2 - }, - "test": "unit_tests", - "test_id_prefix": "ninja://chrome/test:unit_tests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "url_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "url_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "url_unittests", - "test_id_prefix": "ninja://url:url_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "video_encode_accelerator_tests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "video_encode_accelerator_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "video_encode_accelerator_tests", - "test_id_prefix": "ninja://media/gpu/test:video_encode_accelerator_tests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "viz_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "viz_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "viz_unittests", - "test_id_prefix": "ninja://components/viz:viz_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "webkit_unit_tests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "webkit_unit_tests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 6 - }, - "test": "blink_unittests", - "test_id_prefix": "ninja://third_party/blink/renderer/controller:blink_unittests/" - }, - { - "args": [ - "--webview-process-mode=multiple", - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "webview_instrumentation_test_apk_multiple_process_mode" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "webview_instrumentation_test_apk_multiple_process_mode", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", - "shards": 12 - }, - "test": "webview_instrumentation_test_apk", - "test_id_prefix": "ninja://android_webview/test:webview_instrumentation_test_apk/" - }, - { - "args": [ "--store-tombstones", "--emulator-debug-tags=all", "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", @@ -3460,147 +174,6 @@ }, "test": "webview_trichrome_64_cts_tests", "test_id_prefix": "ninja://android_webview/test:webview_trichrome_64_cts_tests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "webview_ui_test_app_test_apk" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "webview_ui_test_app_test_apk", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "webview_ui_test_app_test_apk", - "test_id_prefix": "ninja://android_webview/tools/automated_ui_tests:webview_ui_test_app_test_apk/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "wtf_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "wtf_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "wtf_unittests", - "test_id_prefix": "ninja://third_party/blink/renderer/platform/wtf:wtf_unittests/" - }, - { - "args": [ - "--emulator-debug-tags=all", - "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", - "--gs-results-bucket=chromium-result-details", - "--recover-devices" - ], - "description": "Run with android_36_google_apis_x64", - "merge": { - "args": [ - "--bucket", - "chromium-result-details", - "--test-name", - "zlib_unittests" - ], - "script": "//build/android/pylib/results/presentation/test_results_presentation.py" - }, - "name": "zlib_unittests", - "resultdb": { - "enable": true, - "has_native_resultdb_integration": true - }, - "swarming": { - "dimensions": { - "cores": "8", - "cpu": "x86-64", - "device_os": null, - "device_type": null, - "os": "Ubuntu-22.04", - "pool": "chromium.tests.avd" - }, - "named_caches": [ - { - "name": "android_36_google_apis_x64", - "path": ".android_emulator/android_36_google_apis_x64" - } - ], - "optional_dimensions": { - "60": { - "caches": "android_36_google_apis_x64" - } - }, - "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" - }, - "test": "zlib_unittests", - "test_id_prefix": "ninja://third_party/zlib:zlib_unittests/" } ] }
diff --git a/infra/config/generated/builders/try/android-16-x64-rel/gn-args.json b/infra/config/generated/builders/try/android-16-x64-rel/gn-args.json new file mode 100644 index 0000000..00384776 --- /dev/null +++ b/infra/config/generated/builders/try/android-16-x64-rel/gn-args.json
@@ -0,0 +1,20 @@ +{ + "gn_args": { + "android_static_analysis": "off", + "dcheck_always_on": true, + "debuggable_apks": false, + "ffmpeg_branding": "Chrome", + "is_component_build": false, + "is_debug": false, + "proprietary_codecs": true, + "strip_debug_info": true, + "symbol_level": 0, + "system_webview_package_name": "com.google.android.webview.debug", + "system_webview_shell_package_name": "org.chromium.my_webview_shell", + "target_cpu": "x64", + "target_os": "android", + "use_reclient": false, + "use_remoteexec": true, + "use_siso": true + } +} \ No newline at end of file
diff --git a/infra/config/generated/builders/try/android-16-x64-rel/properties.json b/infra/config/generated/builders/try/android-16-x64-rel/properties.json new file mode 100644 index 0000000..6cb781e --- /dev/null +++ b/infra/config/generated/builders/try/android-16-x64-rel/properties.json
@@ -0,0 +1,75 @@ +{ + "$build/chromium_tests_builder_config": { + "builder_config": { + "additional_exclusions": [ + "infra/config/generated/builders/try/android-16-x64-rel/gn-args.json" + ], + "builder_db": { + "entries": [ + { + "builder_id": { + "bucket": "ci", + "builder": "android-16-x64-rel", + "project": "chromium" + }, + "builder_spec": { + "build_gs_bucket": "chromium-android-archive", + "builder_group": "chromium.android", + "execution_mode": "COMPILE_AND_TEST", + "legacy_android_config": { + "config": "base_config" + }, + "legacy_chromium_config": { + "apply_configs": [ + "mb" + ], + "build_config": "Release", + "config": "main_builder", + "target_arch": "intel", + "target_bits": 64, + "target_platform": "android" + }, + "legacy_gclient_config": { + "apply_configs": [ + "android" + ], + "config": "chromium" + } + } + } + ] + }, + "builder_ids": [ + { + "bucket": "ci", + "builder": "android-16-x64-rel", + "project": "chromium" + } + ], + "targets_spec_directory": "src/infra/config/generated/builders/try/android-16-x64-rel/targets" + } + }, + "$build/siso": { + "configs": [ + "builder", + "remote-link" + ], + "enable_cloud_monitoring": true, + "enable_cloud_profiler": true, + "enable_cloud_trace": true, + "experiments": [], + "metrics_project": "chromium-reclient-metrics", + "output_local_strategy": "greedy", + "project": "rbe-chromium-untrusted", + "remote_jobs": 150 + }, + "$recipe_engine/resultdb/test_presentation": { + "column_keys": [], + "grouping_keys": [ + "status", + "v.test_suite" + ] + }, + "builder_group": "tryserver.chromium.android", + "recipe": "chromium_trybot" +} \ No newline at end of file
diff --git a/infra/config/generated/builders/try/android-16-x64-rel/targets/chromium.android.json b/infra/config/generated/builders/try/android-16-x64-rel/targets/chromium.android.json new file mode 100644 index 0000000..36da7e5 --- /dev/null +++ b/infra/config/generated/builders/try/android-16-x64-rel/targets/chromium.android.json
@@ -0,0 +1,3361 @@ +{ + "android-16-x64-rel": { + "gtest_tests": [ + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "absl_hardening_tests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "absl_hardening_tests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "absl_hardening_tests", + "test_id_prefix": "ninja://third_party/abseil-cpp:absl_hardening_tests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "android_browsertests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "android_browsertests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 4 + }, + "test": "android_browsertests", + "test_id_prefix": "ninja://chrome/test:android_browsertests/" + }, + { + "args": [ + "--disable-field-trial-config", + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "ci_only": true, + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "android_browsertests_no_fieldtrial" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "android_browsertests_no_fieldtrial", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 3 + }, + "test": "android_browsertests", + "test_id_prefix": "ninja://chrome/test:android_browsertests/" + }, + { + "args": [ + "--test-launcher-batch-limit=1", + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "android_sync_integration_tests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "android_sync_integration_tests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "android_sync_integration_tests", + "test_id_prefix": "ninja://chrome/test:android_sync_integration_tests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "android_webview_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "android_webview_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "android_webview_unittests", + "test_id_prefix": "ninja://android_webview/test:android_webview_unittests/" + }, + { + "args": [ + "-v", + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "script": "//testing/merge_scripts/standard_isolated_script_merge.py" + }, + "name": "angle_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "angle_unittests", + "test_id_prefix": "ninja://third_party/angle/src/tests:angle_unittests/", + "use_isolated_scripts_api": true + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_14_15_16.base_unittests.filter", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "base_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "base_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "base_unittests", + "test_id_prefix": "ninja://base:base_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "blink_common_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "blink_common_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "blink_common_unittests", + "test_id_prefix": "ninja://third_party/blink/common:blink_common_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "blink_heap_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "blink_heap_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "blink_heap_unittests", + "test_id_prefix": "ninja://third_party/blink/renderer/platform/heap:blink_heap_unittests/" + }, + { + "args": [ + "--git-revision=${got_revision}", + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "blink_platform_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "blink_platform_unittests", + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "blink_platform_unittests", + "test_id_prefix": "ninja://third_party/blink/renderer/platform:blink_platform_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "boringssl_crypto_tests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "boringssl_crypto_tests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "boringssl_crypto_tests", + "test_id_prefix": "ninja://third_party/boringssl:boringssl_crypto_tests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "boringssl_ssl_tests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "boringssl_ssl_tests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "boringssl_ssl_tests", + "test_id_prefix": "ninja://third_party/boringssl:boringssl_ssl_tests/" + }, + { + "args": [ + "--gtest_filter=-*UsingRealWebcam*", + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "capture_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "capture_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "capture_unittests", + "test_id_prefix": "ninja://media/capture:capture_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "cast_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "cast_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "cast_unittests", + "test_id_prefix": "ninja://media/cast:cast_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "cc_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "cc_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "cc_unittests", + "test_id_prefix": "ninja://cc:cc_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "ci_only": true, + "description": "Run with android_36_google_apis_x64", + "experiment_percentage": 100, + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "chrome_public_apk_profile_tests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "chrome_public_apk_profile_tests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "chrome_public_apk_baseline_profile_generator", + "test_id_prefix": "ninja://chrome/test/android:chrome_public_apk_baseline_profile_generator/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "chrome_public_smoke_test" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "chrome_public_smoke_test", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "chrome_public_smoke_test", + "test_id_prefix": "ninja://chrome/android:chrome_public_smoke_test/" + }, + { + "args": [ + "--git-revision=${got_revision}", + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "chrome_public_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "chrome_public_test_apk", + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 20 + }, + "test": "chrome_public_test_apk", + "test_id_prefix": "ninja://chrome/android:chrome_public_test_apk/" + }, + { + "args": [ + "--git-revision=${got_revision}", + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "chrome_public_unit_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "chrome_public_unit_test_apk", + "precommit_args": [ + "--gerrit-issue=${patch_issue}", + "--gerrit-patchset=${patch_set}", + "--buildbucket-id=${buildbucket_build_id}" + ], + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 4 + }, + "test": "chrome_public_unit_test_apk", + "test_id_prefix": "ninja://chrome/android:chrome_public_unit_test_apk/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "components_browsertests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "components_browsertests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "components_browsertests", + "test_id_prefix": "ninja://components:components_browsertests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "components_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "components_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 6 + }, + "test": "components_unittests", + "test_id_prefix": "ninja://components:components_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_16.content_browsertests.filter", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "content_browsertests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "content_browsertests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 30 + }, + "test": "content_browsertests", + "test_id_prefix": "ninja://content/test:content_browsertests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_14_15_16.content_shell_test_apk.filter", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "content_shell_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "content_shell_test_apk", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 3 + }, + "test": "content_shell_test_apk", + "test_id_prefix": "ninja://content/shell/android:content_shell_test_apk/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_15_16.content_unittests.filter", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "content_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "content_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 3 + }, + "test": "content_unittests", + "test_id_prefix": "ninja://content/test:content_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "crashpad_tests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "crashpad_tests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "crashpad_tests", + "test_id_prefix": "ninja://third_party/crashpad/crashpad:crashpad_tests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "crypto_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "crypto_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "crypto_unittests", + "test_id_prefix": "ninja://crypto:crypto_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "device_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "device_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "device_unittests", + "test_id_prefix": "ninja://device:device_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "display_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "display_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "display_unittests", + "test_id_prefix": "ninja://ui/display:display_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "ci_only": true, + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "env_chromium_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "env_chromium_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "env_chromium_unittests", + "test_id_prefix": "ninja://third_party/leveldatabase:env_chromium_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "events_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "events_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "events_unittests", + "test_id_prefix": "ninja://ui/events:events_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "fuzzing_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "fuzzing_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "fuzzing_unittests", + "test_id_prefix": "ninja://testing/libfuzzer/tests:fuzzing_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "gcm_unit_tests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "gcm_unit_tests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "gcm_unit_tests", + "test_id_prefix": "ninja://google_apis/gcm:gcm_unit_tests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "gfx_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "gfx_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "gfx_unittests", + "test_id_prefix": "ninja://ui/gfx:gfx_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "gin_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "gin_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "gin_unittests", + "test_id_prefix": "ninja://gin:gin_unittests/" + }, + { + "args": [ + "--use-cmd-decoder=validating", + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_12_12l_13.gl_tests.filter", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "gl_tests_validating" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "gl_tests_validating", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "gl_tests", + "test_id_prefix": "ninja://gpu:gl_tests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "gl_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "gl_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "gl_unittests", + "test_id_prefix": "ninja://ui/gl:gl_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "google_apis_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "google_apis_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "google_apis_unittests", + "test_id_prefix": "ninja://google_apis:google_apis_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "gpu_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "gpu_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "gpu_unittests", + "test_id_prefix": "ninja://gpu:gpu_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_15_16.gwp_asan_unittests.filter", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "gwp_asan_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "gwp_asan_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "gwp_asan_unittests", + "test_id_prefix": "ninja://components/gwp_asan:gwp_asan_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "ipc_tests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "ipc_tests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "ipc_tests", + "test_id_prefix": "ninja://ipc:ipc_tests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "jni_zero_sample_apk_test" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "jni_zero_sample_apk_test", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "jni_zero_sample_apk_test", + "test_id_prefix": "ninja://third_party/jni_zero/sample:jni_zero_sample_apk_test/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "latency_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "latency_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "latency_unittests", + "test_id_prefix": "ninja://ui/latency:latency_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "ci_only": true, + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "leveldb_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "leveldb_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "leveldb_unittests", + "test_id_prefix": "ninja://third_party/leveldatabase:leveldb_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "libjingle_xmpp_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "libjingle_xmpp_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "libjingle_xmpp_unittests", + "test_id_prefix": "ninja://third_party/libjingle_xmpp:libjingle_xmpp_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "liburlpattern_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "liburlpattern_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "liburlpattern_unittests", + "test_id_prefix": "ninja://third_party/liburlpattern:liburlpattern_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator.media_unittests.filter", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "media_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "media_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "media_unittests", + "test_id_prefix": "ninja://media:media_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "midi_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "midi_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "midi_unittests", + "test_id_prefix": "ninja://media/midi:midi_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "minidump_uploader_test" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "minidump_uploader_test", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "minidump_uploader_test", + "test_id_prefix": "ninja://components/minidump_uploader:minidump_uploader_test/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "mojo_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "mojo_test_apk", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "mojo_test_apk", + "test_id_prefix": "ninja://mojo/public/java/system:mojo_test_apk/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "mojo_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "mojo_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "mojo_unittests", + "test_id_prefix": "ninja://mojo:mojo_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "net_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "net_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 3 + }, + "test": "net_unittests", + "test_id_prefix": "ninja://net:net_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gtest_filter=-ScopedDirTest.CloseOutOfScope", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "perfetto_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "perfetto_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "perfetto_unittests", + "test_id_prefix": "ninja://third_party/perfetto:perfetto_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "sandbox_linux_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "sandbox_linux_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "sandbox_linux_unittests", + "test_id_prefix": "ninja://sandbox/linux:sandbox_linux_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "services_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "services_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "services_unittests", + "test_id_prefix": "ninja://services:services_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "shell_dialogs_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "shell_dialogs_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "shell_dialogs_unittests", + "test_id_prefix": "ninja://ui/shell_dialogs:shell_dialogs_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "skia_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "skia_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "skia_unittests", + "test_id_prefix": "ninja://skia:skia_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "sql_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "sql_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "sql_unittests", + "test_id_prefix": "ninja://sql:sql_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "storage_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "storage_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "storage_unittests", + "test_id_prefix": "ninja://storage:storage_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "system_webview_shell_layout_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "system_webview_shell_layout_test_apk", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "system_webview_shell_layout_test_apk", + "test_id_prefix": "ninja://android_webview/tools/system_webview_shell:system_webview_shell_layout_test_apk/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "trichrome_chrome_bundle_smoke_test" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "trichrome_chrome_bundle_smoke_test", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "trichrome_chrome_bundle_smoke_test", + "test_id_prefix": "ninja://chrome/android:trichrome_chrome_bundle_smoke_test/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "ui_android_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "ui_android_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "ui_android_unittests", + "test_id_prefix": "ninja://ui/android:ui_android_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "ui_base_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "ui_base_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "ui_base_unittests", + "test_id_prefix": "ninja://ui/base:ui_base_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "ui_touch_selection_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "ui_touch_selection_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "ui_touch_selection_unittests", + "test_id_prefix": "ninja://ui/touch_selection:ui_touch_selection_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_14_15_16.unit_tests.filter", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "unit_tests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "unit_tests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 2 + }, + "test": "unit_tests", + "test_id_prefix": "ninja://chrome/test:unit_tests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "url_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "url_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "url_unittests", + "test_id_prefix": "ninja://url:url_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "video_encode_accelerator_tests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "video_encode_accelerator_tests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "video_encode_accelerator_tests", + "test_id_prefix": "ninja://media/gpu/test:video_encode_accelerator_tests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "viz_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "viz_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "viz_unittests", + "test_id_prefix": "ninja://components/viz:viz_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "webkit_unit_tests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "webkit_unit_tests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 6 + }, + "test": "blink_unittests", + "test_id_prefix": "ninja://third_party/blink/renderer/controller:blink_unittests/" + }, + { + "args": [ + "--webview-process-mode=multiple", + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "webview_instrumentation_test_apk_multiple_process_mode" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "webview_instrumentation_test_apk_multiple_process_mode", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", + "shards": 12 + }, + "test": "webview_instrumentation_test_apk", + "test_id_prefix": "ninja://android_webview/test:webview_instrumentation_test_apk/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "webview_ui_test_app_test_apk" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "webview_ui_test_app_test_apk", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "webview_ui_test_app_test_apk", + "test_id_prefix": "ninja://android_webview/tools/automated_ui_tests:webview_ui_test_app_test_apk/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "wtf_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "wtf_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "wtf_unittests", + "test_id_prefix": "ninja://third_party/blink/renderer/platform/wtf:wtf_unittests/" + }, + { + "args": [ + "--avd-config=../../tools/android/avd/proto/android_36_google_apis_x64.textpb", + "--gs-results-bucket=chromium-result-details", + "--recover-devices" + ], + "description": "Run with android_36_google_apis_x64", + "merge": { + "args": [ + "--bucket", + "chromium-result-details", + "--test-name", + "zlib_unittests" + ], + "script": "//build/android/pylib/results/presentation/test_results_presentation.py" + }, + "name": "zlib_unittests", + "resultdb": { + "enable": true, + "has_native_resultdb_integration": true + }, + "swarming": { + "dimensions": { + "cores": "8", + "cpu": "x86-64", + "device_os": null, + "device_type": null, + "os": "Ubuntu-22.04", + "pool": "chromium.tests.avd" + }, + "named_caches": [ + { + "name": "android_36_google_apis_x64", + "path": ".android_emulator/android_36_google_apis_x64" + } + ], + "optional_dimensions": { + "60": { + "caches": "android_36_google_apis_x64" + } + }, + "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" + }, + "test": "zlib_unittests", + "test_id_prefix": "ninja://third_party/zlib:zlib_unittests/" + } + ] + } +} \ No newline at end of file
diff --git a/infra/config/generated/builders/try/mac-builder-next/targets/chromium.fyi.json b/infra/config/generated/builders/try/mac-builder-next/targets/chromium.fyi.json index 31d3fb2..4bfb18e 100644 --- a/infra/config/generated/builders/try/mac-builder-next/targets/chromium.fyi.json +++ b/infra/config/generated/builders/try/mac-builder-next/targets/chromium.fyi.json
@@ -12,7 +12,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -27,7 +27,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -42,7 +42,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -58,7 +58,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -73,7 +73,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -88,7 +88,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -103,7 +103,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -118,7 +118,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -141,7 +141,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -156,7 +156,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -171,7 +171,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -186,7 +186,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 25 @@ -205,7 +205,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -220,7 +220,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -235,7 +235,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -250,7 +250,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -265,7 +265,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -280,7 +280,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -295,7 +295,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 @@ -311,7 +311,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 8 @@ -327,7 +327,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -343,7 +343,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -358,7 +358,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -373,7 +373,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -388,7 +388,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -403,7 +403,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -418,7 +418,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -434,7 +434,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -449,7 +449,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -464,7 +464,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -479,7 +479,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -494,7 +494,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -509,7 +509,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -524,7 +524,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -539,7 +539,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -554,7 +554,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -569,7 +569,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -584,7 +584,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -599,7 +599,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -614,7 +614,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -629,7 +629,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -644,7 +644,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 7 @@ -660,7 +660,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -675,7 +675,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -691,7 +691,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -706,7 +706,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -721,7 +721,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -736,7 +736,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -751,7 +751,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -766,7 +766,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -781,7 +781,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -796,7 +796,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -811,7 +811,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -826,7 +826,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -841,7 +841,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -856,7 +856,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -871,7 +871,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -886,7 +886,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -901,7 +901,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -916,7 +916,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -931,7 +931,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -946,7 +946,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -961,7 +961,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -976,7 +976,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -991,7 +991,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -1006,7 +1006,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -1021,7 +1021,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", "shards": 3 @@ -1037,7 +1037,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -1052,7 +1052,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -1067,7 +1067,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -1082,7 +1082,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -1097,7 +1097,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -1112,7 +1112,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -1127,7 +1127,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -1142,7 +1142,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -1157,7 +1157,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -1172,7 +1172,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -1187,7 +1187,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -1202,7 +1202,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -1225,7 +1225,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -1246,7 +1246,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -1261,7 +1261,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -1282,7 +1282,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -1301,7 +1301,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -1320,7 +1320,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -1338,7 +1338,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -1353,7 +1353,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -1371,7 +1371,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" }, @@ -1389,7 +1389,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "idempotent": false, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" @@ -1411,7 +1411,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "idempotent": false, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -1435,7 +1435,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "idempotent": false, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com", @@ -1458,7 +1458,7 @@ "swarming": { "dimensions": { "cpu": "arm64", - "os": "Mac-15.5" + "os": "Mac-26" }, "service_account": "chromium-tester@chops-service-accounts.iam.gserviceaccount.com" },
diff --git a/infra/config/generated/health-specs/health-specs.json b/infra/config/generated/health-specs/health-specs.json index 3894ca36..42ed2087 100644 --- a/infra/config/generated/health-specs/health-specs.json +++ b/infra/config/generated/health-specs/health-specs.json
@@ -6657,6 +6657,27 @@ } ] }, + "android-16-x64-rel": { + "contact_team_email": "clank-engprod@google.com", + "problem_specs": [ + { + "name": "Unhealthy", + "period_days": 7, + "score": 5, + "thresholds": { + "_default": "_default" + } + }, + { + "name": "Low Value", + "period_days": 90, + "score": 1, + "thresholds": { + "_default": "_default" + } + } + ] + }, "android-androidx-packager": { "contact_team_email": "clank-build@google.com", "problem_specs": [
diff --git a/infra/config/generated/luci/commit-queue.cfg b/infra/config/generated/luci/commit-queue.cfg index 92587132..4d378662 100644 --- a/infra/config/generated/luci/commit-queue.cfg +++ b/infra/config/generated/luci/commit-queue.cfg
@@ -922,6 +922,11 @@ disable_reuse_footers: "Include-Ci-Only-Tests" } builders { + name: "chromium/try/android-16-x64-rel" + includable_only: true + disable_reuse_footers: "Include-Ci-Only-Tests" + } + builders { name: "chromium/try/android-angle-chromium-try" includable_only: true disable_reuse_footers: "Include-Ci-Only-Tests"
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg index 3350fba..138f94f 100644 --- a/infra/config/generated/luci/cr-buildbucket.cfg +++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -22778,7 +22778,7 @@ swarming_host: "chromium-swarm.appspot.com" dimensions: "builder:Mac Builder Next" dimensions: "cpu:arm64" - dimensions: "os:Mac-15" + dimensions: "os:Mac-15|Mac-26" dimensions: "pool:luci.chromium.ci" exe { cipd_package: "infra/chromium/bootstrapper/${platform}" @@ -37522,6 +37522,117 @@ } } builders { + name: "android-16-x64-rel" + swarming_host: "chromium-swarm.appspot.com" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "free_space:standard" + dimensions: "os:Ubuntu-22.04" + dimensions: "pool:luci.chromium.ci" + dimensions: "ssd:0" + exe { + cipd_package: "infra/chromium/bootstrapper/${platform}" + cipd_version: "latest" + cmd: "bootstrapper" + } + properties: + '{' + ' "$bootstrap/exe": {' + ' "exe": {' + ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",' + ' "cipd_version": "refs/heads/main",' + ' "cmd": [' + ' "luciexe"' + ' ]' + ' }' + ' },' + ' "$bootstrap/properties": {' + ' "properties_file": "infra/config/generated/builders/ci/android-16-x64-rel/properties.json",' + ' "shadow_properties_file": "infra/config/generated/builders/ci/android-16-x64-rel/shadow-properties.json",' + ' "top_level_project": {' + ' "ref": "refs/heads/main",' + ' "repo": {' + ' "host": "chromium.googlesource.com",' + ' "project": "chromium/src"' + ' }' + ' }' + ' },' + ' "builder_group": "chromium.android",' + ' "led_builder_is_bootstrapped": true,' + ' "recipe": "chromium"' + '}' + execution_timeout_secs: 14400 + build_numbers: YES + service_account: "chromium-ci-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "chromium.use_per_builder_build_dir_name" + value: 100 + } + experiments { + key: "luci.recipes.use_python3" + value: 100 + } + resultdb { + enable: true + bq_exports { + project: "chrome-luci-data" + dataset: "chromium" + table: "ci_test_results" + test_results {} + } + bq_exports { + project: "chrome-luci-data" + dataset: "chromium" + table: "gpu_ci_test_results" + test_results { + predicate { + test_id_regexp: "ninja://(chrome|content)/test:telemetry_gpu_integration_test[^/]*/.+" + } + } + } + bq_exports { + project: "chrome-luci-data" + dataset: "chromium" + table: "blink_web_tests_ci_test_results" + test_results { + predicate { + test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*_wpt_tests/.+)|(ninja://[^/]*headless_shell_wpt/.+)" + } + } + } + history_options { + use_invocation_timestamp: true + } + } + description_html: "Run chromium tests on Android 16 emulators.<br/>This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-16-x64-rel\">android-16-x64-rel</a></li></ul><br/>Builder owner: <a href=mailto:clank-engprod@google.com>clank-engprod@google.com</a>" + shadow_builder_adjustments { + service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" + pool: "luci.chromium.try" + dimensions: "free_space:" + dimensions: "pool:luci.chromium.try" + } + contact_team_email: "clank-engprod@google.com" + custom_metric_definitions { + name: "/chrome/infra/browser/builds/cached_count" + predicates: "has(build.output.properties.is_cached)" + predicates: "string(build.output.properties.is_cached) == \"true\"" + } + custom_metric_definitions { + name: "/chrome/infra/browser/builds/ran_tests_retry_shard_count" + predicates: "has(build.output.properties.ran_tests_retry_shard)" + } + custom_metric_definitions { + name: "/chrome/infra/browser/builds/ran_tests_without_patch_count" + predicates: "has(build.output.properties.ran_tests_without_patch)" + } + custom_metric_definitions { + name: "/chrome/infra/browser/builds/uncached_count" + predicates: "has(build.output.properties.is_cached)" + predicates: "string(build.output.properties.is_cached) == \"false\"" + } + } + builders { name: "android-androidx-packager" swarming_host: "chromium-swarm.appspot.com" dimensions: "builderless:1" @@ -50747,7 +50858,7 @@ swarming_host: "chromium-swarm.appspot.com" dimensions: "builder:ios18-beta-simulator" dimensions: "cpu:arm64" - dimensions: "os:Mac-15" + dimensions: "os:Mac-15|Mac-26" dimensions: "pool:luci.chromium.ci" exe { cipd_package: "infra/chromium/bootstrapper/${platform}" @@ -50860,7 +50971,7 @@ swarming_host: "chromium-swarm.appspot.com" dimensions: "builder:ios18-sdk-device" dimensions: "cpu:arm64" - dimensions: "os:Mac-15" + dimensions: "os:Mac-15|Mac-26" dimensions: "pool:luci.chromium.ci" exe { cipd_package: "infra/chromium/bootstrapper/${platform}" @@ -50974,7 +51085,7 @@ swarming_host: "chromium-swarm.appspot.com" dimensions: "builder:ios18-sdk-simulator" dimensions: "cpu:arm64" - dimensions: "os:Mac-15" + dimensions: "os:Mac-15|Mac-26" dimensions: "pool:luci.chromium.ci" exe { cipd_package: "infra/chromium/bootstrapper/${platform}" @@ -51087,7 +51198,7 @@ swarming_host: "chromium-swarm.appspot.com" dimensions: "builder:ios26-beta-simulator" dimensions: "cpu:arm64" - dimensions: "os:Mac-15" + dimensions: "os:Mac-15|Mac-26" dimensions: "pool:luci.chromium.ci" exe { cipd_package: "infra/chromium/bootstrapper/${platform}" @@ -51200,7 +51311,7 @@ swarming_host: "chromium-swarm.appspot.com" dimensions: "builder:ios26-sdk-simulator" dimensions: "cpu:arm64" - dimensions: "os:Mac-15" + dimensions: "os:Mac-15|Mac-26" dimensions: "pool:luci.chromium.ci" exe { cipd_package: "infra/chromium/bootstrapper/${platform}" @@ -61716,7 +61827,7 @@ swarming_host: "chromium-swarm.appspot.com" dimensions: "builder:mac-osxbeta-rel" dimensions: "cpu:arm64" - dimensions: "os:Mac-15" + dimensions: "os:Mac-15|Mac-26" dimensions: "pool:luci.chromium.ci" exe { cipd_package: "infra/chromium/bootstrapper/${platform}" @@ -78059,6 +78170,118 @@ } } builders { + name: "android-16-x64-rel" + swarming_host: "chromium-swarm.appspot.com" + dimensions: "builderless:1" + dimensions: "cores:8" + dimensions: "cpu:x86-64" + dimensions: "free_space:standard" + dimensions: "os:Ubuntu-22.04" + dimensions: "pool:luci.chromium.try" + dimensions: "ssd:0" + exe { + cipd_package: "infra/chromium/bootstrapper/${platform}" + cipd_version: "latest" + cmd: "bootstrapper" + } + properties: + '{' + ' "$bootstrap/exe": {' + ' "exe": {' + ' "cipd_package": "infra/recipe_bundles/chromium.googlesource.com/chromium/tools/build",' + ' "cipd_version": "refs/heads/main",' + ' "cmd": [' + ' "luciexe"' + ' ]' + ' }' + ' },' + ' "$bootstrap/properties": {' + ' "properties_file": "infra/config/generated/builders/try/android-16-x64-rel/properties.json",' + ' "top_level_project": {' + ' "ref": "refs/heads/main",' + ' "repo": {' + ' "host": "chromium.googlesource.com",' + ' "project": "chromium/src"' + ' }' + ' }' + ' },' + ' "builder_group": "tryserver.chromium.android",' + ' "led_builder_is_bootstrapped": true,' + ' "recipe": "chromium_trybot"' + '}' + execution_timeout_secs: 14400 + expiration_secs: 7200 + grace_period { + seconds: 120 + } + build_numbers: YES + service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" + experiments { + key: "chromium.use_per_builder_build_dir_name" + value: 100 + } + experiments { + key: "luci.buildbucket.canary_software" + value: 5 + } + experiments { + key: "luci.recipes.use_python3" + value: 100 + } + resultdb { + enable: true + bq_exports { + project: "chrome-luci-data" + dataset: "chromium" + table: "try_test_results" + test_results {} + } + bq_exports { + project: "chrome-luci-data" + dataset: "chromium" + table: "gpu_try_test_results" + test_results { + predicate { + test_id_regexp: "ninja://(chrome|content)/test:telemetry_gpu_integration_test[^/]*/.+" + } + } + } + bq_exports { + project: "chrome-luci-data" + dataset: "chromium" + table: "blink_web_tests_try_test_results" + test_results { + predicate { + test_id_regexp: "(ninja://[^/]*blink_web_tests/.+)|(ninja://[^/]*_wpt_tests/.+)|(ninja://[^/]*headless_shell_wpt/.+)" + } + } + } + history_options { + use_invocation_timestamp: true + } + } + description_html: "Run Chromium tests on Android 16 emulator.<br/>This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-16-x64-rel\">android-16-x64-rel</a></li></ul><br/>Builder owner: <a href=mailto:clank-engprod@google.com>clank-engprod@google.com</a>" + contact_team_email: "clank-engprod@google.com" + custom_metric_definitions { + name: "/chrome/infra/browser/builds/cached_count" + predicates: "has(build.output.properties.is_cached)" + predicates: "string(build.output.properties.is_cached) == \"true\"" + } + custom_metric_definitions { + name: "/chrome/infra/browser/builds/ran_tests_retry_shard_count" + predicates: "has(build.output.properties.ran_tests_retry_shard)" + } + custom_metric_definitions { + name: "/chrome/infra/browser/builds/ran_tests_without_patch_count" + predicates: "has(build.output.properties.ran_tests_without_patch)" + } + custom_metric_definitions { + name: "/chrome/infra/browser/builds/uncached_count" + predicates: "has(build.output.properties.is_cached)" + predicates: "string(build.output.properties.is_cached) == \"false\"" + } + } + builders { name: "android-angle-chromium-try" swarming_host: "chromium-swarm.appspot.com" dimensions: "builder:android-angle-chromium-try" @@ -114992,7 +115215,7 @@ swarming_host: "chromium-swarm.appspot.com" dimensions: "builder:mac-builder-next" dimensions: "cpu:arm64" - dimensions: "os:Mac-15" + dimensions: "os:Mac-15|Mac-26" dimensions: "pool:luci.chromium.try" dimensions: "ssd:1" exe { @@ -116315,7 +116538,7 @@ swarming_host: "chromium-swarm.appspot.com" dimensions: "builder:mac-osxbeta-rel" dimensions: "cpu:arm64" - dimensions: "os:Mac-15" + dimensions: "os:Mac-15|Mac-26" dimensions: "pool:luci.chromium.try" dimensions: "ssd:1" exe {
diff --git a/infra/config/generated/luci/luci-milo.cfg b/infra/config/generated/luci/luci-milo.cfg index 396045ae..71120ef 100644 --- a/infra/config/generated/luci/luci-milo.cfg +++ b/infra/config/generated/luci/luci-milo.cfg
@@ -8894,6 +8894,11 @@ short_name: "and64rel" } builders { + name: "buildbucket/luci.chromium.ci/android-16-x64-rel" + category: "emulator|x64|rel" + short_name: "16" + } + builders { name: "buildbucket/luci.chromium.ci/android-14-arm64-rel" category: "on_cq" short_name: "14" @@ -26165,6 +26170,9 @@ name: "buildbucket/luci.chromium.try/android-16-x64-fyi-rel" } builders { + name: "buildbucket/luci.chromium.try/android-16-x64-rel" + } + builders { name: "buildbucket/luci.chromium.try/android-angle-chromium-try" } builders { @@ -27700,6 +27708,9 @@ name: "buildbucket/luci.chromium.try/android-16-x64-fyi-rel" } builders { + name: "buildbucket/luci.chromium.try/android-16-x64-rel" + } + builders { name: "buildbucket/luci.chromium.try/android-arm-compile-dbg" } builders {
diff --git a/infra/config/generated/luci/luci-scheduler.cfg b/infra/config/generated/luci/luci-scheduler.cfg index 034b855..8d35b6f 100644 --- a/infra/config/generated/luci/luci-scheduler.cfg +++ b/infra/config/generated/luci/luci-scheduler.cfg
@@ -3145,6 +3145,15 @@ } } job { + id: "android-16-x64-rel" + realm: "ci" + buildbucket { + server: "cr-buildbucket.appspot.com" + bucket: "ci" + builder: "android-16-x64-rel" + } +} +job { id: "android-androidx-packager" realm: "ci" schedule: "0 7,14,22 * * * *" @@ -6395,6 +6404,7 @@ triggers: "android-15-x64-fyi-rel" triggers: "android-15-x64-rel" triggers: "android-16-x64-fyi-rel" + triggers: "android-16-x64-rel" triggers: "android-angle-chromium-arm64-builder" triggers: "android-annotator-rel" triggers: "android-archive-rel"
diff --git a/infra/config/lib/builders.star b/infra/config/lib/builders.star index 8c33feb5..099ed23 100644 --- a/infra/config/lib/builders.star +++ b/infra/config/lib/builders.star
@@ -88,7 +88,7 @@ MAC_14 = os_enum(os_category.MAC, "Mac-14"), MAC_DEFAULT = os_enum(os_category.MAC, "Mac-15"), MAC_ANY = os_enum(os_category.MAC, "Mac"), - MAC_BETA = os_enum(os_category.MAC, "Mac-15"), + MAC_BETA = os_enum(os_category.MAC, "Mac-15|Mac-26"), WINDOWS_10 = os_enum(os_category.WINDOWS, "Windows-10"), # TODO(crbug.com/41492657): remove after slow compile issue resolved. WINDOWS_10_1909 = os_enum(os_category.WINDOWS, "Windows-10-18363"),
diff --git a/infra/config/subprojects/chromium/ci/chromium.android.fyi.star b/infra/config/subprojects/chromium/ci/chromium.android.fyi.star index b55e283..2a52883 100644 --- a/infra/config/subprojects/chromium/ci/chromium.android.fyi.star +++ b/infra/config/subprojects/chromium/ci/chromium.android.fyi.star
@@ -1271,60 +1271,6 @@ "x86-64", ], per_test_modifications = { - "base_unittests": targets.mixin( - args = [ - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_14_15_16.base_unittests.filter", - ], - ), - "content_browsertests": targets.mixin( - args = [ - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_16.content_browsertests.filter", - ], - swarming = targets.swarming( - shards = 30, - ), - ), - "content_shell_test_apk": targets.mixin( - args = [ - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_14_15_16.content_shell_test_apk.filter", - ], - ), - "content_unittests": targets.mixin( - args = [ - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_15_16.content_unittests.filter", - ], - ), - "gl_tests_validating": targets.mixin( - args = [ - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_12_12l_13.gl_tests.filter", - ], - ), - "gwp_asan_unittests": targets.mixin( - args = [ - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_15_16.gwp_asan_unittests.filter", - ], - ), - "media_unittests": targets.mixin( - args = [ - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator.media_unittests.filter", - ], - ), - "perfetto_unittests": targets.mixin( - args = [ - # TODO(crbug.com/40201873): Fix the failed test - "--gtest_filter=-ScopedDirTest.CloseOutOfScope", - ], - ), - "unit_tests": targets.mixin( - args = [ - "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_14_15_16.unit_tests.filter", - ], - ), - "webview_instrumentation_test_apk_multiple_process_mode": targets.mixin( - swarming = targets.swarming( - shards = 12, - ), - ), }, ), targets_settings = targets.settings(
diff --git a/infra/config/subprojects/chromium/ci/chromium.android.star b/infra/config/subprojects/chromium/ci/chromium.android.star index c068b67..5a7c6887 100644 --- a/infra/config/subprojects/chromium/ci/chromium.android.star +++ b/infra/config/subprojects/chromium/ci/chromium.android.star
@@ -4456,6 +4456,128 @@ ) ci.builder( + name = "android-16-x64-rel", + # TODO(crbug.com/424231911): Enable when green. + # branch_selector = branches.selector.ANDROID_BRANCHES, + description_html = "Run chromium tests on Android 16 emulators.", + builder_spec = builder_config.builder_spec( + gclient_config = builder_config.gclient_config( + config = "chromium", + apply_configs = [ + "android", + ], + ), + chromium_config = builder_config.chromium_config( + config = "main_builder", + apply_configs = [ + "mb", + ], + build_config = builder_config.build_config.RELEASE, + target_arch = builder_config.target_arch.INTEL, + target_bits = 64, + target_platform = builder_config.target_platform.ANDROID, + ), + android_config = builder_config.android_config( + config = "base_config", + ), + build_gs_bucket = "chromium-android-archive", + ), + gn_args = gn_args.config( + configs = [ + "android_builder", + "release_builder", + "remoteexec", + "minimal_symbols", + "x64", + "strip_debug_info", + "android_fastbuild", + "webview_trichrome", + "webview_shell", + ], + ), + targets = targets.bundle( + targets = [ + "android_16_emulator_gtests", + ], + mixins = [ + "16-x64-emulator", + "emulator-8-cores", + "has_native_resultdb_integration", + "linux-jammy", + "x86-64", + ], + per_test_modifications = { + "base_unittests": targets.mixin( + args = [ + "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_14_15_16.base_unittests.filter", + ], + ), + "content_browsertests": targets.mixin( + args = [ + "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_16.content_browsertests.filter", + ], + swarming = targets.swarming( + shards = 30, + ), + ), + "content_shell_test_apk": targets.mixin( + args = [ + "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_14_15_16.content_shell_test_apk.filter", + ], + ), + "content_unittests": targets.mixin( + args = [ + "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_15_16.content_unittests.filter", + ], + ), + "gl_tests_validating": targets.mixin( + args = [ + "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_12_12l_13.gl_tests.filter", + ], + ), + "gwp_asan_unittests": targets.mixin( + args = [ + "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_15_16.gwp_asan_unittests.filter", + ], + ), + "media_unittests": targets.mixin( + args = [ + "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator.media_unittests.filter", + ], + ), + "perfetto_unittests": targets.mixin( + args = [ + # TODO(crbug.com/40201873): Fix the failed test + "--gtest_filter=-ScopedDirTest.CloseOutOfScope", + ], + ), + "unit_tests": targets.mixin( + args = [ + "--test-launcher-filter-file=../../testing/buildbot/filters/android.emulator_14_15_16.unit_tests.filter", + ], + ), + "webview_instrumentation_test_apk_multiple_process_mode": targets.mixin( + swarming = targets.swarming( + shards = 12, + ), + ), + }, + ), + targets_settings = targets.settings( + os_type = targets.os_type.ANDROID, + ), + gardener_rotations = args.ignore_default(None), + # TODO(crbug.com/424231911): Enable when green. + tree_closing = False, + console_view_entry = consoles.console_view_entry( + category = "emulator|x64|rel", + short_name = "16", + ), + contact_team_email = "clank-engprod@google.com", + execution_timeout = 4 * time.hour, +) + +ci.builder( name = "android-webview-13-x64-hostside-rel", branch_selector = branches.selector.ANDROID_BRANCHES, description_html = (
diff --git a/infra/config/subprojects/chromium/ci/chromium.fyi.star b/infra/config/subprojects/chromium/ci/chromium.fyi.star index c0183b0..a9e9a3a 100644 --- a/infra/config/subprojects/chromium/ci/chromium.fyi.star +++ b/infra/config/subprojects/chromium/ci/chromium.fyi.star
@@ -2050,7 +2050,7 @@ "all", ], mixins = [ - "mac_beta_arm64", + "mac_26_arm64", ], per_test_modifications = { "browser_tests": targets.mixin(
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.android.star b/infra/config/subprojects/chromium/try/tryserver.chromium.android.star index a8d35ab..f356731 100644 --- a/infra/config/subprojects/chromium/try/tryserver.chromium.android.star +++ b/infra/config/subprojects/chromium/try/tryserver.chromium.android.star
@@ -372,6 +372,24 @@ ) try_.builder( + name = "android-16-x64-rel", + # TODO(crbug.com/424231911): Enable when green. + # branch_selector = branches.selector.ANDROID_BRANCHES, + description_html = "Run Chromium tests on Android 16 emulator.", + mirrors = [ + "ci/android-16-x64-rel", + ], + gn_args = gn_args.config( + configs = [ + "ci/android-16-x64-rel", + "release_try_builder", + ], + ), + contact_team_email = "clank-engprod@google.com", + siso_remote_jobs = siso.remote_jobs.LOW_JOBS_FOR_CQ, +) + +try_.builder( name = "android-16-x64-fyi-rel", mirrors = [ "ci/android-16-x64-fyi-rel",
diff --git a/infra/config/targets/bundles.star b/infra/config/targets/bundles.star index 36f3b7f3..332eb68 100644 --- a/infra/config/targets/bundles.star +++ b/infra/config/targets/bundles.star
@@ -291,19 +291,6 @@ targets.bundle( name = "android_16_emulator_fyi_gtests", targets = [ - "android_specific_chromium_gtests", # Already includes gl_gtests. - "chromium_gtests", - "android_emulator_specific_chrome_public_tests", - "android_trichrome_smoke_tests", - "android_smoke_tests", - "chrome_profile_generator_tests", - "chromium_gtests_for_devices_with_graphical_output", - "fieldtrial_android_tests", - "jni_zero_sample_apk_test", - "minidump_uploader_test", - "linux_flavor_specific_chromium_gtests", - "system_webview_shell_instrumentation_tests", # Not an experimental test - "webview_ui_instrumentation_tests", targets.bundle( targets = "webview_trichrome_64_cts_tests_suite", variants = [ @@ -316,6 +303,25 @@ ) targets.bundle( + name = "android_16_emulator_gtests", + targets = [ + "android_specific_chromium_gtests", # Already includes gl_gtests. + "chrome_profile_generator_tests", + "chromium_gtests", + "android_emulator_specific_chrome_public_tests", + "android_trichrome_smoke_tests", + "android_smoke_tests", + "chromium_gtests_for_devices_with_graphical_output", + "fieldtrial_android_tests", + "jni_zero_sample_apk_test", + "linux_flavor_specific_chromium_gtests", + "minidump_uploader_test", + "system_webview_shell_instrumentation_tests", # Not an experimental test + "webview_ui_instrumentation_tests", + ], +) + +targets.bundle( name = "android_ar_gtests", targets = [ "monochrome_public_test_ar_apk",
diff --git a/infra/config/targets/mixins.star b/infra/config/targets/mixins.star index 9fc27ef..2e6835f 100644 --- a/infra/config/targets/mixins.star +++ b/infra/config/targets/mixins.star
@@ -1693,6 +1693,17 @@ ) targets.mixin( + name = "mac_26_arm64", + generate_pyl_entry = False, + swarming = targets.swarming( + dimensions = { + "cpu": "arm64", + "os": "Mac-26", + }, + ), +) + +targets.mixin( name = "mac_15_x64", # All references have been moved to starlark generate_pyl_entry = False,
diff --git a/infra/scripts/sizes.py b/infra/scripts/sizes.py index 83bd8a28..b56029f 100755 --- a/infra/scripts/sizes.py +++ b/infra/scripts/sizes.py
@@ -56,17 +56,16 @@ def get_linux_stripped_size(filename): - EU_STRIP_NAME = 'eu-strip' # Assumes |filename| is in out/Release - # build/linux/bin/eu-strip' src_dir = os.path.dirname(os.path.dirname(os.path.dirname(filename))) - eu_strip_path = os.path.join(src_dir, 'build', 'linux', 'bin', EU_STRIP_NAME) - if (platform.architecture()[0] == '64bit' or - not os.path.exists(eu_strip_path)): - eu_strip_path = EU_STRIP_NAME + llvm_strip_path = os.path.join(src_dir, 'third_party', 'llvm-build', + 'Release+Asserts', 'bin', 'llvm-strip') with tempfile.NamedTemporaryFile() as stripped_file: - strip_cmd = [eu_strip_path, '-o', stripped_file.name, filename] + strip_cmd = [ + llvm_strip_path, '--strip-unneeded', '--strip-debug', '-o', + stripped_file.name, filename + ] result = 0 result, _ = run_process(result, strip_cmd) if result != 0:
diff --git a/internal b/internal index 1352cfb..0e4d05a 160000 --- a/internal +++ b/internal
@@ -1 +1 @@ -Subproject commit 1352cfbc23726d06daa6dc8320c8eea7da7ce099 +Subproject commit 0e4d05ade90a328d85fdf0516544ba6491b6ec35
diff --git a/ios/chrome/app/strings/ios_strings.grd b/ios/chrome/app/strings/ios_strings.grd index 1baac97..af66d2a 100644 --- a/ios/chrome/app/strings/ios_strings.grd +++ b/ios/chrome/app/strings/ios_strings.grd
@@ -3071,6 +3071,21 @@ <message name="IDS_IOS_INTENTS_URL_PARAMETER" desc="The URL the user would like to pass as input parameter to Shortcuts that require a URL as input [iOS only]."> URL </message> + <message name="IDS_IOS_INTERACTIVE_LENS_OVERLAY_PROMO_BUBBLE_TEXT" desc="The text for the IPH bubble in interactive lens overlay promo in the First Run Experience."> + Try circling or tapping the picture to search + </message> + <message name="IDS_IOS_INTERACTIVE_LENS_OVERLAY_PROMO_SKIP_BUTTON" desc="The text for the button that allows users to skip the interactive lens overlay promo in the First Run Experience."> + Skip + </message> + <message name="IDS_IOS_INTERACTIVE_LENS_OVERLAY_PROMO_START_BROWSING_BUTTON" desc="The text for the button that allows users to start browsing after the interactive lens overlay promo in the First Run Experience."> + Start browsing + </message> + <message name="IDS_IOS_INTERACTIVE_LENS_OVERLAY_PROMO_SUBTITLE" desc="The subtitle for the interactive lens overlay promo in the First Run Experience."> + You can now open Google Lens from your address bar and search anything you see + </message> + <message name="IDS_IOS_INTERACTIVE_LENS_OVERLAY_PROMO_TITLE" desc="The title for the interactive lens overlay promo in the First Run Experience."> + Search anything on your screen + </message> <message name="IDS_IOS_IPH_BUBBLE_GOT_IT" desc="Label of a button that appears in an in-product help Tip. Pressing this button will dismiss the last Tip."> Got it </message>
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTERACTIVE_LENS_OVERLAY_PROMO_BUBBLE_TEXT.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTERACTIVE_LENS_OVERLAY_PROMO_BUBBLE_TEXT.png.sha1 new file mode 100644 index 0000000..b8c57b9 --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTERACTIVE_LENS_OVERLAY_PROMO_BUBBLE_TEXT.png.sha1
@@ -0,0 +1 @@ +e9b63cb2a2417d7e5158c6faff120ca30fc10243 \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTERACTIVE_LENS_OVERLAY_PROMO_SKIP_BUTTON.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTERACTIVE_LENS_OVERLAY_PROMO_SKIP_BUTTON.png.sha1 new file mode 100644 index 0000000..b8c57b9 --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTERACTIVE_LENS_OVERLAY_PROMO_SKIP_BUTTON.png.sha1
@@ -0,0 +1 @@ +e9b63cb2a2417d7e5158c6faff120ca30fc10243 \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTERACTIVE_LENS_OVERLAY_PROMO_START_BROWSING_BUTTON.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTERACTIVE_LENS_OVERLAY_PROMO_START_BROWSING_BUTTON.png.sha1 new file mode 100644 index 0000000..aa4971f --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTERACTIVE_LENS_OVERLAY_PROMO_START_BROWSING_BUTTON.png.sha1
@@ -0,0 +1 @@ +58748e4ae4045f640754f999ad4a9c6c3645059e \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTERACTIVE_LENS_OVERLAY_PROMO_SUBTITLE.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTERACTIVE_LENS_OVERLAY_PROMO_SUBTITLE.png.sha1 new file mode 100644 index 0000000..b8c57b9 --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTERACTIVE_LENS_OVERLAY_PROMO_SUBTITLE.png.sha1
@@ -0,0 +1 @@ +e9b63cb2a2417d7e5158c6faff120ca30fc10243 \ No newline at end of file
diff --git a/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTERACTIVE_LENS_OVERLAY_PROMO_TITLE.png.sha1 b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTERACTIVE_LENS_OVERLAY_PROMO_TITLE.png.sha1 new file mode 100644 index 0000000..b8c57b9 --- /dev/null +++ b/ios/chrome/app/strings/ios_strings_grd/IDS_IOS_INTERACTIVE_LENS_OVERLAY_PROMO_TITLE.png.sha1
@@ -0,0 +1 @@ +e9b63cb2a2417d7e5158c6faff120ca30fc10243 \ No newline at end of file
diff --git a/ios/chrome/browser/autofill/ui_bundled/bottom_sheet/virtual_card_enrollment_bottom_sheet_egtest.mm b/ios/chrome/browser/autofill/ui_bundled/bottom_sheet/virtual_card_enrollment_bottom_sheet_egtest.mm index 3fa0b0f..7f4ef505 100644 --- a/ios/chrome/browser/autofill/ui_bundled/bottom_sheet/virtual_card_enrollment_bottom_sheet_egtest.mm +++ b/ios/chrome/browser/autofill/ui_bundled/bottom_sheet/virtual_card_enrollment_bottom_sheet_egtest.mm
@@ -143,6 +143,9 @@ forRequest:kGetSaveCardDetailsUrl withErrorCode:net::HTTP_OK]; + // Wait for the web view to appear. + [ChromeEarlGrey + waitForUIElementToAppearWithMatcher:chrome_test_util::WebViewMatcher()]; // Fill the form. [[EarlGrey selectElementWithMatcher:chrome_test_util::WebViewMatcher()] performAction:chrome_test_util::TapWebElementWithId(kFillFormId)];
diff --git a/ios/chrome/browser/first_run/ui_bundled/DEPS b/ios/chrome/browser/first_run/ui_bundled/DEPS index f008d5fe..9e7a03aaa 100644 --- a/ios/chrome/browser/first_run/ui_bundled/DEPS +++ b/ios/chrome/browser/first_run/ui_bundled/DEPS
@@ -26,6 +26,7 @@ "+ios/chrome/browser/settings/ui_bundled/elements", "+ios/chrome/browser/authentication/ui_bundled/continuation.h", "+ios/chrome/browser/passwords/model/features.h", + "+ios/chrome/browser/bubble/ui_bundled", ] specific_include_rules = {
diff --git a/ios/chrome/browser/first_run/ui_bundled/interactive_lens/coordinator/BUILD.gn b/ios/chrome/browser/first_run/ui_bundled/interactive_lens/coordinator/BUILD.gn index 0c18489..75b2d48 100644 --- a/ios/chrome/browser/first_run/ui_bundled/interactive_lens/coordinator/BUILD.gn +++ b/ios/chrome/browser/first_run/ui_bundled/interactive_lens/coordinator/BUILD.gn
@@ -10,6 +10,7 @@ deps = [ "//base", "//ios/chrome/browser/first_run/ui_bundled:screen_delegate", + "//ios/chrome/browser/first_run/ui_bundled/interactive_lens/ui", "//ios/chrome/browser/shared/coordinator/chrome_coordinator", ] frameworks = [ "UIKit.framework" ]
diff --git a/ios/chrome/browser/first_run/ui_bundled/interactive_lens/coordinator/interactive_lens_promo_coordinator.mm b/ios/chrome/browser/first_run/ui_bundled/interactive_lens/coordinator/interactive_lens_promo_coordinator.mm index 57bc35e..4e075e3 100644 --- a/ios/chrome/browser/first_run/ui_bundled/interactive_lens/coordinator/interactive_lens_promo_coordinator.mm +++ b/ios/chrome/browser/first_run/ui_bundled/interactive_lens/coordinator/interactive_lens_promo_coordinator.mm
@@ -4,9 +4,19 @@ #import "ios/chrome/browser/first_run/ui_bundled/interactive_lens/coordinator/interactive_lens_promo_coordinator.h" +#import "base/check.h" #import "ios/chrome/browser/first_run/ui_bundled/first_run_screen_delegate.h" +#import "ios/chrome/browser/first_run/ui_bundled/interactive_lens/ui/interactive_lens_overlay_promo_view_controller.h" -@implementation InteractiveLensPromoCoordinator +@interface InteractiveLensPromoCoordinator () <InteractiveLensPromoDelegate> +@end + +@implementation InteractiveLensPromoCoordinator { + // View controller for the Interactive Lens promo screen. + InteractiveLensOverlayPromoViewController* _promoViewController; + // Container view controller for the Lens view. + UIViewController* _lensContainerViewController; +} @synthesize baseNavigationController = _baseNavigationController; @@ -24,12 +34,31 @@ - (void)start { [super start]; - // TODO(crbug.com/416480202): Present screen. + // TODO(crbug.com/416480202): Trigger the Lens UI presentation with + // `_lensContainerViewController` as the base view controller before + // presenting `_promoViewController`. + _lensContainerViewController = [[UIViewController alloc] init]; + _promoViewController = [[InteractiveLensOverlayPromoViewController alloc] + initWithLensView:_lensContainerViewController.view]; + _promoViewController.delegate = self; + _promoViewController.modalInPresentation = YES; + BOOL animated = self.baseNavigationController.topViewController != nil; + [self.baseNavigationController setViewControllers:@[ _promoViewController ] + animated:animated]; } - (void)stop { self.firstRunDelegate = nil; + _lensContainerViewController = nil; + _promoViewController = nil; [super stop]; } +#pragma mark - InteractiveLensPromoDelegate + +- (void)didTapContinueButton { + CHECK(self.firstRunDelegate); + [self.firstRunDelegate screenWillFinishPresenting]; +} + @end
diff --git a/ios/chrome/browser/first_run/ui_bundled/interactive_lens/ui/BUILD.gn b/ios/chrome/browser/first_run/ui_bundled/interactive_lens/ui/BUILD.gn new file mode 100644 index 0000000..6b6848d --- /dev/null +++ b/ios/chrome/browser/first_run/ui_bundled/interactive_lens/ui/BUILD.gn
@@ -0,0 +1,23 @@ +# 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("ui") { + sources = [ + "interactive_lens_overlay_promo_view_controller.h", + "interactive_lens_overlay_promo_view_controller.mm", + ] + deps = [ + "//base", + "//ios/chrome/app/strings", + "//ios/chrome/browser/bubble/ui_bundled:bubble_view", + "//ios/chrome/browser/bubble/ui_bundled:constants", + "//ios/chrome/common/ui/colors", + "//ios/chrome/common/ui/elements", + "//ios/chrome/common/ui/promo_style", + "//ios/chrome/common/ui/promo_style:utils", + "//ios/chrome/common/ui/util", + "//ui/base", + ] + frameworks = [ "UIKit.framework" ] +}
diff --git a/ios/chrome/browser/first_run/ui_bundled/interactive_lens/ui/interactive_lens_overlay_promo_view_controller.h b/ios/chrome/browser/first_run/ui_bundled/interactive_lens/ui/interactive_lens_overlay_promo_view_controller.h new file mode 100644 index 0000000..23ebc8c --- /dev/null +++ b/ios/chrome/browser/first_run/ui_bundled/interactive_lens/ui/interactive_lens_overlay_promo_view_controller.h
@@ -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. + +#ifndef IOS_CHROME_BROWSER_FIRST_RUN_UI_BUNDLED_INTERACTIVE_LENS_UI_INTERACTIVE_LENS_OVERLAY_PROMO_VIEW_CONTROLLER_H_ +#define IOS_CHROME_BROWSER_FIRST_RUN_UI_BUNDLED_INTERACTIVE_LENS_UI_INTERACTIVE_LENS_OVERLAY_PROMO_VIEW_CONTROLLER_H_ + +#import <UIKit/UIKit.h> + +#import "ios/chrome/common/ui/promo_style/promo_style_view_controller.h" + +// Delegate for actions on the Interactive Lens screen. +@protocol InteractiveLensPromoDelegate <NSObject> + +// Called when the user tapped on the "continue" button. +- (void)didTapContinueButton; + +@end + +// View controller for the Interactive Lens screen in the First Run Experience. +@interface InteractiveLensOverlayPromoViewController : UIViewController + +// Delegate for actions on the Interactive Lens screen. +@property(nonatomic, weak) id<InteractiveLensPromoDelegate> delegate; + +// Designated initializer for this view controller. `lensView` is view for the +// interactive Lens Overlay. +- (instancetype)initWithLensView:(UIView*)lensView NS_DESIGNATED_INITIALIZER; + +- (instancetype)initWithNibName:(NSString*)nibNameOrNil + bundle:(NSBundle*)nibBundleOrNil NS_UNAVAILABLE; + +- (instancetype)initWithCoder:(NSCoder*)coder NS_UNAVAILABLE; + +- (instancetype)init NS_UNAVAILABLE; + +@end + +#endif // IOS_CHROME_BROWSER_FIRST_RUN_UI_BUNDLED_INTERACTIVE_LENS_UI_INTERACTIVE_LENS_OVERLAY_PROMO_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/first_run/ui_bundled/interactive_lens/ui/interactive_lens_overlay_promo_view_controller.mm b/ios/chrome/browser/first_run/ui_bundled/interactive_lens/ui/interactive_lens_overlay_promo_view_controller.mm new file mode 100644 index 0000000..cfb0ec08 --- /dev/null +++ b/ios/chrome/browser/first_run/ui_bundled/interactive_lens/ui/interactive_lens_overlay_promo_view_controller.mm
@@ -0,0 +1,312 @@ +// 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/first_run/ui_bundled/interactive_lens/ui/interactive_lens_overlay_promo_view_controller.h" + +#import "ios/chrome/browser/bubble/ui_bundled/bubble_constants.h" +#import "ios/chrome/browser/bubble/ui_bundled/bubble_view.h" +#import "ios/chrome/common/ui/colors/semantic_color_names.h" +#import "ios/chrome/common/ui/elements/gradient_view.h" +#import "ios/chrome/common/ui/promo_style/utils.h" +#import "ios/chrome/common/ui/util/button_util.h" +#import "ios/chrome/common/ui/util/constraints_ui_util.h" +#import "ios/chrome/common/ui/util/pointer_interaction_util.h" +#import "ios/chrome/grit/ios_strings.h" +#import "ui/base/l10n/l10n_util.h" + +namespace { +// Margins for the Lens view. +const CGFloat kLensViewTopMargin = 40.0; +const CGFloat kLensViewHorizontalMargin = 20.0; +// Height multipliers for the Lens view. +const CGFloat kLensViewMinHeightMultiplier = 0.4; +const CGFloat kLensViewMaxHeightMultiplier = 1.45; +// Corner radius for the top two corners of the Lens view. +const CGFloat kLensViewCornerRadius = 30.0; +// Top margin for tip bubble. +const CGFloat kBubbleViewTopMargin = 10.0; +// Height constant for the bubble view. +const CGFloat kBubbleViewHeightConstant = 70.0; +// Top margin for scroll view. +const CGFloat kScrollViewTopMargin = 45.0; +// Minimum height for the footer view. +const CGFloat kMinFooterHeight = 100.0; +} // namespace + +@implementation InteractiveLensOverlayPromoViewController { + // View for the tip bubble. + BubbleView* _bubbleView; + // View for the interactive Lens instance. + UIView* _lensView; + // Scroll view containing the screen's title and subtitle. + UIScrollView* _textScrollView; +} + +- (instancetype)initWithLensView:(UIView*)lensView { + self = [super initWithNibName:nil bundle:nil]; + if (self) { + _lensView = lensView; + } + return self; +} + +#pragma mark - UIViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + + UIView* view = self.view; + view.backgroundColor = [UIColor colorNamed:kPrimaryBackgroundColor]; + UILayoutGuide* widthLayoutGuide = AddPromoStyleWidthLayoutGuide(view); + + // Add a gradient to the background. + GradientView* gradientView = [[GradientView alloc] + initWithTopColor:[UIColor colorNamed:kPrimaryBackgroundColor] + bottomColor:[UIColor colorNamed:kSecondaryBackgroundColor]]; + gradientView.translatesAutoresizingMaskIntoConstraints = NO; + [view addSubview:gradientView]; + AddSameConstraints(gradientView, view); + + // Create and constrain the scroll view containing the title and subtitle. The + // content will only be scrollable after the Lens view has first compressed as + // much as it can. + _textScrollView = [self textScrollView]; + [view addSubview:_textScrollView]; + [NSLayoutConstraint activateConstraints:@[ + [_textScrollView.topAnchor + constraintEqualToAnchor:view.safeAreaLayoutGuide.topAnchor + constant:kScrollViewTopMargin], + [_textScrollView.leadingAnchor + constraintEqualToAnchor:widthLayoutGuide.leadingAnchor], + [_textScrollView.trailingAnchor + constraintEqualToAnchor:widthLayoutGuide.trailingAnchor], + ]]; + NSLayoutConstraint* heightConstraint = [_textScrollView.heightAnchor + constraintEqualToAnchor:_textScrollView.contentLayoutGuide.heightAnchor]; + // UILayoutPriorityDefaultHigh is the default priority for content + // compression. Setting this lower avoids compressing the content of the + // scroll view. + heightConstraint.priority = UILayoutPriorityDefaultHigh - 1; + heightConstraint.active = YES; + + // Create and constrain the footer view containing the action button. + UIView* footerContainerView = [self footerContainerView]; + [view addSubview:footerContainerView]; + AddSameConstraintsToSides( + footerContainerView, view, + LayoutSides::kLeading | LayoutSides::kTrailing | LayoutSides::kBottom); + [NSLayoutConstraint activateConstraints:@[ + [footerContainerView.heightAnchor + constraintGreaterThanOrEqualToConstant:kMinFooterHeight], + ]]; + + // Add and constrain the Lens view. + [view addSubview:_lensView]; + _lensView.translatesAutoresizingMaskIntoConstraints = NO; + _lensView.layer.cornerRadius = kLensViewCornerRadius; + _lensView.layer.masksToBounds = YES; + _lensView.layer.maskedCorners = + kCALayerMinXMinYCorner | kCALayerMaxXMinYCorner; + [NSLayoutConstraint activateConstraints:@[ + // The Lens view has both a minimum possible height (relative to the height + // of its superview) and a maximum possible height (relative to the height + // of the Lens overlay image asset). + [_lensView.heightAnchor + constraintGreaterThanOrEqualToAnchor:view.heightAnchor + multiplier:kLensViewMinHeightMultiplier], + [_lensView.heightAnchor + constraintLessThanOrEqualToAnchor:_lensView.widthAnchor + multiplier:kLensViewMaxHeightMultiplier], + [_lensView.leadingAnchor + constraintEqualToAnchor:widthLayoutGuide.leadingAnchor + constant:kLensViewHorizontalMargin], + [_lensView.trailingAnchor + constraintEqualToAnchor:widthLayoutGuide.trailingAnchor + constant:-kLensViewHorizontalMargin], + [_lensView.bottomAnchor + constraintEqualToAnchor:footerContainerView.topAnchor], + [_lensView.topAnchor + constraintGreaterThanOrEqualToAnchor:_textScrollView.bottomAnchor + constant:kLensViewTopMargin], + ]]; + + // Create and constrain the bubble view so that it is pinned to the Lens view + // and always below the title/subtitle. + _bubbleView = [self bubbleView]; + [view addSubview:_bubbleView]; + [NSLayoutConstraint activateConstraints:@[ + [_bubbleView.centerXAnchor constraintEqualToAnchor:view.centerXAnchor], + [_bubbleView.leadingAnchor + constraintEqualToAnchor:view.safeAreaLayoutGuide.leadingAnchor], + [_bubbleView.trailingAnchor + constraintEqualToAnchor:view.safeAreaLayoutGuide.trailingAnchor], + [_bubbleView.bottomAnchor + constraintEqualToAnchor:_lensView.topAnchor + constant:kBubbleViewHeightConstant], + [_bubbleView.topAnchor + constraintGreaterThanOrEqualToAnchor:_textScrollView.bottomAnchor + constant:kBubbleViewTopMargin], + ]]; + + [self startBubbleAnimation]; +} + +- (void)viewDidAppear:(BOOL)animated { + [super viewDidAppear:animated]; + [_textScrollView flashScrollIndicators]; +} + +#pragma mark - Private + +// Creates and returns a scroll view containing the title and subtitle texts. +- (UIScrollView*)textScrollView { + UILabel* titleLabel = [[UILabel alloc] init]; + titleLabel.numberOfLines = 0; + titleLabel.font = GetFRETitleFont(GetTitleLabelFontTextStyle(self)); + titleLabel.textColor = [UIColor colorNamed:kTextPrimaryColor]; + titleLabel.text = + l10n_util::GetNSString(IDS_IOS_INTERACTIVE_LENS_OVERLAY_PROMO_TITLE); + titleLabel.textAlignment = NSTextAlignmentCenter; + titleLabel.translatesAutoresizingMaskIntoConstraints = NO; + titleLabel.adjustsFontForContentSizeCategory = YES; + titleLabel.accessibilityTraits |= UIAccessibilityTraitHeader; + + UILabel* subtitleLabel = [[UILabel alloc] init]; + subtitleLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody]; + subtitleLabel.numberOfLines = 0; + subtitleLabel.textColor = [UIColor colorNamed:kGrey800Color]; + subtitleLabel.text = + l10n_util::GetNSString(IDS_IOS_INTERACTIVE_LENS_OVERLAY_PROMO_SUBTITLE); + subtitleLabel.textAlignment = NSTextAlignmentCenter; + subtitleLabel.translatesAutoresizingMaskIntoConstraints = NO; + subtitleLabel.adjustsFontForContentSizeCategory = YES; + + UIStackView* textStack = [[UIStackView alloc] + initWithArrangedSubviews:@[ titleLabel, subtitleLabel ]]; + textStack.axis = UILayoutConstraintAxisVertical; + textStack.alignment = UIStackViewAlignmentCenter; + textStack.spacing = 10.0; + textStack.translatesAutoresizingMaskIntoConstraints = NO; + + UIScrollView* scrollView = [[UIScrollView alloc] init]; + scrollView.translatesAutoresizingMaskIntoConstraints = NO; + scrollView.showsVerticalScrollIndicator = YES; + [scrollView addSubview:textStack]; + + [NSLayoutConstraint activateConstraints:@[ + [textStack.topAnchor + constraintEqualToAnchor:scrollView.contentLayoutGuide.topAnchor], + [textStack.bottomAnchor + constraintEqualToAnchor:scrollView.contentLayoutGuide.bottomAnchor], + [textStack.widthAnchor + constraintEqualToAnchor:scrollView.frameLayoutGuide.widthAnchor], + [textStack.centerXAnchor constraintEqualToAnchor:scrollView.centerXAnchor], + ]]; + + return scrollView; +} + +// Creates and returns the tip bubble view. +- (BubbleView*)bubbleView { + BubbleView* bubbleView = [[BubbleView alloc] + initWithText:l10n_util::GetNSString( + IDS_IOS_INTERACTIVE_LENS_OVERLAY_PROMO_BUBBLE_TEXT) + arrowDirection:BubbleArrowDirectionDown + alignment:BubbleAlignmentCenter]; + bubbleView.translatesAutoresizingMaskIntoConstraints = NO; + + return bubbleView; +} + +// Starts the animation for the tip bubble view. +- (void)startBubbleAnimation { + CGFloat originalY = _bubbleView.frame.origin.y; + CGFloat floatHeight = 18.0; + + __weak __typeof(_bubbleView) weakBubbleView = _bubbleView; + [UIView animateWithDuration:1.5 + delay:0.0 + options:UIViewAnimationOptionAutoreverse | + UIViewAnimationOptionRepeat | + UIViewAnimationOptionCurveEaseInOut + animations:^{ + CGRect frame = weakBubbleView.frame; + frame.origin.y = originalY - floatHeight; + weakBubbleView.frame = frame; + } + completion:nil]; +} + +// Creates and returns the footer container view, which holds the action button +// and a separator line. +- (UIView*)footerContainerView { + UIView* footerContainerView = [[UIView alloc] init]; + footerContainerView.translatesAutoresizingMaskIntoConstraints = NO; + footerContainerView.backgroundColor = [UIColor whiteColor]; + + UIView* separatorLine = [[UIView alloc] init]; + separatorLine.translatesAutoresizingMaskIntoConstraints = NO; + separatorLine.backgroundColor = [UIColor colorWithWhite:0.9 alpha:1.0]; + [footerContainerView addSubview:separatorLine]; + + [NSLayoutConstraint activateConstraints:@[ + [separatorLine.topAnchor + constraintEqualToAnchor:footerContainerView.topAnchor], + [separatorLine.leadingAnchor + constraintEqualToAnchor:footerContainerView.leadingAnchor], + [separatorLine.trailingAnchor + constraintEqualToAnchor:footerContainerView.trailingAnchor], + [separatorLine.heightAnchor constraintEqualToConstant:1.0] + ]]; + + UIButton* button = [self buttonView]; + [footerContainerView addSubview:button]; + + [NSLayoutConstraint activateConstraints:@[ + [button.centerXAnchor + constraintEqualToAnchor:footerContainerView.centerXAnchor], + [button.centerYAnchor + constraintEqualToAnchor:footerContainerView.centerYAnchor + constant:-5], + ]]; + + return footerContainerView; +} + +// Creates and returns the action button. +- (UIButton*)buttonView { + UIButton* button = [UIButton buttonWithType:UIButtonTypeSystem]; + NSString* buttonTitle = l10n_util::GetNSString( + IDS_IOS_INTERACTIVE_LENS_OVERLAY_PROMO_SKIP_BUTTON); + UIButtonConfiguration* buttonConfiguration = + [UIButtonConfiguration plainButtonConfiguration]; + buttonConfiguration.title = buttonTitle; + buttonConfiguration.background.backgroundColor = [UIColor clearColor]; + buttonConfiguration.baseForegroundColor = [UIColor colorNamed:kBlueColor]; + buttonConfiguration.contentInsets = NSDirectionalEdgeInsetsMake( + kButtonVerticalInsets, 0, kButtonVerticalInsets, 0); + UIFont* font = [UIFont preferredFontForTextStyle:UIFontTextStyleBody]; + NSDictionary* attributes = @{NSFontAttributeName : font}; + NSMutableAttributedString* string = + [[NSMutableAttributedString alloc] initWithString:buttonTitle]; + [string addAttributes:attributes range:NSMakeRange(0, string.length)]; + buttonConfiguration.attributedTitle = string; + buttonConfiguration.titleLineBreakMode = NSLineBreakByTruncatingTail; + button.configuration = buttonConfiguration; + button.translatesAutoresizingMaskIntoConstraints = NO; + button.titleLabel.adjustsFontForContentSizeCategory = YES; + button.pointerInteractionEnabled = YES; + button.pointerStyleProvider = CreateOpaqueButtonPointerStyleProvider(); + [button addTarget:self + action:@selector(buttonTapped) + forControlEvents:UIControlEventTouchUpInside]; + return button; +} + +// Handles taps on the action button. +- (void)buttonTapped { + [self.delegate didTapContinueButton]; +} + +@end
diff --git a/ios/chrome/browser/home_customization/coordinator/home_customization_background_photo_picker_coordinator.h b/ios/chrome/browser/home_customization/coordinator/home_customization_background_photo_picker_coordinator.h index e3c5e82..d1397be4 100644 --- a/ios/chrome/browser/home_customization/coordinator/home_customization_background_photo_picker_coordinator.h +++ b/ios/chrome/browser/home_customization/coordinator/home_customization_background_photo_picker_coordinator.h
@@ -10,12 +10,33 @@ #import "ios/chrome/browser/shared/coordinator/chrome_coordinator/chrome_coordinator.h" +@class HomeCustomizationBackgroundPhotoPickerCoordinator; + +// Protocol for handling selected images from the photo picker. +@protocol HomeCustomizationBackgroundPhotoPickerCoordinatorDelegate <NSObject> + +// Called when the user successfully selects and frames an image. +- (void)photoPickerCoordinator: + (HomeCustomizationBackgroundPhotoPickerCoordinator*)coordinator + didSelectImage:(UIImage*)image; + +// Called when the user cancels the photo selection process. +- (void)photoPickerCoordinatorDidCancel: + (HomeCustomizationBackgroundPhotoPickerCoordinator*)coordinator; + +@end + // Coordinator that handles photo selection from the device's photo library. // This coordinator manages the PHPickerViewController and handles selected // images. -@interface PHPickerCoordinator +@interface HomeCustomizationBackgroundPhotoPickerCoordinator : ChromeCoordinator <PHPickerViewControllerDelegate> +// Delegate to handle the final selected and framed image. +@property(nonatomic, weak) + id<HomeCustomizationBackgroundPhotoPickerCoordinatorDelegate> + delegate; + @end #endif // IOS_CHROME_BROWSER_HOME_CUSTOMIZATION_COORDINATOR_HOME_CUSTOMIZATION_BACKGROUND_PHOTO_PICKER_COORDINATOR_H_
diff --git a/ios/chrome/browser/home_customization/coordinator/home_customization_background_photo_picker_coordinator.mm b/ios/chrome/browser/home_customization/coordinator/home_customization_background_photo_picker_coordinator.mm index df05f6f8..3c9e4aa 100644 --- a/ios/chrome/browser/home_customization/coordinator/home_customization_background_photo_picker_coordinator.mm +++ b/ios/chrome/browser/home_customization/coordinator/home_customization_background_photo_picker_coordinator.mm
@@ -5,12 +5,21 @@ #import "ios/chrome/browser/home_customization/coordinator/home_customization_background_photo_picker_coordinator.h" #import "base/check.h" -#import "ios/chrome/browser/home_customization/ui/home_customization_background_photo_library_picker_view_controller.h" +#import "ios/chrome/browser/home_customization/ui/home_customization_background_photo_framing_view_controller.h" #import "ios/chrome/browser/shared/model/browser/browser.h" +#import "ios/chrome/browser/shared/model/web_state_list/web_state_list.h" #import "ios/chrome/grit/ios_strings.h" +#import "ios/public/provider/chrome/browser/ui_utils/ui_utils_api.h" #import "ui/base/l10n/l10n_util_mac.h" -@implementation PHPickerCoordinator +@interface HomeCustomizationBackgroundPhotoPickerCoordinator () < + HomeCustomizationImageFramingViewControllerDelegate> +@end + +@implementation HomeCustomizationBackgroundPhotoPickerCoordinator { + // Strong reference to the framing view controller while it's being presented. + HomeCustomizationImageFramingViewController* _framingViewController; +} - (void)start { [self presentPhotoPicker]; @@ -21,6 +30,9 @@ if (self.baseViewController.presentedViewController) { [self.baseViewController dismissViewControllerAnimated:NO completion:nil]; } + + _framingViewController = nil; + [super stop]; } @@ -66,14 +78,70 @@ }); } }]; + } else { + // User cancelled without selecting an image. + [self.delegate photoPickerCoordinatorDidCancel:self]; } } #pragma mark - Private -// Handles the selected image and presents the cropping view. +// Handles the selected image and presents the framing view. - (void)handleSelectedImage:(UIImage*)image { - // TODO(crbug.com/415060566): Present cropping interface. + // Create the logo vendor + id<LogoVendor> logoVendor = ios::provider::CreateLogoVendor( + self.browser, self.browser->GetWebStateList()->GetActiveWebState()); + + // Create the framing view controller with both image and logo vendor + _framingViewController = [[HomeCustomizationImageFramingViewController alloc] + initWithImage:image + logoVendor:logoVendor]; + + // Set the delegate to handle the framed image. + _framingViewController.delegate = self; + + _framingViewController.modalPresentationStyle = + UIModalPresentationOverFullScreen; + _framingViewController.modalTransitionStyle = + UIModalTransitionStyleCrossDissolve; + + // Present the framing interface. + [self.baseViewController presentViewController:_framingViewController + animated:YES + completion:nil]; +} + +#pragma mark - HomeCustomizationImageFramingViewControllerDelegate + +- (void)imageFramingViewController: + (HomeCustomizationImageFramingViewController*)controller + didFinishWithImage:(UIImage*)framedImage { + // Dismiss the framing view controller. + __weak __typeof(self) weakSelf = self; + [controller dismissViewControllerAnimated:YES + completion:^{ + // Pass the framed image to the delegate. + [weakSelf.delegate + photoPickerCoordinator:weakSelf + didSelectImage:framedImage]; + }]; + + _framingViewController = nil; +} + +- (void)imageFramingViewControllerDidCancel: + (HomeCustomizationImageFramingViewController*)controller { + // Dismiss the framing view controller. + __weak __typeof(self) weakSelf = self; + [controller + dismissViewControllerAnimated:YES + completion:^{ + // Notify delegate of cancellation. + [weakSelf.delegate + photoPickerCoordinatorDidCancel:weakSelf]; + }]; + + _framingViewController = nil; } @end
diff --git a/ios/chrome/browser/home_customization/coordinator/home_customization_background_picker_action_sheet_coordinator.mm b/ios/chrome/browser/home_customization/coordinator/home_customization_background_picker_action_sheet_coordinator.mm index 4c5eaf7..82d3dfb 100644 --- a/ios/chrome/browser/home_customization/coordinator/home_customization_background_picker_action_sheet_coordinator.mm +++ b/ios/chrome/browser/home_customization/coordinator/home_customization_background_picker_action_sheet_coordinator.mm
@@ -52,7 +52,7 @@ _backgroundPresetGalleryPickerMediator; // The coordinator for the photo picker. - PHPickerCoordinator* _photoPickerCoordinator; + HomeCustomizationBackgroundPhotoPickerCoordinator* _photoPickerCoordinator; // The main view controller presented by the base view controller. UIViewController* _mainViewController; @@ -251,9 +251,10 @@ // from the device's photo library. - (void)presentPhotoLibraryPicker { // Create and start the photo picker coordinator - _photoPickerCoordinator = [[PHPickerCoordinator alloc] - initWithBaseViewController:self.baseViewController - browser:self.browser]; + _photoPickerCoordinator = + [[HomeCustomizationBackgroundPhotoPickerCoordinator alloc] + initWithBaseViewController:self.baseViewController + browser:self.browser]; [_photoPickerCoordinator start]; }
diff --git a/ios/chrome/browser/home_customization/ui/BUILD.gn b/ios/chrome/browser/home_customization/ui/BUILD.gn index d2a5b2b..0a6a120 100644 --- a/ios/chrome/browser/home_customization/ui/BUILD.gn +++ b/ios/chrome/browser/home_customization/ui/BUILD.gn
@@ -10,6 +10,8 @@ "home_customization_background_color_picker_mutator.h", "home_customization_background_color_picker_view_controller.h", "home_customization_background_color_picker_view_controller.mm", + "home_customization_background_photo_framing_view_controller.h", + "home_customization_background_photo_framing_view_controller.mm", "home_customization_background_photo_library_picker_view_controller.h", "home_customization_background_photo_library_picker_view_controller.mm", "home_customization_background_picker_action_sheet_mutator.h",
diff --git a/ios/chrome/browser/home_customization/ui/home_customization_background_photo_framing_view_controller.h b/ios/chrome/browser/home_customization/ui/home_customization_background_photo_framing_view_controller.h new file mode 100644 index 0000000..518cc6e --- /dev/null +++ b/ios/chrome/browser/home_customization/ui/home_customization_background_photo_framing_view_controller.h
@@ -0,0 +1,47 @@ +// 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 IOS_CHROME_BROWSER_HOME_CUSTOMIZATION_UI_HOME_CUSTOMIZATION_BACKGROUND_PHOTO_FRAMING_VIEW_CONTROLLER_H_ +#define IOS_CHROME_BROWSER_HOME_CUSTOMIZATION_UI_HOME_CUSTOMIZATION_BACKGROUND_PHOTO_FRAMING_VIEW_CONTROLLER_H_ + +#import <UIKit/UIKit.h> + +@protocol LogoVendor; +@class HomeCustomizationImageFramingViewController; + +// Protocol for handling framing results. +@protocol HomeCustomizationImageFramingViewControllerDelegate <NSObject> +// Called when the user finishes framing with a resulting image. +- (void)imageFramingViewController: + (HomeCustomizationImageFramingViewController*)controller + didFinishWithImage:(UIImage*)framedImage; + +// Called when the user cancels the framing operation. +- (void)imageFramingViewControllerDidCancel: + (HomeCustomizationImageFramingViewController*)controller; +@end + +// View controller that provides a full-screen image framing interface. +@interface HomeCustomizationImageFramingViewController : UIViewController + +// Delegate to receive framing results. +@property(nonatomic, weak) + id<HomeCustomizationImageFramingViewControllerDelegate> + delegate; + +// Initialize with an image to frame and a logo vendor for displaying the Google +// logo. +- (instancetype)initWithImage:(UIImage*)image + logoVendor:(id<LogoVendor>)logoVendor + NS_DESIGNATED_INITIALIZER; + +// Unavailable initializers. +- (instancetype)init NS_UNAVAILABLE; +- (instancetype)initWithNibName:(NSString*)nibNameOrNil + bundle:(NSBundle*)nibBundleOrNil NS_UNAVAILABLE; +- (instancetype)initWithCoder:(NSCoder*)coder NS_UNAVAILABLE; + +@end + +#endif // IOS_CHROME_BROWSER_HOME_CUSTOMIZATION_UI_HOME_CUSTOMIZATION_BACKGROUND_PHOTO_FRAMING_VIEW_CONTROLLER_H_
diff --git a/ios/chrome/browser/home_customization/ui/home_customization_background_photo_framing_view_controller.mm b/ios/chrome/browser/home_customization/ui/home_customization_background_photo_framing_view_controller.mm new file mode 100644 index 0000000..8335cac5 --- /dev/null +++ b/ios/chrome/browser/home_customization/ui/home_customization_background_photo_framing_view_controller.mm
@@ -0,0 +1,344 @@ +// 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/home_customization/ui/home_customization_background_photo_framing_view_controller.h" + +#import "base/check.h" +#import "ios/chrome/browser/ntp/ui_bundled/logo_vendor.h" +#import "ios/chrome/browser/shared/ui/symbols/symbols.h" +#import "ios/chrome/common/ui/colors/semantic_color_names.h" +#import "ios/chrome/common/ui/util/constraints_ui_util.h" +#import "ios/chrome/grit/ios_strings.h" +#import "ui/base/l10n/l10n_util_mac.h" + +namespace { +// Constants for UI layout. +const CGFloat kButtonHeight = 50.0; +const CGFloat kButtonCornerRadius = 8.0; +const CGFloat kButtonSpacing = 12.0; +const CGFloat kContentPadding = 16.0; +const CGFloat kTopSpacingHeight = 5.0; +const CGFloat kOmniboxHeight = 50.0; +const CGFloat kOmniboxRadius = 22.5; +const CGFloat kPinchIconSize = 18.0; +const CGFloat kMaximumZoomScale = 5.0; +const CGFloat kSectionSpacing = 24.0; +const CGFloat kBottomHSpacingHeight = 5.0; +const CGFloat kLogoContainerWidth = 120.0; +const CGFloat kLogoContainerHeight = 40.0; +const CGFloat kCenterStackSpacing = 4.0; +} // namespace + +@interface HomeCustomizationImageFramingViewController () < + UIScrollViewDelegate> { + // The original image to be framed. + UIImage* _originalImage; + // Logo vendor for displaying Google logo/doodle. + id<LogoVendor> _logoVendor; + // Image view displaying the image. + UIImageView* _imageView; + // Bottom section container. + UIView* _bottomSection; + // Scroll view for zooming and panning. + UIScrollView* _scrollView; +} + +@end + +@implementation HomeCustomizationImageFramingViewController + +#pragma mark - Initialization + +- (instancetype)initWithImage:(UIImage*)image + logoVendor:(id<LogoVendor>)logoVendor { + CHECK(image); + CHECK(logoVendor); + self = [super initWithNibName:nil bundle:nil]; + if (self) { + _originalImage = image; + _logoVendor = logoVendor; + // Set fullscreen presentation. + self.modalPresentationStyle = UIModalPresentationOverFullScreen; + } + return self; +} + +#pragma mark - UIViewController + +- (void)viewDidLoad { + [super viewDidLoad]; + + self.view.backgroundColor = [UIColor colorNamed:kTextPrimaryColor]; + + [self setupScrollView]; + [self setupImageView]; + [self setupTopSection]; + [self setupBottomSection]; + [self setupCenterContainer]; +} + +- (void)viewDidAppear:(BOOL)animated { + [super viewDidAppear:animated]; + [self updateMinimumZoomScale]; + [self centerImageView]; +} + +- (void)viewWillTransitionToSize:(CGSize)size + withTransitionCoordinator: + (id<UIViewControllerTransitionCoordinator>)coordinator { + [super viewWillTransitionToSize:size withTransitionCoordinator:coordinator]; + + __weak __typeof(self) weakSelf = self; + [coordinator + animateAlongsideTransition:nil + completion:^( + id<UIViewControllerTransitionCoordinatorContext> + context) { + [weakSelf updateMinimumZoomScale]; + [weakSelf centerImageView]; + }]; +} + +#pragma mark - UIScrollViewDelegate + +- (UIView*)viewForZoomingInScrollView:(UIScrollView*)scrollView { + return _imageView; +} + +- (void)scrollViewDidZoom:(UIScrollView*)scrollView { + [self centerImageView]; +} + +#pragma mark - Private + +// Sets up the scroll view for image zooming and panning. +- (void)setupScrollView { + _scrollView = [[UIScrollView alloc] init]; + _scrollView.translatesAutoresizingMaskIntoConstraints = NO; + _scrollView.delegate = self; + _scrollView.showsVerticalScrollIndicator = NO; + _scrollView.showsHorizontalScrollIndicator = NO; + _scrollView.decelerationRate = UIScrollViewDecelerationRateFast; + _scrollView.minimumZoomScale = 1.0; + _scrollView.maximumZoomScale = kMaximumZoomScale; + _scrollView.contentInsetAdjustmentBehavior = + UIScrollViewContentInsetAdjustmentNever; + [self.view addSubview:_scrollView]; + + // Pin scroll view to view edges. + AddSameConstraints(_scrollView, self.view); +} + +// Configures the image view and adds it to the scroll view. +- (void)setupImageView { + _imageView = [[UIImageView alloc] initWithImage:_originalImage]; + _imageView.contentMode = UIViewContentModeScaleAspectFit; + [_scrollView addSubview:_imageView]; + + _scrollView.contentSize = _imageView.frame.size; +} + +// Creates the top section with logo and omnibox. +- (void)setupTopSection { + // Top section container. + UIStackView* topSection = [[UIStackView alloc] init]; + topSection.axis = UILayoutConstraintAxisVertical; + topSection.alignment = UIStackViewAlignmentCenter; + topSection.spacing = kSectionSpacing; + topSection.translatesAutoresizingMaskIntoConstraints = NO; + [self.view addSubview:topSection]; + + // Add logo vendor view. + if (_logoVendor) { + // Get logo view and configure it. + UIView* logoView = _logoVendor.view; + logoView.translatesAutoresizingMaskIntoConstraints = NO; + _logoVendor.showingLogo = YES; + _logoVendor.usesMonochromeLogo = YES; + logoView.tintColor = [UIColor colorNamed:kSolidWhiteColor]; + [topSection addArrangedSubview:logoView]; + + [NSLayoutConstraint activateConstraints:@[ + [logoView.widthAnchor constraintEqualToConstant:kLogoContainerWidth], + [logoView.heightAnchor constraintEqualToConstant:kLogoContainerHeight] + ]]; + } + + // Omnibox view. + UIView* omniboxView = [[UIView alloc] init]; + omniboxView.backgroundColor = [UIColor whiteColor]; + omniboxView.layer.cornerRadius = kOmniboxRadius; + omniboxView.translatesAutoresizingMaskIntoConstraints = NO; + [topSection addArrangedSubview:omniboxView]; + + [NSLayoutConstraint activateConstraints:@[ + // Top section container. + [topSection.topAnchor + constraintEqualToAnchor:self.view.safeAreaLayoutGuide.topAnchor + constant:kContentPadding + kTopSpacingHeight + + kSectionSpacing], + [topSection.leadingAnchor constraintEqualToAnchor:self.view.leadingAnchor + constant:kContentPadding], + [topSection.trailingAnchor constraintEqualToAnchor:self.view.trailingAnchor + constant:-kContentPadding], + + // Omnibox view. + [omniboxView.widthAnchor constraintEqualToAnchor:topSection.widthAnchor], + [omniboxView.heightAnchor constraintEqualToConstant:kOmniboxHeight] + ]]; +} + +// Creates the bottom section with save and cancel buttons. +- (void)setupBottomSection { + // Bottom section container using stack view. + _bottomSection = [[UIStackView alloc] init]; + UIStackView* bottomStack = (UIStackView*)_bottomSection; + bottomStack.axis = UILayoutConstraintAxisVertical; + bottomStack.alignment = UIStackViewAlignmentFill; + bottomStack.spacing = kButtonSpacing; + bottomStack.translatesAutoresizingMaskIntoConstraints = NO; + [self.view addSubview:_bottomSection]; + + // Save button. + UIButtonConfiguration* saveConfig = + [UIButtonConfiguration filledButtonConfiguration]; + saveConfig.title = l10n_util::GetNSString( + IDS_IOS_HOME_CUSTOMIZATION_BACKGROUND_FRAMING_VIEW_SAVE_BUTTON_LABEL); + saveConfig.baseBackgroundColor = [UIColor colorNamed:kBlueColor]; + saveConfig.baseForegroundColor = [UIColor colorNamed:kSolidWhiteColor]; + saveConfig.cornerStyle = UIButtonConfigurationCornerStyleFixed; + saveConfig.background.cornerRadius = kButtonCornerRadius; + + UIButton* saveButton = [UIButton buttonWithConfiguration:saveConfig + primaryAction:nil]; + saveButton.translatesAutoresizingMaskIntoConstraints = NO; + [saveButton addTarget:self + action:@selector(saveButtonTapped) + forControlEvents:UIControlEventTouchUpInside]; + [bottomStack addArrangedSubview:saveButton]; + + // Cancel button. + UIButtonConfiguration* cancelConfig = + [UIButtonConfiguration filledButtonConfiguration]; + cancelConfig.title = l10n_util::GetNSString( + IDS_IOS_HOME_CUSTOMIZATION_BACKGROUND_FRAMING_VIEW_CANCEL_BUTTON_LABEL); + cancelConfig.baseBackgroundColor = [UIColor colorNamed:kSolidWhiteColor]; + cancelConfig.baseForegroundColor = [UIColor colorNamed:kBlueColor]; + cancelConfig.cornerStyle = UIButtonConfigurationCornerStyleFixed; + cancelConfig.background.cornerRadius = kButtonCornerRadius; + + UIButton* cancelButton = [UIButton buttonWithConfiguration:cancelConfig + primaryAction:nil]; + cancelButton.translatesAutoresizingMaskIntoConstraints = NO; + [cancelButton addTarget:self + action:@selector(cancelButtonTapped) + forControlEvents:UIControlEventTouchUpInside]; + [bottomStack addArrangedSubview:cancelButton]; + + // Constraints for stack view and button heights. + [NSLayoutConstraint activateConstraints:@[ + // Bottom section container. + [_bottomSection.bottomAnchor + constraintEqualToAnchor:self.view.safeAreaLayoutGuide.bottomAnchor + constant:-(kContentPadding + kBottomHSpacingHeight + + kButtonSpacing)], + [_bottomSection.leadingAnchor + constraintEqualToAnchor:self.view.leadingAnchor + constant:kContentPadding], + [_bottomSection.trailingAnchor + constraintEqualToAnchor:self.view.trailingAnchor + constant:-kContentPadding], + + // Button heights. + [saveButton.heightAnchor constraintEqualToConstant:kButtonHeight], + [cancelButton.heightAnchor constraintEqualToConstant:kButtonHeight] + ]]; +} + +// Creates the center container with pinch instruction. +- (void)setupCenterContainer { + // Center container for pinch instruction using horizontal stack view. + UIStackView* centerContainer = [[UIStackView alloc] init]; + centerContainer.alignment = UIStackViewAlignmentCenter; + centerContainer.spacing = kCenterStackSpacing; + centerContainer.translatesAutoresizingMaskIntoConstraints = NO; + [self.view addSubview:centerContainer]; + + // Pinch icon. + UIImage* pinchIcon = DefaultSymbolWithPointSize(kCropSymbol, kPinchIconSize); + UIImageView* pinchIconView = [[UIImageView alloc] initWithImage:pinchIcon]; + pinchIconView.tintColor = [UIColor colorNamed:kSolidWhiteColor]; + pinchIconView.contentMode = UIViewContentModeScaleAspectFit; + pinchIconView.translatesAutoresizingMaskIntoConstraints = NO; + [centerContainer addArrangedSubview:pinchIconView]; + + // Add size constraints for the icon. + [NSLayoutConstraint activateConstraints:@[ + [pinchIconView.widthAnchor constraintEqualToConstant:kPinchIconSize], + [pinchIconView.heightAnchor constraintEqualToConstant:kPinchIconSize] + ]]; + + // Pinch label. + UILabel* pinchLabel = [[UILabel alloc] init]; + // Temp string till UX confirms the final string to use here. + // TODO(crbug.com/415061276: remove temp string when final string is + // available. + pinchLabel.text = @"Foo: Pinch to crop"; + pinchLabel.textColor = [UIColor colorNamed:kSolidWhiteColor]; + pinchLabel.font = [UIFont preferredFontForTextStyle:UIFontTextStyleFootnote]; + pinchLabel.translatesAutoresizingMaskIntoConstraints = NO; + [centerContainer addArrangedSubview:pinchLabel]; + + // Set up constraints for center container. + [NSLayoutConstraint activateConstraints:@[ + [centerContainer.centerXAnchor + constraintEqualToAnchor:self.view.centerXAnchor], + [centerContainer.bottomAnchor + constraintEqualToAnchor:_bottomSection.topAnchor + constant:-kContentPadding] + ]]; +} + +// Updates the minimum zoom scale to fill the screen. +- (void)updateMinimumZoomScale { + CGSize scrollViewSize = _scrollView.bounds.size; + CGSize imageSize = _originalImage.size; + + // Calculate the scale needed to fill the screen. + CGFloat widthScale = scrollViewSize.width / imageSize.width; + CGFloat heightScale = scrollViewSize.height / imageSize.height; + CGFloat minimumScale = MAX(widthScale, heightScale); + + _scrollView.minimumZoomScale = minimumScale; + _scrollView.zoomScale = minimumScale; +} + +// Centers the image view within the scroll view bounds. +- (void)centerImageView { + CGSize scrollViewSize = _scrollView.bounds.size; + CGSize contentSize = _scrollView.contentSize; + + CGFloat offsetX = (scrollViewSize.width > contentSize.width) + ? (scrollViewSize.width - contentSize.width) * 0.5 + : 0; + CGFloat offsetY = (scrollViewSize.height > contentSize.height) + ? (scrollViewSize.height - contentSize.height) * 0.5 + : 0; + + _imageView.center = CGPointMake(contentSize.width * 0.5 + offsetX, + contentSize.height * 0.5 + offsetY); +} + +// Handles cancel button tap and notifies delegate. +- (void)cancelButtonTapped { + [self.delegate imageFramingViewControllerDidCancel:self]; +} + +// Handles save button tap functionality. +- (void)saveButtonTapped { + // TODO(crbug.com/421925583): Implement save button and integrate with + // services. +} + +@end
diff --git a/ios/chrome/browser/main/ui_bundled/BUILD.gn b/ios/chrome/browser/main/ui_bundled/BUILD.gn index d7027103..20197d31 100644 --- a/ios/chrome/browser/main/ui_bundled/BUILD.gn +++ b/ios/chrome/browser/main/ui_bundled/BUILD.gn
@@ -153,6 +153,7 @@ "//ios/chrome/browser/signin/model:authentication_service_factory", "//ios/chrome/browser/signin/model:fake_system_identity", "//ios/chrome/browser/signin/model:fake_system_identity_manager", + "//ios/chrome/browser/signin/model:signin_util", "//ios/chrome/browser/signin/model:test_support", "//ios/chrome/browser/sync/model", "//ios/chrome/browser/tabs/model/inactive_tabs:features",
diff --git a/ios/chrome/browser/main/ui_bundled/default_browser_promo_scene_agent_unittest.mm b/ios/chrome/browser/main/ui_bundled/default_browser_promo_scene_agent_unittest.mm index 80d6fcdb..5eefe714 100644 --- a/ios/chrome/browser/main/ui_bundled/default_browser_promo_scene_agent_unittest.mm +++ b/ios/chrome/browser/main/ui_bundled/default_browser_promo_scene_agent_unittest.mm
@@ -31,6 +31,7 @@ #import "ios/chrome/browser/signin/model/fake_authentication_service_delegate.h" #import "ios/chrome/browser/signin/model/fake_system_identity.h" #import "ios/chrome/browser/signin/model/fake_system_identity_manager.h" +#import "ios/chrome/browser/signin/model/signin_util.h" #import "ios/chrome/test/ios_chrome_scoped_testing_local_state.h" #import "ios/chrome/test/testing_application_context.h" #import "ios/web/public/test/web_task_environment.h" @@ -98,6 +99,12 @@ agent_ = [[DefaultBrowserPromoSceneAgent alloc] init]; agent_.sceneState = scene_state_; agent_.promosManager = promos_manager_.get(); + + base::RunLoop run_loop; + // Call IsFirstSessionAfterDeviceRestore() explicitly to make sure sentinel + // files related to backup/restore are fully created before the test begins. + IsFirstSessionAfterDeviceRestore(run_loop.QuitClosure()); + run_loop.Run(); } void TearDown() override { @@ -108,6 +115,7 @@ scene_state_ = nil; profile_.reset(); ClearDefaultBrowserPromoData(); + ResetDeviceRestoreDataForTesting(); } void SignIn() { @@ -124,6 +132,8 @@ [[NSUserDefaults standardUserDefaults] setBool:YES forKey:@"SimulatePostDeviceRestore"]; + + ResetDeviceRestoreDataForTesting(); } void VerifyPromoRegistration(std::set<promos_manager::Promo> promos) { @@ -253,11 +263,7 @@ // Tests that the Post Restore Default Browser Promo is registered when the // conditions are met. -// TODO(crbug.com/417431030): disabled because it fails after fixing the UaF -// caused by bad interaction between FakeSceneState and TestProfileIOS. It -// should be fixed and re-enabled. -TEST_F(DefaultBrowserPromoSceneAgentTest, - DISABLED_TestPromoRegistrationPostRestore) { +TEST_F(DefaultBrowserPromoSceneAgentTest, TestPromoRegistrationPostRestore) { SimulatePostDeviceRestore(); TestingApplicationContext::GetGlobal()->SetLastShutdownClean(true); LogOpenHTTPURLFromExternalURL();
diff --git a/ios/chrome/browser/omnibox/model/BUILD.gn b/ios/chrome/browser/omnibox/model/BUILD.gn index 43c91941..c2e1881 100644 --- a/ios/chrome/browser/omnibox/model/BUILD.gn +++ b/ios/chrome/browser/omnibox/model/BUILD.gn
@@ -45,6 +45,8 @@ "//ios/chrome/browser/search_engines/model", "//ios/chrome/browser/shared/model/profile", "//ios/chrome/browser/shared/model/profile:profile_keyed_service_factory", + "//ios/chrome/browser/shared/ui/symbols", + "//ios/chrome/common/ui/favicon", "//rlz/buildflags", "//ui/base", ] @@ -215,10 +217,12 @@ "omnibox_pedal_annotator_unittest.mm", "omnibox_view_ios_unittest.mm", "pedal_section_extractor_unittest.mm", + "placeholder_service_unittest.mm", ] deps = [ ":model", ":omnibox_pedal_swift", + ":placeholder_service", ":swift_dependencies", ":test_support", ":ui_bundled_interface", @@ -235,17 +239,22 @@ "//components/search_engines", "//components/search_engines:test_support", "//ios/chrome/browser/autocomplete/model", + "//ios/chrome/browser/favicon/model:test_support", "//ios/chrome/browser/location_bar/model:test_support", "//ios/chrome/browser/search_engines/model:template_url_service_factory", "//ios/chrome/browser/shared/model/prefs:browser_prefs", "//ios/chrome/browser/shared/model/prefs:pref_names", "//ios/chrome/browser/shared/model/profile/test", + "//ios/chrome/browser/shared/ui/symbols", + "//ios/chrome/common/ui/favicon", + "//ios/chrome/common/ui/favicon:favicon_constants", "//ios/chrome/test:test_support", "//ios/testing:nserror_support", "//ios/web/public/test", "//testing/gmock", "//testing/gtest", "//third_party/ocmock", + "//ui/base:test_support", "//ui/gfx:test_support", ] }
diff --git a/ios/chrome/browser/omnibox/model/placeholder_service.h b/ios/chrome/browser/omnibox/model/placeholder_service.h index aae22be..fa74ff46 100644 --- a/ios/chrome/browser/omnibox/model/placeholder_service.h +++ b/ios/chrome/browser/omnibox/model/placeholder_service.h
@@ -7,13 +7,16 @@ #import <UIKit/UIKit.h> +#import "base/functional/callback.h" #import "base/memory/raw_ptr.h" #import "base/observer_list.h" #import "base/task/cancelable_task_tracker.h" #import "components/keyed_service/core/keyed_service.h" +#import "components/search_engines/template_url_id.h" #import "components/search_engines/template_url_service_observer.h" class FaviconLoader; +class TemplateURL; class TemplateURLService; #include "base/observer_list_types.h" @@ -59,7 +62,15 @@ void AddObserver(PlaceholderServiceObserver* observer); void RemoveObserver(PlaceholderServiceObserver* observer); - UIImage* GetCurrentDefaultSearchEngineFavicon(); + using PlaceholderImageCallback = base::RepeatingCallback<void(UIImage*)>; + // Requests the icon for the current default search engine at the given + // `icon_point_size`. If the icon is available synchronously, the callback + // will be called immediately with the cached icon. Otherwise, the callback + // will be called with a placeholder icon first, and then updated with the + // real icon once it's available. The callback will not be updated if the + // default search engine changes during the fetch. + void FetchDefaultSearchEngineIcon(CGFloat icon_point_size, + PlaceholderImageCallback callback); NSString* GetCurrentPlaceholderText(); NSString* GetCurrentSearchOnlyPlaceholderText(); @@ -67,9 +78,31 @@ void OnTemplateURLServiceChanged() override; private: + // Retrieves a bundled icon (e.g., Google icon) for the given `template_url` + // and `icon_point_size`, if available. Returns nil otherwise. + UIImage* GetBundledIconForTemplateURL(const TemplateURL* template_url, + CGFloat icon_point_size); + + // Called when an icon has been successfully fetched or retrieved for a + // `template_url_id` at a specific `icon_point_size`. Caches the icon and + // notifies relevant callbacks. + void OnIconReceivedForTemplateURL(TemplateURLID template_url_id, + CGFloat icon_point_size, + UIImage* icon); + + // Initiates a fetch for the icon of the given `template_url` at the specified + // `icon_point_size`. + void PerformIconFetch(const TemplateURL* template_url, + CGFloat icon_point_size); + raw_ptr<FaviconLoader> favicon_loader_; raw_ptr<TemplateURLService> template_url_service_; base::ObserverList<PlaceholderServiceObserver> model_observers_; + // Cache for fetched/bundled icons. Keyed by icon size. + NSCache<NSNumber*, UIImage*>* icon_cache_; + // Map of icon sizes to a list of callbacks awaiting an icon of that size. + // This is cleared when default search engine changes. + std::map<CGFloat, std::vector<PlaceholderImageCallback>> icon_callbacks_; base::WeakPtrFactory<PlaceholderService> weak_ptr_factory_{this}; };
diff --git a/ios/chrome/browser/omnibox/model/placeholder_service.mm b/ios/chrome/browser/omnibox/model/placeholder_service.mm index 5d26df3c..095527ba 100644 --- a/ios/chrome/browser/omnibox/model/placeholder_service.mm +++ b/ios/chrome/browser/omnibox/model/placeholder_service.mm
@@ -6,9 +6,12 @@ #import "base/strings/sys_string_conversions.h" #import "components/omnibox/common/omnibox_features.h" +#import "components/search_engines/template_url.h" #import "components/search_engines/template_url_service.h" #import "components/strings/grit/components_strings.h" #import "ios/chrome/browser/favicon/model/favicon_loader.h" +#import "ios/chrome/browser/shared/ui/symbols/symbols.h" +#import "ios/chrome/common/ui/favicon/favicon_attributes.h" #import "ios/chrome/grit/ios_strings.h" #import "ui/base/l10n/l10n_util.h" #import "ui/base/l10n/l10n_util_mac.h" @@ -16,20 +19,64 @@ PlaceholderService::PlaceholderService(FaviconLoader* favicon_loader, TemplateURLService* template_url_service) : favicon_loader_(favicon_loader), - template_url_service_(template_url_service) { + template_url_service_(template_url_service), + icon_callbacks_() { template_url_service->AddObserver(this); + icon_cache_ = [[NSCache alloc] init]; } PlaceholderService::~PlaceholderService() { for (auto& observer : model_observers_) { observer.OnPlaceholderServiceShuttingDown(); } - template_url_service_->RemoveObserver(this); + icon_cache_ = nil; } -UIImage* PlaceholderService::GetCurrentDefaultSearchEngineFavicon() { - return nil; +void PlaceholderService::FetchDefaultSearchEngineIcon( + CGFloat icon_point_size, + PlaceholderImageCallback callback) { + // Return the cached image if there is one. + UIImage* cached_icon = [icon_cache_ objectForKey:@(icon_point_size)]; + if (cached_icon) { + if (callback) { + callback.Run(cached_icon); + } + return; + } + + // Return the placeholder icon if there is no default search provider. + UIImage* placeholder_icon = + DefaultSymbolWithPointSize(kSearchSymbol, icon_point_size); + const TemplateURL* default_provider = + template_url_service_ ? template_url_service_->GetDefaultSearchProvider() + : nullptr; + if (!default_provider) { + if (callback) { + callback.Run(placeholder_icon); + } + return; + } + + // Return the bundled icon if there is one. Also cache it. + UIImage* bundled_icon = + GetBundledIconForTemplateURL(default_provider, icon_point_size); + if (bundled_icon) { + [icon_cache_ setObject:bundled_icon forKey:@(icon_point_size)]; + if (callback) { + callback.Run(bundled_icon); + } + return; + } + + // Set a placeholder before fetching the icon. + if (callback) { + callback.Run(placeholder_icon); + } + // The original `callback` is moved and will be invoked when the fetch + // completes. + icon_callbacks_[icon_point_size].push_back(std::move(callback)); + PerformIconFetch(default_provider, icon_point_size); } NSString* PlaceholderService::GetCurrentPlaceholderText() { @@ -77,8 +124,93 @@ #pragma mark - TemplateURLServiceObserver void PlaceholderService::OnTemplateURLServiceChanged() { + [icon_cache_ removeAllObjects]; + icon_callbacks_.clear(); for (auto& observer : model_observers_) { observer.OnPlaceholderTextChanged(); observer.OnPlaceholderImageChanged(); } } + +#pragma mark - Private + +UIImage* PlaceholderService::GetBundledIconForTemplateURL( + const TemplateURL* template_url, + CGFloat icon_point_size) { + CHECK(template_url); + CHECK(template_url_service_); + + // Google bundled icon. + if (template_url->GetEngineType(template_url_service_->search_terms_data()) == + SEARCH_ENGINE_GOOGLE) { +#if BUILDFLAG(IOS_USE_BRANDED_SYMBOLS) + return MakeSymbolMulticolor( + CustomSymbolWithPointSize(kGoogleIconSymbol, icon_point_size)); +#endif + } + return nil; +} + +void PlaceholderService::OnIconReceivedForTemplateURL( + TemplateURLID template_url_id, + CGFloat icon_point_size, + UIImage* icon) { + if (icon && template_url_service_ && + template_url_service_->GetDefaultSearchProvider()->id() == + template_url_id && + ![icon_cache_ objectForKey:@(icon_point_size)]) { + [icon_cache_ setObject:icon forKey:@(icon_point_size)]; + + if (icon_callbacks_.contains(icon_point_size)) { + std::vector<PlaceholderImageCallback> callbacks = + std::move(icon_callbacks_[icon_point_size]); + icon_callbacks_.erase(icon_point_size); + for (PlaceholderImageCallback& callback : callbacks) { + if (callback) { + std::move(callback).Run(icon); + } + } + } + } +} + +void PlaceholderService::PerformIconFetch(const TemplateURL* template_url, + CGFloat icon_point_size) { + if (!favicon_loader_) { + return; + } + + auto favicon_completion = base::CallbackToBlock(base::BindRepeating( + [](base::WeakPtr<PlaceholderService> weak_self, + TemplateURLID template_url_id, CGFloat icon_point_size, + FaviconAttributes* favicon_result) { + if (!favicon_result.faviconImage || favicon_result.usesDefaultImage) { + return; + } + UIImage* favicon = favicon_result.faviconImage; + if (weak_self) { + weak_self->OnIconReceivedForTemplateURL(template_url_id, + icon_point_size, favicon); + } + }, + AsWeakPtr(), template_url->id(), icon_point_size)); + + // Prepopulated search engines don't have a favicon URL, so the favicon is + // loaded with an empty query search page URL. + if (template_url->prepopulate_id() != 0) { + // Fake up a page URL for favicons of prepopulated search engines, since + // favicons may be fetched from Google server which doesn't suppoprt icon + // URL. + std::string empty_page_url = template_url->url_ref().ReplaceSearchTerms( + TemplateURLRef::SearchTermsArgs(std::u16string()), + template_url_service_->search_terms_data()); + favicon_loader_->FaviconForPageUrl( + GURL(empty_page_url), icon_point_size, icon_point_size, + /*fallback_to_google_server=*/YES, favicon_completion); + } else { + // Download the favicon. + favicon_loader_->FaviconForIconUrl(template_url->favicon_url(), + icon_point_size, icon_point_size, + favicon_completion); + } +}
diff --git a/ios/chrome/browser/omnibox/model/placeholder_service_unittest.mm b/ios/chrome/browser/omnibox/model/placeholder_service_unittest.mm new file mode 100644 index 0000000..a877095 --- /dev/null +++ b/ios/chrome/browser/omnibox/model/placeholder_service_unittest.mm
@@ -0,0 +1,263 @@ +// 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/omnibox/model/placeholder_service.h" + +#import "base/functional/bind.h" +#import "base/functional/callback_helpers.h" +#import "base/run_loop.h" +#import "base/strings/utf_string_conversions.h" +#import "base/test/task_environment.h" +#import "build/branding_buildflags.h" +#import "components/search_engines/search_engines_test_environment.h" +#import "components/search_engines/template_url.h" +#import "components/search_engines/template_url_data.h" +#import "components/search_engines/template_url_service.h" +#import "ios/chrome/browser/favicon/model/mock_favicon_loader.h" +#import "ios/chrome/browser/shared/ui/symbols/symbols.h" +#import "ios/chrome/common/ui/favicon/favicon_attributes.h" +#import "ios/chrome/common/ui/favicon/favicon_constants.h" +#import "ios/web/public/test/web_task_environment.h" +#import "testing/gmock/include/gmock/gmock.h" +#import "testing/gtest/include/gtest/gtest.h" +#import "testing/platform_test.h" +#import "third_party/ocmock/gtest_support.h" +#import "ui/base/test/ios/ui_image_test_utils.h" +#import "ui/gfx/image/image.h" + +using ::testing::_; +using ::testing::Invoke; +using ::testing::Return; +using ::testing::SaveArg; +using ::ui::test::uiimage_utils::UIImagesAreEqual; + +namespace { + +// Whether the image is the placeholder image used in the `placeholder_service`. +bool IsPlaceholderImage(UIImage* image, CGFloat image_point_size) { + UIImage* placeholder_image = + DefaultSymbolWithPointSize(kSearchSymbol, image_point_size); + return UIImagesAreEqual(placeholder_image, image); +} + +// Test fixture for PlaceholderService. +class PlaceholderServiceTest : public PlatformTest { + protected: + PlaceholderServiceTest() + : search_engines_test_environment_(), + mock_favicon_loader_( + std::make_unique<::testing::StrictMock<MockFaviconLoader>>()), + placeholder_service_(mock_favicon_loader_.get(), + &template_url_service()) { + // Set up a default search provider. + TemplateURLData data; + data.SetShortName(u"TestEngine"); + data.SetKeyword(u"test"); + data.SetURL("http://test.com/search?q={searchTerms}"); + data.favicon_url = GURL("http://test.com/favicon.ico"); + default_search_provider_ = + template_url_service().Add(std::make_unique<TemplateURL>(data)); + template_url_service().SetUserSelectedDefaultSearchProvider( + default_search_provider_); + } + + void TearDown() override { + placeholder_service_.Shutdown(); + PlatformTest::TearDown(); + } + + TemplateURLService& template_url_service() { + return *search_engines_test_environment_.template_url_service(); + } + + // Helper to create a UIImage from an SF Symbol for testing. + UIImage* CreateTestSymbolImage(CGFloat size = 16.0) { + return DefaultSymbolWithPointSize(kInfoCircleSymbol, size); + } + + base::test::TaskEnvironment task_environment_; + search_engines::SearchEnginesTestEnvironment search_engines_test_environment_; + std::unique_ptr<MockFaviconLoader> mock_favicon_loader_; + PlaceholderService placeholder_service_; + raw_ptr<TemplateURL> default_search_provider_; +}; + +// Test that a bundled icon is returned for Google. +TEST_F(PlaceholderServiceTest, TestFetchingBundledIcon) { +#if BUILDFLAG(IOS_USE_BRANDED_SYMBOLS) + const CGFloat icon_size = kDesiredSmallFaviconSizePt; + TemplateURLData google_data; + google_data.SetShortName(u"Google"); + google_data.SetKeyword(u"google.com"); + google_data.SetURL("https://www.google.com/search?q={searchTerms}"); + google_data.prepopulate_id = 1; // Indicates Google + template_url_service().SetUserSelectedDefaultSearchProvider( + template_url_service().Add(std::make_unique<TemplateURL>(google_data))); + + __block UIImage* received_icon_final = nil; + __block int callback_count = 0; + __block std::unique_ptr<base::RunLoop> run_loop = + std::make_unique<base::RunLoop>(); + + EXPECT_CALL(*mock_favicon_loader_, FaviconForPageUrl(_, _, _, _, _)).Times(0); + EXPECT_CALL(*mock_favicon_loader_, FaviconForIconUrl(_, _, _, _)).Times(0); + + placeholder_service_.FetchDefaultSearchEngineIcon( + icon_size, base::BindRepeating(^(UIImage* icon) { + callback_count++; + if (!IsPlaceholderImage(icon, icon_size)) { + received_icon_final = icon; + run_loop->Quit(); + } + run_loop->QuitWhenIdle(); + })); + run_loop->Run(); + + ASSERT_NE(received_icon_final, nil); + UIImage* expected_bundled_icon = MakeSymbolMulticolor( + CustomSymbolWithPointSize(kGoogleIconSymbol, icon_size)); + EXPECT_TRUE(UIImagesAreEqual(received_icon_final, expected_bundled_icon)); + // Callback is invoked once with bundled icon. + EXPECT_EQ(callback_count, 1); +#endif +} + +// Test fetching an icon using FaviconLoader for a non-prepopulated DSE. +TEST_F(PlaceholderServiceTest, TestFetchingIconFromFaviconLoader) { + const CGFloat icon_size = kDesiredMediumFaviconSizePt; + UIImage* fetched_image = CreateTestSymbolImage(icon_size); + FaviconAttributes* fetched_attributes = + [FaviconAttributes attributesWithImage:fetched_image]; + + FaviconLoader::FaviconAttributesCompletionBlock favicon_callback_block; + EXPECT_CALL(*mock_favicon_loader_, + FaviconForIconUrl(GURL("http://test.com/favicon.ico"), icon_size, + icon_size, _)) + .WillOnce(SaveArg<3>(&favicon_callback_block)); + + __block UIImage* received_icon_final = nil; + __block int callback_count = 0; + __block std::unique_ptr<base::RunLoop> run_loop = + std::make_unique<base::RunLoop>(); + placeholder_service_.FetchDefaultSearchEngineIcon( + icon_size, base::BindRepeating(^(UIImage* icon) { + callback_count++; + if (callback_count == 1) { + EXPECT_TRUE(IsPlaceholderImage(icon, icon_size)); + } else if (callback_count == 2) { + received_icon_final = icon; + run_loop->Quit(); + } + run_loop->QuitWhenIdle(); + })); + + EXPECT_EQ(callback_count, 1); + ASSERT_TRUE(favicon_callback_block); + + favicon_callback_block(fetched_attributes); + run_loop->Run(); + + EXPECT_EQ(received_icon_final, fetched_image); + EXPECT_EQ(callback_count, 2); +} + +// Test that callback is not called if DSE changes during fetch, +// but future calls for the new DSE work. +TEST_F(PlaceholderServiceTest, TestDSESwitchesDuringFetch) { + const CGFloat icon_size = kDesiredSmallFaviconSizePt; + + // DSE1 is `default_search_provider_` with favicon + // "http://test.com/favicon.ico" + UIImage* dse1_fetched_image = CreateTestSymbolImage(icon_size); + FaviconAttributes* dse1_fetched_attributes = + [FaviconAttributes attributesWithImage:dse1_fetched_image]; + + FaviconLoader::FaviconAttributesCompletionBlock dse1_favicon_callback_block; + EXPECT_CALL(*mock_favicon_loader_, + FaviconForIconUrl(GURL("http://test.com/favicon.ico"), icon_size, + icon_size, _)) + .WillOnce(SaveArg<3>(&dse1_favicon_callback_block)); + + __block UIImage* received_icon_dse1_final = nil; + __block int callback_dse1_count = 0; + + // 1. Initial fetch for DSE1 + placeholder_service_.FetchDefaultSearchEngineIcon( + icon_size, base::BindRepeating(^(UIImage* icon) { + callback_dse1_count++; + if (!IsPlaceholderImage(icon, icon_size)) { + received_icon_dse1_final = icon; + } + })); + + // Should have received placeholder for DSE1 + EXPECT_EQ(callback_dse1_count, 1); + ASSERT_TRUE(dse1_favicon_callback_block); + + // 2. Set up DSE2 + TemplateURLData data_dse2; + data_dse2.SetShortName(u"TestEngine2"); + data_dse2.SetKeyword(u"test2"); + data_dse2.SetURL("http://test2.com/search?q={searchTerms}"); + data_dse2.favicon_url = GURL("http://test2.com/favicon.ico"); + TemplateURL* dse2 = + template_url_service().Add(std::make_unique<TemplateURL>(data_dse2)); + + UIImage* dse2_fetched_image = + CreateTestSymbolImage(icon_size); // Can be same image for simplicity + FaviconAttributes* dse2_fetched_attributes = + [FaviconAttributes attributesWithImage:dse2_fetched_image]; + ; + + // 3. Change DSE to DSE2 *before* DSE1 icon fetch completes + template_url_service().SetUserSelectedDefaultSearchProvider(dse2); + // TODO(crbug.com/424382890): Change is not propagated, remove this line when + // the bug is fixed. + placeholder_service_.OnTemplateURLServiceChanged(); + + // 4. Complete DSE1 icon fetch (which should now be ignored) + dse1_favicon_callback_block(dse1_fetched_attributes); + + // 5. Future call to fetch for new DSE (DSE2) + FaviconLoader::FaviconAttributesCompletionBlock dse2_favicon_callback_block; + EXPECT_CALL(*mock_favicon_loader_, + FaviconForIconUrl(GURL("http://test2.com/favicon.ico"), icon_size, + icon_size, _)) + .WillOnce(SaveArg<3>(&dse2_favicon_callback_block)); + + __block UIImage* received_icon_dse2_final = nil; + __block int callback_dse2_count = 0; + __block std::unique_ptr<base::RunLoop> run_loop = + std::make_unique<base::RunLoop>(); + placeholder_service_.FetchDefaultSearchEngineIcon( + icon_size, base::BindRepeating(^(UIImage* icon) { + callback_dse2_count++; + if (callback_dse2_count == 1) { + EXPECT_TRUE(IsPlaceholderImage(icon, icon_size)); + } else if (callback_dse2_count == 2) { + received_icon_dse2_final = icon; + run_loop->Quit(); + } + run_loop->QuitWhenIdle(); + })); + + // Should have received placeholder for DSE2 + EXPECT_EQ(callback_dse2_count, 1); + ASSERT_TRUE(dse2_favicon_callback_block); + + // 6. Complete DSE2 icon fetch + dse2_favicon_callback_block(dse2_fetched_attributes); + run_loop->Run(); + + // Callback for DSE1 should NOT have been called with the fetched icon + EXPECT_EQ(callback_dse1_count, 1); // Still 1, only placeholder + EXPECT_EQ(received_icon_dse1_final, nil); // Final icon not received for DSE1 + + // Callback for DSE2 should have been called with placeholder and then fetched + // icon + EXPECT_EQ(received_icon_dse2_final, dse2_fetched_image); + EXPECT_EQ(callback_dse2_count, 2); +} + +} // namespace
diff --git a/ios/chrome/browser/reminder_notifications/model/BUILD.gn b/ios/chrome/browser/reminder_notifications/model/BUILD.gn index ce153399..5d6e723 100644 --- a/ios/chrome/browser/reminder_notifications/model/BUILD.gn +++ b/ios/chrome/browser/reminder_notifications/model/BUILD.gn
@@ -18,13 +18,13 @@ "//ios/chrome/browser/reminder_notifications/coordinator", "//ios/chrome/browser/shared/model/browser", "//ios/chrome/browser/shared/model/prefs:pref_names", - "//ios/chrome/browser/shared/model/profile", "//ios/chrome/browser/shared/model/web_state_list", "//ios/chrome/browser/shared/public/features", "//ios/web/public", "//net", "//ui/base", "//ui/gfx", + "//url", ] frameworks = [ "Foundation.framework", @@ -46,10 +46,14 @@ "//ios/chrome/browser/push_notification/model:constants", "//ios/chrome/browser/push_notification/model:push_notification_client", "//ios/chrome/browser/reminder_notifications/coordinator", + "//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:browser_prefs", "//ios/chrome/browser/shared/model/prefs:pref_names", "//ios/chrome/browser/shared/model/profile/test", + "//ios/chrome/browser/shared/public/commands", "//ios/chrome/browser/shared/public/features", "//ios/chrome/test:test_support", "//ios/testing:block_swizzler",
diff --git a/ios/chrome/browser/reminder_notifications/model/reminder_notification_client.h b/ios/chrome/browser/reminder_notifications/model/reminder_notification_client.h index 3c83543..e28734d 100644 --- a/ios/chrome/browser/reminder_notifications/model/reminder_notification_client.h +++ b/ios/chrome/browser/reminder_notifications/model/reminder_notification_client.h
@@ -31,11 +31,6 @@ std::optional<UIBackgroundFetchResult> HandleNotificationReception( NSDictionary<NSString*, id>* notification) override; NSArray<UNNotificationCategory*>* RegisterActionableNotifications() override; - void OnSceneActiveForegroundBrowserReady() override; - - // Called when the scene becomes "active foreground" and the browser is - // ready. The closure will be called when all async operations are done. - void OnSceneActiveForegroundBrowserReady(base::OnceClosure closure); private: // Returns true if the client is permitted to schedule notifications. @@ -47,6 +42,15 @@ // Called when the relevant permissions Pref changes. void OnPermissionsPrefChanged(); + // Schedules new reminder notifications based on the current reminder data in + // Prefs. + void ScheduleNewReminders(); + + // Schedules new reminder notifications if they don't already exist in the + // notification center. + void ScheduleNewRemindersIfNeeded( + NSArray<UNNotificationRequest*>* pending_requests); + // Cancels all pending reminder notifications. void CancelAllNotifications(base::OnceClosure completion_handler); @@ -56,15 +60,16 @@ base::OnceClosure completion_handler, NSArray<UNNotificationRequest*>* requests); - // Schedules all notifications based on the current state of Prefs. - void ScheduleNotificationsFromPrefs(); - // Schedules a single reminder notification for `reminder_url` using // `reminder_details`. void ScheduleNotification(const GURL& reminder_url, const base::Value::Dict& reminder_details, std::string_view profile_name); + // Called upon completion of scheduling a single notification. Removes the + // corresponding Pref entry for `scheduled_url` if scheduling was successful. + void OnNotificationScheduled(const GURL& scheduled_url, NSError* error); + // Used to assert that asynchronous callback are invoked on the correct // sequence. SEQUENCE_CHECKER(sequence_checker_);
diff --git a/ios/chrome/browser/reminder_notifications/model/reminder_notification_client.mm b/ios/chrome/browser/reminder_notifications/model/reminder_notification_client.mm index 7a873b1..f72670c 100644 --- a/ios/chrome/browser/reminder_notifications/model/reminder_notification_client.mm +++ b/ios/chrome/browser/reminder_notifications/model/reminder_notification_client.mm
@@ -16,6 +16,7 @@ #import "base/values.h" #import "components/prefs/pref_change_registrar.h" #import "components/prefs/pref_service.h" +#import "components/prefs/scoped_user_pref_update.h" #import "ios/chrome/browser/push_notification/model/constants.h" #import "ios/chrome/browser/reminder_notifications/coordinator/reminder_notifications_mediator.h" #import "ios/chrome/browser/reminder_notifications/model/reminder_notification_builder.h" @@ -52,15 +53,39 @@ bool ReminderNotificationClient::CanHandleNotification( UNNotification* notification) { - // TODO(crbug.com/390432325): Handle reminder notification interactions. - return false; + return [notification.request.identifier + hasPrefix:kReminderNotificationsIdentifierPrefix]; } bool ReminderNotificationClient::HandleNotificationInteraction( UNNotificationResponse* response) { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - // TODO(crbug.com/390432325): Handle reminder notification interactions. - return false; + + if (!CanHandleNotification(response.notification)) { + return false; + } + + NSDictionary* user_info = response.notification.request.content.userInfo; + NSString* url_string = user_info[@"url"]; + + if (!url_string || url_string.length == 0) { + // TODO(crbug.com/390432325): Consider adding UMA logs for missing URL. + return false; + } + + GURL url(base::SysNSStringToUTF8(url_string)); + + if (!url.is_valid()) { + // TODO(crbug.com/390432325): Consider adding UMA logs for invalid URL. + return false; + } + + // TODO(crbug.com/422449238): Consider adding UMA logs for interaction + // handling. + + LoadUrlInNewTab(url); + + return true; } std::optional<UIBackgroundFetchResult> @@ -75,18 +100,6 @@ return @[]; } -void ReminderNotificationClient::OnSceneActiveForegroundBrowserReady() { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - OnSceneActiveForegroundBrowserReady(base::DoNothing()); -} - -void ReminderNotificationClient::OnSceneActiveForegroundBrowserReady( - base::OnceClosure closure) { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - // TODO(crbug.com/390432325): Handle reminder notification interactions. - std::move(closure).Run(); -} - bool ReminderNotificationClient::IsPermitted() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); @@ -101,22 +114,19 @@ void ReminderNotificationClient::OnReminderDataPrefChanged() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - // Schedule notifications based on Pref changes. Cancel existing notifications - // first, then schedule new ones based on current prefs. - CancelAllNotifications(base::BindOnce( - &ReminderNotificationClient::ScheduleNotificationsFromPrefs, - weak_ptr_factory_.GetWeakPtr())); + ScheduleNewReminders(); } void ReminderNotificationClient::OnPermissionsPrefChanged() { DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - // When permissions changes, re-evaluate scheduling. - // Cancel existing notifications first, then attempt to reschedule. - // `ScheduleNotificationsFromPrefs()` will check the new permission state. - CancelAllNotifications(base::BindOnce( - &ReminderNotificationClient::ScheduleNotificationsFromPrefs, - weak_ptr_factory_.GetWeakPtr())); + if (!IsPermitted()) { + CancelAllNotifications(base::DoNothing()); + + return; + } + + ScheduleNewReminders(); } void ReminderNotificationClient::CancelAllNotifications( @@ -154,52 +164,6 @@ std::move(completion_handler).Run(); } -void ReminderNotificationClient::ScheduleNotificationsFromPrefs() { - DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); - - // Do not schedule notifications if not permitted. - if (!IsPermitted()) { - return; - } - - ProfileIOS* current_profile = GetProfile(); - - PrefService* prefs = current_profile->GetPrefs(); - - const base::Value::Dict& reminders = - prefs->GetDict(prefs::kReminderNotifications); - - if (reminders.empty()) { - // TODO(crbug.com/422449238): Consider adding UMA/logging for this failure - // case. - return; - } - - for (auto it : reminders) { - const std::string& url = it.first; - const base::Value& details = it.second; - - GURL reminder_url(url); - - if (!reminder_url.is_valid()) { - // TODO(crbug.com/422449238): Consider adding UMA/logging for this failure - // case. - continue; - } - - const base::Value::Dict* reminder_details = details.GetIfDict(); - - if (!reminder_details) { - // TODO(crbug.com/422449238): Consider adding UMA/logging for this failure - // case. - continue; - } - - ScheduleNotification(reminder_url, *reminder_details, - current_profile->GetProfileName()); - } -} - void ReminderNotificationClient::ScheduleNotification( const GURL& reminder_url, const base::Value::Dict& reminder_details, @@ -247,5 +211,103 @@ ScheduledNotificationRequest request = [builder buildRequest]; - ScheduleProfileNotification(request, base::DoNothing(), profile_name); + ScheduleProfileNotification( + request, + base::BindOnce(&ReminderNotificationClient::OnNotificationScheduled, + weak_ptr_factory_.GetWeakPtr(), reminder_url), + profile_name); +} + +void ReminderNotificationClient::OnNotificationScheduled( + const GURL& scheduled_url, + NSError* error) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + + if (error) { + // TODO(crbug.com/422449238): Consider adding UMA for scheduling failures. + return; + } + + ProfileIOS* current_profile = GetProfile(); + + if (!current_profile) { + // Profile might have been destroyed before the callback ran. + + // TODO(crbug.com/422449238): Consider adding UMA for scheduling failures. + + return; + } + + PrefService* prefs = current_profile->GetPrefs(); + + ScopedDictPrefUpdate update(prefs, prefs::kReminderNotifications); + + update->Remove(scheduled_url.spec()); + + // TODO(crbug.com/422449238): Consider adding UMA for successful removal. +} + +void ReminderNotificationClient::ScheduleNewReminders() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + + if (!IsPermitted()) { + return; + } + + auto completion_block = base::CallbackToBlock(base::BindPostTask( + base::SequencedTaskRunner::GetCurrentDefault(), + base::BindOnce(&ReminderNotificationClient::ScheduleNewRemindersIfNeeded, + weak_ptr_factory_.GetWeakPtr()))); + + [[UNUserNotificationCenter currentNotificationCenter] + getPendingNotificationRequestsWithCompletionHandler:completion_block]; +} + +void ReminderNotificationClient::ScheduleNewRemindersIfNeeded( + NSArray<UNNotificationRequest*>* pending_requests) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + + ProfileIOS* current_profile = GetProfile(); + if (!current_profile || !IsPermitted()) { + return; + } + + PrefService* prefs = current_profile->GetPrefs(); + const base::Value::Dict& reminders_in_prefs = + prefs->GetDict(prefs::kReminderNotifications); + if (reminders_in_prefs.empty()) { + return; + } + + // Build a set of pending URLs for quick lookup. + std::set<std::string> pending_urls; + for (UNNotificationRequest* request in pending_requests) { + if (![request.identifier + hasPrefix:kReminderNotificationsIdentifierPrefix]) { + continue; + } + + NSString* url = request.content.userInfo[@"url"]; + pending_urls.insert(base::SysNSStringToUTF8(url)); + } + + // Iterate through reminders in prefs and schedule notifications only for URLs + // that exist in prefs but not in the notification center. + for (const auto [key, value] : reminders_in_prefs) { + GURL url(key); + + if (!url.is_valid()) { + continue; + } + + std::string url_string = url.spec(); + + if (pending_urls.find(url_string) == pending_urls.end()) { + const base::Value::Dict* details = value.GetIfDict(); + + if (details) { + ScheduleNotification(url, *details, current_profile->GetProfileName()); + } + } + } }
diff --git a/ios/chrome/browser/reminder_notifications/model/reminder_notification_client_unittests.mm b/ios/chrome/browser/reminder_notifications/model/reminder_notification_client_unittests.mm index 552d2bc0..94d6f74c 100644 --- a/ios/chrome/browser/reminder_notifications/model/reminder_notification_client_unittests.mm +++ b/ios/chrome/browser/reminder_notifications/model/reminder_notification_client_unittests.mm
@@ -8,6 +8,7 @@ #import "base/apple/foundation_util.h" #import "base/json/values_util.h" +#import "base/strings/sys_string_conversions.h" #import "base/test/scoped_feature_list.h" #import "base/test/task_environment.h" #import "components/pref_registry/pref_registry_syncable.h" @@ -18,10 +19,17 @@ #import "ios/chrome/browser/push_notification/model/push_notification_client.h" #import "ios/chrome/browser/reminder_notifications/coordinator/reminder_notifications_mediator.h" #import "ios/chrome/browser/reminder_notifications/model/reminder_notification_builder.h" +#import "ios/chrome/browser/shared/coordinator/scene/scene_state.h" #import "ios/chrome/browser/shared/model/application_context/application_context.h" +#import "ios/chrome/browser/shared/model/browser/browser_list.h" +#import "ios/chrome/browser/shared/model/browser/browser_list_factory.h" +#import "ios/chrome/browser/shared/model/browser/test/test_browser.h" #import "ios/chrome/browser/shared/model/prefs/browser_prefs.h" #import "ios/chrome/browser/shared/model/prefs/pref_names.h" #import "ios/chrome/browser/shared/model/profile/test/test_profile_ios.h" +#import "ios/chrome/browser/shared/public/commands/application_commands.h" +#import "ios/chrome/browser/shared/public/commands/command_dispatcher.h" +#import "ios/chrome/browser/shared/public/commands/open_new_tab_command.h" #import "ios/chrome/browser/shared/public/features/features.h" #import "ios/chrome/grit/ios_strings.h" #import "ios/chrome/test/ios_chrome_scoped_testing_local_state.h" @@ -44,6 +52,13 @@ builder.SetPrefService(CreatePrefService()); profile_ = std::move(builder).Build(); + mock_scene_state_ = OCMClassMock([SceneState class]); + OCMStub([mock_scene_state_ activationLevel]) + .andReturn(SceneActivationLevelForegroundActive); + browser_ = std::make_unique<TestBrowser>(profile_.get(), mock_scene_state_); + BrowserListFactory::GetForProfile(profile_.get()) + ->AddBrowser(browser_.get()); + client_ = std::make_unique<ReminderNotificationClient>(profile_.get()); } @@ -57,6 +72,14 @@ return prefs; } + // Creates a mock command handler for a given protocol and starts dispatching. + id MockHandler(Protocol* protocol) { + id mock_handler = OCMProtocolMock(protocol); + [browser_->GetCommandDispatcher() startDispatchingToTarget:mock_handler + forProtocol:protocol]; + return mock_handler; + } + // Sets up a mock notification center, so notification requests can be // tested. void SetupMockNotificationCenter() { @@ -111,7 +134,6 @@ void SetReminderPrefs(const base::Value::Dict& reminders) { profile_->GetPrefs()->SetDict(prefs::kReminderNotifications, reminders.Clone()); - task_environment_.RunUntilIdle(); } // Helper to set the reminder permission. @@ -119,7 +141,6 @@ ScopedDictPrefUpdate update(profile_->GetPrefs(), prefs::kFeaturePushNotificationPermissions); update->Set(kReminderNotificationKey, enabled); - task_environment_.RunUntilIdle(); } web::WebTaskEnvironment task_environment_{ @@ -131,6 +152,8 @@ std::unique_ptr<ReminderNotificationClient> client_; id mock_notification_center_; std::unique_ptr<ScopedBlockSwizzler> notification_center_swizzler_; + id mock_scene_state_; + std::unique_ptr<TestBrowser> browser_; }; #pragma mark - Test cases @@ -171,6 +194,7 @@ StubGetPendingRequests(nil); ExpectAddNotificationRequest(url); SetReminderPrefs(reminders); + task_environment_.RunUntilIdle(); EXPECT_OCMOCK_VERIFY(mock_notification_center_); } @@ -198,6 +222,7 @@ ExpectAddNotificationRequest(url1); ExpectAddNotificationRequest(url2); SetReminderPrefs(reminders); + task_environment_.RunUntilIdle(); EXPECT_OCMOCK_VERIFY(mock_notification_center_); } @@ -219,3 +244,158 @@ SetReminderPrefs(reminders); EXPECT_OCMOCK_VERIFY(mock_notification_center_); } + +// Tests that handling a notification interaction with a valid URL eventually +// dispatches a command to open that URL in a new tab. +TEST_F(ReminderNotificationClientTest, HandleInteractionOpensUrlInNewTab) { + GURL url_to_open("https://www.chromium.org/reminders"); + + id mock_application_handler = MockHandler(@protocol(ApplicationCommands)); + + OCMExpect([mock_application_handler + openURLInNewTab:[OCMArg checkWithBlock:^BOOL(OpenNewTabCommand* command) { + EXPECT_EQ(command.URL, url_to_open); + EXPECT_EQ(command.inIncognito, NO); + EXPECT_EQ(command.inBackground, NO); + return YES; + }]]); + + id mock_response = OCMClassMock([UNNotificationResponse class]); + id mock_notification = OCMClassMock([UNNotification class]); + id mock_request = OCMClassMock([UNNotificationRequest class]); + id mock_content = OCMClassMock([UNNotificationContent class]); + + OCMStub([mock_response notification]).andReturn(mock_notification); + OCMStub([mock_notification request]).andReturn(mock_request); + OCMStub([mock_request content]).andReturn(mock_content); + OCMStub([mock_request identifier]) + .andReturn(kReminderNotificationsIdentifierPrefix); + OCMStub([mock_content userInfo]).andReturn(@{ + @"url" : base::SysUTF8ToNSString(url_to_open.spec()) + }); + + ASSERT_TRUE(client_->HandleNotificationInteraction(mock_response)); + + client_->OnSceneActiveForegroundBrowserReady(); + + task_environment_.RunUntilIdle(); + + EXPECT_OCMOCK_VERIFY(mock_application_handler); +} + +// Test scheduling a single notification from Prefs and verifies Prefs removal. +TEST_F(ReminderNotificationClientTest, OneReminderInPrefsHasPrefRemoved) { + SetupMockNotificationCenter(); + SetReminderPermission(true); + GURL url("http://example.com/page1"); + base::Time reminder_time = base::Time::Now() + base::Minutes(10); + base::Value::Dict reminder_details; + reminder_details.Set(kReminderNotificationsTimeKey, + base::TimeToValue(reminder_time)); + base::Value::Dict reminders; + reminders.Set(url.spec(), std::move(reminder_details)); + + StubGetPendingRequests(nil); + ExpectAddNotificationRequest(url); + + // Set the prefs, which will trigger the scheduling logic. + SetReminderPrefs(reminders); + + // Verify the pref is initially set. + EXPECT_TRUE(profile_->GetPrefs() + ->GetDict(prefs::kReminderNotifications) + .contains(url.spec())); + + // Run pending tasks to allow the notification scheduling and its + // completion handler (which removes the pref) to execute. + task_environment_.RunUntilIdle(); + + // Verify the mock and that the pref has been removed. + EXPECT_OCMOCK_VERIFY(mock_notification_center_); + const base::Value::Dict& final_reminders = + profile_->GetPrefs()->GetDict(prefs::kReminderNotifications); + EXPECT_FALSE(final_reminders.contains(url.spec())); + EXPECT_TRUE(final_reminders.empty()); +} + +// Test scheduling multiple notifications from Prefs and verifies Prefs removal. +TEST_F(ReminderNotificationClientTest, + MultipleRemindersInPrefsHavePrefsRemoved) { + SetupMockNotificationCenter(); + SetReminderPermission(true); + GURL url1("http://example.com/page1"); + GURL url2("http://example.org/anotherpage"); + base::Time reminder_time1 = base::Time::Now() + base::Minutes(10); + base::Time reminder_time2 = base::Time::Now() + base::Minutes(20); + + base::Value::Dict details1; + details1.Set(kReminderNotificationsTimeKey, + base::TimeToValue(reminder_time1)); + base::Value::Dict details2; + details2.Set(kReminderNotificationsTimeKey, + base::TimeToValue(reminder_time2)); + + base::Value::Dict reminders; + reminders.Set(url1.spec(), std::move(details1)); + reminders.Set(url2.spec(), std::move(details2)); + + StubGetPendingRequests(nil); + ExpectAddNotificationRequest(url1); + ExpectAddNotificationRequest(url2); + + // Set the prefs, triggering scheduling. + SetReminderPrefs(reminders); + + // Verify prefs are initially set. + EXPECT_TRUE(profile_->GetPrefs() + ->GetDict(prefs::kReminderNotifications) + .contains(url1.spec())); + EXPECT_TRUE(profile_->GetPrefs() + ->GetDict(prefs::kReminderNotifications) + .contains(url2.spec())); + + // Run pending tasks. + task_environment_.RunUntilIdle(); + + // Verify mocks and pref removal. + EXPECT_OCMOCK_VERIFY(mock_notification_center_); + const base::Value::Dict& final_reminders = + profile_->GetPrefs()->GetDict(prefs::kReminderNotifications); + EXPECT_FALSE(final_reminders.contains(url1.spec())); + EXPECT_FALSE(final_reminders.contains(url2.spec())); + EXPECT_TRUE(final_reminders.empty()); +} + +// Tests that the client doesn't reschedule a reminder that is already pending +// in the notification center. +TEST_F(ReminderNotificationClientTest, DoesNotReschedulePendingReminder) { + SetupMockNotificationCenter(); + SetReminderPermission(true); + GURL url("http://example.com/page1"); + base::Time reminder_time = base::Time::Now() + base::Minutes(10); + + UNMutableNotificationContent* content = + [[UNMutableNotificationContent alloc] init]; + content.userInfo = @{@"url" : [net::NSURLWithGURL(url) absoluteString]}; + UNNotificationRequest* pending_request = + [UNNotificationRequest requestWithIdentifier:@"reminder_existing_123" + content:content + trigger:nil]; + StubGetPendingRequests(@[ pending_request ]); + + base::Value::Dict reminder_details; + reminder_details.Set(kReminderNotificationsTimeKey, + base::TimeToValue(reminder_time)); + base::Value::Dict reminders; + reminders.Set(url.spec(), std::move(reminder_details)); + SetReminderPrefs(reminders); + + OCMReject([mock_notification_center_ addNotificationRequest:[OCMArg any] + withCompletionHandler:[OCMArg any]]); + task_environment_.RunUntilIdle(); + EXPECT_OCMOCK_VERIFY(mock_notification_center_); + + EXPECT_TRUE(profile_->GetPrefs() + ->GetDict(prefs::kReminderNotifications) + .contains(url.spec())); +}
diff --git a/ios/chrome/browser/shared/ui/symbols/symbol_names.h b/ios/chrome/browser/shared/ui/symbols/symbol_names.h index 90d1945..cdbd118 100644 --- a/ios/chrome/browser/shared/ui/symbols/symbol_names.h +++ b/ios/chrome/browser/shared/ui/symbols/symbol_names.h
@@ -75,6 +75,7 @@ extern NSString* const kLanguageSymbol; extern NSString* const kLocationSymbol; extern NSString* const kPasswordSymbol; +extern NSString* const kCropSymbol; #if !BUILDFLAG(IS_IOS_MACCATALYST) extern NSString* const kMulticolorPasswordSymbol; #endif // BUILDFLAG(IS_IOS_MACCATALYST)
diff --git a/ios/chrome/browser/shared/ui/symbols/symbol_names.mm b/ios/chrome/browser/shared/ui/symbols/symbol_names.mm index 05844ef..758ad38 100644 --- a/ios/chrome/browser/shared/ui/symbols/symbol_names.mm +++ b/ios/chrome/browser/shared/ui/symbols/symbol_names.mm
@@ -81,6 +81,7 @@ NSString* const kLanguageSymbol = @"language"; NSString* const kLocationSymbol = @"location"; NSString* const kPasswordSymbol = @"password"; +NSString* const kCropSymbol = @"crop"; #if !BUILDFLAG(IS_IOS_MACCATALYST) NSString* const kMulticolorPasswordSymbol = @"multicolor_password"; #endif // BUILDFLAG(IS_IOS_MACCATALYST)
diff --git a/ios/chrome/browser/snapshots/model/snapshot_tab_helper.mm b/ios/chrome/browser/snapshots/model/snapshot_tab_helper.mm index 85199037..e86059cf 100644 --- a/ios/chrome/browser/snapshots/model/snapshot_tab_helper.mm +++ b/ios/chrome/browser/snapshots/model/snapshot_tab_helper.mm
@@ -113,13 +113,20 @@ void SnapshotTabHelper::UpdateSnapshotWithCallback(void (^callback)(UIImage*)) { was_loading_during_last_snapshot_ = web_state_->IsLoading(); + // `wrapped_callback` is possibly called multiple times as a completion + // handler in `takeSnapshotWithConfiguration:completionHandler:`. + __block void (^block_callback)(UIImage*) = callback; base::TimeTicks start_time = base::TimeTicks::Now(); void (^wrapped_callback)(UIImage*) = ^(UIImage* image) { base::TimeTicks end_time = base::TimeTicks::Now(); base::UmaHistogramTimes("IOS.Snapshots.UpdateSnapshotTime", end_time - start_time); - if (callback) { - callback(image); + + if (block_callback) { + block_callback(image); + // Nullify the callback to ensure that the original callback is called + // only once. + block_callback = nil; } };
diff --git a/ios/chrome/browser/webui/ui_bundled/crashes_ui.cc b/ios/chrome/browser/webui/ui_bundled/crashes_ui.cc index 6d088be6..b22dfa6 100644 --- a/ios/chrome/browser/webui/ui_bundled/crashes_ui.cc +++ b/ios/chrome/browser/webui/ui_bundled/crashes_ui.cc
@@ -131,7 +131,7 @@ return; } - std::string local_id = args[0].GetString(); + const std::string& local_id = args[0].GetString(); upload_list_->RequestSingleUploadAsync(local_id); }
diff --git a/ios/chrome/browser/webui/ui_bundled/omaha_ui.mm b/ios/chrome/browser/webui/ui_bundled/omaha_ui.mm index dc599751..d0de7e9 100644 --- a/ios/chrome/browser/webui/ui_bundled/omaha_ui.mm +++ b/ios/chrome/browser/webui/ui_bundled/omaha_ui.mm
@@ -73,7 +73,7 @@ void OmahaDOMHandler::HandleRequestDebugInformation( const base::Value::List& args) { CHECK_EQ(1u, args.size()); - std::string callback_id = args[0].GetString(); + const std::string& callback_id = args[0].GetString(); OmahaService::GetDebugInformation( base::BindOnce(&OmahaDOMHandler::OnDebugInformationAvailable,
diff --git a/ios/chrome/browser/webui/ui_bundled/on_device_llm_internals_ui.mm b/ios/chrome/browser/webui/ui_bundled/on_device_llm_internals_ui.mm index 543eaa5..f59778ec 100644 --- a/ios/chrome/browser/webui/ui_bundled/on_device_llm_internals_ui.mm +++ b/ios/chrome/browser/webui/ui_bundled/on_device_llm_internals_ui.mm
@@ -125,7 +125,7 @@ return; } - std::string input = args[0].GetString(); + const std::string& input = args[0].GetString(); VLOG(1) << "Init LLM and generate response..."; VLOG(1) << "query: " << input;
diff --git a/ios/chrome/browser/webui/ui_bundled/policy/policy_ui_handler.mm b/ios/chrome/browser/webui/ui_bundled/policy/policy_ui_handler.mm index 2218772..00012ad 100644 --- a/ios/chrome/browser/webui/ui_bundled/policy/policy_ui_handler.mm +++ b/ios/chrome/browser/webui/ui_bundled/policy/policy_ui_handler.mm
@@ -208,7 +208,7 @@ void PolicyUIHandler::HandleUploadReport(const base::Value::List& args) { upload_report_count_ += 1; DCHECK_EQ(1u, args.size()); - std::string callback_id = args[0].GetString(); + const std::string& callback_id = args[0].GetString(); auto* report_scheduler = GetApplicationContext() ->GetBrowserPolicyConnector() ->chrome_browser_cloud_management_controller() @@ -224,7 +224,7 @@ void PolicyUIHandler::HandleSetLocalTestPolicies( const base::Value::List& args) { - std::string json_policies_string = args[1].GetString(); + const std::string& json_policies_string = args[1].GetString(); if (!PolicyUI::ShouldLoadTestPage(ProfileIOS::FromWebUIIOS(web_ui()))) { web_ui()->ResolveJavascriptCallback(args[0], true); @@ -260,7 +260,7 @@ void PolicyUIHandler::HandleRestartBrowser(const base::Value::List& args) { CHECK(args.size() == 2); - std::string policies = args[1].GetString(); + const std::string& policies = args[1].GetString(); // Set policies to preference PrefService* prefs = GetApplicationContext()->GetLocalState();
diff --git a/ios/chrome/browser/webui/ui_bundled/profile_internals/profile_internals_handler.mm b/ios/chrome/browser/webui/ui_bundled/profile_internals/profile_internals_handler.mm index 8cea44e..ac067a8 100644 --- a/ios/chrome/browser/webui/ui_bundled/profile_internals/profile_internals_handler.mm +++ b/ios/chrome/browser/webui/ui_bundled/profile_internals/profile_internals_handler.mm
@@ -93,7 +93,7 @@ void ProfileInternalsHandler::HandleGetProfilesList( const base::Value::List& args) { CHECK_EQ(1u, args.size()); - std::string callback_id = args[0].GetString(); + const std::string& callback_id = args[0].GetString(); ProfileIOS* profile = ProfileIOS::FromWebUIIOS(web_ui()); web_ui()->ResolveJavascriptCallback(callback_id, GetProfilesList(profile));
diff --git a/ios/chrome/browser/webui/ui_bundled/signin_internals_ui_ios.cc b/ios/chrome/browser/webui/ui_bundled/signin_internals_ui_ios.cc index 8923c55..71fbbfa 100644 --- a/ios/chrome/browser/webui/ui_bundled/signin_internals_ui_ios.cc +++ b/ios/chrome/browser/webui/ui_bundled/signin_internals_ui_ios.cc
@@ -62,7 +62,8 @@ void SignInInternalsHandlerIOS::HandleGetSignInInfo( const base::Value::List& args) { CHECK_GE(args.size(), 1u); - std::string callback_id = args[0].GetString(); // CHECKs if non-string. + // CHECKs if non-string. + const std::string& callback_id = args[0].GetString(); base::Value callback(callback_id); base::Value success(true);
diff --git a/ios/chrome/browser/webui/ui_bundled/version_handler.cc b/ios/chrome/browser/webui/ui_bundled/version_handler.cc index 725384e..830e88b 100644 --- a/ios/chrome/browser/webui/ui_bundled/version_handler.cc +++ b/ios/chrome/browser/webui/ui_bundled/version_handler.cc
@@ -26,7 +26,7 @@ void VersionHandler::HandleRequestVariationInfo(const base::Value::List& args) { // Respond with the variations info immediately. CHECK_EQ(2U, args.size()); - std::string callback_id = args[0].GetString(); + const std::string& callback_id = args[0].GetString(); const bool return_raw_variations_cmd = args[1].GetBool(); base::Value::Dict response;
diff --git a/ios/web/public/ui/crw_web_view_proxy.h b/ios/web/public/ui/crw_web_view_proxy.h index 916edb6..a4b9ec5 100644 --- a/ios/web/public/ui/crw_web_view_proxy.h +++ b/ios/web/public/ui/crw_web_view_proxy.h
@@ -40,6 +40,9 @@ // back-forward list navigations. @property(nonatomic) BOOL allowsBackForwardNavigationGestures; +// Whether or not long pressing a link in the web view renders a link preview. +@property(nonatomic) BOOL allowsLinkPreview; + // Returns the webview's gesture recognizers. @property(nonatomic, readonly) NSArray* gestureRecognizers;
diff --git a/ios/web/web_state/ui/crw_web_controller.h b/ios/web/web_state/ui/crw_web_controller.h index 8a4cac2..77c75e65 100644 --- a/ios/web/web_state/ui/crw_web_controller.h +++ b/ios/web/web_state/ui/crw_web_controller.h
@@ -80,6 +80,9 @@ // back-forward list navigations. @property(nonatomic) BOOL allowsBackForwardNavigationGestures; +// Whether or not long pressing a link in the web view renders a link preview. +@property(nonatomic) BOOL allowsLinkPreview; + // Whether the WebController should attempt to keep the render process alive. @property(nonatomic, assign, getter=shouldKeepRenderProcessAlive) BOOL keepsRenderProcessAlive;
diff --git a/ios/web/web_state/ui/crw_web_controller.mm b/ios/web/web_state/ui/crw_web_controller.mm index 8a09931..0e48751 100644 --- a/ios/web/web_state/ui/crw_web_controller.mm +++ b/ios/web/web_state/ui/crw_web_controller.mm
@@ -221,6 +221,7 @@ _webUsageEnabled = YES; _allowsBackForwardNavigationGestures = YES; + _allowsLinkPreview = YES; DCHECK(_webStateImpl); // Content area is lazily instantiated. @@ -328,6 +329,14 @@ allowsBackForwardNavigationGestures; } +- (void)setAllowsLinkPreview:(BOOL)allowsLinkPreview { + // Store it to an instance variable as well as + // self.webView.allowsLinkPreview because self.webView may be nil. When + // self.webView is nil, it will be set later in -setWebView:. + _allowsLinkPreview = allowsLinkPreview; + self.webView.allowsLinkPreview = allowsLinkPreview; +} + #pragma mark - Private properties accessors - (void)setWebView:(WKWebView*)webView { @@ -373,6 +382,7 @@ _webView.allowsBackForwardNavigationGestures = _allowsBackForwardNavigationGestures; + _webView.allowsLinkPreview = _allowsLinkPreview; } self.webViewNavigationObserver.webView = _webView; @@ -1163,6 +1173,9 @@ _webView.allowsBackForwardNavigationGestures = _allowsBackForwardNavigationGestures; } + if (_webView.allowsLinkPreview != _allowsLinkPreview) { + _webView.allowsLinkPreview = _allowsLinkPreview; + } BOOL success = !context || !context->GetError(); [self loadCompleteWithSuccess:success forContext:context];
diff --git a/ios/web/web_state/ui/crw_web_controller_unittest.mm b/ios/web/web_state/ui/crw_web_controller_unittest.mm index 1cf0aaa..26e5b78 100644 --- a/ios/web/web_state/ui/crw_web_controller_unittest.mm +++ b/ios/web/web_state/ui/crw_web_controller_unittest.mm
@@ -212,6 +212,9 @@ OCMStub([result allowsBackForwardNavigationGestures]); OCMStub([result setAllowsBackForwardNavigationGestures:NO]); OCMStub([result setAllowsBackForwardNavigationGestures:YES]); + OCMStub([result allowsLinkPreview]); + OCMStub([result setAllowsLinkPreview:NO]); + OCMStub([result setAllowsLinkPreview:YES]); OCMStub([result isLoading]); OCMStub([result stopLoading]); OCMStub([result removeFromSuperview]); @@ -271,6 +274,13 @@ EXPECT_FALSE(web_controller().allowsBackForwardNavigationGestures); } +// Tests allowsLinkPreview default value and negating this property. +TEST_F(CRWWebControllerTest, SetAllowsLinkPreview) { + EXPECT_TRUE(web_controller().allowsLinkPreview); + web_controller().allowsLinkPreview = NO; + EXPECT_FALSE(web_controller().allowsLinkPreview); +} + // Tests that a web view is created after calling -[ensureWebViewCreated] and // check its user agent. TEST_F(CRWWebControllerTest, WebViewCreatedAfterEnsureWebViewCreated) {
diff --git a/ios/web/web_state/ui/crw_web_view_proxy_impl.mm b/ios/web/web_state/ui/crw_web_view_proxy_impl.mm index ee8111a..ad01e2dd 100644 --- a/ios/web/web_state/ui/crw_web_view_proxy_impl.mm +++ b/ios/web/web_state/ui/crw_web_view_proxy_impl.mm
@@ -101,6 +101,14 @@ allowsBackForwardNavigationGestures; } +- (BOOL)allowsLinkPreview { + return _webController.allowsLinkPreview; +} + +- (void)setAllowsLinkPreview:(BOOL)allowsLinkPreview { + _webController.allowsLinkPreview = allowsLinkPreview; +} + - (CGRect)bounds { return [_contentView bounds]; }
diff --git a/ios/web/web_state/ui/crw_web_view_proxy_impl_unittest.mm b/ios/web/web_state/ui/crw_web_view_proxy_impl_unittest.mm index d2493f2f..1b4f4fb 100644 --- a/ios/web/web_state/ui/crw_web_view_proxy_impl_unittest.mm +++ b/ios/web/web_state/ui/crw_web_view_proxy_impl_unittest.mm
@@ -78,4 +78,19 @@ EXPECT_OCMOCK_VERIFY((id)mockWebController); } +// Tests allowsLinkPreview property is delegated to CWVWebController. +TEST_F(CRWWebViewProxyImplTest, AllowsLinkPreview) { + CRWWebController* mockWebController = + OCMStrictClassMock([CRWWebController class]); + CRWWebViewProxyImpl* proxy = + [[CRWWebViewProxyImpl alloc] initWithWebController:mockWebController]; + + OCMStub([mockWebController allowsLinkPreview]).andReturn(YES); + EXPECT_TRUE(proxy.allowsLinkPreview); + + OCMExpect([mockWebController setAllowsLinkPreview:YES]); + proxy.allowsLinkPreview = YES; + EXPECT_OCMOCK_VERIFY((id)mockWebController); +} + } // namespace
diff --git a/ios/web_view/internal/cwv_web_view.mm b/ios/web_view/internal/cwv_web_view.mm index 14e6113..5e15a36 100644 --- a/ios/web_view/internal/cwv_web_view.mm +++ b/ios/web_view/internal/cwv_web_view.mm
@@ -555,6 +555,21 @@ allowsBackForwardNavigationGestures; } +- (BOOL)allowsLinkPreview { + if (![self isWebStateSafeToUse]) { + return NO; + } + + return _webState->GetWebViewProxy().allowsLinkPreview; +} + +- (void)setAllowsLinkPreview:(BOOL)allowsLinkPreview { + if (![self isWebStateSafeToUse]) { + return; + } + _webState->GetWebViewProxy().allowsLinkPreview = allowsLinkPreview; +} + - (void)dealloc { if (_webState) { if (_webStateObserver) { @@ -1089,6 +1104,7 @@ BOOL allowsBackForwardNavigationGestures = self.allowsBackForwardNavigationGestures; + BOOL allowsLinkPreview = self.allowsLinkPreview; // CWVWebView does not support unrealized WebState, so ignore the // over-realization check (this simply reset the recent realization @@ -1149,6 +1165,7 @@ _webState->GetWebViewProxy().allowsBackForwardNavigationGestures = allowsBackForwardNavigationGestures; + _webState->GetWebViewProxy().allowsLinkPreview = allowsLinkPreview; if (_translationController) { id<CWVTranslationControllerDelegate> delegate =
diff --git a/ios/web_view/public/cwv_defines.h b/ios/web_view/public/cwv_defines.h index 99ac5bf..23f46ff8 100644 --- a/ios/web_view/public/cwv_defines.h +++ b/ios/web_view/public/cwv_defines.h
@@ -120,4 +120,7 @@ // Supports timestamps in the CWVAutofillDataManager #define IOS_WEB_VIEW_CWV_AUTOFILL_DATA_MANAGER_TIMESTAMPS 1 +// Supports -[CWVWebView allowsLinkPreview]. +#define IOS_WEB_VIEW_SUPPORTS_ALLOWS_LINK_PREVIEW 1 + #endif // IOS_WEB_VIEW_PUBLIC_CWV_DEFINES_H_
diff --git a/ios/web_view/public/cwv_web_view.h b/ios/web_view/public/cwv_web_view.h index 1c1cca4c..9f65788 100644 --- a/ios/web_view/public/cwv_web_view.h +++ b/ios/web_view/public/cwv_web_view.h
@@ -119,6 +119,9 @@ // back-forward list navigations. @property(nonatomic) BOOL allowsBackForwardNavigationGestures; +// Whether or not long pressing a link in the web view renders a link preview. +@property(nonatomic) BOOL allowsLinkPreview; + // The web view's autofill controller. @property(nonatomic, readonly) CWVAutofillController* autofillController;
diff --git a/ios_internal b/ios_internal index b254cb4..6f93402 160000 --- a/ios_internal +++ b/ios_internal
@@ -1 +1 @@ -Subproject commit b254cb46f918229d29978dcd9685439f27798668 +Subproject commit 6f934023958e0f948212f4743697f175669da13b
diff --git a/media/renderers/video_resource_updater.cc b/media/renderers/video_resource_updater.cc index fdd60140..1b31578 100644 --- a/media/renderers/video_resource_updater.cc +++ b/media/renderers/video_resource_updater.cc
@@ -966,9 +966,13 @@ auto* dest_ptr = upload_pixels_[0].get() + video_frame->visible_rect().y() * bytes_per_row + video_frame->visible_rect().x() * sizeof(uint32_t); + // Alpha can be premul for videos that can be delegated/overlaid. + bool premultiply_alpha = + hardware_resource->shared_image()->alpha_type() == kPremul_SkAlphaType + ? true + : false; PaintCanvasVideoRenderer::ConvertVideoFrameToRGBPixels( - video_frame.get(), dest_ptr, bytes_per_row, - /*premultiply_alpha=*/false); + video_frame.get(), dest_ptr, bytes_per_row, premultiply_alpha); source_pixels = upload_pixels_[0].get(); } @@ -983,7 +987,8 @@ viz::ToClosestSkColorType(resource_format, /*plane_index=*/0); auto info = SkImageInfo::Make( gfx::SizeToSkISize(hardware_resource->size()), color_type, - hardware_resource->shared_image()->alpha_type()); + hardware_resource->shared_image()->alpha_type(), + hardware_resource->shared_image()->color_space().ToSkColorSpace()); SkPixmap pixmap(info, source_pixels, bytes_per_row); ri->WritePixels( hardware_resource->shared_image()->mailbox(), /*dst_x_offset=*/0, @@ -1174,6 +1179,13 @@ gfx::ColorSpace output_color_space = video_frame->ColorSpace(); SkAlphaType output_alpha_type = software_compositor() ? kPremul_SkAlphaType : kUnpremul_SkAlphaType; + if (!software_compositor() && use_gpu_memory_buffer_resources_ && + context_provider_->SharedImageInterface() + ->GetCapabilities() + .supports_scanout_shared_images) { + // Overlays can only work with Premul alpha types. + output_alpha_type = kPremul_SkAlphaType; + } // `output_si_format` can be single plane if we're using software compositor // or frame format is 32 bit RGB or we are unable to display frame format as
diff --git a/net/http/transport_security_state_static.pins b/net/http/transport_security_state_static.pins index 574ec797..c1019fe 100644 --- a/net/http/transport_security_state_static.pins +++ b/net/http/transport_security_state_static.pins
@@ -43,9 +43,9 @@ # hash function for preloaded entries again (we have already done so once). # -# Last updated: 2025-06-15 13:01 UTC +# Last updated: 2025-06-16 12:53 UTC PinsListTimestamp -1749992496 +1750078406 TestSPKI sha256/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA=
diff --git a/net/http/transport_security_state_static_pins.json b/net/http/transport_security_state_static_pins.json index beb573d..4901c123 100644 --- a/net/http/transport_security_state_static_pins.json +++ b/net/http/transport_security_state_static_pins.json
@@ -31,7 +31,7 @@ // the 'static_spki_hashes' and 'bad_static_spki_hashes' fields in 'pinsets' // refer to, and the timestamp at which the pins list was last updated. // -// Last updated: 2025-06-15 13:01 UTC +// Last updated: 2025-06-16 12:53 UTC // { "pinsets": [
diff --git a/sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc b/sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc index 7bde5011..1df0b22 100644 --- a/sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc +++ b/sandbox/linux/seccomp-bpf-helpers/baseline_policy.cc
@@ -187,13 +187,12 @@ if (sysno == __NR_fcntl) return RestrictFcntlCommands(); -#if defined(__i386__) || defined(__arm__) || \ - (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) +#if !defined(__LP64__) if (sysno == __NR_fcntl64) return RestrictFcntlCommands(); #endif -#if !defined(__aarch64__) +#if defined(__NR_fork) // fork() is never used as a system call (clone() is used instead), but we // have seen it in fallback code on Android. if (sysno == __NR_fork) { @@ -203,16 +202,15 @@ #if defined(__NR_vfork) // vfork() is almost never used as a system call, but some libc versions (e.g. - // older versions of bionic) might use it in a posix_spawn() implementation, - // which is used by system(); + // 32-bit versions of bionic) use it in a posix_spawn() implementation, + // which is used by system(). if (sysno == __NR_vfork) { return Error(EPERM); } #endif if (sysno == __NR_futex -#if defined(__i386__) || defined(__arm__) || \ - (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) +#if !defined(__LP64__) || sysno == __NR_futex_time64 #endif ) { @@ -254,14 +252,14 @@ .Else(Error(EPERM)); } + // TODO(crbug.com/40528912): should i386 really be in this list? #if defined(__i386__) || defined(__x86_64__) || defined(__mips__) || \ defined(__aarch64__) if (sysno == __NR_mmap) return RestrictMmapFlags(); #endif -#if defined(__i386__) || defined(__arm__) || \ - (defined(ARCH_CPU_MIPS_FAMILY) && defined(ARCH_CPU_32_BITS)) +#if !defined(__LP64__) if (sysno == __NR_mmap2) return RestrictMmapFlags(); #endif @@ -275,8 +273,7 @@ if (sysno == __NR_prctl) return RestrictPrctl(); -#if defined(__x86_64__) || defined(__arm__) || defined(__mips__) || \ - defined(__aarch64__) + // (Note that i386 may also use socketcall() for this, handled below.) if (sysno == __NR_socketpair) { // Only allow AF_UNIX, PF_UNIX. Crash if anything else is seen. static_assert(AF_UNIX == PF_UNIX, @@ -284,7 +281,6 @@ const Arg<int> domain(0); return If(domain == AF_UNIX, Allow()).Else(CrashSIGSYS()); } -#endif // On Android, for https://crbug.com/701137. // On Desktop, for https://crbug.com/741984. @@ -345,15 +341,14 @@ return RestrictSocketcallCommand(); #endif -#if !defined(__i386__) if (sysno == __NR_getsockopt || sysno ==__NR_setsockopt) { // Used by Mojo EDK to catch a message pipe being sent over itself. + // TODO(crbug.com/40528912): is this still needed? const Arg<int> level(1); const Arg<int> optname(2); return If(AllOf(level == SOL_SOCKET, optname == SO_PEEK_OFF), Allow()) .Else(CrashSIGSYS()); } -#endif // https://crbug.com/644759 // https://chromium-review.googlesource.com/c/crashpad/crashpad/+/3278691 @@ -366,7 +361,7 @@ // Allow creating pipes, but don't allow weird flags to pipe2(). // O_NOTIFICATION_PIPE (== O_EXCL) can be used to create // "notification pipes", which are rarely used. -#if !defined(__aarch64__) +#if defined(__NR_pipe) if (sysno == __NR_pipe) { return Allow(); }
diff --git a/services/device/battery/battery_status_manager_mac.cc b/services/device/battery/battery_status_manager_mac.cc index 97d4252..22e2be7 100644 --- a/services/device/battery/battery_status_manager_mac.cc +++ b/services/device/battery/battery_status_manager_mac.cc
@@ -9,10 +9,17 @@ #include <IOKit/ps/IOPowerSources.h> #include <memory> +#include <optional> #include <vector> #include "base/apple/foundation_util.h" #include "base/apple/scoped_cftyperef.h" +#include "base/feature_list.h" +#include "base/features.h" +#include "base/functional/bind.h" +#include "base/task/task_traits.h" +#include "base/task/thread_pool.h" +#include "base/threading/scoped_blocking_call.h" #include "base/time/time.h" namespace device { @@ -106,9 +113,17 @@ } } -std::vector<mojom::BatteryStatus> GetInternalBatteriesStates() { +std::vector<mojom::BatteryStatus> GetInternalBatteriesStates(bool may_block) { std::vector<mojom::BatteryStatus> internal_sources; + // This function is known to block but cannot always be tagged as such right + // now because it might run on the UI thread. When running on the ThreadPool + // though it should be appropriately tagged. + std::optional<base::ScopedBlockingCall> scoped_blocking_call; + if (may_block) { + scoped_blocking_call.emplace(FROM_HERE, base::BlockingType::MAY_BLOCK); + } + base::apple::ScopedCFTypeRef<CFTypeRef> info(IOPSCopyPowerSourcesInfo()); base::apple::ScopedCFTypeRef<CFArrayRef> power_sources_list( IOPSCopyPowerSourcesList(info.get())); @@ -140,9 +155,8 @@ return internal_sources; } -void OnBatteryStatusChanged(const BatteryCallback& callback) { - std::vector<mojom::BatteryStatus> batteries(GetInternalBatteriesStates()); - +void HandleNewBatteryStatus(const BatteryCallback& callback, + std::vector<mojom::BatteryStatus> batteries) { if (batteries.empty()) { callback.Run(mojom::BatteryStatus()); return; @@ -155,6 +169,17 @@ callback.Run(batteries.front()); } +void OnBatteryStatusChangedAsync(const BatteryCallback& callback) { + base::ThreadPool::PostTaskAndReplyWithResult( + FROM_HERE, {base::MayBlock()}, + base::BindOnce(&GetInternalBatteriesStates, true), + base::BindOnce(&HandleNewBatteryStatus, callback)); +} + +void OnBatteryStatusChanged(const BatteryCallback& callback) { + HandleNewBatteryStatus(callback, GetInternalBatteriesStates(false)); +} + class BatteryStatusObserver { public: explicit BatteryStatusObserver(const BatteryCallback& callback) @@ -195,7 +220,11 @@ private: static void CallOnBatteryStatusChanged(void* callback) { - OnBatteryStatusChanged(*static_cast<BatteryCallback*>(callback)); + if (base::FeatureList::IsEnabled(base::features::kReducePPMs)) { + OnBatteryStatusChangedAsync(*static_cast<BatteryCallback*>(callback)); + } else { + OnBatteryStatusChanged(*static_cast<BatteryCallback*>(callback)); + } } BatteryCallback callback_;
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 05f9701..6396c6a 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
@@ -12,7 +12,7 @@ /** An {@link android.app.Activity} for running native browser tests. */ public abstract class NativeBrowserTestActivity extends FragmentActivity { - private static final String TAG = "NativeTest"; + private static final String TAG = "NativeTestActivity"; private final NativeTest mTest = new NativeTest(); private boolean mStarted; @@ -44,7 +44,9 @@ if (mStarted) return; mStarted = true; - NativeBrowserTest.deletePrivateDataDirectory(getPrivateDataDirectory()); + if (!mTest.shouldKeepUserDataDir()) { + NativeBrowserTest.deletePrivateDataDirectory(getPrivateDataDirectory()); + } initializeBrowserProcess(); }
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 f0c7a91..ecde6d1 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
@@ -33,6 +33,7 @@ private final StringBuilder mCommandLineFlags = new StringBuilder(); private TestStatusReporter mReporter; private boolean mRunInSubThread; + private boolean mKeepUserDataDir; private String mStdoutFilePath; private static class ReportingUncaughtExceptionHandler @@ -81,6 +82,10 @@ mReporter, Thread.getDefaultUncaughtExceptionHandler())); } + public boolean shouldKeepUserDataDir() { + return mKeepUserDataDir; + } + private void parseArgumentsFromIntent(Activity activity, Intent intent) { Log.i(TAG, "Extras:"); Bundle extras = intent.getExtras(); @@ -107,6 +112,11 @@ mRunInSubThread = intent.hasExtra(NativeTestIntent.EXTRA_RUN_IN_SUB_THREAD); + mKeepUserDataDir = intent.getBooleanExtra(NativeTestIntent.EXTRA_KEEP_USER_DATA_DIR, false); + if (mKeepUserDataDir) { + Log.i(TAG, "user data dir is kept for the tests."); + } + String gtestFilter = intent.getStringExtra(NativeTestIntent.EXTRA_GTEST_FILTER); if (gtestFilter != null) { appendCommandLineFlags("--gtest_filter=" + gtestFilter);
diff --git a/testing/variations/fieldtrial_testing_config.json b/testing/variations/fieldtrial_testing_config.json index 9ff2cb8..fe37291 100644 --- a/testing/variations/fieldtrial_testing_config.json +++ b/testing/variations/fieldtrial_testing_config.json
@@ -13394,7 +13394,19 @@ "enable_features": [ "KeepDefaultSearchEngineRendererAlive", "TrackEmptyRendererProcessesForReuse" + ], + "disable_features": [ + "ProcessPerSiteForDSE" ] + }, + { + "name": "EnabledDSEKeepAliveWithProcessSharing", + "enable_features": [ + "KeepDefaultSearchEngineRendererAlive", + "ProcessPerSiteForDSE", + "TrackEmptyRendererProcessesForReuse" + ], + "disable_features": [] } ] } @@ -15422,6 +15434,26 @@ ] } ], + "NoLateBeginFrames": [ + { + "platforms": [ + "android", + "android_webview", + "chromeos", + "linux", + "mac", + "windows" + ], + "experiments": [ + { + "name": "Enabled", + "enable_features": [ + "NoLateBeginFrames" + ] + } + ] + } + ], "NoPasswordSuggestionFiltering": [ { "platforms": [
diff --git a/third_party/android_deps/autorolled/build.gradle.template b/third_party/android_deps/autorolled/build.gradle.template index e92336d..3857dd2 100644 --- a/third_party/android_deps/autorolled/build.gradle.template +++ b/third_party/android_deps/autorolled/build.gradle.template
@@ -52,6 +52,8 @@ compileLatest "com.google.android.gms:play-services-tasks:+" compileLatest "com.google.android.gms:play-services-vision-common:+" compileLatest "com.google.android.gms:play-services-vision:+" + + compileLatest 'com.airbnb.android:lottie:+' } task setUpRepository(type: BuildConfigGenerator) {
diff --git a/third_party/angle b/third_party/angle index 94ee620..dfefcbc6 160000 --- a/third_party/angle +++ b/third_party/angle
@@ -1 +1 @@ -Subproject commit 94ee620d2e2f771d350e14ca90804bf1457834d3 +Subproject commit dfefcbc68cc3627e6cd80c83ce67815fb5b6efd9
diff --git a/third_party/blink/public/common/input/web_pointer_properties.h b/third_party/blink/public/common/input/web_pointer_properties.h index 45e7be5..292b51e 100644 --- a/third_party/blink/public/common/input/web_pointer_properties.h +++ b/third_party/blink/public/common/input/web_pointer_properties.h
@@ -18,8 +18,8 @@ // This class encapsulates the properties that are common between mouse and // pointer events and touch points as we transition towards the unified pointer // event model. -// TODO(mustaq): Unify WebTouchPoint & WebMouseEvent into WebPointerEvent. -// crbug.com/508283 +// TODO(crbug.com/41371756): Unify WebTouchPoint & WebMouseEvent into +// WebPointerEvent. class WebPointerProperties { public: using Button = mojom::Button;
diff --git a/third_party/blink/public/common/input/web_touch_event.h b/third_party/blink/public/common/input/web_touch_event.h index 38a339b..32a38e5 100644 --- a/third_party/blink/public/common/input/web_touch_event.h +++ b/third_party/blink/public/common/input/web_touch_event.h
@@ -14,7 +14,7 @@ // WebTouchEvent -------------------------------------------------------------- -// TODO(e_hakkinen): Replace with WebPointerEvent. crbug.com/508283 +// TODO(crbug.com/41371756): Replace with WebPointerEvent. class BLINK_COMMON_EXPORT WebTouchEvent : public WebInputEvent { public: // Maximum number of simultaneous touches supported on
diff --git a/third_party/blink/public/common/input/web_touch_point.h b/third_party/blink/public/common/input/web_touch_point.h index 95593eda..08e822ab 100644 --- a/third_party/blink/public/common/input/web_touch_point.h +++ b/third_party/blink/public/common/input/web_touch_point.h
@@ -37,8 +37,8 @@ namespace blink { -// TODO(mustaq): Unify WebTouchPoint & WebMouseEvent into WebPointerEvent. -// crbug.com/508283 +// TODO(crbug.com/41371756): Unify WebTouchPoint & WebMouseEvent into +// WebPointerEvent. class BLINK_COMMON_EXPORT WebTouchPoint : public WebPointerProperties { public: WebTouchPoint() : WebTouchPoint(WebPointerProperties(0)) {}
diff --git a/third_party/blink/public/web/modules/service_worker/web_service_worker_context_client.h b/third_party/blink/public/web/modules/service_worker/web_service_worker_context_client.h index 9b2dc42..f96781a04 100644 --- a/third_party/blink/public/web/modules/service_worker/web_service_worker_context_client.h +++ b/third_party/blink/public/web/modules/service_worker/web_service_worker_context_client.h
@@ -113,9 +113,6 @@ WebServiceWorkerContextProxy*, scoped_refptr<base::SequencedTaskRunner> worker_task_runner) {} - // Called before preparing v8 script engine for evaluation. - virtual void WillPrepareForEvaluation(v8::Local<v8::Context> v8_context) {} - // Called immediately before V8 script evaluation starts for the main script. // This means all setup is finally complete: the script has been loaded, the // worker thread has started, the script has been passed to the worker thread,
diff --git a/third_party/blink/public/web/web_v8_features.h b/third_party/blink/public/web/web_v8_features.h index f735897..6e540fe 100644 --- a/third_party/blink/public/web/web_v8_features.h +++ b/third_party/blink/public/web/web_v8_features.h
@@ -58,9 +58,6 @@ // Send isolate priority change notification to worker thread isolates. static void SetIsolatePriority(base::Process::Priority priority); - // Whether `WebV8Features` is supported for the given v8 context. - static bool IsSupported(v8::Local<v8::Context>); - private: WebV8Features() = delete; };
diff --git a/third_party/blink/renderer/core/exported/web_v8_features.cc b/third_party/blink/renderer/core/exported/web_v8_features.cc index 1ce89f4..160cec84 100644 --- a/third_party/blink/renderer/core/exported/web_v8_features.cc +++ b/third_party/blink/renderer/core/exported/web_v8_features.cc
@@ -43,8 +43,7 @@ } v8::Isolate* isolate = context->GetIsolate(); ScriptState* script_state = ScriptState::From(isolate, context); - DCHECK(script_state->World().IsMainWorld() || - script_state->World().IsWorkerOrWorkletWorld()); + DCHECK(script_state->World().IsMainWorld()); ContextFeatureSettings::From( ExecutionContext::From(script_state), ContextFeatureSettings::CreationMode::kCreateIfNotExists) @@ -139,9 +138,4 @@ WorkerBackingThread::SetWorkerThreadIsolatesPriority(isolate_priority); } -// static -bool WebV8Features::IsSupported(v8::Local<v8::Context> context) { - return blink::ExecutionContext::From(context); -} - } // namespace blink
diff --git a/third_party/blink/renderer/core/workers/dedicated_worker_global_scope.cc b/third_party/blink/renderer/core/workers/dedicated_worker_global_scope.cc index 123d1e46..0580966 100644 --- a/third_party/blink/renderer/core/workers/dedicated_worker_global_scope.cc +++ b/third_party/blink/renderer/core/workers/dedicated_worker_global_scope.cc
@@ -276,9 +276,6 @@ InitContentSecurityPolicyFromVector(std::move(csp_list)); BindContentSecurityPolicyToExecutionContext(); - // Allows `ContextFeatureSettings` to update before preparing script engine. - ReportingProxy().WillPrepareForEvaluation(); - // This should be called after OriginTrialContext::AddTokens() to install // origin trial features in JavaScript's global object. // DedicatedWorkerGlobalScope inherits the outside's OriginTrialTokens in the
diff --git a/third_party/blink/renderer/core/workers/shared_worker_global_scope.cc b/third_party/blink/renderer/core/workers/shared_worker_global_scope.cc index fc26ac9a..905f866 100644 --- a/third_party/blink/renderer/core/workers/shared_worker_global_scope.cc +++ b/third_party/blink/renderer/core/workers/shared_worker_global_scope.cc
@@ -113,9 +113,6 @@ OriginTrialContext::AddTokens(this, response_origin_trial_tokens); - // Allows `ContextFeatureSettings` to update before preparing script engine. - ReportingProxy().WillPrepareForEvaluation(); - // This should be called after OriginTrialContext::AddTokens() to install // origin trial features in JavaScript's global object. ScriptController()->PrepareForEvaluation();
diff --git a/third_party/blink/renderer/core/workers/worker_reporting_proxy.h b/third_party/blink/renderer/core/workers/worker_reporting_proxy.h index 0c14796..54c24e6 100644 --- a/third_party/blink/renderer/core/workers/worker_reporting_proxy.h +++ b/third_party/blink/renderer/core/workers/worker_reporting_proxy.h
@@ -85,9 +85,6 @@ // or InstalledScriptsManager). virtual void DidFailToFetchModuleScript() {} - // Invoked before preparing script engine for evaluation. - virtual void WillPrepareForEvaluation() {} - // Invoked when the main classic/module script is about to be evaluated. virtual void WillEvaluateScript() {}
diff --git a/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler.cc b/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler.cc index d8c871d..832d63c 100644 --- a/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler.cc +++ b/third_party/blink/renderer/modules/mediarecorder/media_recorder_handler.cc
@@ -46,6 +46,7 @@ #include "third_party/blink/renderer/core/frame/local_frame.h" #include "third_party/blink/renderer/core/inspector/console_message.h" #include "third_party/blink/renderer/modules/mediarecorder/media_recorder.h" +#include "third_party/blink/renderer/modules/mediarecorder/video_track_recorder.h" #include "third_party/blink/renderer/modules/mediastream/media_stream_video_track.h" #include "third_party/blink/renderer/platform/bindings/exception_code.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h"
diff --git a/third_party/blink/renderer/modules/mediarecorder/track_recorder.cc b/third_party/blink/renderer/modules/mediarecorder/track_recorder.cc index 6c3c950..2745d2a 100644 --- a/third_party/blink/renderer/modules/mediarecorder/track_recorder.cc +++ b/third_party/blink/renderer/modules/mediarecorder/track_recorder.cc
@@ -19,7 +19,7 @@ } else if (EqualIgnoringASCIICase(type, "video/webm")) { return MediaTrackContainerType::kVideoWebM; } else if (EqualIgnoringASCIICase(type, "video/x-matroska")) { - return MediaTrackContainerType::kVidoMatroska; + return MediaTrackContainerType::kVideoMatroska; } else if (EqualIgnoringASCIICase(type, "audio/mp4")) { return MediaTrackContainerType::kAudioMp4; } else if (EqualIgnoringASCIICase(type, "audio/webm")) {
diff --git a/third_party/blink/renderer/modules/mediarecorder/track_recorder.h b/third_party/blink/renderer/modules/mediarecorder/track_recorder.h index 0325823..5d5901cb 100644 --- a/third_party/blink/renderer/modules/mediarecorder/track_recorder.h +++ b/third_party/blink/renderer/modules/mediarecorder/track_recorder.h
@@ -50,7 +50,7 @@ kNone, kVideoMp4, kVideoWebM, - kVidoMatroska, + kVideoMatroska, kAudioMp4, kAudioWebM, };
diff --git a/third_party/blink/renderer/modules/mediarecorder/video_track_recorder.cc b/third_party/blink/renderer/modules/mediarecorder/video_track_recorder.cc index 44624a6..38ccb7d 100644 --- a/third_party/blink/renderer/modules/mediarecorder/video_track_recorder.cc +++ b/third_party/blink/renderer/modules/mediarecorder/video_track_recorder.cc
@@ -39,6 +39,7 @@ #include "third_party/blink/public/platform/web_graphics_context_3d_provider.h" #include "third_party/blink/renderer/modules/mediarecorder/media_recorder_encoder_wrapper.h" #include "third_party/blink/renderer/modules/mediarecorder/media_recorder_handler.h" +#include "third_party/blink/renderer/modules/mediarecorder/track_recorder.h" #include "third_party/blink/renderer/modules/mediastream/media_stream_video_track.h" #include "third_party/blink/renderer/platform/graphics/web_graphics_context_3d_provider_util.h" #include "third_party/blink/renderer/platform/heap/persistent.h" @@ -126,20 +127,46 @@ namespace { -static const struct { +constexpr MediaTrackContainerType kVp8Types[] = { + MediaTrackContainerType::kVideoMatroska, + MediaTrackContainerType::kVideoWebM}; +constexpr MediaTrackContainerType kVp9Types[] = { + MediaTrackContainerType::kVideoMatroska, + MediaTrackContainerType::kVideoWebM, MediaTrackContainerType::kVideoMp4}; +#if BUILDFLAG(USE_PROPRIETARY_CODECS) +constexpr MediaTrackContainerType kH264Types[] = { + MediaTrackContainerType::kVideoMatroska, + MediaTrackContainerType::kVideoMp4}; +#endif +constexpr MediaTrackContainerType kAv1Types[] = { + MediaTrackContainerType::kVideoWebM, + MediaTrackContainerType::kVideoMatroska, + MediaTrackContainerType::kVideoMp4}; +#if BUILDFLAG(ENABLE_HEVC_PARSER_AND_HW_DECODER) +constexpr MediaTrackContainerType kH265Types[] = { + MediaTrackContainerType::kVideoMatroska, + MediaTrackContainerType::kVideoMp4}; +#endif + +constexpr struct { CodecId codec_id; media::VideoCodecProfile min_profile; media::VideoCodecProfile max_profile; + base::raw_span<const MediaTrackContainerType> supported_container_types; } kPreferredCodecIdAndVEAProfiles[] = { - {CodecId::kVp8, media::VP8PROFILE_ANY, media::VP8PROFILE_ANY}, - {CodecId::kVp9, media::VP9PROFILE_PROFILE0, media::VP9PROFILE_PROFILE0}, + {CodecId::kVp8, media::VP8PROFILE_ANY, media::VP8PROFILE_ANY, + base::span{kVp8Types}}, + {CodecId::kVp9, media::VP9PROFILE_PROFILE0, media::VP9PROFILE_PROFILE0, + base::span{kVp9Types}}, #if BUILDFLAG(USE_PROPRIETARY_CODECS) - {CodecId::kH264, media::H264PROFILE_BASELINE, media::H264PROFILE_HIGH}, + {CodecId::kH264, media::H264PROFILE_BASELINE, media::H264PROFILE_HIGH, + base::span{kH264Types}}, #endif {CodecId::kAv1, media::AV1PROFILE_PROFILE_MAIN, - media::AV1PROFILE_PROFILE_MAIN}, + media::AV1PROFILE_PROFILE_MAIN, base::span{kAv1Types}}, #if BUILDFLAG(ENABLE_HEVC_PARSER_AND_HW_DECODER) - {CodecId::kHevc, media::HEVCPROFILE_MAIN, media::HEVCPROFILE_MAIN}, + {CodecId::kHevc, media::HEVCPROFILE_MAIN, media::HEVCPROFILE_MAIN, + base::span{kH265Types}}, #endif }; @@ -147,6 +174,27 @@ static_cast<int>(CodecId::kLast), "|kPreferredCodecIdAndVEAProfiles| should consider all CodecIds"); +media::VideoCodec CodecIdToMediaCodec(VideoTrackRecorder::CodecId codec) { + switch (codec) { + case VideoTrackRecorder::CodecId::kVp8: + return media::VideoCodec::kVP8; + case VideoTrackRecorder::CodecId::kVp9: + return media::VideoCodec::kVP9; +#if BUILDFLAG(USE_PROPRIETARY_CODECS) + case VideoTrackRecorder::CodecId::kH264: + return media::VideoCodec::kH264; +#endif +#if BUILDFLAG(ENABLE_HEVC_PARSER_AND_HW_DECODER) + case VideoTrackRecorder::CodecId::kHevc: + return media::VideoCodec::kHEVC; +#endif + case VideoTrackRecorder::CodecId::kAv1: + return media::VideoCodec::kAV1; + case VideoTrackRecorder::CodecId::kLast: + return media::VideoCodec::kUnknown; + } +} + void NotifyEncoderSupportKnown(base::OnceClosure callback) { if (!Platform::Current()) { DLOG(ERROR) << "Couldn't access the render thread"; @@ -683,29 +731,24 @@ // static VideoTrackRecorderImpl::CodecId VideoTrackRecorderImpl::GetPreferredCodecId( MediaTrackContainerType type) { - const auto preferred_codec_id = []() { - for (const auto& supported_profile : GetVEASupportedProfiles()) { - const media::VideoCodecProfile codec = supported_profile.profile; - for (auto& codec_id_and_profile : kPreferredCodecIdAndVEAProfiles) { - if (codec >= codec_id_and_profile.min_profile && - codec <= codec_id_and_profile.max_profile) { - DVLOG(2) << "Accelerated codec found: " - << media::GetProfileName(codec) << ", min_resolution: " - << supported_profile.min_resolution.ToString() - << ", max_resolution: " - << supported_profile.max_resolution.ToString() - << ", max_framerate: " - << supported_profile.max_framerate_numerator << "/" - << supported_profile.max_framerate_denominator; - return codec_id_and_profile.codec_id; - } + for (const auto& supported_profile : GetVEASupportedProfiles()) { + const media::VideoCodecProfile codec = supported_profile.profile; + for (auto& entry : kPreferredCodecIdAndVEAProfiles) { + if (codec >= entry.min_profile && codec <= entry.max_profile && + std::find(entry.supported_container_types.begin(), + entry.supported_container_types.end(), + type) != entry.supported_container_types.end()) { + DVLOG(2) << "Accelerated codec found: " << media::GetProfileName(codec) + << ", min_resolution: " + << supported_profile.min_resolution.ToString() + << ", max_resolution: " + << supported_profile.max_resolution.ToString() + << ", max_framerate: " + << supported_profile.max_framerate_numerator << "/" + << supported_profile.max_framerate_denominator; + return entry.codec_id; } } - return CodecId::kLast; - }(); - - if (preferred_codec_id != CodecId::kLast) { - return preferred_codec_id; } if (type == MediaTrackContainerType::kVideoMp4 || @@ -731,27 +774,7 @@ } } - const auto media_codec_id = [](CodecId codec) { - switch (codec) { - case VideoTrackRecorder::CodecId::kVp8: - return media::VideoCodec::kVP8; - case VideoTrackRecorder::CodecId::kVp9: - return media::VideoCodec::kVP9; -#if BUILDFLAG(USE_PROPRIETARY_CODECS) - case VideoTrackRecorder::CodecId::kH264: - return media::VideoCodec::kH264; -#endif -#if BUILDFLAG(ENABLE_HEVC_PARSER_AND_HW_DECODER) - case VideoTrackRecorder::CodecId::kHevc: - return media::VideoCodec::kHEVC; -#endif - case VideoTrackRecorder::CodecId::kAv1: - return media::VideoCodec::kAV1; - case VideoTrackRecorder::CodecId::kLast: - return media::VideoCodec::kUnknown; - } - }(codec_profile.codec_id); - + const auto media_codec_id = CodecIdToMediaCodec(codec_profile.codec_id); for (const auto& profile : GetVEASupportedProfiles()) { DCHECK_NE(profile.profile, media::VIDEO_CODEC_PROFILE_UNKNOWN);
diff --git a/third_party/blink/renderer/modules/mediarecorder/video_track_recorder_unittest.cc b/third_party/blink/renderer/modules/mediarecorder/video_track_recorder_unittest.cc index b70ea6c..3f5b3e5 100644 --- a/third_party/blink/renderer/modules/mediarecorder/video_track_recorder_unittest.cc +++ b/third_party/blink/renderer/modules/mediarecorder/video_track_recorder_unittest.cc
@@ -2,6 +2,7 @@ // 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/mediarecorder/track_recorder.h" #ifdef UNSAFE_BUFFERS_BUILD // TODO(crbug.com/390223051): Remove C-library calls to fix the errors. #pragma allow_unsafe_libc_calls @@ -1466,4 +1467,120 @@ VideoTrackRecorderPassthroughTest, ValuesIn(kTrackRecorderTestCodec)); +TEST(VideoTrackRecorder, DefaultCodecWithoutGpuFactories) { + EXPECT_EQ(VideoTrackRecorder::CodecId::kVp8, + VideoTrackRecorderImpl::GetPreferredCodecId( + MediaTrackContainerType::kVideoWebM)); + EXPECT_EQ(VideoTrackRecorder::CodecId::kVp8, + VideoTrackRecorderImpl::GetPreferredCodecId( + MediaTrackContainerType::kVideoMatroska)); + EXPECT_EQ(VideoTrackRecorder::CodecId::kVp9, + VideoTrackRecorderImpl::GetPreferredCodecId( + MediaTrackContainerType::kVideoMp4)); +} + +TEST(VideoTrackRecorder, DefaultCodecWithAcceleratedVp9) { + auto sii = base::MakeRefCounted<gpu::TestSharedImageInterface>(); + sii->UseTestGMBInSharedImageCreationWithBufferUsage(); + media::MockGpuVideoAcceleratorFactories mock_gpu_factories(sii.get()); + ScopedTestingPlatformSupport<MockTestingPlatform> platform; + EXPECT_CALL(*platform, GetGpuFactories()) + .WillRepeatedly(Return(&mock_gpu_factories)); + EXPECT_CALL(mock_gpu_factories, GetVideoEncodeAcceleratorSupportedProfiles) + .WillRepeatedly( + Return(std::vector<media::VideoEncodeAccelerator::SupportedProfile>{ + media::VideoEncodeAccelerator::SupportedProfile( + media::VideoCodecProfile::VP9PROFILE_PROFILE0, + gfx::Size(1920, 1080)), + })); + EXPECT_EQ(VideoTrackRecorder::CodecId::kVp9, + VideoTrackRecorderImpl::GetPreferredCodecId( + MediaTrackContainerType::kVideoWebM)); + EXPECT_EQ(VideoTrackRecorder::CodecId::kVp9, + VideoTrackRecorderImpl::GetPreferredCodecId( + MediaTrackContainerType::kVideoMatroska)); + EXPECT_EQ(VideoTrackRecorder::CodecId::kVp9, + VideoTrackRecorderImpl::GetPreferredCodecId( + MediaTrackContainerType::kVideoMp4)); +} + +#if BUILDFLAG(USE_PROPRIETARY_CODECS) +TEST(VideoTrackRecorder, DefaultCodecWithAcceleratedH264) { + auto sii = base::MakeRefCounted<gpu::TestSharedImageInterface>(); + sii->UseTestGMBInSharedImageCreationWithBufferUsage(); + media::MockGpuVideoAcceleratorFactories mock_gpu_factories(sii.get()); + ScopedTestingPlatformSupport<MockTestingPlatform> platform; + EXPECT_CALL(*platform, GetGpuFactories()) + .WillRepeatedly(Return(&mock_gpu_factories)); + EXPECT_CALL(mock_gpu_factories, GetVideoEncodeAcceleratorSupportedProfiles) + .WillRepeatedly( + Return(std::vector<media::VideoEncodeAccelerator::SupportedProfile>{ + media::VideoEncodeAccelerator::SupportedProfile( + media::VideoCodecProfile::H264PROFILE_HIGH, + gfx::Size(1920, 1080)), + })); + EXPECT_EQ(VideoTrackRecorder::CodecId::kVp8, + VideoTrackRecorderImpl::GetPreferredCodecId( + MediaTrackContainerType::kVideoWebM)); + EXPECT_EQ(VideoTrackRecorder::CodecId::kH264, + VideoTrackRecorderImpl::GetPreferredCodecId( + MediaTrackContainerType::kVideoMatroska)); + EXPECT_EQ(VideoTrackRecorder::CodecId::kH264, + VideoTrackRecorderImpl::GetPreferredCodecId( + MediaTrackContainerType::kVideoMp4)); +} +#endif // BUILDFLAG(USE_PROPRIETARY_CODECS) + +#if BUILDFLAG(ENABLE_HEVC_PARSER_AND_HW_DECODER) +TEST(VideoTrackRecorder, DefaultCodecWithAcceleratedH265) { + auto sii = base::MakeRefCounted<gpu::TestSharedImageInterface>(); + sii->UseTestGMBInSharedImageCreationWithBufferUsage(); + media::MockGpuVideoAcceleratorFactories mock_gpu_factories(sii.get()); + ScopedTestingPlatformSupport<MockTestingPlatform> platform; + EXPECT_CALL(*platform, GetGpuFactories()) + .WillRepeatedly(Return(&mock_gpu_factories)); + EXPECT_CALL(mock_gpu_factories, GetVideoEncodeAcceleratorSupportedProfiles) + .WillRepeatedly( + Return(std::vector<media::VideoEncodeAccelerator::SupportedProfile>{ + media::VideoEncodeAccelerator::SupportedProfile( + media::VideoCodecProfile::HEVCPROFILE_MAIN, + gfx::Size(1920, 1080)), + })); + EXPECT_EQ(VideoTrackRecorder::CodecId::kVp8, + VideoTrackRecorderImpl::GetPreferredCodecId( + MediaTrackContainerType::kVideoWebM)); + EXPECT_EQ(VideoTrackRecorder::CodecId::kHevc, + VideoTrackRecorderImpl::GetPreferredCodecId( + MediaTrackContainerType::kVideoMatroska)); + EXPECT_EQ(VideoTrackRecorder::CodecId::kHevc, + VideoTrackRecorderImpl::GetPreferredCodecId( + MediaTrackContainerType::kVideoMp4)); +} +#endif // BUILDFLAG(ENABLE_HEVC_PARSER_AND_HW_DECODER) + +TEST(VideoTrackRecorder, DefaultCodecWithAcceleratedVp8) { + auto sii = base::MakeRefCounted<gpu::TestSharedImageInterface>(); + sii->UseTestGMBInSharedImageCreationWithBufferUsage(); + media::MockGpuVideoAcceleratorFactories mock_gpu_factories(sii.get()); + ScopedTestingPlatformSupport<MockTestingPlatform> platform; + EXPECT_CALL(*platform, GetGpuFactories()) + .WillRepeatedly(Return(&mock_gpu_factories)); + EXPECT_CALL(mock_gpu_factories, GetVideoEncodeAcceleratorSupportedProfiles) + .WillRepeatedly( + Return(std::vector<media::VideoEncodeAccelerator::SupportedProfile>{ + media::VideoEncodeAccelerator::SupportedProfile( + media::VideoCodecProfile::VP8PROFILE_ANY, + gfx::Size(1920, 1080)), + })); + EXPECT_EQ(VideoTrackRecorder::CodecId::kVp8, + VideoTrackRecorderImpl::GetPreferredCodecId( + MediaTrackContainerType::kVideoWebM)); + EXPECT_EQ(VideoTrackRecorder::CodecId::kVp8, + VideoTrackRecorderImpl::GetPreferredCodecId( + MediaTrackContainerType::kVideoMatroska)); + EXPECT_EQ(VideoTrackRecorder::CodecId::kVp9, + VideoTrackRecorderImpl::GetPreferredCodecId( + MediaTrackContainerType::kVideoMp4)); +} + } // namespace blink
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.cc b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.cc index 9f1d06e9..48eed6c 100644 --- a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.cc +++ b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.cc
@@ -514,10 +514,9 @@ // TODO(nhiroki): Clarify mappings between the steps 4.8-4.11 and // implementation. - pending_prepare_for_evaluation_ = true; - if (!pause_evaluation_) { - PrepareForEvaluationIfNeeded(); - } + // This should be called after OriginTrialContext::AddTokens() to install + // origin trial features in JavaScript's global object. + ScriptController()->PrepareForEvaluation(); } void ServiceWorkerGlobalScope::LoadAndRunInstalledClassicScript( @@ -1714,10 +1713,8 @@ ancestor_frame_type_ = ancestor_frame_type; global_scope_initialized_ = true; - if (!pause_evaluation_) { - PrepareForEvaluationIfNeeded(); + if (!pause_evaluation_) ReadyToRunWorkerScript(); - } storage_key_ = storage_key; } @@ -1733,10 +1730,8 @@ DCHECK(IsContextThread()); DCHECK(pause_evaluation_); pause_evaluation_ = false; - if (global_scope_initialized_) { - PrepareForEvaluationIfNeeded(); + if (global_scope_initialized_) ReadyToRunWorkerScript(); - } } void ServiceWorkerGlobalScope::DispatchInstallEvent( @@ -2828,20 +2823,4 @@ } } -void ServiceWorkerGlobalScope::PrepareForEvaluationIfNeeded() { - DCHECK(!pause_evaluation_); - - if (!pending_prepare_for_evaluation_) { - return; - } - pending_prepare_for_evaluation_ = false; - - // Allows `ContextFeatureSettings` to update before preparing script engine. - ReportingProxy().WillPrepareForEvaluation(); - - // This should be called after OriginTrialContext::AddTokens() to install - // origin trial features in JavaScript's global object. - ScriptController()->PrepareForEvaluation(); -} - } // namespace blink
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.h b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.h index ab4918a7..5e234602 100644 --- a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.h +++ b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope.h
@@ -633,8 +633,6 @@ const KURL& request_url); void RemoveItemFromRaceNetworkRequests(int fetch_event_id); - void PrepareForEvaluationIfNeeded(); - Member<ServiceWorkerClients> clients_; Member<ServiceWorkerRegistration> registration_; Member<::blink::ServiceWorker> service_worker_; @@ -754,10 +752,6 @@ // ResumeEvaluation() evaluates the top level script when this flag is true. bool global_scope_initialized_ = false; - // Whether `ScriptController()->PrepareForEvaluation()` should be called after - // evaluation is resumed. - bool pending_prepare_for_evaluation_ = false; - // Connected by the ServiceWorkerHost in the browser process and by the // controllees. |controller_bindings_| should be destroyed before // |event_queue_| since the pipe needs to be disconnected before callbacks
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope_proxy.cc b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope_proxy.cc index 0bfb7ae01..400ad4c3 100644 --- a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope_proxy.cc +++ b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope_proxy.cc
@@ -172,14 +172,6 @@ Client().FailedToFetchModuleScript(); } -void ServiceWorkerGlobalScopeProxy::WillPrepareForEvaluation() { - DCHECK_CALLED_ON_VALID_THREAD(worker_thread_checker_); - ScriptState::Scope scope( - WorkerGlobalScope()->ScriptController()->GetScriptState()); - Client().WillPrepareForEvaluation( - WorkerGlobalScope()->ScriptController()->GetContext()); -} - void ServiceWorkerGlobalScopeProxy::WillEvaluateScript() { DCHECK_CALLED_ON_VALID_THREAD(worker_thread_checker_); TRACE_EVENT_NESTABLE_ASYNC_BEGIN0(
diff --git a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope_proxy.h b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope_proxy.h index b86e0fa..f7f3e68 100644 --- a/third_party/blink/renderer/modules/service_worker/service_worker_global_scope_proxy.h +++ b/third_party/blink/renderer/modules/service_worker/service_worker_global_scope_proxy.h
@@ -129,7 +129,6 @@ void DidFetchScript() override; void DidFailToFetchClassicScript() override; void DidFailToFetchModuleScript() override; - void WillPrepareForEvaluation() override; void WillEvaluateScript() override; void DidEvaluateTopLevelScript(bool success) override; void DidCloseWorkerGlobalScope() override;
diff --git a/third_party/blink/renderer/platform/blink_platform_unittests_bundle_data.filelist b/third_party/blink/renderer/platform/blink_platform_unittests_bundle_data.filelist index 76d090220..63af1543 100644 --- a/third_party/blink/renderer/platform/blink_platform_unittests_bundle_data.filelist +++ b/third_party/blink/renderer/platform/blink_platform_unittests_bundle_data.filelist
@@ -363,6 +363,7 @@ ../../web_tests/images/resources/count-down-color-test.png ../../web_tests/images/resources/count-down-color-test.webp ../../web_tests/images/resources/crbug.364830.webp +../../web_tests/images/resources/crbug423310049.png ../../web_tests/images/resources/crbug702934.png ../../web_tests/images/resources/crbug752898.bmp ../../web_tests/images/resources/crbug779261.gif
diff --git a/third_party/blink/renderer/platform/graphics/web_graphics_context_3d_video_frame_pool.cc b/third_party/blink/renderer/platform/graphics/web_graphics_context_3d_video_frame_pool.cc index 9b7ea22..c06f58237 100644 --- a/third_party/blink/renderer/platform/graphics/web_graphics_context_3d_video_frame_pool.cc +++ b/third_party/blink/renderer/platform/graphics/web_graphics_context_3d_video_frame_pool.cc
@@ -160,7 +160,6 @@ void CopyToGpuMemoryBuffer( base::WeakPtr<blink::WebGraphicsContext3DProviderWrapper> ctx_wrapper, media::VideoFrame* dst_frame, - const gpu::SyncToken& blit_done_sync_token, base::OnceClosure callback) { CHECK(dst_frame->HasMappableGpuBuffer()); CHECK(!dst_frame->HasNativeGpuMemoryBuffer()); @@ -173,6 +172,9 @@ auto* ri = raster_context_provider->RasterInterface(); DCHECK(ri); + gpu::SyncToken blit_done_sync_token; + ri->GenUnverifiedSyncTokenCHROMIUM(blit_done_sync_token.GetData()); + auto* sii = context_provider.SharedImageInterface(); DCHECK(sii); @@ -199,9 +201,18 @@ // Synchronize RasterInterface with SharedImageInterface. auto copy_to_gmb_done_sync_token = sii->GenUnverifiedSyncToken(); + ri->WaitSyncTokenCHROMIUM(copy_to_gmb_done_sync_token.GetData()); - media::SimpleSyncTokenClient simple_client(copy_to_gmb_done_sync_token); - dst_frame->UpdateAcquireSyncToken(copy_to_gmb_done_sync_token); + // Make access to the `dst_frame` wait on copy completion. We also update the + // ReleaseSyncToken here since it's used when the underlying GpuMemoryBuffer + // and SharedImage resources are returned to the pool. This is not necessary + // since we'll set the empty sync token on the video frame on GPU completion. + // But if we ever refactor this code to have a "don't wait for GMB" mode, the + // correct sync token on the video frame will be needed. + gpu::SyncToken completion_sync_token; + ri->GenUnverifiedSyncTokenCHROMIUM(completion_sync_token.GetData()); + media::SimpleSyncTokenClient simple_client(completion_sync_token); + dst_frame->UpdateAcquireSyncToken(completion_sync_token); dst_frame->UpdateReleaseSyncToken(&simple_client); // Do not use a query to track copy completion on Windows when using the new @@ -287,7 +298,6 @@ // For shared memory GMBs we needed to explicitly request a copy // from the shared image GPU texture to the GMB. CopyToGpuMemoryBuffer(weak_context_provider_, dst_frame_ptr, - completion_sync_token.value(), wrapped_callback->callback()); } else { // QueryEXT functions are used to make sure that
diff --git a/third_party/blink/renderer/platform/image-decoders/skia/skia_image_decoder_base.cc b/third_party/blink/renderer/platform/image-decoders/skia/skia_image_decoder_base.cc index adbbd20..8644913 100644 --- a/third_party/blink/renderer/platform/image-decoders/skia/skia_image_decoder_base.cc +++ b/third_party/blink/renderer/platform/image-decoders/skia/skia_image_decoder_base.cc
@@ -337,7 +337,17 @@ } } - if (frame.GetStatus() == ImageFrame::kFrameInitialized) { + bool already_started_current_frame = + already_started_frame_.has_value() && + already_started_frame_.value() == current_frame_index; + if (!already_started_current_frame) { + // `kFrameEmpty` and `kFrameComplete` are handled above. + // `kFrameInitialized` is possible when decoding a frame from scratch. + // `kFramePartial` is possible when resuming to decode a frame that + // previously returned `kIncompleteInput` from `incrementalDecode`. + DCHECK(frame.GetStatus() == ImageFrame::kFrameInitialized || + frame.GetStatus() == ImageFrame::kFramePartial); + SkCodec::FrameInfo frame_info; bool frame_info_received = codec_->getFrameInfo(current_frame_index, &frame_info); @@ -363,10 +373,22 @@ } DCHECK_NE(color_type, kUnknown_SkColorType); + sk_sp<SkColorSpace> color_space; + if (const ColorProfileTransform* transform = ColorTransform()) { + const skcms_ICCProfile* dst_profile = transform->DstProfile(); + DCHECK(dst_profile); // Always non-null ptr to `dst_profile_` field. + color_space = SkColorSpace::Make(*dst_profile); + } else { + // Explicitly ask for no color transformation. This avoids transforming + // into sRGB if/when `SkEncodedInfo::makeImageInfo` has set + // `codec_->getInfo().colorSpace()` to sRGB as a fallback. + color_space = nullptr; + } + SkImageInfo image_info = codec_->getInfo() .makeColorType(color_type) - .makeColorSpace(ColorSpaceForSkImages()) - .makeAlphaType(alpha_type); + .makeAlphaType(alpha_type) + .makeColorSpace(color_space); SkCodec::Options options; options.fFrameIndex = current_frame_index; @@ -386,11 +408,13 @@ continue; } frame.SetStatus(ImageFrame::kFramePartial); + already_started_frame_.emplace(current_frame_index); } SkCodec::Result incremental_decode_result = codec_->incrementalDecode(); switch (incremental_decode_result) { case SkCodec::kSuccess: { + already_started_frame_.reset(); SkCodec::FrameInfo frame_info; bool frame_info_received = codec_->getFrameInfo(current_frame_index, &frame_info); @@ -409,6 +433,7 @@ } break; default: + already_started_frame_.reset(); frame.SetPixelsChanged(true); SetFailedFrameIndex(current_frame_index); break;
diff --git a/third_party/blink/renderer/platform/image-decoders/skia/skia_image_decoder_base.h b/third_party/blink/renderer/platform/image-decoders/skia/skia_image_decoder_base.h index bcdd4185..e057fa0f 100644 --- a/third_party/blink/renderer/platform/image-decoders/skia/skia_image_decoder_base.h +++ b/third_party/blink/renderer/platform/image-decoders/skia/skia_image_decoder_base.h
@@ -95,6 +95,11 @@ // an image embedded in a middle of another data stream - one specific example // is PNG images embedded inside ICO or BMP images. const wtf_size_t reading_offset_ = 0; + + // Number of a frame for which calling `SkCodec::incrementalDecode` is okay. + // Set after calling `SkCodec::startIncrementalDecode` and reset after + // `SkCodec::incrementalDecode` succeeds or encounters a non-resumable error. + std::optional<wtf_size_t> already_started_frame_; }; } // namespace blink
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 index a39877b..f122444 100644 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -4235,7 +4235,7 @@ }, { name: "ScrollAnchorPriorityCandidateSubtree", - status: "experimental", + status: "stable", }, { name: "ScrollbarColor",
diff --git a/third_party/blink/web_tests/NeverFixTests b/third_party/blink/web_tests/NeverFixTests index 2f05ee0..6037da6 100644 --- a/third_party/blink/web_tests/NeverFixTests +++ b/third_party/blink/web_tests/NeverFixTests
@@ -124,6 +124,11 @@ crbug.com/613672 [ Mac ] external/wpt/pointerevents/pointerevent_after_target_appended.html?touch [ Skip ] crbug.com/613672 [ Mac ] external/wpt/pointerevents/pointerevent_after_target_removed.html?touch [ Skip ] crbug.com/613672 [ Mac ] external/wpt/pointerevents/pointerevent_contextmenu_is_a_pointerevent.html?touch [ Skip ] +crbug.com/613672 [ Mac ] external/wpt/pointerevents/pointerevent_element_haspointercapture.html?touch [ Skip ] +crbug.com/613672 [ Mac ] external/wpt/pointerevents/pointerevent_element_haspointercapture_release_pending_capture.html?touch [ Skip ] +crbug.com/613672 [ Mac ] external/wpt/pointerevents/pointerevent_releasepointercapture_release_right_after_capture.html?touch [ Skip ] +crbug.com/613672 [ Mac ] external/wpt/pointerevents/pointerevent_setpointercapture_override_pending_capture_element.html?touch [ Skip ] +crbug.com/613672 [ Mac ] external/wpt/pointerevents/pointerevent_setpointercapture_to_same_element_twice.html?touch [ Skip ] crbug.com/613672 [ Mac ] external/wpt/pointerevents/touch-action-with-swipe-dir-change.html?touch [ Skip ] crbug.com/613672 [ Mac ] fast/events/pointerevents/multi-pointer-event-in-slop-region.html [ Skip ] crbug.com/613672 [ Mac ] fast/events/pointerevents/pointer-event-in-slop-region.html [ Skip ]
diff --git a/third_party/blink/web_tests/TestExpectations b/third_party/blink/web_tests/TestExpectations index 768be04..1b89c011 100644 --- a/third_party/blink/web_tests/TestExpectations +++ b/third_party/blink/web_tests/TestExpectations
@@ -2762,6 +2762,8 @@ crbug.com/413411328 external/wpt/css/css-values/urls/referrer-policy/unsafe-url/url-image-referrerpolicy-cross-origin.sub.html [ Failure ] crbug.com/413411328 external/wpt/css/css-values/urls/referrer-policy/unsafe-url/url-image-referrerpolicy-same-origin.sub.html [ Failure ] +crbug.com/424798906 external/wpt/pointerevents/pointerevent_element_haspointercapture.html?touch [ Failure ] + # ====== New tests from wpt-importer added here ====== crbug.com/425056982 [ Mac14 ] virtual/threaded-prefer-compositing/external/wpt/css/cssom-view/devicePixelRatio-undisplayed-iframe.tentative.html [ Crash ] crbug.com/425118323 [ Mac14 ] virtual/threaded-preload-scanner/external/wpt/html/semantics/scripting-1/the-script-element/async_001.htm [ Timeout ] @@ -6517,7 +6519,6 @@ # Virtual suite mostly fails while feature is in development. crbug.com/40253999 virtual/indexeddb_sqlite/* [ Skip Timeout ] - crbug.com/40253999 virtual/indexeddb_sqlite/external/wpt/IndexedDB/abort-in-initial-upgradeneeded.any.html [ Pass ] crbug.com/40253999 virtual/indexeddb_sqlite/external/wpt/IndexedDB/abort-in-initial-upgradeneeded.any.serviceworker.html [ Pass ] crbug.com/40253999 virtual/indexeddb_sqlite/external/wpt/IndexedDB/abort-in-initial-upgradeneeded.any.sharedworker.html [ Pass ] @@ -6527,23 +6528,6 @@ crbug.com/40253999 virtual/indexeddb_sqlite/external/wpt/IndexedDB/idbobjectstore_count.any.sharedworker.html [ Pass ] crbug.com/40253999 virtual/indexeddb_sqlite/external/wpt/IndexedDB/idbobjectstore_count.any.worker.html [ Pass ] -crbug.com/40253999 virtual/indexeddb_sqlite/external/wpt/IndexedDB/idbcursor-direction-objectstore-keyrange.any.html [ Pass ] -crbug.com/40253999 virtual/indexeddb_sqlite/external/wpt/IndexedDB/idbcursor-direction-objectstore.any.html [ Pass ] -crbug.com/40253999 virtual/indexeddb_sqlite/external/wpt/IndexedDB/idbcursor_advance_objectstore.any.html [ Pass ] -crbug.com/40253999 virtual/indexeddb_sqlite/external/wpt/IndexedDB/idbcursor_continue_objectstore.any.html [ Pass ] -crbug.com/40253999 virtual/indexeddb_sqlite/external/wpt/IndexedDB/idbcursor_update_objectstore.any.html [ Pass ] -crbug.com/40253999 virtual/indexeddb_sqlite/external/wpt/IndexedDB/idbobjectstore_openCursor.any.html [ Pass ] -crbug.com/40253999 virtual/indexeddb_sqlite/external/wpt/IndexedDB/idbobjectstore_openKeyCursor.any.html [ Pass ] -crbug.com/40253999 virtual/indexeddb_sqlite/external/wpt/IndexedDB/interleaved-cursors-large.any.html [ Pass ] -crbug.com/40253999 virtual/indexeddb_sqlite/external/wpt/IndexedDB/interleaved-cursors-small.any.html [ Pass ] -crbug.com/40253999 virtual/indexeddb_sqlite/external/wpt/IndexedDB/parallel-cursors-upgrade.any.html [ Pass ] - -crbug.com/40253999 virtual/indexeddb_sqlite/external/wpt/IndexedDB/idbobjectstore-getAll-enforcerange.any.html [ Pass ] -crbug.com/40253999 virtual/indexeddb_sqlite/external/wpt/IndexedDB/idbobjectstore-getAllKeys-enforcerange.any.html [ Pass ] -crbug.com/40253999 virtual/indexeddb_sqlite/external/wpt/IndexedDB/idbobjectstore_getAll.any.html [ Pass ] -crbug.com/40253999 virtual/indexeddb_sqlite/external/wpt/IndexedDB/idbobjectstore_getAllKeys.any.html [ Pass ] -crbug.com/40253999 virtual/indexeddb_sqlite/external/wpt/IndexedDB/idbobjectstore_getAllRecords.tentative.any.html [ Pass ] - # Sheriff 2022-08-06 crbug.com/1350337 [ Linux ] external/wpt/web-locks/query-ordering.tentative.https.html [ Failure Pass ] @@ -9176,7 +9160,8 @@ # Gardener 2025-06-12 crbug.com/422636456 [ Mac ] http/tests/inspector-protocol/network/navigate-iframe-out2in.js [ Pass Timeout ] +crbug.com/414257771 [ Mac ] external/wpt/notifications/shownotification.https.window.html [ Failure Pass ] # Gardener 2025-06-16 crbug.com/424918655 [ Mac ] external/wpt/soft-navigation-heuristics/lcp/tentative/contracted-image.html [ Failure Pass ] -crbug.com/420596996 [ Win ] virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/parallel-dispatch.https.any.serviceworker.html?gpu [ Failure Pass ] \ No newline at end of file +crbug.com/420596996 [ Win ] virtual/webnn-service-with-gpu/external/wpt/webnn/conformance_tests/parallel-dispatch.https.any.serviceworker.html?gpu [ Failure Pass ]
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 75a49e9f..489d4ba6 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
@@ -8234,6 +8234,13 @@ {} ] ], + "form-check-validity-crash.html": [ + "6d3bd0d2e36751c554af42164189d921975ced93", + [ + null, + {} + ] + ], "form-controls-id-removal-crash.html": [ "2b1ef87774fc1c5393129fca8e65147c379ea7a9", [ @@ -75466,7 +75473,7 @@ ] ], "position-area-scroll-adjust.html": [ - "497b526fb62b942f93d092c0a247b3f45d8f6cd0", + "128f23f95f02615f987380bb752a1cc383c604ce", [ null, [ @@ -183927,32 +183934,6 @@ {} ] ], - "first-line-child-display-none-dynamic.html": [ - "35fdf0a5c5ce455a55f526be4626daae317ecc13", - [ - null, - [ - [ - "/css/css-pseudo/first-line-child-display-none-ref.html", - "==" - ] - ], - {} - ] - ], - "first-line-child-display-none.html": [ - "3ec50d5b01a874a527d98537cec4b2160d0b8a26", - [ - null, - [ - [ - "/css/css-pseudo/first-line-child-display-none-ref.html", - "==" - ] - ], - {} - ] - ], "first-line-inherited-no-transition.html": [ "e5253daa63fc7cb074901dd086864e27426cd152", [ @@ -316184,7 +316165,7 @@ ] ], "rect-03.svg": [ - "f4b59c91b110a68db4bf3c54d76c84e8b40c4156", + "3562249ee11fd97e9fbd7886c0bf0ef5df751255", [ null, [ @@ -316197,7 +316178,7 @@ ] ], "rect-04.svg": [ - "37c4c9b2ab59238f9ff1339ac31e1eb1c1f4685b", + "f3e6d576363c13467df5b89ecd7feedbe58ec858", [ null, [ @@ -362664,10 +362645,6 @@ "84becd9a78d186ba3c0e658746fd56aef8039b74", [] ], - "first-line-child-display-none-ref.html": [ - "6808b87159a0c0b18ea53a1627265e2b47fccfb9", - [] - ], "first-line-green-ref.html": [ "99e9c334bf2c856535c7643911a3050390658a6f", [] @@ -431038,7 +431015,7 @@ [] ], "text-context-fill-ref.svg": [ - "a8fbd1964ee492b9ac54648c14419daeb45b4840", + "30f771d56331b5429e83166c1b10c7e275a7fa98", [] ], "text-font-face-load-image-ref.html": [ @@ -431216,6 +431193,12 @@ "07697d6491b83414923e80a4a8c5a06f7471cce9", [] ] + }, + "support": { + "initial-value-helper.js": [ + "e417d582acc0ec1fbb2d8463d593aaf0fcba627b", + [] + ] } } } @@ -438020,7 +438003,7 @@ [] ], "RTCRtpTransceiver.https-expected.txt": [ - "7a07190ce98f3583d9c15b123b4ad711ac39b217", + "3661b1e2a89371e612930805b28f985b571073eb", [] ], "WEB_FEATURES.yml": [ @@ -438407,10 +438390,6 @@ "f73ad23fc53014c79fb1d0aa11ece0ab1c2f8ff1", [] ], - "outbound-rtp.https-expected.txt": [ - "fb3703309450f9875522465b9fd34bda721c747a", - [] - ], "rtp-stats-creation-expected.txt": [ "cc727db1c7c73aa59774b77754a39e0f6b9cbda3", [] @@ -497539,6 +497518,13 @@ {} ] ], + "anchor-name-mutation.html": [ + "07272c387e04ce528c245d9e4e5624dbfe90235c", + [ + null, + {} + ] + ], "anchor-parse-invalid.html": [ "795722972a2ab79f133842c1d146550ed885038b", [ @@ -498043,8 +498029,8 @@ {} ] ], - "anchor-transition-attr.html": [ - "540ab893efc0166b2b1befaf80c58917d27e0571", + "anchor-transition-attr.tentative.html": [ + "824c75c9665b3a94d16d7a0f9f4795a749a16f37", [ null, {} @@ -500803,21 +500789,21 @@ ] ], "corner-shape-computed.html": [ - "e48fda86af2bb161f12e3144b160e55a324b65c8", + "7ba3f089d28d065aff74235ee150aa469aa2f73c", [ null, {} ] ], "corner-shape-invalid.html": [ - "5426a5ec704f4f74618d00c36afdf5846231f0f0", + "d65ef996ade2f5581c3657131b406adc758536f7", [ null, {} ] ], "corner-shape-valid.html": [ - "c9c4421a46c0c33b96b6ea8b63edbb29640643c7", + "6c230ab56d51f8116a6471da219ccd33ed178001", [ null, {} @@ -527382,6 +527368,13 @@ ] ] }, + "text-transform-capitalize-036.html": [ + "a47dc35b949b56c734a0090c9c7a4932c745c4cf", + [ + null, + {} + ] + ], "text-transform-upperlower-107.html": [ "791edd14c0e144a945b4766a338725bca13da6bd", [ @@ -737537,6 +737530,13 @@ ] }, "scripted": { + "SVGAnimatedAngle-initial-values.html": [ + "7e59c46b7b90b62eb87d8b2393a9cb8ff42b2b24", + [ + null, + {} + ] + ], "SVGAnimatedAngle.html": [ "5fdc9f3cffb0a3aaabe231706afc2c871ecf1ee8", [ @@ -737656,6 +737656,13 @@ {} ] ], + "SVGAnimatedEnumeration-initial-values.html": [ + "e577aa32a355088bd6607d3db75cff3cc0c84e63", + [ + null, + {} + ] + ], "SVGAnimatedEnumeration.html": [ "990b884545d70a3f1156e4c070cdac2d6cc2ac79", [ @@ -737663,6 +737670,13 @@ {} ] ], + "SVGAnimatedInteger-initial-values.html": [ + "05aefaae27b6f2abcaedb0e769fdbb3733205166", + [ + null, + {} + ] + ], "SVGAnimatedInteger.html": [ "849c13d3671df44b759729572c76f5965965865c", [ @@ -737671,7 +737685,7 @@ ] ], "SVGAnimatedLength-initial-values.html": [ - "3c82087d169b089ba160ceac0b03eba286ee1549", + "c7f77edf4c09de0244aabc91946bceb453f81b12", [ null, {} @@ -737691,6 +737705,13 @@ {} ] ], + "SVGAnimatedNumber-initial-values.html": [ + "ac52575d273af8f2598090119c0439b97ba9bc18", + [ + null, + {} + ] + ], "SVGAnimatedNumber.html": [ "c72cabca1a84b8cf071b91097e23a4039468999b", [ @@ -779171,7 +779192,7 @@ ] ], "qdq_subgraph.https.any.js": [ - "b578270223928f89dc19c0819018465e37628ad0", + "b7bcdc06228075db5a54494f41f488ccf29f9207", [ "webnn/conformance_tests/qdq_subgraph.https.any.html?cpu", { @@ -801382,7 +801403,7 @@ ] ], "RTCRtpTransceiver.https.html": [ - "943550d4b7feeb0bc69dd02de3fec722aef4565c", + "54af97aa7b85629369f6bb83ad720c4346553180", [ null, { @@ -802704,7 +802725,7 @@ ] ], "outbound-rtp.https.html": [ - "ff87d54256026b3b6fc6da2aa9f03a579730b330", + "196e8fd003706f9d6fe89cdaa2adf17e8fc2b30e", [ null, {
diff --git a/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-name-mutation.html b/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-name-mutation.html new file mode 100644 index 0000000..07272c38 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-anchor-position/anchor-name-mutation.html
@@ -0,0 +1,217 @@ +<!DOCTYPE html> + +<html> + +<title>Tests that when an anchor name is mutated, the anchor-positioned element adjusts to the new anchor</title> + +<link rel="author" href="mailto:kiet.ho@apple.com"> +<link rel="help" href="https://drafts.csswg.org/css-anchor-position-1/#name"> + +<script src="/resources/testharness.js"></script> +<script src="/resources/testharnessreport.js"></script> +<script src="/common/rendering-utils.js"></script> + +<style> + .containing-block { + position: relative; + width: 300px; + height: 300px; + + border: 1px black solid; + } + + .cell { + width: 100px; + height: 100px; + } + + #anchor-1 { + position: absolute; + top: 0; + left: 0; + + background: green; + } + + #anchor-2 { + position: absolute; + top: 100px; + left: 0; + + background: blue; + } + + .anchor { + anchor-name: --anchor; + } + + #anchor-positioned { + background: orange; + + position: absolute; + top: 0; + left: 0; + } + + .positioned-using-anchor-function-explicit-name { + position: absolute; + top: anchor(--anchor bottom) !important; + left: anchor(--anchor right) !important; + } + + .positioned-using-anchor-function-implicit-name { + position: absolute; + position-anchor: --anchor; + + top: anchor(bottom) !important; + left: anchor(right) !important; + } + + .positioned-using-position-area { + position: absolute; + position-anchor: --anchor; + + position-area: bottom right; + } +</style> + +<body> + <main id="main"> + </main> + + <template id="test-template"> + <div class="containing-block"> + <div class="cell" id="anchor-1"></div> + <div class="cell" id="anchor-2"></div> + <div class="cell" id="anchor-positioned"></div> + </div> + </template> + + <script> + function inflate(t, template_element) { + const main_element = document.getElementById("main"); + + t.add_cleanup(() => main_element.replaceChildren()); + main_element.append(template_element.content.cloneNode(true)); + } + + const test_template = document.getElementById("test-template"); + + const positioning_methods = [ + "positioned-using-anchor-function-explicit-name", + "positioned-using-anchor-function-implicit-name", + "positioned-using-position-area" + ] + + for (let positioning_method of positioning_methods) { + promise_test(async (t) => { + inflate(t, test_template); + + const anchor1 = document.getElementById("anchor-1"); + const anchorPositioned = document.getElementById("anchor-positioned"); + + anchorPositioned.classList.add(positioning_method); + + // Here, anchorPositioned should be at the default location (top-left of containing block) + // This is because the anchor elements don't have an anchor name yet. + assert_equals(anchorPositioned.offsetTop, 0); + assert_equals(anchorPositioned.offsetLeft, 0); + + anchor1.classList.add("anchor"); + + // Here, anchorPositioned should be bottom-right of anchor1 + assert_equals(anchorPositioned.offsetTop, 100); + assert_equals(anchorPositioned.offsetLeft, 100); + }, `Tests when an anchor-name is added later ${positioning_method}`); + + promise_test(async (t) => { + inflate(t, test_template); + + const anchor1 = document.getElementById("anchor-1"); + const anchorPositioned = document.getElementById("anchor-positioned"); + + anchor1.classList.add("anchor"); + anchorPositioned.classList.add(positioning_method); + + // Here, anchorPositioned should be bottom-right of anchor1 + assert_equals(anchorPositioned.offsetTop, 100); + assert_equals(anchorPositioned.offsetLeft, 100); + + anchor1.classList.remove("anchor"); + + // Here, anchorPositioned should be at the default location (top-left of containing block) + // This is because the anchor elements don't have an anchor name. + assert_equals(anchorPositioned.offsetTop, 0); + assert_equals(anchorPositioned.offsetLeft, 0); + }, `Tests when an anchor-name is removed later ${positioning_method}`); + + promise_test(async (t) => { + inflate(t, test_template); + + const anchor1 = document.getElementById("anchor-1"); + const anchor2 = document.getElementById("anchor-2"); + const anchorPositioned = document.getElementById("anchor-positioned"); + + anchor1.classList.add("anchor"); + anchorPositioned.classList.add(positioning_method); + + // Here, anchorPositioned should be bottom-right of anchor1 + assert_equals(anchorPositioned.offsetTop, 100); + assert_equals(anchorPositioned.offsetLeft, 100); + + anchor1.classList.remove("anchor"); + anchor2.classList.add("anchor"); + + // Here, anchorPositioned should be bottom-right of anchor2 + assert_equals(anchorPositioned.offsetTop, 200); + assert_equals(anchorPositioned.offsetLeft, 100); + }, `Tests when an anchor-name moves from one element to another ${positioning_method}`); + + promise_test(async (t) => { + inflate(t, test_template); + + const anchor1 = document.getElementById("anchor-1"); + const anchor2 = document.getElementById("anchor-2"); + const anchorPositioned = document.getElementById("anchor-positioned"); + + anchor1.classList.add("anchor"); + anchorPositioned.classList.add(positioning_method); + + // Here, anchorPositioned should be bottom-right of anchor1 + assert_equals(anchorPositioned.offsetTop, 100); + assert_equals(anchorPositioned.offsetLeft, 100); + + anchor2.classList.add("anchor"); + + // Here, anchorPositioned should be bottom-right of anchor2 + assert_equals(anchorPositioned.offsetTop, 200); + assert_equals(anchorPositioned.offsetLeft, 100); + }, `Tests when a new anchor candidate is added (which wins out previous anchor) ${positioning_method}`); + + + promise_test(async (t) => { + inflate(t, test_template); + + const anchor1 = document.getElementById("anchor-1"); + const anchor2 = document.getElementById("anchor-2"); + const anchorPositioned = document.getElementById("anchor-positioned"); + + anchor2.classList.add("anchor"); + anchorPositioned.classList.add(positioning_method); + + // Here, anchorPositioned should be bottom-right of anchor2 + assert_equals(anchorPositioned.offsetTop, 200); + assert_equals(anchorPositioned.offsetLeft, 100); + + anchor1.classList.add("anchor"); + + // Here, anchorPositioned should be bottom-right of anchor2 + assert_equals(anchorPositioned.offsetTop, 200); + assert_equals(anchorPositioned.offsetLeft, 100); + }, `Tests when a new anchor candidate is added (which loses out previous anchor) ${positioning_method}`); + } + </script> + +</body> + +</html>
diff --git a/third_party/blink/web_tests/external/wpt/css/css-text/text-transform/text-transform-capitalize-036.html b/third_party/blink/web_tests/external/wpt/css/css-text/text-transform/text-transform-capitalize-036.html new file mode 100644 index 0000000..a47dc35b --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/css/css-text/text-transform/text-transform-capitalize-036.html
@@ -0,0 +1,63 @@ +<!DOCTYPE html> +<html> +<head> + <meta charset="utf-8"> + <title>text-transform: capitalize innerText WPT tests</title> + <link rel="author" href="mailto:yezhizhenjiakang@gmail.com" title="Euclid Ye"> + <link rel="help" href="https://drafts.csswg.org/css-text/#propdef-text-transform"> + <script src="/resources/testharness.js"></script> + <script src="/resources/testharnessreport.js"></script> +</head> +<body> + <div id="div1" style="text-transform: capitalize;">hello world</div> + <div id="div2" style="text-transform: capitalize;">foo-bar</div> + <div id="div3" style="text-transform: capitalize;">john's apple</div> + <!-- Test case 4 nested elements --> + <div id="div4" style="text-transform: capitalize;"> + hello <span>world</span> + </div> + <div id="div5" style="text-transform: capitalize;">foo_bar</div> + <!-- Test case 6 not starting at word boundary --> + a<span id="span1" style="text-transform: capitalize;">b</span>c + + <script> + test(function () { + var div = document.getElementById("div1"); + assert_equals(div.innerText, "Hello World", + "innerText for 'hello world' should be 'Hello World'"); + }, "text-transform: capitalize test for 'hello world'"); + + test(function () { + var div = document.getElementById("div2"); + assert_equals(div.innerText, "Foo-Bar", + "innerText for 'foo-bar' should be 'Foo-Bar'"); + }, "text-transform: capitalize test for 'foo-bar'"); + + test(function () { + var div = document.getElementById("div3"); + assert_equals(div.innerText, "John's Apple", + "innerText for \"john's apple\" should be \"John's Apple\""); + }, "text-transform: capitalize test for \"john's apple\""); + + // Test for nested elements: the text inside the span should also be affected. + test(function () { + var div = document.getElementById("div4"); + assert_equals(div.innerText, "Hello World", + "innerText for nested 'hello <span>world</span>' should be 'Hello World'"); + }, "text-transform: capitalize test for nested elements"); + + // Test for underscore + test(function () { + var div = document.getElementById("div5"); + assert_equals(div.innerText.trim(), "Foo_bar", + "innerText for 'foo_bar' should be 'Foo_bar'"); + }, "text-transform: capitalize test for underscore"); + + test(function () { + var div = document.getElementById("span1"); + assert_equals(div.innerText, "b", + "innerText for span in 'a<span style='text-transform: capitalize;'>b</span>c' should be 'b'"); + }, "text-transform: capitalize test for not starting at word boundary"); + </script> +</body> +</html> \ No newline at end of file
diff --git a/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-form-element/form-check-validity-crash.html b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-form-element/form-check-validity-crash.html new file mode 100644 index 0000000..6d3bd0d --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/html/semantics/forms/the-form-element/form-check-validity-crash.html
@@ -0,0 +1,8 @@ +<!DOCTYPE html> +<div id="container"> + <form id="formId"></form> +</div> +<input id="inputId" required form="formId" oninvalid="container.remove()"> +<script> + formId.checkValidity(); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_element_haspointercapture.html b/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_element_haspointercapture.html index 3db6acf..d0f73a03 100644 --- a/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_element_haspointercapture.html +++ b/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_element_haspointercapture.html
@@ -3,6 +3,9 @@ <head> <title>Element.hasPointerCapture test</title> <meta name="viewport" content="width=device-width"> + <meta name="variant" content="?mouse"> + <meta name="variant" content="?pen"> + <meta name="variant" content="?touch"> <link rel="stylesheet" type="text/css" href="pointerevent_styles.css"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> @@ -11,6 +14,8 @@ <script src="/resources/testdriver-vendor.js"></script> <script type="text/javascript" src="pointerevent_support.js"></script> <script> + const pointer_type = location.search.substring(1); + var detected_pointertypes = {}; add_completion_callback(showPointerTypes); var test_pointerEvent = async_test("hasPointerCapture"); @@ -32,8 +37,13 @@ on_event(target0, "pointerdown", function (e) { detected_pointertypes[e.pointerType] = true; test_pointerEvent.step(function () { - assert_equals(target0.hasPointerCapture(e.pointerId), false, - "before target0.setPointerCapture, target0.hasPointerCapture should be false"); + if (pointer_type === "pen") { + // Implicit capture for pen is platform-dependent. + return; + } + const expected_default_capture = pointer_type !== "mouse"; + assert_equals(target0.hasPointerCapture(e.pointerId), expected_default_capture, + "before target0.setPointerCapture, target0.hasPointerCapture should be " + expected_default_capture); }); target1.setPointerCapture(e.pointerId); test_pointerEvent.step(function () { @@ -112,6 +122,7 @@ // Inject mouse inputs. actions_promise = new test_driver.Actions() + .addPointer("TestPointer", pointer_type) .pointerMove(0, 0, {origin: target0}) .pointerDown() .pointerMove(0, 10, {origin: target0}) @@ -139,8 +150,8 @@ </ol> </h4> <p> - <div id="target0" touch-action:none></div> - <div id="target1" touch-action:none></div> + <div id="target0" style="touch-action:none"></div> + <div id="target1"></div> <div id="complete-notice"> <p>The following pointer types were detected: <span id="pointertype-log"></span>.</p> </div>
diff --git a/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_element_haspointercapture_release_pending_capture.html b/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_element_haspointercapture_release_pending_capture.html index e75dff86..26ce5837c 100644 --- a/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_element_haspointercapture_release_pending_capture.html +++ b/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_element_haspointercapture_release_pending_capture.html
@@ -3,6 +3,9 @@ <head> <title>Element.hasPointerCapture test after the pending pointer capture element releases pointer capture</title> <meta name="viewport" content="width=device-width"> + <meta name="variant" content="?mouse"> + <meta name="variant" content="?pen"> + <meta name="variant" content="?touch"> <link rel="stylesheet" type="text/css" href="pointerevent_styles.css"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> @@ -11,6 +14,8 @@ <script src="/resources/testdriver-vendor.js"></script> <script type="text/javascript" src="pointerevent_support.js"></script> <script> + const pointer_type = location.search.substring(1); + var actions_promise; var detected_pointertypes = {}; add_completion_callback(showPointerTypes); @@ -59,6 +64,7 @@ // Inject mouse inputs. actions_promise = new test_driver.Actions() + .addPointer("TestPointer", pointer_type) .pointerMove(10, 10, {origin: target0}) .pointerDown() .pointerMove(10, 10, {origin: target1}) @@ -78,11 +84,11 @@ </ol> </h4> <p> - <div id="target0" touch-action:none></div> - <div id="target1" touch-action:none></div> + <div id="target0" style="touch-action:none"></div> + <div id="target1"></div> <div id="complete-notice"> <p>The following pointer types were detected: <span id="pointertype-log"></span>.</p> </div> <div id="log"></div> </body> -</html> \ No newline at end of file +</html>
diff --git a/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_releasepointercapture_release_right_after_capture.html b/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_releasepointercapture_release_right_after_capture.html index 409951b..bdae1a3 100644 --- a/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_releasepointercapture_release_right_after_capture.html +++ b/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_releasepointercapture_release_right_after_capture.html
@@ -3,6 +3,9 @@ <head> <title>Release pointer capture right after setpointercapture</title> <meta name="viewport" content="width=device-width"> + <meta name="variant" content="?mouse"> + <meta name="variant" content="?pen"> + <meta name="variant" content="?touch"> <link rel="stylesheet" type="text/css" href="pointerevent_styles.css"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> @@ -11,6 +14,8 @@ <script src="/resources/testdriver-vendor.js"></script> <script src="pointerevent_support.js"></script> <script type="text/javascript"> + const pointer_type = location.search.substring(1); + var actions_promise; var detected_pointertypes = {}; add_completion_callback(showPointerTypes); @@ -48,6 +53,7 @@ // Inject mouse inputs. actions_promise = new test_driver.Actions() + .addPointer("TestPointer", pointer_type) .pointerMove(0, 0, {origin: target0}) .pointerDown() .pointerMove(10, 10, {origin: target0}) @@ -66,8 +72,8 @@ </ol> </h4> <br> - <div id="target0" touch-action:none></div> - <div id="target1" touch-action:none></div> + <div id="target0" style="touch-action:none"></div> + <div id="target1"></div> <div id="complete-notice"> <p>The following pointer types were detected: <span id="pointertype-log"></span>.</p> </div>
diff --git a/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_setpointercapture_override_pending_capture_element.html b/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_setpointercapture_override_pending_capture_element.html index f7c1d4299..7021153e 100644 --- a/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_setpointercapture_override_pending_capture_element.html +++ b/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_setpointercapture_override_pending_capture_element.html
@@ -3,6 +3,9 @@ <head> <title>Test overriding the pending pointer capture element</title> <meta name="viewport" content="width=device-width"> + <meta name="variant" content="?mouse"> + <meta name="variant" content="?pen"> + <meta name="variant" content="?touch"> <link rel="stylesheet" type="text/css" href="pointerevent_styles.css"> <script src="/resources/testharness.js"></script> <script src="/resources/testharnessreport.js"></script> @@ -11,6 +14,8 @@ <script src="/resources/testdriver-vendor.js"></script> <script src="pointerevent_support.js"></script> <script type="text/javascript"> + const pointer_type = location.search.substring(1); + var actions_promise; var detected_pointertypes = {}; add_completion_callback(showPointerTypes); @@ -50,6 +55,7 @@ // Inject mouse inputs. actions_promise = new test_driver.Actions() + .addPointer("TestPointer", pointer_type) .pointerMove(0, 0, {origin: target0}) .pointerDown() .pointerMove(10, 10, {origin: target0}) @@ -68,8 +74,8 @@ </ol> </h4> <br> - <div id="target0" touch-action:none></div> - <div id="target1" touch-action:none></div> + <div id="target0" style="touch-action:none"></div> + <div id="target1"></div> <div id="complete-notice"> <p>The following pointer types were detected: <span id="pointertype-log"></span>.</p> </div>
diff --git a/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_setpointercapture_to_same_element_twice.html b/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_setpointercapture_to_same_element_twice.html index 5225ac5..156fa6c 100644 --- a/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_setpointercapture_to_same_element_twice.html +++ b/third_party/blink/web_tests/external/wpt/pointerevents/pointerevent_setpointercapture_to_same_element_twice.html
@@ -1,77 +1,86 @@ -<!doctype html> -<html> - <head> - <title>setPointerCapture() to the element which already captured the pointer</title> - <meta name="viewport" content="width=device-width"> - <link rel="stylesheet" type="text/css" href="pointerevent_styles.css"> - <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="pointerevent_support.js"></script> - <script type="text/javascript"> - var actions_promise; - var detected_pointertypes = {}; - add_completion_callback(showPointerTypes); - var test_setPointerCapture = async_test("setPointerCapture: set to the element which already captured the pointer"); - var got_pointer_capture = false; +<!DOCTYPE HTML> +<title>Repeated setPointerCapture calls on the capturing element</title> +<meta name="variant" content="?mouse"> +<meta name="variant" content="?pen"> +<meta name="variant" content="?touch"> +<link rel="help" href="https://github.com/w3c/pointerevents/issues/534"> +<meta name="viewport" content="width=device-width"> +<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="pointerevent_support.js"></script> - function run() { - var target0 = document.getElementById("target0"); - var target1 = document.getElementById("target1"); +<style> + div { + width: 50px; + height: 50px; + touch-action: none; + user-select: none; + } +</style> - on_event(target0, "pointerdown", function (event) { - detected_pointertypes[event.pointerType] = true; - target0.setPointerCapture(event.pointerId); - }); +<div id="target"></div> +<div id="other"></div> +<div id="done"></div> - on_event(target0, "gotpointercapture", function (event) { - test_setPointerCapture.step(function () { - assert_equals(got_pointer_capture, false, "Target0 should receive gotpointercapture at the first time it captured the pointer"); - assert_equals(target0.hasPointerCapture(event.pointerId), true, "Target 0 received gotpointercapture, target0.hasPointerCapture should be true"); - }); - got_pointer_capture = true; +<script> + 'use strict'; + const pointer_type = location.search.substring(1); - target0.setPointerCapture(event.pointerId); - test_setPointerCapture.step(function () { - assert_equals(target0.hasPointerCapture(event.pointerId), true, "Set capture to target0, target0.hasPointerCapture should be true"); - assert_equals(target1.hasPointerCapture(event.pointerId), false, "Set capture to target0, target1.hasPointerCapture should be false"); - }); - }); + const target = document.getElementById("target"); + const other = document.getElementById("other"); + const done = document.getElementById("done"); - on_event(target0, "pointerup", function (event) { - // Make sure the test finishes after all the input actions are completed. - actions_promise.then( () => { - test_setPointerCapture.done(); - }); - }); + let event_log = []; + function logEvent(e) { + if (e.type === "pointermove" && e.buttons == 0) { + // Move events w/o button pressed are irrelevant, and could be noisy too. + return; + } + event_log.push(e.type + "@" + e.target.id); + } - // Inject mouse inputs. - actions_promise = new test_driver.Actions() - .pointerMove(0, 0, {origin: target0}) - .pointerDown() - .pointerMove(10, 10, {origin: target0}) - .pointerUp() - .send(); - } - </script> - </head> - <body onload="run()"> - <h1>Pointer Event: setPointerCapture to the element which already captured the pointer</h1> - <h4>Test Description: - When the setPointerCapture method is invoked, if the target element had already captured the pointer, it should not trigger any gotpointercapture or lostpointercapture event - <ol> - <li>Press and hold left mouse button over black box - <li>Move mouse and release mouse button - </ol> - </h4> - <br> - <div id="target0" touch-action:none></div> - <div id="target1" touch-action:none></div> - <div id="complete-notice"> - <p>The following pointer types were detected: <span id="pointertype-log"></span>.</p> - </div> - <div id="log"></div> - </body> -</html> + const logged_events = [ + "pointerdown", "pointermove", "pointerup", "gotpointercapture", "lostpointercapture" + ]; + logged_events.forEach(ename => { + [target, other].forEach(div => div.addEventListener(ename, logEvent)); + }); + + target.addEventListener("pointerdown", e => { + other.setPointerCapture(e.pointerId); + }); + + const expected_events = [ + "pointerdown@target", "gotpointercapture@other", + "pointermove@other", "pointerup@other", + "lostpointercapture@other" + ]; + + promise_test(async () => { + event_log = []; + + target.addEventListener("pointermove", e => { + target.setPointerCapture(e.pointerId); + }); + + let done_click_promise = getEvent("click", done); + + let actions = new test_driver.Actions() + .addPointer("TestPointer", pointer_type) + .pointerMove(0, 0, {origin: target}) + .pointerDown() + .pointerMove(10, 10, {origin: target}) + .pointerUp() + .pointerMove(0, 0, {origin: done}) + .pointerDown() + .pointerUp(); + + await actions.send(); + await done_click_promise; + + assert_array_equals(event_log, expected_events, "events received"); + }, "A repeated setPointerCapture call does not redispatch capture events"); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/soft-navigation-heuristics/lcp/tentative/background-image-set-image.html b/third_party/blink/web_tests/external/wpt/soft-navigation-heuristics/lcp/tentative/background-image-set-image.html new file mode 100644 index 0000000..a99ba5bd --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/soft-navigation-heuristics/lcp/tentative/background-image-set-image.html
@@ -0,0 +1,75 @@ +<!doctype html> +<!-- +The soft navigation version of the identically named test in +/largest-contentful-paint/background-image-set-image.html +Notes: + - Triggers trivial soft navigation with same page contents as original test. +--> +<title>Background image-set images should be LCP candidates after soft navigation</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 src="/soft-navigation-heuristics/resources/soft-navigation-test-helper.js"></script> +<script> + function clickHandler() { + document.body.innerHTML = ` + <style> + .background { + width: calc(100vw - 40px); + height: calc(100vw - 40px); + max-width: 100px; + max-height: 100px; + background: #eee image-set("/images/lcp-100x50.png" type("image/png")) center center no-repeat; + background-size: cover; + } + </style> + <div class="background"></div> + <p>fallback</p>`; + history.pushState({}, "", "/test"); + } +</script> +<body> + <div id="click-target" onclick="clickHandler()">Click!</div> +</body> +<script> + promise_test(async (t) => { + assert_implements(window.LargestContentfulPaint, "LargestContentfulPaint is not implemented"); + const helper = new SoftNavigationTestHelper(t); + const lcpEntries = await helper.getBufferedPerformanceEntriesWithTimeout( + /*type=*/ "largest-contentful-paint", + /*includeSoftNavigationObservations=*/ false, + /*minNumEntries=*/ 1, + ); + assert_equals(lcpEntries.length, 1); + assert_equals(lcpEntries[0].id, "click-target", "The first entry should be the button"); + + const softLcpPromise = new Promise((resolve) => { + new PerformanceObserver((list) => { + for (const entry of list.getEntries()) { + if (entry.url.includes("lcp-100x50")) { + resolve(entry.url); + return; + } + } + }).observe({ + type: "largest-contentful-paint", + includeSoftNavigationObservations: true, + buffered: true, + }); + }); + if (test_driver) { + test_driver.click(document.getElementById("click-target")); + } + await helper.withTimeoutMessage( + softLcpPromise, + "Timed out waiting for LCP entry for background image-set image.", + /*timeoutMs=*/ 3000, + ); + assert_equals( + 1, + performance.getEntriesByType("soft-navigation").length, + "There should be one soft navigation entry.", + ); + }, "Background image-set images should be eligible for LCP candidates after soft navigation."); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/soft-navigation-heuristics/lcp/tentative/first-paint-equals-lcp-text.html b/third_party/blink/web_tests/external/wpt/soft-navigation-heuristics/lcp/tentative/first-paint-equals-lcp-text.html new file mode 100644 index 0000000..ea0ceb1 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/soft-navigation-heuristics/lcp/tentative/first-paint-equals-lcp-text.html
@@ -0,0 +1,99 @@ +<!doctype html> +<!-- +The soft navigation version of the identically named test in +/largest-contentful-paint/first-paint-equals-lcp-text.html. +Notes: +- Awaits trivial soft navigation with same page contents as original test. +- Since FCP is not implemented for soft navigations, this test actually + compares the element timing of the text node to the LCP. +--> +<meta charset="utf-8" /> +<title> + LargestContentfulPaint after soft navigation compared with FirstPaint and FirstContentfulPaint on + single text page. +</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 src="/soft-navigation-heuristics/resources/soft-navigation-test-helper.js"></script> +<script> + function clickHandler() { + document.body.innerHTML = `<p elementtiming=text>Text</p>`; + history.pushState({}, "", "/test"); + } +</script> +<body> + <div id="click-target" onclick="clickHandler()">Click!</div> +</body> +<script> + setup({ hide_test_state: true }); + promise_test(async (t) => { + assert_implements(window.LargestContentfulPaint, "LargestContentfulPaint is not implemented"); + + const helper = new SoftNavigationTestHelper(t); + const lcpEntries = await helper.getBufferedPerformanceEntriesWithTimeout( + /*type=*/ "largest-contentful-paint", + /*includeSoftNavigationObservations=*/ false, + /*minNumEntries=*/ 1, + ); + assert_equals(lcpEntries.length, 1); + assert_equals(lcpEntries[0].id, "click-target", "The first entry should be the button"); + const beforeLoad = performance.now(); + const promise = Promise.all([ + SoftNavigationTestHelper.getPerformanceEntries( + /*type=*/ "soft-navigation", + /*includeSoftNavigationObservations=*/ true, + /*minNumEntries=*/ 1, + ), + SoftNavigationTestHelper.getPerformanceEntries( + /*type=*/ "element", + /*includeSoftNavigationObservations=*/ true, + /*minNumEntries=*/ 1, + ), + SoftNavigationTestHelper.getPerformanceEntries( + /*type=*/ "largest-contentful-paint", + /*includeSoftNavigationObservations=*/ true, + /*minNumEntries=*/ 1, + ), + ]); + if (test_driver) { + test_driver.click(document.getElementById("click-target")); + } + const [softNavigationEntries, elementEntries, softLcpEntries] = await helper.withTimeoutMessage( + promise, + "Failed to get performance entries.", + ); + + assert_equals(1, softNavigationEntries.length, "There should be one soft navigation entry."); + assert_equals(1, elementEntries.length, "There should be one element entry."); + assert_equals(1, softLcpEntries.length, "There should be one soft LCP entry."); + + assert_less_than_equal( + softNavigationEntries[0].startTime, + softLcpEntries[0].startTime, + "Soft LCP should be after soft navigation.", + ); + assert_equals( + softLcpEntries[0].startTime, + elementEntries[0].startTime, + "Soft LCP and element entry should be at the same time.", + ); + + assert_not_equals( + lcpEntries[0].navigationId, + softNavigationEntries[0].navigationId, + "Initial LCP and soft navigation have different navigation ID.", + ); + assert_equals( + softNavigationEntries[0].navigationId, + softLcpEntries[0].navigationId, + "Soft navigation and soft LCP have the same navigation ID.", + ); + assert_equals( + softLcpEntries[0].navigationId, + elementEntries[0].navigationId, + "Soft LCP and element entry have the same navigation ID.", + ); + }, "FCP and LCP after soft navigation are the same when there is a single text element in the page."); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/soft-navigation-heuristics/lcp/tentative/iframe-content-not-observed.html b/third_party/blink/web_tests/external/wpt/soft-navigation-heuristics/lcp/tentative/iframe-content-not-observed.html new file mode 100644 index 0000000..73beb752 --- /dev/null +++ b/third_party/blink/web_tests/external/wpt/soft-navigation-heuristics/lcp/tentative/iframe-content-not-observed.html
@@ -0,0 +1,67 @@ +<!doctype html> +<!-- +The soft navigation version of the identically named test in +/largest-contentful-paint/iframe-content-not-observed.html +Notes: +- This test almost triggers a soft navigation except that the + contents inside the iframe don't count, even though it's same-origin. + This is actually just like LCP, and we also test that the iframe content + doesn't generate a soft LCP entry either. +--> +<meta charset="utf-8" /> +<title> + Largest Contentful Paint and soft navigation: do NOT observe elements from same-origin iframes +</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 src="/soft-navigation-heuristics/resources/soft-navigation-test-helper.js"></script> +<script> + function clickHandler() { + document.body.innerHTML = `<iframe src='/largest-contentful-paint/resources/iframe-with-content.html'></iframe>`; + history.pushState({}, "", "/test"); + } +</script> +<body> + <div id="click-target" onclick="clickHandler()">Click!</div> +</body> +<script> + promise_test(async (t) => { + assert_implements(window.LargestContentfulPaint, "LargestContentfulPaint is not implemented"); + const helper = new SoftNavigationTestHelper(t); + const lcpEntries = await helper.getBufferedPerformanceEntriesWithTimeout( + /*type=*/ "largest-contentful-paint", + /*includeSoftNavigationObservations=*/ false, + /*minNumEntries=*/ 1, + ); + assert_equals(lcpEntries.length, 1); + assert_equals(lcpEntries[0].id, "click-target", "The first entry should be the button"); + + const softNavigationPromise = SoftNavigationTestHelper.getPerformanceEntries( + /*type=*/ "soft-navigation", + /*includeSoftNavigationObservations=*/ true, + /*minNumEntries=*/ 1, + ).then((entries) => { + assert_unreached("Should not have received a soft navigation entry!"); + }); + const softLcpPromise = SoftNavigationTestHelper.getPerformanceEntries( + /*type=*/ "largest-contentful-paint", + /*includeSoftNavigationObservations=*/ true, + /*minNumEntries=*/ 1, + ).then((entries) => { + assert_unreached("Should not have received an a soft LCP entry!"); + }); + + if (test_driver) { + test_driver.click(document.getElementById("click-target")); + } + + // If neither the soft navigation nor the soft LCP are received within 3 seconds, we're ok. + await Promise.race([ + softNavigationPromise, + softLcpPromise, + new Promise((resolve) => t.step_timeout(resolve(), 2000)), + ]); + }, "Element in child iframe is not observed for lcp or soft navigation, even if same-origin."); +</script>
diff --git a/third_party/blink/web_tests/external/wpt/svg/shapes/rect-03.svg b/third_party/blink/web_tests/external/wpt/svg/shapes/rect-03.svg index f4b59c91..3562249 100644 --- a/third_party/blink/web_tests/external/wpt/svg/shapes/rect-03.svg +++ b/third_party/blink/web_tests/external/wpt/svg/shapes/rect-03.svg
@@ -4,6 +4,7 @@ <link xmlns="http://www.w3.org/1999/xhtml" rel="help" href="http://www.w3.org/TR/SVG2/shapes.html#RectElement"/> <link xmlns="http://www.w3.org/1999/xhtml" rel="match" href="rect-03-ref.html"/> <meta xmlns="http://www.w3.org/1999/xhtml" name="assert" content="rect element with rounded corners renders correctly."/> + <meta name="fuzzy" content="0-30;0-100"/> </metadata> <rect x="10" y="10" width="50" height="50" rx="8" ry="8" fill="blue"/> </svg>
diff --git a/third_party/blink/web_tests/external/wpt/svg/shapes/rect-04.svg b/third_party/blink/web_tests/external/wpt/svg/shapes/rect-04.svg index 37c4c9b..f3e6d57 100644 --- a/third_party/blink/web_tests/external/wpt/svg/shapes/rect-04.svg +++ b/third_party/blink/web_tests/external/wpt/svg/shapes/rect-04.svg
@@ -4,6 +4,7 @@ <link xmlns="http://www.w3.org/1999/xhtml" rel="help" href="http://www.w3.org/TR/SVG2/shapes.html#RectElement"/> <link xmlns="http://www.w3.org/1999/xhtml" rel="match" href="rect-04-ref.html"/> <meta xmlns="http://www.w3.org/1999/xhtml" name="assert" content="rect element with rounded corners and stroke renders correctly."/> + <meta name="fuzzy" content="0-50;0-150"/> </metadata> <rect x="10" y="10" width="50" height="50" rx="8" ry="8" fill="none" stroke="blue" stroke-width="4"/> </svg>
diff --git a/third_party/blink/web_tests/images/png-crbug423310049.html b/third_party/blink/web_tests/images/png-crbug423310049.html new file mode 100644 index 0000000..94df631 --- /dev/null +++ b/third_party/blink/web_tests/images/png-crbug423310049.html
@@ -0,0 +1,12 @@ +<!DOCTYPE html> +In https://crbug.com/423310049 the color space transformation wasn't quite +right - with the test image below the symptom was that yellow and cyan +bands were swapped (magenta and black bands were preserved). +<p> +The test image below was created by +<ul> + <li>Taking IHDR, IDAT, and IEND chunks from basn2c08 from the PNG test suite + <li>Taking iCCP chunk from the repro image from https://crbug.com/423310049 +</ul> +<hr> +<img src="resources/crbug423310049.png">
diff --git a/third_party/blink/web_tests/images/resources/crbug423310049.png b/third_party/blink/web_tests/images/resources/crbug423310049.png new file mode 100644 index 0000000..2b097080 --- /dev/null +++ b/third_party/blink/web_tests/images/resources/crbug423310049.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/images/png-crbug423310049-expected.png b/third_party/blink/web_tests/platform/linux/images/png-crbug423310049-expected.png new file mode 100644 index 0000000..a4e8341a --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/images/png-crbug423310049-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/png-crbug423310049-expected.png b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/png-crbug423310049-expected.png new file mode 100644 index 0000000..51a82e7 --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/virtual/exotic-color-space/images/png-crbug423310049-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/linux/virtual/gpu-rasterization/images/png-crbug423310049-expected.png b/third_party/blink/web_tests/platform/linux/virtual/gpu-rasterization/images/png-crbug423310049-expected.png new file mode 100644 index 0000000..33ae7623 --- /dev/null +++ b/third_party/blink/web_tests/platform/linux/virtual/gpu-rasterization/images/png-crbug423310049-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12/images/png-crbug423310049-expected.png b/third_party/blink/web_tests/platform/mac-mac12/images/png-crbug423310049-expected.png new file mode 100644 index 0000000..2f6f5ae --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac12/images/png-crbug423310049-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac12/virtual/gpu-rasterization/images/png-crbug423310049-expected.png b/third_party/blink/web_tests/platform/mac-mac12/virtual/gpu-rasterization/images/png-crbug423310049-expected.png new file mode 100644 index 0000000..c183cfe --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac12/virtual/gpu-rasterization/images/png-crbug423310049-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13/images/png-crbug423310049-expected.png b/third_party/blink/web_tests/platform/mac-mac13/images/png-crbug423310049-expected.png new file mode 100644 index 0000000..2f6f5ae --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac13/images/png-crbug423310049-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac13/virtual/gpu-rasterization/images/png-crbug423310049-expected.png b/third_party/blink/web_tests/platform/mac-mac13/virtual/gpu-rasterization/images/png-crbug423310049-expected.png new file mode 100644 index 0000000..c183cfe --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac13/virtual/gpu-rasterization/images/png-crbug423310049-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/images/png-crbug423310049-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/images/png-crbug423310049-expected.png new file mode 100644 index 0000000..866cf6a --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/images/png-crbug423310049-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/png-crbug423310049-expected.png b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/png-crbug423310049-expected.png new file mode 100644 index 0000000..2c8b9af --- /dev/null +++ b/third_party/blink/web_tests/platform/mac-mac15-arm64/virtual/gpu-rasterization/images/png-crbug423310049-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/images/png-crbug423310049-expected.png b/third_party/blink/web_tests/platform/mac/images/png-crbug423310049-expected.png new file mode 100644 index 0000000..2f6f5ae --- /dev/null +++ b/third_party/blink/web_tests/platform/mac/images/png-crbug423310049-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/png-crbug423310049-expected.png b/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/png-crbug423310049-expected.png new file mode 100644 index 0000000..4ad3f745 --- /dev/null +++ b/third_party/blink/web_tests/platform/mac/virtual/exotic-color-space/images/png-crbug423310049-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/mac/virtual/gpu-rasterization/images/png-crbug423310049-expected.png b/third_party/blink/web_tests/platform/mac/virtual/gpu-rasterization/images/png-crbug423310049-expected.png new file mode 100644 index 0000000..c183cfe --- /dev/null +++ b/third_party/blink/web_tests/platform/mac/virtual/gpu-rasterization/images/png-crbug423310049-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/images/png-crbug423310049-expected.png b/third_party/blink/web_tests/platform/win/images/png-crbug423310049-expected.png new file mode 100644 index 0000000..a5f2bc1f --- /dev/null +++ b/third_party/blink/web_tests/platform/win/images/png-crbug423310049-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/png-crbug423310049-expected.png b/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/png-crbug423310049-expected.png new file mode 100644 index 0000000..5a20637 --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/exotic-color-space/images/png-crbug423310049-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win/virtual/gpu-rasterization/images/png-crbug423310049-expected.png b/third_party/blink/web_tests/platform/win/virtual/gpu-rasterization/images/png-crbug423310049-expected.png new file mode 100644 index 0000000..946d2db --- /dev/null +++ b/third_party/blink/web_tests/platform/win/virtual/gpu-rasterization/images/png-crbug423310049-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/platform/win11-arm64/images/png-crbug423310049-expected.png b/third_party/blink/web_tests/platform/win11-arm64/images/png-crbug423310049-expected.png new file mode 100644 index 0000000..8e53544 --- /dev/null +++ b/third_party/blink/web_tests/platform/win11-arm64/images/png-crbug423310049-expected.png Binary files differ
diff --git a/third_party/blink/web_tests/virtual/indexeddb_sqlite/external/wpt/IndexedDB/idbcursor_continue_objectstore.any-expected.txt b/third_party/blink/web_tests/virtual/indexeddb_sqlite/external/wpt/IndexedDB/idbcursor_continue_objectstore.any-expected.txt deleted file mode 100644 index 8118d60..0000000 --- a/third_party/blink/web_tests/virtual/indexeddb_sqlite/external/wpt/IndexedDB/idbcursor_continue_objectstore.any-expected.txt +++ /dev/null
@@ -1,5 +0,0 @@ -This is a testharness.js-based test. -[FAIL] Delete next element, and iterate to it - assert_unreached: unexpected db.error (AbortError) Reached unreachable code -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/virtual/indexeddb_sqlite/external/wpt/IndexedDB/idbobjectstore_getAll.any-expected.txt b/third_party/blink/web_tests/virtual/indexeddb_sqlite/external/wpt/IndexedDB/idbobjectstore_getAll.any-expected.txt deleted file mode 100644 index 5fcf71ca..0000000 --- a/third_party/blink/web_tests/virtual/indexeddb_sqlite/external/wpt/IndexedDB/idbobjectstore_getAll.any-expected.txt +++ /dev/null
@@ -1,5 +0,0 @@ -This is a testharness.js-based test. -[FAIL] Get all with large values - Cannot read properties of null (reading 'join') -Harness: the test ran to completion. -
diff --git a/third_party/blink/web_tests/virtual/indexeddb_sqlite/external/wpt/IndexedDB/idbobjectstore_getAllRecords.tentative.any-expected.txt b/third_party/blink/web_tests/virtual/indexeddb_sqlite/external/wpt/IndexedDB/idbobjectstore_getAllRecords.tentative.any-expected.txt deleted file mode 100644 index afd207e9..0000000 --- a/third_party/blink/web_tests/virtual/indexeddb_sqlite/external/wpt/IndexedDB/idbobjectstore_getAllRecords.tentative.any-expected.txt +++ /dev/null
@@ -1,5 +0,0 @@ -This is a testharness.js-based test. -[FAIL] Get all records with large values - Cannot read properties of null (reading 'join') -Harness: the test ran to completion. -
diff --git a/third_party/boringssl/src b/third_party/boringssl/src index 5622da9..45f35e0 160000 --- a/third_party/boringssl/src +++ b/third_party/boringssl/src
@@ -1 +1 @@ -Subproject commit 5622da92e1e7bacb5d0785ff5650a5a23b143b84 +Subproject commit 45f35e007cf55285581fae079b721c63922871b9
diff --git a/third_party/catapult b/third_party/catapult index 9e57472..43e5bb8 160000 --- a/third_party/catapult +++ b/third_party/catapult
@@ -1 +1 @@ -Subproject commit 9e57472d991ef17726931163fb943277e372421e +Subproject commit 43e5bb872890d0b7038c81744e169c9e0edd8013
diff --git a/third_party/chromite b/third_party/chromite index be7db7a..d6db0868 160000 --- a/third_party/chromite +++ b/third_party/chromite
@@ -1 +1 @@ -Subproject commit be7db7a8cb09acf9cb9467be836b9569777baba6 +Subproject commit d6db0868fc4ae3f19fd9d9ee4a4dfd6f0c88b078
diff --git a/third_party/devtools-frontend/src b/third_party/devtools-frontend/src index 668292f..576cf52 160000 --- a/third_party/devtools-frontend/src +++ b/third_party/devtools-frontend/src
@@ -1 +1 @@ -Subproject commit 668292f6e38a78c16e1877c6e9919716bd7da04d +Subproject commit 576cf523f65f423424a2991c4c7983bf87d05348
diff --git a/third_party/libaom/README.chromium b/third_party/libaom/README.chromium index 651f4128..28773e3 100644 --- a/third_party/libaom/README.chromium +++ b/third_party/libaom/README.chromium
@@ -2,7 +2,7 @@ Short Name: libaom URL: https://aomedia.googlesource.com/aom/ Version: N/A -Revision: 3304ee478e7e8e41da2d9f96e5c5fc9b1e5bb043 +Revision: 6c4010bde34318fd6c1f0d10196f27ac9908eeb8 CPEPrefix: cpe:/a:aomedia:aomedia:3.12.1 License: BSD-2-Clause, Patent License Android Compatible: yes
diff --git a/third_party/libaom/source/config/config/aom_version.h b/third_party/libaom/source/config/config/aom_version.h index 63c6e7c5..1225abc6 100644 --- a/third_party/libaom/source/config/config/aom_version.h +++ b/third_party/libaom/source/config/config/aom_version.h
@@ -14,9 +14,9 @@ #define VERSION_MAJOR 3 #define VERSION_MINOR 12 #define VERSION_PATCH 1 -#define VERSION_EXTRA "179-g3304ee478e" +#define VERSION_EXTRA "182-g6c4010bde3" #define VERSION_PACKED \ ((VERSION_MAJOR << 16) | (VERSION_MINOR << 8) | (VERSION_PATCH)) -#define VERSION_STRING_NOSP "3.12.1-179-g3304ee478e" -#define VERSION_STRING " 3.12.1-179-g3304ee478e" +#define VERSION_STRING_NOSP "3.12.1-182-g6c4010bde3" +#define VERSION_STRING " 3.12.1-182-g6c4010bde3" #endif // AOM_VERSION_H_
diff --git a/third_party/libaom/source/libaom b/third_party/libaom/source/libaom index 3304ee4..6c4010b 160000 --- a/third_party/libaom/source/libaom +++ b/third_party/libaom/source/libaom
@@ -1 +1 @@ -Subproject commit 3304ee478e7e8e41da2d9f96e5c5fc9b1e5bb043 +Subproject commit 6c4010bde34318fd6c1f0d10196f27ac9908eeb8
diff --git a/third_party/llvm-libc/src b/third_party/llvm-libc/src index a2f7b48..ced0173 160000 --- a/third_party/llvm-libc/src +++ b/third_party/llvm-libc/src
@@ -1 +1 @@ -Subproject commit a2f7b489cd4fecf856eb3739cc5a341545022896 +Subproject commit ced017335267492f948279508b4c60681eddf1b8
diff --git a/third_party/nearby/BUILD.gn b/third_party/nearby/BUILD.gn index 1fc085b4b..d94e1ee 100644 --- a/third_party/nearby/BUILD.gn +++ b/third_party/nearby/BUILD.gn
@@ -1330,6 +1330,7 @@ proto_in_dir = "src" sources = [ "${proto_in_dir}/internal/proto/metadata.proto" ] proto_out_dir = "third_party/nearby" + deps = [ ":connections_credential_proto" ] } # src/connections/implementation/proto
diff --git a/third_party/nearby/README.chromium b/third_party/nearby/README.chromium index 28715d4..8a4dcb3 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: e96ebef1d3b0e109109f1c108e5d9f4c773bd281 +Version: fff5c22e3178a633f57e4ad1fb5ad96a6116240a License: Apache-2.0 License File: LICENSE Security Critical: yes
diff --git a/third_party/nearby/src b/third_party/nearby/src index e96ebef..fff5c22 160000 --- a/third_party/nearby/src +++ b/third_party/nearby/src
@@ -1 +1 @@ -Subproject commit e96ebef1d3b0e109109f1c108e5d9f4c773bd281 +Subproject commit fff5c22e3178a633f57e4ad1fb5ad96a6116240a
diff --git a/third_party/perfetto b/third_party/perfetto index 167e1f0..891351c 160000 --- a/third_party/perfetto +++ b/third_party/perfetto
@@ -1 +1 @@ -Subproject commit 167e1f0dab2691a4b2a911e001317353405d83d9 +Subproject commit 891351c7233523c01dc0e58ac8650df47fad9ab5
diff --git a/third_party/rust/chromium_crates_io/Cargo.lock b/third_party/rust/chromium_crates_io/Cargo.lock index 9f62894..5b31c9d 100644 --- a/third_party/rust/chromium_crates_io/Cargo.lock +++ b/third_party/rust/chromium_crates_io/Cargo.lock
@@ -74,7 +74,7 @@ [[package]] name = "cc" -version = "1.2.26" +version = "1.2.27" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "shlex", @@ -650,7 +650,7 @@ [[package]] name = "libc" -version = "0.2.172" +version = "0.2.173" source = "registry+https://github.com/rust-lang/crates.io-index" [[package]] @@ -964,7 +964,7 @@ [[package]] name = "syn" -version = "2.0.102" +version = "2.0.103" source = "registry+https://github.com/rust-lang/crates.io-index" dependencies = [ "proc-macro2",
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 4420c67..95dc0de91 100644 --- a/third_party/rust/chromium_crates_io/supply-chain/config.toml +++ b/third_party/rust/chromium_crates_io/supply-chain/config.toml
@@ -74,7 +74,7 @@ [policy."calendrical_calculations:0.2.0"] criteria = ["crypto-safe", "safe-to-deploy", "ub-risk-2"] -[policy."cc:1.2.26"] +[policy."cc:1.2.27"] criteria = [] [policy."cfg-if:1.0.1"] @@ -248,7 +248,7 @@ [policy."lazy_static:1.5.0"] criteria = ["crypto-safe", "safe-to-deploy", "ub-risk-2"] -[policy."libc:0.2.172"] +[policy."libc:0.2.173"] criteria = ["crypto-safe", "safe-to-deploy", "ub-risk-2"] [policy."libm:0.2.15"] @@ -374,7 +374,7 @@ [policy."subtle:2.6.1"] criteria = ["crypto-safe", "safe-to-deploy", "ub-risk-2"] -[policy."syn:2.0.102"] +[policy."syn:2.0.103"] criteria = ["crypto-safe", "safe-to-deploy", "ub-risk-2"] [policy."synstructure:0.13.2"]
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 7330449..126d497 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.26` crate. +# `cc-1.2.27` crate. # # See `//tools/crates/gnrt/removed_crate.md` to learn more. [package] name = "cc" -version = "1.2.26" +version = "1.2.27" [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 aaccf6cc..97eb002 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.26` crate. +// `cc-1.2.27` crate. // // See `//tools/crates/gnrt/removed_crate.md` to learn more.
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/.cargo_vcs_info.json b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/.cargo_vcs_info.json index af5afed..49f714d4 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/.cargo_vcs_info.json +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/.cargo_vcs_info.json
@@ -1,6 +1,6 @@ { "git": { - "sha1": "a5eab581f9c9c03f29e3edd4a4d4f850d748f2e9" + "sha1": "9288ec0123086439f27ea47a2b120345e6007e24" }, "path_in_vcs": "" } \ No newline at end of file
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/CHANGELOG.md b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/CHANGELOG.md index 82a37cf..0adc302 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/CHANGELOG.md +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/CHANGELOG.md
@@ -1,5 +1,42 @@ # Changelog + +## [0.2.173](https://github.com/rust-lang/libc/compare/0.2.172...0.2.173) - 2025-06-09 + +### Added + +- AIX: Add an AIX triple to Cargo.toml for doc ([#4475](https://github.com/rust-lang/libc/pull/4475)) +- FreeBSD: Add the `SO_SPLICE` socket option support for FreeBSD >= 14.2 ([#4451](https://github.com/rust-lang/libc/pull/4451)) +- Linux GNU: Prepare for supporting `_TIME_BITS=64` ([#4433](https://github.com/rust-lang/libc/pull/4433)) +- Linux: Add constant PACKET_IGNORE_OUTGOING ([#4319](https://github.com/rust-lang/libc/pull/4319)) +- Linux: Add constants and types for `nsfs` ioctls ([#4436](https://github.com/rust-lang/libc/pull/4436)) +- Linux: Add constants for Memory-Deny-Write-Execute `prctls` ([#4400](https://github.com/rust-lang/libc/pull/4400)) +- Linux: Add constants from `linux/cn_proc.h` and `linux/connector.h` ([#4434](https://github.com/rust-lang/libc/pull/4434)) +- Linux: Add new flags for `pwritev2` and `preadv2` ([#4452](https://github.com/rust-lang/libc/pull/4452)) +- Linux: Add pid_type enum values ([#4403](https://github.com/rust-lang/libc/pull/4403)) +- Linux: Update pidfd constants and types (Linux 6.9-6.15) ([#4402](https://github.com/rust-lang/libc/pull/4402)) +- Loongarch64 musl: Define the `MADV_SOFT_OFFLINE` constant ([#4448](https://github.com/rust-lang/libc/pull/4448)) +- Musl: Add new fields since 1.2.0/1.2.2 to `struct tcp_info` ([#4443](https://github.com/rust-lang/libc/pull/4443)) +- Musl: Prepare for supporting v1.2.3 ([#4443](https://github.com/rust-lang/libc/pull/4443)) +- NuttX: Add `arc4random` and `arc4random_buf` ([#4464](https://github.com/rust-lang/libc/pull/4464)) +- RISC-V Musl: Add `MADV_SOFT_OFFLINE` definition ([#4447](https://github.com/rust-lang/libc/pull/4447)) +- Redox: Define SCM_RIGHTS ([#4440](https://github.com/rust-lang/libc/pull/4440)) +- VxWorks: Add missing UTIME defines and TASK_RENAME_LENGTH ([#4407](https://github.com/rust-lang/libc/pull/4407)) +- Windows: Add more `time.h` functions ([#4427](https://github.com/rust-lang/libc/pull/4427)) + +### Changed + +- Redox: Update `SA_` constants. ([#4426](https://github.com/rust-lang/libc/pull/4426)) +- Redox: make `CMSG_ALIGN`, `CMSG_LEN`, and `CMSG_SPACE` const functions ([#4441](https://github.com/rust-lang/libc/pull/4441)) + +### Fixed + +- AIX: Enable libc-test and fix definitions/declarations. ([#4450](https://github.com/rust-lang/libc/pull/4450)) +- Emscripten: Fix querying emcc on windows (use emcc.bat) ([#4248](https://github.com/rust-lang/libc/pull/4248)) +- Hurd: Fix build from missing `fpos_t` ([#4472](https://github.com/rust-lang/libc/pull/4472)) +- Loongarch64 Musl: Fix the `struct ipc_perm` bindings ([#4384](https://github.com/rust-lang/libc/pull/4384)) +- Musl: Fix the `O_LARGEFILE` constant value. ([#4443](https://github.com/rust-lang/libc/pull/4443)) + ## [0.2.172](https://github.com/rust-lang/libc/compare/0.2.171...0.2.172) - 2025-04-14 ### Added
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/Cargo.lock b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/Cargo.lock index 833de34..eae0e13 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/Cargo.lock +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/Cargo.lock
@@ -4,7 +4,7 @@ [[package]] name = "libc" -version = "0.2.172" +version = "0.2.173" dependencies = [ "rustc-std-workspace-core", ]
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/Cargo.toml b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/Cargo.toml index 946d700e..0bfc5e5 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/Cargo.toml +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/Cargo.toml
@@ -13,7 +13,7 @@ edition = "2021" rust-version = "1.63" name = "libc" -version = "0.2.172" +version = "0.2.173" authors = ["The Rust Project Developers"] build = "build.rs" exclude = [ @@ -27,11 +27,7 @@ autoexamples = false autotests = false autobenches = false -description = """ -Raw FFI bindings to platform libraries like libc. -""" -homepage = "https://github.com/rust-lang/libc" -documentation = "https://docs.rs/libc/" +description = "Raw FFI bindings to platform libraries like libc." readme = "README.md" keywords = [ "libc", @@ -108,6 +104,7 @@ "powerpc-unknown-netbsd", "powerpc-wrs-vxworks", "powerpc-wrs-vxworks-spe", + "powerpc64-ibm-aix", "powerpc64-unknown-freebsd", "powerpc64-unknown-linux-gnu", "powerpc64-wrs-vxworks", @@ -184,3 +181,20 @@ [dependencies.rustc-std-workspace-core] version = "1.0.0" optional = true + +[lints.clippy] +expl_impl_clone_on_copy = "allow" +explicit_iter_loop = "warn" +identity_op = "allow" +manual_assert = "warn" +map_unwrap_or = "warn" +missing_safety_doc = "allow" +non_minimal_cfg = "allow" +ptr_as_ptr = "warn" +uninlined_format_args = "allow" +unnecessary_cast = "allow" +unnecessary_semicolon = "warn" +used_underscore_binding = "allow" + +[lints.rust] +unused_qualifications = "allow"
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/Cargo.toml.orig b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/Cargo.toml.orig index cabbc528..b9d9d73 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/Cargo.toml.orig +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/Cargo.toml.orig
@@ -1,21 +1,15 @@ [package] name = "libc" -version = "0.2.172" -authors = ["The Rust Project Developers"] -license = "MIT OR Apache-2.0" -readme = "README.md" -edition = "2021" -repository = "https://github.com/rust-lang/libc" -homepage = "https://github.com/rust-lang/libc" -documentation = "https://docs.rs/libc/" +version = "0.2.173" keywords = ["libc", "ffi", "bindings", "operating", "system"] categories = ["external-ffi-bindings", "no-std", "os"] -build = "build.rs" exclude = ["/ci/*", "/.github/*", "/.cirrus.yml", "/triagebot.toml"] +description = "Raw FFI bindings to platform libraries like libc." +authors = ["The Rust Project Developers"] +edition = "2021" +license = "MIT OR Apache-2.0" +repository = "https://github.com/rust-lang/libc" rust-version = "1.63" -description = """ -Raw FFI bindings to platform libraries like libc. -""" [package.metadata.docs.rs] features = ["extra_traits"] @@ -78,6 +72,7 @@ "powerpc-unknown-netbsd", "powerpc-wrs-vxworks", "powerpc-wrs-vxworks-spe", + "powerpc64-ibm-aix", "powerpc64-unknown-freebsd", "powerpc64-unknown-linux-gnu", "powerpc64-wrs-vxworks", @@ -153,5 +148,33 @@ [workspace] members = [ "ctest", + "ctest-next", "libc-test", ] + +# FIXME(msrv): These should be renamed as `[workspace.lints.*]` once MSRV is above 1.64 +# This way all crates can use it with `[lints] workspace=true` section + +[lints.rust] +# FIXME(cleanup): make ident usage consistent in each file +unused_qualifications = "allow" + +[lints.clippy] +# Enable pedantic lints - use this manually once in a while, but don't enable by default +# pedantic = { level = "warn", priority = -1 } + +# We are okay with the current state of these lints +explicit_iter_loop = "warn" +identity_op = "allow" # some expressions like `0 | x` are clearer for bit ops +manual_assert = "warn" +map_unwrap_or = "warn" +missing_safety_doc = "allow" # safety? in libc? seriously? +non_minimal_cfg = "allow" # for some reason cfg_if! sometimes trigger this +ptr_as_ptr = "warn" +unnecessary_semicolon = "warn" + +# FIXME(clippy): these should be fixed if possible +expl_impl_clone_on_copy = "allow" +uninlined_format_args = "allow" +unnecessary_cast = "allow" # some casts like `as usize` are only needed for some targets +used_underscore_binding = "allow"
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/build.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/build.rs index bf5277a9..5e1e62c5 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/build.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/build.rs
@@ -4,7 +4,7 @@ // List of cfgs this build script is allowed to set. The list is needed to support check-cfg, as we // need to know all the possible cfgs that this script will set. If you need to set another cfg // make sure to add it to this list as well. -const ALLOWED_CFGS: &'static [&'static str] = &[ +const ALLOWED_CFGS: &[&str] = &[ "emscripten_old_stat_abi", "espidf_time32", "freebsd10", @@ -15,6 +15,8 @@ "freebsd15", // Corresponds to `_FILE_OFFSET_BITS=64` in glibc "gnu_file_offset_bits64", + // Corresponds to `_TIME_BITS=64` in glibc + "gnu_time_bits64", // FIXME(ctest): this config shouldn't be needed but ctest can't parse `const extern fn` "libc_const_extern_fn", "libc_deny_warnings", @@ -22,10 +24,11 @@ "libc_ctest", // Corresponds to `__USE_TIME_BITS64` in UAPI "linux_time_bits64", + "musl_v1_2_3", ]; // Extra values to allow for check-cfg. -const CHECK_CFG_EXTRA: &'static [(&'static str, &'static [&'static str])] = &[ +const CHECK_CFG_EXTRA: &[(&str, &[&str])] = &[ ( "target_os", &[ @@ -89,29 +92,48 @@ _ => (), } + let musl_v1_2_3 = env::var("RUST_LIBC_UNSTABLE_MUSL_V1_2_3").is_ok(); + println!("cargo:rerun-if-env-changed=RUST_LIBC_UNSTABLE_MUSL_V1_2_3"); + // loongarch64 and ohos have already updated + if musl_v1_2_3 || target_os == "loongarch64" || target_env == "ohos" { + // FIXME(musl): enable time64 api as well + set_cfg("musl_v1_2_3"); + } let linux_time_bits64 = env::var("RUST_LIBC_UNSTABLE_LINUX_TIME_BITS64").is_ok(); println!("cargo:rerun-if-env-changed=RUST_LIBC_UNSTABLE_LINUX_TIME_BITS64"); if linux_time_bits64 { set_cfg("linux_time_bits64"); } println!("cargo:rerun-if-env-changed=RUST_LIBC_UNSTABLE_GNU_FILE_OFFSET_BITS"); - match env::var("RUST_LIBC_UNSTABLE_GNU_FILE_OFFSET_BITS") { - Ok(val) if val == "64" => { - if target_env == "gnu" - && target_os == "linux" - && target_ptr_width == "32" - && target_arch != "riscv32" - && target_arch != "x86_64" - { + println!("cargo:rerun-if-env-changed=RUST_LIBC_UNSTABLE_GNU_TIME_BITS"); + if target_env == "gnu" + && target_os == "linux" + && target_ptr_width == "32" + && target_arch != "riscv32" + && target_arch != "x86_64" + { + match env::var("RUST_LIBC_UNSTABLE_GNU_TIME_BITS") { + Ok(val) if val == "64" => { set_cfg("gnu_file_offset_bits64"); + set_cfg("linux_time_bits64"); + set_cfg("gnu_time_bits64"); + } + Ok(val) if val != "32" => { + panic!("RUST_LIBC_UNSTABLE_GNU_TIME_BITS may only be set to '32' or '64'") + } + _ => { + match env::var("RUST_LIBC_UNSTABLE_GNU_FILE_OFFSET_BITS") { + Ok(val) if val == "64" => { + set_cfg("gnu_file_offset_bits64"); + } + Ok(val) if val != "32" => { + panic!("RUST_LIBC_UNSTABLE_GNU_FILE_OFFSET_BITS may only be set to '32' or '64'") + } + _ => {} + } } } - Ok(val) if val != "32" => { - panic!("RUST_LIBC_UNSTABLE_GNU_FILE_OFFSET_BITS may only be set to '32' or '64'") - } - _ => {} } - // On CI: deny all warnings if libc_ci { set_cfg("libc_deny_warnings"); @@ -130,17 +152,17 @@ if rustc_minor_ver >= 80 { for cfg in ALLOWED_CFGS { if rustc_minor_ver >= 75 { - println!("cargo:rustc-check-cfg=cfg({})", cfg); + println!("cargo:rustc-check-cfg=cfg({cfg})"); } else { - println!("cargo:rustc-check-cfg=values({})", cfg); + println!("cargo:rustc-check-cfg=values({cfg})"); } } for &(name, values) in CHECK_CFG_EXTRA { let values = values.join("\",\""); if rustc_minor_ver >= 75 { - println!("cargo:rustc-check-cfg=cfg({},values(\"{}\"))", name, values); + println!("cargo:rustc-check-cfg=cfg({name},values(\"{values}\"))"); } else { - println!("cargo:rustc-check-cfg=values({},\"{}\")", name, values); + println!("cargo:rustc-check-cfg=values({name},\"{values}\")"); } } } @@ -169,12 +191,11 @@ let output = cmd.output().expect("Failed to get rustc version"); - if !output.status.success() { - panic!( - "failed to run rustc: {}", - String::from_utf8_lossy(output.stderr.as_slice()) - ); - } + assert!( + output.status.success(), + "failed to run rustc: {}", + String::from_utf8_lossy(output.stderr.as_slice()) + ); output } @@ -201,9 +222,11 @@ let mut pieces = version.split('.'); - if pieces.next() != Some("rustc 1") { - panic!("Failed to get rustc version"); - } + assert_eq!( + pieces.next(), + Some("rustc 1"), + "Failed to get rustc version" + ); let minor = pieces.next(); @@ -213,9 +236,9 @@ // since a nightly build should either come from CI // or a git checkout let nightly_raw = otry!(pieces.next()).split('-').nth(1); - let nightly = nightly_raw - .map(|raw| raw.starts_with("dev") || raw.starts_with("nightly")) - .unwrap_or(false); + let nightly = nightly_raw.map_or(false, |raw| { + raw.starts_with("dev") || raw.starts_with("nightly") + }); let minor = otry!(otry!(minor).parse().ok()); (minor, nightly) @@ -241,7 +264,13 @@ } fn emcc_version_code() -> Option<u64> { - let output = Command::new("emcc").arg("-dumpversion").output().ok()?; + let emcc = if cfg!(target_os = "windows") { + "emcc.bat" + } else { + "emcc" + }; + + let output = Command::new(emcc).arg("-dumpversion").output().ok()?; if !output.status.success() { return None; } @@ -260,8 +289,9 @@ } fn set_cfg(cfg: &str) { - if !ALLOWED_CFGS.contains(&cfg) { - panic!("trying to set cfg {}, but it is not in ALLOWED_CFGS", cfg); - } - println!("cargo:rustc-cfg={}", cfg); + assert!( + ALLOWED_CFGS.contains(&cfg), + "trying to set cfg {cfg}, but it is not in ALLOWED_CFGS", + ); + println!("cargo:rustc-cfg={cfg}"); }
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/fuchsia/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/fuchsia/mod.rs index b602017..bfd71ff 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/fuchsia/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/fuchsia/mod.rs
@@ -1068,26 +1068,6 @@ } } impl Eq for sysinfo {} - impl fmt::Debug for sysinfo { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sysinfo") - .field("uptime", &self.uptime) - .field("loads", &self.loads) - .field("totalram", &self.totalram) - .field("freeram", &self.freeram) - .field("sharedram", &self.sharedram) - .field("bufferram", &self.bufferram) - .field("totalswap", &self.totalswap) - .field("freeswap", &self.freeswap) - .field("procs", &self.procs) - .field("pad", &self.pad) - .field("totalhigh", &self.totalhigh) - .field("freehigh", &self.freehigh) - .field("mem_unit", &self.mem_unit) - // FIXME(debug): .field("__reserved", &self.__reserved) - .finish() - } - } impl hash::Hash for sysinfo { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.uptime.hash(state); @@ -1118,14 +1098,6 @@ } } impl Eq for sockaddr_un {} - impl fmt::Debug for sockaddr_un { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sockaddr_un") - .field("sun_family", &self.sun_family) - // FIXME(debug): .field("sun_path", &self.sun_path) - .finish() - } - } impl hash::Hash for sockaddr_un { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.sun_family.hash(state); @@ -1145,15 +1117,6 @@ } } impl Eq for sockaddr_storage {} - impl fmt::Debug for sockaddr_storage { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sockaddr_storage") - .field("ss_family", &self.ss_family) - .field("__ss_align", &self.__ss_align) - // FIXME(debug): .field("__ss_pad2", &self.__ss_pad2) - .finish() - } - } impl hash::Hash for sockaddr_storage { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.ss_family.hash(state); @@ -1191,17 +1154,6 @@ } } impl Eq for utsname {} - impl fmt::Debug for utsname { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("utsname") - // FIXME(debug): .field("sysname", &self.sysname) - // FIXME(debug): .field("nodename", &self.nodename) - // FIXME(debug): .field("release", &self.release) - // FIXME(debug): .field("version", &self.version) - // FIXME(debug): .field("machine", &self.machine) - .finish() - } - } impl hash::Hash for utsname { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.sysname.hash(state); @@ -1226,17 +1178,6 @@ } } impl Eq for dirent {} - impl fmt::Debug for dirent { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("dirent") - .field("d_ino", &self.d_ino) - .field("d_off", &self.d_off) - .field("d_reclen", &self.d_reclen) - .field("d_type", &self.d_type) - // FIXME(debug): .field("d_name", &self.d_name) - .finish() - } - } impl hash::Hash for dirent { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.d_ino.hash(state); @@ -1261,17 +1202,6 @@ } } impl Eq for dirent64 {} - impl fmt::Debug for dirent64 { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("dirent64") - .field("d_ino", &self.d_ino) - .field("d_off", &self.d_off) - .field("d_reclen", &self.d_reclen) - .field("d_type", &self.d_type) - // FIXME(debug): .field("d_name", &self.d_name) - .finish() - } - } impl hash::Hash for dirent64 { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.d_ino.hash(state); @@ -1291,16 +1221,6 @@ } } impl Eq for mq_attr {} - impl fmt::Debug for mq_attr { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("mq_attr") - .field("mq_flags", &self.mq_flags) - .field("mq_maxmsg", &self.mq_maxmsg) - .field("mq_msgsize", &self.mq_msgsize) - .field("mq_curmsgs", &self.mq_curmsgs) - .finish() - } - } impl hash::Hash for mq_attr { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.mq_flags.hash(state); @@ -1318,15 +1238,6 @@ } } impl Eq for sockaddr_nl {} - impl fmt::Debug for sockaddr_nl { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sockaddr_nl") - .field("nl_family", &self.nl_family) - .field("nl_pid", &self.nl_pid) - .field("nl_groups", &self.nl_groups) - .finish() - } - } impl hash::Hash for sockaddr_nl { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.nl_family.hash(state); @@ -1347,17 +1258,6 @@ } } impl Eq for sigevent {} - impl fmt::Debug for sigevent { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sigevent") - .field("sigev_value", &self.sigev_value) - .field("sigev_signo", &self.sigev_signo) - .field("sigev_notify", &self.sigev_notify) - .field("sigev_notify_function", &self.sigev_notify_function) - .field("sigev_notify_attributes", &self.sigev_notify_attributes) - .finish() - } - } impl hash::Hash for sigevent { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.sigev_value.hash(state); @@ -1374,13 +1274,6 @@ } } impl Eq for pthread_cond_t {} - impl fmt::Debug for pthread_cond_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("pthread_cond_t") - // FIXME(debug): .field("size", &self.size) - .finish() - } - } impl hash::Hash for pthread_cond_t { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.size.hash(state); @@ -1393,13 +1286,6 @@ } } impl Eq for pthread_mutex_t {} - impl fmt::Debug for pthread_mutex_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("pthread_mutex_t") - // FIXME(debug): .field("size", &self.size) - .finish() - } - } impl hash::Hash for pthread_mutex_t { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.size.hash(state); @@ -1412,13 +1298,6 @@ } } impl Eq for pthread_rwlock_t {} - impl fmt::Debug for pthread_rwlock_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("pthread_rwlock_t") - // FIXME(debug): .field("size", &self.size) - .finish() - } - } impl hash::Hash for pthread_rwlock_t { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.size.hash(state); @@ -1452,9 +1331,9 @@ pub const SIGIOT: c_int = 6; -pub const S_ISUID: crate::mode_t = 0o4000; -pub const S_ISGID: crate::mode_t = 0o2000; -pub const S_ISVTX: crate::mode_t = 0o1000; +pub const S_ISUID: mode_t = 0o4000; +pub const S_ISGID: mode_t = 0o2000; +pub const S_ISVTX: mode_t = 0o1000; pub const IF_NAMESIZE: size_t = 16; pub const IFNAMSIZ: size_t = IF_NAMESIZE; @@ -1585,26 +1464,26 @@ pub const O_WRONLY: c_int = 1; pub const O_RDWR: c_int = 2; -pub const S_IFIFO: crate::mode_t = 0o1_0000; -pub const S_IFCHR: crate::mode_t = 0o2_0000; -pub const S_IFBLK: crate::mode_t = 0o6_0000; -pub const S_IFDIR: crate::mode_t = 0o4_0000; -pub const S_IFREG: crate::mode_t = 0o10_0000; -pub const S_IFLNK: crate::mode_t = 0o12_0000; -pub const S_IFSOCK: crate::mode_t = 0o14_0000; -pub const S_IFMT: crate::mode_t = 0o17_0000; -pub const S_IRWXU: crate::mode_t = 0o0700; -pub const S_IXUSR: crate::mode_t = 0o0100; -pub const S_IWUSR: crate::mode_t = 0o0200; -pub const S_IRUSR: crate::mode_t = 0o0400; -pub const S_IRWXG: crate::mode_t = 0o0070; -pub const S_IXGRP: crate::mode_t = 0o0010; -pub const S_IWGRP: crate::mode_t = 0o0020; -pub const S_IRGRP: crate::mode_t = 0o0040; -pub const S_IRWXO: crate::mode_t = 0o0007; -pub const S_IXOTH: crate::mode_t = 0o0001; -pub const S_IWOTH: crate::mode_t = 0o0002; -pub const S_IROTH: crate::mode_t = 0o0004; +pub const S_IFIFO: mode_t = 0o1_0000; +pub const S_IFCHR: mode_t = 0o2_0000; +pub const S_IFBLK: mode_t = 0o6_0000; +pub const S_IFDIR: mode_t = 0o4_0000; +pub const S_IFREG: mode_t = 0o10_0000; +pub const S_IFLNK: mode_t = 0o12_0000; +pub const S_IFSOCK: mode_t = 0o14_0000; +pub const S_IFMT: mode_t = 0o17_0000; +pub const S_IRWXU: mode_t = 0o0700; +pub const S_IXUSR: mode_t = 0o0100; +pub const S_IWUSR: mode_t = 0o0200; +pub const S_IRUSR: mode_t = 0o0400; +pub const S_IRWXG: mode_t = 0o0070; +pub const S_IXGRP: mode_t = 0o0010; +pub const S_IWGRP: mode_t = 0o0020; +pub const S_IRGRP: mode_t = 0o0040; +pub const S_IRWXO: mode_t = 0o0007; +pub const S_IXOTH: mode_t = 0o0001; +pub const S_IWOTH: mode_t = 0o0002; +pub const S_IROTH: mode_t = 0o0004; pub const F_OK: c_int = 0; pub const R_OK: c_int = 4; pub const W_OK: c_int = 2; @@ -3429,9 +3308,9 @@ pub fn CMSG_NXTHDR(mhdr: *const msghdr, cmsg: *const cmsghdr) -> *mut cmsghdr { if ((*cmsg).cmsg_len as size_t) < mem::size_of::<cmsghdr>() { - 0 as *mut cmsghdr + core::ptr::null_mut::<cmsghdr>() } else if __CMSG_NEXT(cmsg).add(mem::size_of::<cmsghdr>()) >= __MHDR_END(mhdr) { - 0 as *mut cmsghdr + core::ptr::null_mut::<cmsghdr>() } else { __CMSG_NEXT(cmsg).cast() } @@ -3441,7 +3320,7 @@ if (*mhdr).msg_controllen as size_t >= mem::size_of::<cmsghdr>() { (*mhdr).msg_control.cast() } else { - 0 as *mut cmsghdr + core::ptr::null_mut::<cmsghdr>() } } @@ -3726,12 +3605,7 @@ pub fn rewinddir(dirp: *mut crate::DIR); pub fn openat(dirfd: c_int, pathname: *const c_char, flags: c_int, ...) -> c_int; - pub fn fchmodat( - dirfd: c_int, - pathname: *const c_char, - mode: crate::mode_t, - flags: c_int, - ) -> c_int; + pub fn fchmodat(dirfd: c_int, pathname: *const c_char, mode: mode_t, flags: c_int) -> c_int; pub fn fchown(fd: c_int, owner: crate::uid_t, group: crate::gid_t) -> c_int; pub fn fchownat( dirfd: c_int, @@ -3748,7 +3622,7 @@ newpath: *const c_char, flags: c_int, ) -> c_int; - pub fn mkdirat(dirfd: c_int, pathname: *const c_char, mode: crate::mode_t) -> c_int; + pub fn mkdirat(dirfd: c_int, pathname: *const c_char, mode: mode_t) -> c_int; pub fn readlinkat( dirfd: c_int, pathname: *const c_char, @@ -3966,7 +3840,7 @@ pub fn gmtime(time_p: *const time_t) -> *mut tm; pub fn localtime(time_p: *const time_t) -> *mut tm; - pub fn mknod(pathname: *const c_char, mode: crate::mode_t, dev: crate::dev_t) -> c_int; + pub fn mknod(pathname: *const c_char, mode: mode_t, dev: crate::dev_t) -> c_int; pub fn uname(buf: *mut crate::utsname) -> c_int; pub fn gethostname(name: *mut c_char, len: size_t) -> c_int; pub fn getservbyname(name: *const c_char, proto: *const c_char) -> *mut servent; @@ -4086,8 +3960,7 @@ pub fn fdopendir(fd: c_int) -> *mut crate::DIR; - pub fn mknodat(dirfd: c_int, pathname: *const c_char, mode: crate::mode_t, dev: dev_t) - -> c_int; + pub fn mknodat(dirfd: c_int, pathname: *const c_char, mode: mode_t, dev: dev_t) -> c_int; pub fn pthread_condattr_getclock( attr: *const pthread_condattr_t, clock_id: *mut clockid_t, @@ -4214,7 +4087,7 @@ pub fn setfsuid(uid: crate::uid_t) -> c_int; // Not available now on Android - pub fn mkfifoat(dirfd: c_int, pathname: *const c_char, mode: crate::mode_t) -> c_int; + pub fn mkfifoat(dirfd: c_int, pathname: *const c_char, mode: mode_t) -> c_int; pub fn if_nameindex() -> *mut if_nameindex; pub fn if_freenameindex(ptr: *mut if_nameindex); pub fn sync_file_range(fd: c_int, offset: off64_t, nbytes: off64_t, flags: c_uint) -> c_int;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/fuchsia/x86_64.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/fuchsia/x86_64.rs index a184539..add60a45 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/fuchsia/x86_64.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/fuchsia/x86_64.rs
@@ -94,18 +94,6 @@ } } impl Eq for ucontext_t {} - impl fmt::Debug for ucontext_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("ucontext_t") - .field("uc_flags", &self.uc_flags) - .field("uc_link", &self.uc_link) - .field("uc_stack", &self.uc_stack) - .field("uc_mcontext", &self.uc_mcontext) - .field("uc_sigmask", &self.uc_sigmask) - // FIXME(debug): .field("__private", &self.__private) - .finish() - } - } impl hash::Hash for ucontext_t { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.uc_flags.hash(state);
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/lib.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/lib.rs index 50aed357..a96ffc6f 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/lib.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/lib.rs
@@ -7,15 +7,8 @@ bad_style, overflowing_literals, improper_ctypes, - // This lint is renamed but we run CI for old stable rustc so should be here. - redundant_semicolon, - redundant_semicolons, unused_macros, unused_macro_rules, - // FIXME(1.0): temporarily allow dead_code to fix CI: - // - https://github.com/rust-lang/libc/issues/3740 - // - https://github.com/rust-lang/rust/pull/126456 - dead_code, )] #![cfg_attr(libc_deny_warnings, deny(warnings))] // Attributes needed when building as part of the standard library @@ -25,8 +18,8 @@ // DIFF(1.0): The thread local references that raise this lint were removed in 1.0 #![cfg_attr(feature = "rustc-dep-of-std", allow(static_mut_refs))] // Enable extra lints: -#![cfg_attr(feature = "extra_traits", deny(missing_debug_implementations))] -#![deny(missing_copy_implementations, safe_packed_borrows)] +#![cfg_attr(feature = "extra_traits", warn(missing_debug_implementations))] +#![warn(missing_copy_implementations, safe_packed_borrows)] #![cfg_attr(not(feature = "rustc-dep-of-std"), no_std)] #![cfg_attr(feature = "rustc-dep-of-std", no_core)]
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/macros.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/macros.rs index e7dbf5611..a0fb7ff1 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/macros.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/macros.rs
@@ -141,7 +141,8 @@ )*); } -/// Implement `Clone` and `Copy` for a struct with no `extra_traits` feature. +/// Implement `Clone` and `Copy` for a struct with no `extra_traits` feature, as well as `Debug` +/// with `extra_traits` since that can always be derived. /// /// Most items will prefer to use [`s`]. macro_rules! s_no_extra_traits { @@ -172,6 +173,7 @@ __item! { #[repr(C)] #[::core::prelude::v1::derive(::core::clone::Clone, ::core::marker::Copy)] + #[cfg_attr(feature = "extra_traits", ::core::prelude::v1::derive(Debug))] $(#[$attr])* pub struct $i { $($field)* } } @@ -193,6 +195,7 @@ /// Implement `Clone` and `Copy` for an enum, as well as `Debug`, `Eq`, `Hash`, and /// `PartialEq` if the `extra_traits` feature is enabled. +// FIXME(#4419): Replace all uses of `e!` with `c_enum!` macro_rules! e { ($( $(#[$attr:meta])* @@ -210,6 +213,48 @@ )*); } +/// Represent a C enum as Rust constants and a type. +/// +/// C enums can't soundly be mapped to Rust enums since C enums are allowed to have duplicates or +/// unlisted values, but this is UB in Rust. This enum doesn't implement any traits, its main +/// purpose is to calculate the correct enum values. +/// +/// See <https://github.com/rust-lang/libc/issues/4419> for more. +macro_rules! c_enum { + ( + $(#[repr($repr:ty)])? + $ty_name:ident { + $($variant:ident $(= $value:literal)?,)+ + } + ) => { + pub type $ty_name = c_enum!(@ty $($repr)?); + c_enum!(@one; $ty_name; 0; $($variant $(= $value)?,)+); + }; + + // Matcher for a single variant + (@one; $_ty_name:ident; $_idx:expr;) => {}; + ( + @one; $ty_name:ident; $default_val:expr; + $variant:ident $(= $value:literal)?, + $($tail:tt)* + ) => { + pub const $variant: $ty_name = { + #[allow(unused_variables)] + let r = $default_val; + $(let r = $value;)? + r + }; + + // The next value is always one more than the previous value, unless + // set explicitly. + c_enum!(@one; $ty_name; $variant + 1; $($tail)*); + }; + + // Use a specific type if provided, otherwise default to `c_uint` + (@ty $repr:ty) => { $repr }; + (@ty) => { $crate::c_uint }; +} + // This is a pretty horrible hack to allow us to conditionally mark some functions as 'const', // without requiring users of this macro to care "libc_const_extern_fn". // @@ -359,3 +404,76 @@ )* } } + +#[cfg(test)] +mod tests { + #[test] + fn c_enumbasic() { + // By default, variants get sequential values. + c_enum! { + e { + VAR0, + VAR1, + VAR2, + } + } + + assert_eq!(VAR0, 0_u32); + assert_eq!(VAR1, 1_u32); + assert_eq!(VAR2, 2_u32); + } + + #[test] + fn c_enumrepr() { + // By default, variants get sequential values. + c_enum! { + #[repr(u16)] + e { + VAR0, + } + } + + assert_eq!(VAR0, 0_u16); + } + + #[test] + fn c_enumset_value() { + // Setting an explicit value resets the count. + c_enum! { + e { + VAR2 = 2, + VAR3, + VAR4, + } + } + + assert_eq!(VAR2, 2_u32); + assert_eq!(VAR3, 3_u32); + assert_eq!(VAR4, 4_u32); + } + + #[test] + fn c_enummultiple_set_value() { + // C enums always take one more than the previous value, unless set to a specific + // value. Duplicates are allowed. + c_enum! { + e { + VAR0, + VAR2_0 = 2, + VAR3_0, + VAR4_0, + VAR2_1 = 2, + VAR3_1, + VAR4_1, + } + } + + assert_eq!(VAR0, 0_u32); + assert_eq!(VAR2_0, 2_u32); + assert_eq!(VAR3_0, 3_u32); + assert_eq!(VAR4_0, 4_u32); + assert_eq!(VAR2_1, 2_u32); + assert_eq!(VAR3_1, 3_u32); + assert_eq!(VAR4_1, 4_u32); + } +}
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/psp.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/psp.rs index 73d4ae0..56d528c 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/psp.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/psp.rs
@@ -2115,12 +2115,10 @@ } s_no_extra_traits! { - #[allow(missing_debug_implementations)] pub struct GeContext { pub context: [u32; 512], } - #[allow(missing_debug_implementations)] pub struct SceKernelUtilsSha1Context { pub h: [u32; 5usize], pub us_remains: u16, @@ -2129,13 +2127,11 @@ pub buf: [u8; 64usize], } - #[allow(missing_debug_implementations)] pub struct SceKernelUtilsMt19937Context { pub count: u32, pub state: [u32; 624usize], } - #[allow(missing_debug_implementations)] pub struct SceKernelUtilsMd5Context { pub h: [u32; 4usize], pub pad: u32, @@ -2145,7 +2141,6 @@ pub buf: [u8; 64usize], } - #[allow(missing_debug_implementations)] pub struct SceIoDirent { pub d_stat: SceIoStat, pub d_name: [u8; 256usize], @@ -2153,7 +2148,6 @@ pub dummy: i32, } - #[cfg_attr(feature = "extra_traits", derive(Debug))] pub struct ScePspFRect { pub x: f32, pub y: f32, @@ -2162,7 +2156,6 @@ } #[repr(align(16))] - #[cfg_attr(feature = "extra_traits", derive(Debug))] pub struct ScePspFVector3 { pub x: f32, pub y: f32, @@ -2170,7 +2163,6 @@ } #[repr(align(16))] - #[cfg_attr(feature = "extra_traits", derive(Debug))] pub struct ScePspFVector4 { pub x: f32, pub y: f32, @@ -2178,7 +2170,6 @@ pub w: f32, } - #[cfg_attr(feature = "extra_traits", derive(Debug))] pub struct ScePspFVector4Unaligned { pub x: f32, pub y: f32, @@ -2186,26 +2177,22 @@ pub w: f32, } - #[cfg_attr(feature = "extra_traits", derive(Debug))] pub struct ScePspFVector2 { pub x: f32, pub y: f32, } - #[cfg_attr(feature = "extra_traits", derive(Debug))] pub struct ScePspFMatrix2 { pub x: ScePspFVector2, pub y: ScePspFVector2, } - #[cfg_attr(feature = "extra_traits", derive(Debug))] pub struct ScePspFMatrix3 { pub x: ScePspFVector3, pub y: ScePspFVector3, pub z: ScePspFVector3, } - #[cfg_attr(feature = "extra_traits", derive(Debug))] #[repr(align(16))] pub struct ScePspFMatrix4 { pub x: ScePspFVector4, @@ -2214,7 +2201,6 @@ pub w: ScePspFVector4, } - #[allow(missing_debug_implementations)] pub struct ScePspFMatrix4Unaligned { pub x: ScePspFVector4, pub y: ScePspFVector4, @@ -2222,7 +2208,6 @@ pub w: ScePspFVector4, } - #[allow(missing_debug_implementations)] pub union ScePspVector3 { pub fv: ScePspFVector3, pub iv: ScePspIVector3, @@ -2230,7 +2215,6 @@ pub i: [i32; 3usize], } - #[allow(missing_debug_implementations)] pub union ScePspVector4 { pub fv: ScePspFVector4, pub iv: ScePspIVector4, @@ -2239,7 +2223,6 @@ pub i: [i32; 4usize], } - #[allow(missing_debug_implementations)] pub union ScePspMatrix2 { pub fm: ScePspFMatrix2, pub im: ScePspIMatrix2, @@ -2250,7 +2233,6 @@ pub i: [[i32; 2usize]; 2usize], } - #[allow(missing_debug_implementations)] pub union ScePspMatrix3 { pub fm: ScePspFMatrix3, pub im: ScePspIMatrix3, @@ -2261,7 +2243,6 @@ pub i: [[i32; 3usize]; 3usize], } - #[allow(missing_debug_implementations)] pub union ScePspVector2 { pub fv: ScePspFVector2, pub iv: ScePspIVector2, @@ -2269,7 +2250,6 @@ pub i: [i32; 2usize], } - #[allow(missing_debug_implementations)] pub union ScePspMatrix4 { pub fm: ScePspFMatrix4, pub im: ScePspIMatrix4, @@ -2280,7 +2260,6 @@ pub i: [[i32; 4usize]; 4usize], } - #[allow(missing_debug_implementations)] pub struct Key { pub key_type: KeyType, pub name: [u8; 256usize], @@ -2289,7 +2268,6 @@ pub unk3: u32, } - #[allow(missing_debug_implementations)] pub struct UtilityMsgDialogParams { pub base: UtilityDialogCommon, pub unknown: i32, @@ -2300,13 +2278,11 @@ pub button_pressed: UtilityMsgDialogPressed, } - #[allow(missing_debug_implementations)] pub union UtilityNetData { pub as_uint: u32, pub as_string: [u8; 128usize], } - #[allow(missing_debug_implementations)] pub struct UtilitySavedataSFOParam { pub title: [u8; 128usize], pub savedata_title: [u8; 128usize], @@ -2315,7 +2291,6 @@ pub unknown: [u8; 3usize], } - #[allow(missing_debug_implementations)] pub struct SceUtilitySavedataParam { pub base: UtilityDialogCommon, pub mode: UtilitySavedataMode, @@ -2342,7 +2317,6 @@ pub unknown3: [u8; 20], } - #[allow(missing_debug_implementations)] pub struct SceNetAdhocctlPeerInfo { pub next: *mut SceNetAdhocctlPeerInfo, pub nickname: [u8; 128usize], @@ -2351,7 +2325,6 @@ pub timestamp: u32, } - #[allow(missing_debug_implementations)] pub struct SceNetAdhocctlParams { pub channel: i32, pub name: [u8; 8usize], @@ -2359,7 +2332,6 @@ pub nickname: [u8; 128usize], } - #[cfg_attr(feature = "extra_traits", allow(missing_debug_implementations))] pub union SceNetApctlInfo { pub name: [u8; 64usize], pub bssid: [u8; 6usize],
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/aix/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/aix/mod.rs index a43fcd104..3f8145d 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/aix/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/aix/mod.rs
@@ -1,4 +1,5 @@ use crate::prelude::*; +use crate::{in_addr_t, in_port_t}; pub type caddr_t = *mut c_char; pub type clockid_t = c_longlong; @@ -9,7 +10,6 @@ pub type fpos64_t = c_longlong; pub type fsblkcnt_t = c_ulong; pub type fsfilcnt_t = c_ulong; -pub type idtype_t = c_int; pub type ino_t = c_ulong; pub type key_t = c_int; pub type mode_t = c_uint; @@ -18,25 +18,23 @@ pub type speed_t = c_uint; pub type tcflag_t = c_uint; pub type time_t = c_long; -pub type time64_t = crate::int64_t; +pub type time64_t = i64; pub type timer_t = c_long; pub type wchar_t = c_uint; -pub type nfds_t = c_int; +pub type nfds_t = c_uint; pub type projid_t = c_int; pub type id_t = c_uint; pub type blksize64_t = c_ulonglong; pub type blkcnt64_t = c_ulonglong; -pub type sctp_assoc_t = crate::uint32_t; - pub type suseconds_t = c_int; pub type useconds_t = c_uint; pub type off_t = c_long; +pub type offset_t = c_longlong; pub type off64_t = c_longlong; +pub type idtype_t = c_uint; pub type socklen_t = c_uint; pub type sa_family_t = c_uchar; -pub type in_port_t = c_ushort; -pub type in_addr_t = c_uint; pub type signal_t = c_int; pub type pthread_t = c_uint; @@ -69,6 +67,11 @@ UIO_WRITE_NO_MOVE, UIO_PWRITE, } + #[repr(u32)] + pub enum ACTION { + FIND = 0, + ENTER, + } } s! { @@ -228,7 +231,7 @@ pub sin_family: sa_family_t, pub sin_port: in_port_t, pub sin_addr: in_addr, - pub sin_zero: [c_char; 8], + pub sin_zero: [c_uchar; 8], } pub struct sockaddr_in6 { @@ -318,19 +321,6 @@ pub sigev_notify_attributes: *mut pthread_attr_t, } - // Should be union with another 'sival_int' - pub struct sigval64 { - pub sival_ptr: c_ulonglong, - } - - pub struct sigevent64 { - pub sigev_value: sigval64, - pub sigev_signo: c_int, - pub sigev_notify: c_int, - pub sigev_notify_function: c_ulonglong, - pub sigev_notify_attributes: c_ulonglong, - } - pub struct osigevent { pub sevt_value: *mut c_void, pub sevt_signo: signal_t, @@ -402,7 +392,7 @@ pub keepcost: c_int, } - pub struct utmp_exit_status { + pub struct exit_status { pub e_termination: c_short, pub e_exit: c_short, } @@ -414,7 +404,7 @@ pub ut_pid: crate::pid_t, pub ut_type: c_short, pub ut_time: time64_t, - pub ut_exit: utmp_exit_status, + pub ut_exit: exit_status, pub ut_host: [c_char; 256], pub __dbl_word_pad: c_int, pub __reservedA: [c_int; 2], @@ -459,7 +449,7 @@ pub shm_extshm: c_int, pub shm_pagesize: crate::int64_t, pub shm_lba: crate::uint64_t, - pub shm_reserved: crate::int64_t, + pub shm_reserved0: crate::int64_t, pub shm_reserved1: crate::int64_t, } @@ -554,7 +544,7 @@ pub events: c_short, pub fd: c_int, pub u: __poll_ctl_ext_u, - pub reversed64: [u64; 6], + pub reserved64: [u64; 6], } } @@ -586,23 +576,11 @@ && self.command == other.command && self.events == other.events && self.fd == other.fd - && self.reversed64 == other.reversed64 + && self.reserved64 == other.reserved64 && self.u == other.u } } impl Eq for poll_ctl_ext {} - impl fmt::Debug for poll_ctl_ext { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("poll_ctl_ext") - .field("version", &self.version) - .field("command", &self.command) - .field("events", &self.events) - .field("fd", &self.fd) - .field("u", &self.u) - .field("reversed64", &self.reversed64) - .finish() - } - } impl hash::Hash for poll_ctl_ext { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.version.hash(state); @@ -610,7 +588,7 @@ self.events.hash(state); self.fd.hash(state); self.u.hash(state); - self.reversed64.hash(state); + self.reserved64.hash(state); } } } @@ -643,33 +621,33 @@ pub const O_SEARCH: c_int = 0x20; pub const O_EXEC: c_int = 0x20; pub const O_CLOEXEC: c_int = 0x800000; -pub const O_ACCMODE: c_int = O_RDONLY | O_WRONLY | O_RDWR; +pub const O_ACCMODE: c_int = O_RDONLY | O_WRONLY | O_RDWR | O_EXEC | O_SEARCH; pub const O_DIRECT: c_int = 0x8000000; pub const O_TTY_INIT: c_int = 0; pub const O_RSYNC: c_int = 0x200000; pub const O_LARGEFILE: c_int = 0x4000000; -pub const F_CLOSEM: c_int = 10; +pub const F_DUPFD: c_int = 0; pub const F_DUPFD_CLOEXEC: c_int = 16; -pub const F_GETLK64: c_int = 11; -pub const F_SETLK64: c_int = 12; -pub const F_SETLKW64: c_int = 13; -pub const F_DUP2FD: c_int = 14; -pub const F_TSTLK: c_int = 15; +pub const F_GETFD: c_int = 1; +pub const F_SETFD: c_int = 2; +pub const F_GETFL: c_int = 3; +pub const F_SETFL: c_int = 4; pub const F_GETLK: c_int = F_GETLK64; pub const F_SETLK: c_int = F_SETLK64; pub const F_SETLKW: c_int = F_SETLKW64; pub const F_GETOWN: c_int = 8; pub const F_SETOWN: c_int = 9; +pub const F_CLOSEM: c_int = 10; +pub const F_GETLK64: c_int = 11; +pub const F_SETLK64: c_int = 12; +pub const F_SETLKW64: c_int = 13; +pub const F_DUP2FD: c_int = 14; +pub const F_TSTLK: c_int = 15; pub const AT_FDCWD: c_int = -2; pub const AT_SYMLINK_NOFOLLOW: c_int = 1; pub const AT_SYMLINK_FOLLOW: c_int = 2; pub const AT_REMOVEDIR: c_int = 1; pub const AT_EACCESS: c_int = 1; -pub const F_DUPFD: c_int = 0; -pub const F_GETFD: c_int = 1; -pub const F_SETFD: c_int = 2; -pub const F_GETFL: c_int = 3; -pub const F_SETFL: c_int = 4; pub const O_SYNC: c_int = 16; pub const O_NONBLOCK: c_int = 4; pub const FASYNC: c_int = 0x20000; @@ -754,25 +732,25 @@ // locale.h pub const LC_GLOBAL_LOCALE: crate::locale_t = -1isize as crate::locale_t; +pub const LC_COLLATE: c_int = 0; pub const LC_CTYPE: c_int = 1; +pub const LC_MONETARY: c_int = 2; pub const LC_NUMERIC: c_int = 3; pub const LC_TIME: c_int = 4; -pub const LC_COLLATE: c_int = 0; -pub const LC_MONETARY: c_int = 2; -pub const LC_MESSAGES: c_int = 4; +pub const LC_MESSAGES: c_int = 5; pub const LC_ALL: c_int = -1; +pub const LC_COLLATE_MASK: c_int = 1; pub const LC_CTYPE_MASK: c_int = 2; +pub const LC_MESSAGES_MASK: c_int = 4; +pub const LC_MONETARY_MASK: c_int = 8; pub const LC_NUMERIC_MASK: c_int = 16; pub const LC_TIME_MASK: c_int = 32; -pub const LC_COLLATE_MASK: c_int = 1; -pub const LC_MONETARY_MASK: c_int = 8; -pub const LC_MESSAGES_MASK: c_int = 4; -pub const LC_ALL_MASK: c_int = LC_CTYPE_MASK - | LC_NUMERIC_MASK - | LC_TIME_MASK - | LC_COLLATE_MASK +pub const LC_ALL_MASK: c_int = LC_COLLATE_MASK + | LC_CTYPE_MASK + | LC_MESSAGES_MASK | LC_MONETARY_MASK - | LC_MESSAGES_MASK; + | LC_NUMERIC_MASK + | LC_TIME_MASK; // netdb.h pub const NI_MAXHOST: crate::socklen_t = 1025; @@ -808,8 +786,11 @@ pub const IPV6_CHECKSUM: c_int = 39; pub const IPV6_DONTFRAG: c_int = 45; pub const IPV6_DSTOPTS: c_int = 54; -pub const IPV6_FLOWINFO_FLOWLABEL: c_int = 16777215; -pub const IPV6_FLOWINFO_PRIORITY: c_int = 251658240; +pub const IPV6_FLOWINFO_FLOWLABEL: c_int = 0x00ffffff; +pub const IPV6_FLOWINFO_PRIORITY: c_int = 0x0f000000; +pub const IPV6_FLOWINFO_PRIFLOW: c_int = 0x0fffffff; +pub const IPV6_FLOWINFO_SRFLAG: c_int = 0x10000000; +pub const IPV6_FLOWINFO_VERSION: c_int = 0xf0000000; pub const IPV6_HOPLIMIT: c_int = 40; pub const IPV6_HOPOPTS: c_int = 52; pub const IPV6_NEXTHOP: c_int = 48; @@ -844,20 +825,20 @@ pub const DLT_FDDI: c_int = 0xf; pub const DLT_ATM: c_int = 0x25; pub const DLT_IPOIB: c_int = 0xc7; -pub const BIOCSETF: c_ulong = 0x80104267; -pub const BIOCGRTIMEOUT: c_ulong = 0x4010426e; -pub const BIOCGBLEN: c_int = 0x40044266; -pub const BIOCSBLEN: c_int = 0xc0044266; -pub const BIOCFLUSH: c_int = 0x20004268; -pub const BIOCPROMISC: c_int = 0x20004269; -pub const BIOCGDLT: c_int = 0x4004426a; -pub const BIOCSRTIMEOUT: c_int = 0x8010426d; -pub const BIOCGSTATS: c_int = 0x4008426f; -pub const BIOCIMMEDIATE: c_int = 0x80044270; -pub const BIOCVERSION: c_int = 0x40044271; -pub const BIOCSDEVNO: c_int = 0x20004272; -pub const BIOCGETIF: c_ulong = 0x4020426b; -pub const BIOCSETIF: c_ulong = 0xffffffff8020426c; +pub const BIOCSETF: c_long = -2146418073; +pub const BIOCGRTIMEOUT: c_long = 1074807406; +pub const BIOCGBLEN: c_long = 1074020966; +pub const BIOCSBLEN: c_long = -1073462682; +pub const BIOCFLUSH: c_long = 536887912; +pub const BIOCPROMISC: c_long = 536887913; +pub const BIOCGDLT: c_long = 1074020970; +pub const BIOCSRTIMEOUT: c_long = -2146418067; +pub const BIOCGSTATS: c_long = 1074283119; +pub const BIOCIMMEDIATE: c_long = -2147204496; +pub const BIOCVERSION: c_long = 1074020977; +pub const BIOCSDEVNO: c_long = 536887922; +pub const BIOCGETIF: c_long = 1075855979; +pub const BIOCSETIF: c_long = -2145369492; pub const BPF_ABS: c_int = 32; pub const BPF_ADD: c_int = 0; pub const BPF_ALIGNMENT: c_ulong = 4; @@ -1024,7 +1005,6 @@ pub const IPPROTO_MH: c_int = 135; pub const IPPROTO_GIF: c_int = 140; pub const IPPROTO_RAW: c_int = 255; -pub const IPPROTO_MAX: c_int = 256; pub const IP_OPTIONS: c_int = 1; pub const IP_HDRINCL: c_int = 2; pub const IP_TOS: c_int = 3; @@ -1121,7 +1101,7 @@ pub const TCP_NODELAYACK: c_int = 0x14; // pthread.h -pub const PTHREAD_BARRIER_SERIAL_THREAD: c_int = -1; +pub const PTHREAD_BARRIER_SERIAL_THREAD: c_int = 2; pub const PTHREAD_CREATE_JOINABLE: c_int = 0; pub const PTHREAD_CREATE_DETACHED: c_int = 1; pub const PTHREAD_PROCESS_SHARED: c_int = 0; @@ -1163,17 +1143,18 @@ pub const REG_ENOSYS: c_int = 17; // rpcsvc/mount.h -pub const NFSMNT_ACDIRMAX: c_int = 2048; -pub const NFSMNT_ACDIRMIN: c_int = 1024; -pub const NFSMNT_ACREGMAX: c_int = 512; -pub const NFSMNT_ACREGMIN: c_int = 256; -pub const NFSMNT_INT: c_int = 64; -pub const NFSMNT_NOAC: c_int = 128; -pub const NFSMNT_RETRANS: c_int = 16; -pub const NFSMNT_RSIZE: c_int = 4; -pub const NFSMNT_SOFT: c_int = 1; -pub const NFSMNT_TIMEO: c_int = 8; -pub const NFSMNT_WSIZE: c_int = 2; +pub const NFSMNT_SOFT: c_int = 0x001; +pub const NFSMNT_WSIZE: c_int = 0x002; +pub const NFSMNT_RSIZE: c_int = 0x004; +pub const NFSMNT_TIMEO: c_int = 0x008; +pub const NFSMNT_RETRANS: c_int = 0x010; +pub const NFSMNT_HOSTNAME: c_int = 0x020; +pub const NFSMNT_INT: c_int = 0x040; +pub const NFSMNT_NOAC: c_int = 0x080; +pub const NFSMNT_ACREGMIN: c_int = 0x0100; +pub const NFSMNT_ACREGMAX: c_int = 0x0200; +pub const NFSMNT_ACDIRMIN: c_int = 0x0400; +pub const NFSMNT_ACDIRMAX: c_int = 0x0800; // rpcsvc/rstat.h pub const CPUSTATES: c_int = 4; @@ -1276,35 +1257,19 @@ pub const ENOCSI: c_int = 43; pub const EL2HLT: c_int = 44; pub const EDEADLK: c_int = 45; +pub const ENOTREADY: c_int = 46; +pub const EWRPROTECT: c_int = 47; +pub const EFORMAT: c_int = 48; pub const ENOLCK: c_int = 49; -pub const ECANCELED: c_int = 117; -pub const ENOTSUP: c_int = 124; -pub const EPROCLIM: c_int = 83; -pub const EDQUOT: c_int = 88; -pub const EOWNERDEAD: c_int = 95; -pub const ENOTRECOVERABLE: c_int = 94; -pub const ENOSTR: c_int = 123; -pub const ENODATA: c_int = 122; -pub const ETIME: c_int = 119; -pub const ENOSR: c_int = 118; -pub const EREMOTE: c_int = 93; -pub const ENOATTR: c_int = 112; -pub const ESAD: c_int = 113; -pub const ENOTRUST: c_int = 114; -pub const ENOLINK: c_int = 126; -pub const EPROTO: c_int = 121; -pub const EMULTIHOP: c_int = 125; -pub const EBADMSG: c_int = 120; -pub const ENAMETOOLONG: c_int = 86; -pub const EOVERFLOW: c_int = 127; -pub const EILSEQ: c_int = 116; -pub const ENOSYS: c_int = 109; -pub const ELOOP: c_int = 85; -pub const ERESTART: c_int = 82; -pub const ENOTEMPTY: c_int = 87; -pub const EUSERS: c_int = 84; +pub const ENOCONNECT: c_int = 50; +pub const ESTALE: c_int = 52; +pub const EDIST: c_int = 53; +pub const EWOULDBLOCK: c_int = EAGAIN; +pub const EINPROGRESS: c_int = 55; +pub const EALREADY: c_int = 56; pub const ENOTSOCK: c_int = 57; pub const EDESTADDRREQ: c_int = 58; +pub const EDESTADDREQ: c_int = EDESTADDRREQ; pub const EMSGSIZE: c_int = 59; pub const EPROTOTYPE: c_int = 60; pub const ENOPROTOOPT: c_int = 61; @@ -1324,15 +1289,43 @@ pub const EISCONN: c_int = 75; pub const ENOTCONN: c_int = 76; pub const ESHUTDOWN: c_int = 77; -pub const ETOOMANYREFS: c_int = 115; pub const ETIMEDOUT: c_int = 78; pub const ECONNREFUSED: c_int = 79; pub const EHOSTDOWN: c_int = 80; pub const EHOSTUNREACH: c_int = 81; -pub const EWOULDBLOCK: c_int = EAGAIN; -pub const EALREADY: c_int = 56; -pub const EINPROGRESS: c_int = 55; -pub const ESTALE: c_int = 52; +pub const ERESTART: c_int = 82; +pub const EPROCLIM: c_int = 83; +pub const EUSERS: c_int = 84; +pub const ELOOP: c_int = 85; +pub const ENAMETOOLONG: c_int = 86; +pub const ENOTEMPTY: c_int = EEXIST; +pub const EDQUOT: c_int = 88; +pub const ECORRUPT: c_int = 89; +pub const ESYSERROR: c_int = 90; +pub const EREMOTE: c_int = 93; +pub const ENOTRECOVERABLE: c_int = 94; +pub const EOWNERDEAD: c_int = 95; +// errnos 96-108 reserved for future use compatible with AIX PS/2 +pub const ENOSYS: c_int = 109; +pub const EMEDIA: c_int = 110; +pub const ESOFT: c_int = 111; +pub const ENOATTR: c_int = 112; +pub const ESAD: c_int = 113; +pub const ENOTRUST: c_int = 114; +pub const ETOOMANYREFS: c_int = 115; +pub const EILSEQ: c_int = 116; +pub const ECANCELED: c_int = 117; +pub const ENOSR: c_int = 118; +pub const ETIME: c_int = 119; +pub const EBADMSG: c_int = 120; +pub const EPROTO: c_int = 121; +pub const ENODATA: c_int = 122; +pub const ENOSTR: c_int = 123; +pub const ECLONEME: c_int = ERESTART; +pub const ENOTSUP: c_int = 124; +pub const EMULTIHOP: c_int = 125; +pub const ENOLINK: c_int = 126; +pub const EOVERFLOW: c_int = 127; // sys/dr.h pub const LPAR_INFO_FORMAT1: c_int = 1; @@ -1371,22 +1364,22 @@ // sys/ioctl.h pub const IOCPARM_MASK: c_int = 0x7f; -pub const IOC_VOID: c_int = 0x20000000; -pub const IOC_OUT: c_int = 0x40000000; -pub const IOC_IN: c_int = 0x40000000 << 1; -pub const IOC_INOUT: c_int = IOC_IN | IOC_OUT; -pub const FIOCLEX: c_int = 536897025; -pub const FIONCLEX: c_int = 536897026; -pub const FIONREAD: c_int = 1074030207; -pub const FIONBIO: c_int = -2147195266; -pub const FIOASYNC: c_int = -2147195267; -pub const FIOSETOWN: c_int = -2147195268; -pub const FIOGETOWN: c_int = 1074030203; -pub const TIOCGETD: c_int = 0x40047400; -pub const TIOCSETD: c_int = 0x80047401; -pub const TIOCHPCL: c_int = 0x20007402; -pub const TIOCMODG: c_int = 0x40047403; -pub const TIOCMODS: c_int = 0x80047404; +pub const IOC_VOID: c_long = 536870912; +pub const IOC_OUT: c_long = 1073741824; +pub const IOC_IN: c_long = -2147483648; +pub const IOC_INOUT: c_long = IOC_IN | IOC_OUT; +pub const FIOCLEX: c_long = 536897025; +pub const FIONCLEX: c_long = 536897026; +pub const FIONREAD: c_long = 1074030207; +pub const FIONBIO: c_long = -2147195266; +pub const FIOASYNC: c_long = -2147195267; +pub const FIOSETOWN: c_long = -2147195268; +pub const FIOGETOWN: c_long = 1074030203; +pub const TIOCGETD: c_long = 1074033664; +pub const TIOCSETD: c_long = -2147191807; +pub const TIOCHPCL: c_long = 536900610; +pub const TIOCMODG: c_long = 1074033667; +pub const TIOCMODS: c_long = -2147191804; pub const TIOCM_LE: c_int = 0x1; pub const TIOCM_DTR: c_int = 0x2; pub const TIOCM_RTS: c_int = 0x4; @@ -1398,46 +1391,46 @@ pub const TIOCM_RNG: c_int = 0x80; pub const TIOCM_RI: c_int = 0x80; pub const TIOCM_DSR: c_int = 0x100; -pub const TIOCGETP: c_int = 0x40067408; -pub const TIOCSETP: c_int = 0x80067409; -pub const TIOCSETN: c_int = 0x8006740a; -pub const TIOCEXCL: c_int = 0x2000740d; -pub const TIOCNXCL: c_int = 0x2000740e; -pub const TIOCFLUSH: c_int = 0x80047410; -pub const TIOCSETC: c_int = 0x80067411; -pub const TIOCGETC: c_int = 0x40067412; +pub const TIOCGETP: c_long = 1074164744; +pub const TIOCSETP: c_long = -2147060727; +pub const TIOCSETN: c_long = -2147060726; +pub const TIOCEXCL: c_long = 536900621; +pub const TIOCNXCL: c_long = 536900622; +pub const TIOCFLUSH: c_long = -2147191792; +pub const TIOCSETC: c_long = -2147060719; +pub const TIOCGETC: c_long = 1074164754; pub const TANDEM: c_int = 0x1; pub const CBREAK: c_int = 0x2; pub const LCASE: c_int = 0x4; pub const MDMBUF: c_int = 0x800000; pub const XTABS: c_int = 0xc00; -pub const SIOCADDMULTI: c_int = -2145359567; -pub const SIOCADDRT: c_int = -2143784438; -pub const SIOCDARP: c_int = -2142476000; -pub const SIOCDELMULTI: c_int = -2145359566; -pub const SIOCDELRT: c_int = -2143784437; -pub const SIOCDIFADDR: c_int = -2144835303; -pub const SIOCGARP: c_int = -1068734170; -pub const SIOCGIFADDR: c_int = -1071093471; -pub const SIOCGIFBRDADDR: c_int = -1071093469; -pub const SIOCGIFCONF: c_int = -1072666299; -pub const SIOCGIFDSTADDR: c_int = -1071093470; -pub const SIOCGIFFLAGS: c_int = -1071093487; -pub const SIOCGIFHWADDR: c_int = -1068209771; -pub const SIOCGIFMETRIC: c_int = -1071093481; -pub const SIOCGIFMTU: c_int = -1071093418; -pub const SIOCGIFNETMASK: c_int = -1071093467; -pub const SIOCSARP: c_int = -2142476002; -pub const SIOCSIFADDR: c_int = -2144835316; -pub const SIOCSIFBRDADDR: c_int = -2144835309; -pub const SIOCSIFDSTADDR: c_int = -2144835314; -pub const SIOCSIFFLAGS: c_int = -2144835312; -pub const SIOCSIFMETRIC: c_int = -2144835304; -pub const SIOCSIFMTU: c_int = -2144835240; -pub const SIOCSIFNETMASK: c_int = -2144835306; -pub const TIOCUCNTL: c_int = -2147191706; -pub const TIOCCONS: c_int = -2147191710; -pub const TIOCPKT: c_int = -2147191696; +pub const SIOCADDMULTI: c_long = -2145359567; +pub const SIOCADDRT: c_long = -2143784438; +pub const SIOCDARP: c_long = -2142476000; +pub const SIOCDELMULTI: c_long = -2145359566; +pub const SIOCDELRT: c_long = -2143784437; +pub const SIOCDIFADDR: c_long = -2144835303; +pub const SIOCGARP: c_long = -1068734170; +pub const SIOCGIFADDR: c_long = -1071093471; +pub const SIOCGIFBRDADDR: c_long = -1071093469; +pub const SIOCGIFCONF: c_long = -1072666299; +pub const SIOCGIFDSTADDR: c_long = -1071093470; +pub const SIOCGIFFLAGS: c_long = -1071093487; +pub const SIOCGIFHWADDR: c_long = -1068209771; +pub const SIOCGIFMETRIC: c_long = -1071093481; +pub const SIOCGIFMTU: c_long = -1071093418; +pub const SIOCGIFNETMASK: c_long = -1071093467; +pub const SIOCSARP: c_long = -2142476002; +pub const SIOCSIFADDR: c_long = -2144835316; +pub const SIOCSIFBRDADDR: c_long = -2144835309; +pub const SIOCSIFDSTADDR: c_long = -2144835314; +pub const SIOCSIFFLAGS: c_long = -2144835312; +pub const SIOCSIFMETRIC: c_long = -2144835304; +pub const SIOCSIFMTU: c_long = -2144835240; +pub const SIOCSIFNETMASK: c_long = -2144835306; +pub const TIOCUCNTL: c_long = -2147191706; +pub const TIOCCONS: c_long = -2147191710; +pub const TIOCPKT: c_long = -2147191696; pub const TIOCPKT_DATA: c_int = 0; pub const TIOCPKT_FLUSHREAD: c_int = 1; pub const TIOCPKT_FLUSHWRITE: c_int = 2; @@ -1463,9 +1456,13 @@ pub const SHM_UNLOCK: c_int = 202; // sys/ldr.h +pub const L_GETMESSAGES: c_int = 1; pub const L_GETINFO: c_int = 2; -pub const L_GETMESSAGE: c_int = 1; pub const L_GETLIBPATH: c_int = 3; +pub const L_GETKERNINFO: c_int = 4; +pub const L_GETLIB32INFO: c_int = 5; +pub const L_GETLIB64INFO: c_int = 6; +pub const L_GETPROCINFO: c_int = 7; pub const L_GETXINFO: c_int = 8; // sys/limits.h @@ -2097,31 +2094,31 @@ pub const TCIOFF: c_int = 2; pub const TCION: c_int = 3; pub const TIOC: c_int = 0x5400; -pub const TIOCGWINSZ: c_int = 0x40087468; -pub const TIOCSWINSZ: c_int = 0x80087467; -pub const TIOCLBIS: c_int = 0x8004747f; -pub const TIOCLBIC: c_int = 0x8004747e; -pub const TIOCLSET: c_int = 0x8004747d; -pub const TIOCLGET: c_int = 0x4004747c; -pub const TIOCSBRK: c_int = 0x2000747b; -pub const TIOCCBRK: c_int = 0x2000747a; -pub const TIOCSDTR: c_int = 0x20007479; -pub const TIOCCDTR: c_int = 0x20007478; -pub const TIOCSLTC: c_int = 0x80067475; -pub const TIOCGLTC: c_int = 0x40067474; -pub const TIOCOUTQ: c_int = 0x40047473; -pub const TIOCNOTTY: c_int = 0x20007471; -pub const TIOCSTOP: c_int = 0x2000746f; -pub const TIOCSTART: c_int = 0x2000746e; -pub const TIOCGPGRP: c_int = 0x40047477; -pub const TIOCSPGRP: c_int = 0x80047476; -pub const TIOCGSID: c_int = 0x40047448; -pub const TIOCSTI: c_int = 0x80017472; -pub const TIOCMSET: c_int = 0x8004746d; -pub const TIOCMBIS: c_int = 0x8004746c; -pub const TIOCMBIC: c_int = 0x8004746b; -pub const TIOCMGET: c_int = 0x4004746a; -pub const TIOCREMOTE: c_int = 0x80047469; +pub const TIOCGWINSZ: c_long = 1074295912; +pub const TIOCSWINSZ: c_long = -2146929561; +pub const TIOCLBIS: c_long = -2147191681; +pub const TIOCLBIC: c_long = -2147191682; +pub const TIOCLSET: c_long = -2147191683; +pub const TIOCLGET: c_long = 1074033788; +pub const TIOCSBRK: c_long = 536900731; +pub const TIOCCBRK: c_long = 536900730; +pub const TIOCSDTR: c_long = 536900729; +pub const TIOCCDTR: c_long = 536900728; +pub const TIOCSLTC: c_long = -2147060619; +pub const TIOCGLTC: c_long = 1074164852; +pub const TIOCOUTQ: c_long = 1074033779; +pub const TIOCNOTTY: c_long = 536900721; +pub const TIOCSTOP: c_long = 536900719; +pub const TIOCSTART: c_long = 536900718; +pub const TIOCGPGRP: c_long = 1074033783; +pub const TIOCSPGRP: c_long = -2147191690; +pub const TIOCGSID: c_long = 1074033736; +pub const TIOCSTI: c_long = -2147388302; +pub const TIOCMSET: c_long = -2147191699; +pub const TIOCMBIS: c_long = -2147191700; +pub const TIOCMBIC: c_long = -2147191701; +pub const TIOCMGET: c_long = 1074033770; +pub const TIOCREMOTE: c_long = -2147191703; // sys/user.h pub const MAXCOMLEN: c_int = 32; @@ -2133,9 +2130,9 @@ pub const AT_UID: c_int = 4; // sys/wait.h -pub const P_ALL: c_int = 0; -pub const P_PID: c_int = 1; -pub const P_PGID: c_int = 2; +pub const P_ALL: idtype_t = 0; +pub const P_PID: idtype_t = 1; +pub const P_PGID: idtype_t = 2; pub const WNOHANG: c_int = 0x1; pub const WUNTRACED: c_int = 0x2; pub const WEXITED: c_int = 0x04; @@ -2157,7 +2154,7 @@ pub const CS7: crate::tcflag_t = 0x00000020; pub const CS8: crate::tcflag_t = 0x00000030; pub const CSTOPB: crate::tcflag_t = 0x00000040; -pub const ECHO: crate::tcflag_t = 0x20000; +pub const ECHO: crate::tcflag_t = 0x00000008; pub const ECHOE: crate::tcflag_t = 0x00000010; pub const ECHOK: crate::tcflag_t = 0x00000020; pub const ECHONL: crate::tcflag_t = 0x00000040; @@ -2173,7 +2170,7 @@ pub const INLCR: crate::tcflag_t = 0x00000040; pub const IGNCR: crate::tcflag_t = 0x00000080; pub const ICRNL: crate::tcflag_t = 0x00000100; -pub const IXON: crate::tcflag_t = 0x0001; +pub const IXON: crate::tcflag_t = 0x00000200; pub const IXOFF: crate::tcflag_t = 0x00000400; pub const IXANY: crate::tcflag_t = 0x00001000; pub const IMAXBEL: crate::tcflag_t = 0x00010000; @@ -2426,7 +2423,7 @@ pub const _SC_RAW_SOCKETS: c_int = 155; // utmp.h -pub const EMPTY: c_short = -1; +pub const EMPTY: c_short = 0; pub const RUN_LVL: c_short = 1; pub const BOOT_TIME: c_short = 2; pub const OLD_TIME: c_short = 3; @@ -2442,7 +2439,7 @@ if (*mhdr).msg_controllen as usize >= mem::size_of::<cmsghdr>() { (*mhdr).msg_control as *mut cmsghdr } else { - 0 as *mut cmsghdr + core::ptr::null_mut::<cmsghdr>() } } @@ -2453,7 +2450,7 @@ if (cmsg as usize + (*cmsg).cmsg_len as usize + mem::size_of::<cmsghdr>()) > ((*mhdr).msg_control as usize + (*mhdr).msg_controllen as usize) { - 0 as *mut cmsghdr + core::ptr::null_mut::<cmsghdr>() } else { // AIX does not have any alignment/padding for ancillary data, so we don't need _CMSG_ALIGN here. (cmsg as usize + (*cmsg).cmsg_len as usize) as *mut cmsghdr @@ -2579,109 +2576,249 @@ parent: Option<unsafe extern "C" fn()>, child: Option<unsafe extern "C" fn()>, ) -> c_int; + + pub fn pthread_attr_getdetachstate( + attr: *const crate::pthread_attr_t, + detachstate: *mut c_int, + ) -> c_int; + pub fn pthread_attr_getguardsize( attr: *const crate::pthread_attr_t, guardsize: *mut size_t, ) -> c_int; - pub fn pthread_attr_setguardsize(attr: *mut crate::pthread_attr_t, guardsize: size_t) -> c_int; + + pub fn pthread_attr_getinheritsched( + attr: *const crate::pthread_attr_t, + inheritsched: *mut c_int, + ) -> c_int; + pub fn pthread_attr_getschedparam( attr: *const crate::pthread_attr_t, param: *mut sched_param, ) -> c_int; + + pub fn pthread_attr_getstackaddr( + attr: *const crate::pthread_attr_t, + stackaddr: *mut *mut c_void, + ) -> c_int; + + pub fn pthread_attr_getschedpolicy( + attr: *const crate::pthread_attr_t, + policy: *mut c_int, + ) -> c_int; + + pub fn pthread_attr_getscope( + attr: *const crate::pthread_attr_t, + contentionscope: *mut c_int, + ) -> c_int; + pub fn pthread_attr_getstack( attr: *const crate::pthread_attr_t, stackaddr: *mut *mut c_void, stacksize: *mut size_t, ) -> c_int; + + pub fn pthread_attr_setguardsize(attr: *mut crate::pthread_attr_t, guardsize: size_t) -> c_int; + + pub fn pthread_attr_setinheritsched( + attr: *mut crate::pthread_attr_t, + inheritsched: c_int, + ) -> c_int; + pub fn pthread_attr_setschedparam( attr: *mut crate::pthread_attr_t, param: *const sched_param, ) -> c_int; + + pub fn pthread_attr_setschedpolicy(attr: *mut crate::pthread_attr_t, policy: c_int) -> c_int; + + pub fn pthread_attr_setscope(attr: *mut crate::pthread_attr_t, contentionscope: c_int) + -> c_int; + + pub fn pthread_attr_setstack( + attr: *mut crate::pthread_attr_t, + stackaddr: *mut c_void, + stacksize: size_t, + ) -> c_int; + + pub fn pthread_attr_setstackaddr( + attr: *mut crate::pthread_attr_t, + stackaddr: *mut c_void, + ) -> c_int; + + pub fn pthread_barrierattr_destroy(attr: *mut crate::pthread_barrierattr_t) -> c_int; + + pub fn pthread_barrierattr_getpshared( + attr: *const crate::pthread_barrierattr_t, + pshared: *mut c_int, + ) -> c_int; + + pub fn pthread_barrierattr_init(attr: *mut crate::pthread_barrierattr_t) -> c_int; + + pub fn pthread_barrierattr_setpshared( + attr: *mut crate::pthread_barrierattr_t, + pshared: c_int, + ) -> c_int; + pub fn pthread_barrier_destroy(barrier: *mut pthread_barrier_t) -> c_int; + pub fn pthread_barrier_init( barrier: *mut pthread_barrier_t, attr: *const crate::pthread_barrierattr_t, count: c_uint, ) -> c_int; + pub fn pthread_barrier_wait(barrier: *mut pthread_barrier_t) -> c_int; - pub fn pthread_barrierattr_destroy(attr: *mut crate::pthread_barrierattr_t) -> c_int; - pub fn pthread_barrierattr_getpshared( - attr: *const crate::pthread_barrierattr_t, - shared: *mut c_int, - ) -> c_int; - pub fn pthread_barrierattr_init(attr: *mut crate::pthread_barrierattr_t) -> c_int; - pub fn pthread_barrierattr_setpshared( - attr: *mut crate::pthread_barrierattr_t, - shared: c_int, - ) -> c_int; + pub fn pthread_cancel(thread: crate::pthread_t) -> c_int; + + pub fn pthread_cleanup_pop(execute: c_int) -> c_void; + + pub fn pthread_cleanup_push( + routine: Option<unsafe extern "C" fn(*mut c_void)>, + arg: *mut c_void, + ) -> c_void; + pub fn pthread_condattr_getclock( attr: *const pthread_condattr_t, clock_id: *mut clockid_t, ) -> c_int; + pub fn pthread_condattr_getpshared( attr: *const pthread_condattr_t, pshared: *mut c_int, ) -> c_int; + pub fn pthread_condattr_setclock( attr: *mut pthread_condattr_t, clock_id: crate::clockid_t, ) -> c_int; + pub fn pthread_condattr_setpshared(attr: *mut pthread_condattr_t, pshared: c_int) -> c_int; + pub fn pthread_create( - native: *mut crate::pthread_t, + thread: *mut crate::pthread_t, attr: *const crate::pthread_attr_t, - f: extern "C" fn(*mut c_void) -> *mut c_void, - value: *mut c_void, + start_routine: extern "C" fn(*mut c_void) -> *mut c_void, + arg: *mut c_void, ) -> c_int; - pub fn pthread_getattr_np(native: crate::pthread_t, attr: *mut crate::pthread_attr_t) -> c_int; - pub fn pthread_getcpuclockid(thread: crate::pthread_t, clk_id: *mut crate::clockid_t) -> c_int; + + pub fn pthread_getconcurrency() -> c_int; + + pub fn pthread_getcpuclockid( + thread_id: crate::pthread_t, + clock_id: *mut crate::clockid_t, + ) -> c_int; + pub fn pthread_getschedparam( thread: crate::pthread_t, policy: *mut c_int, param: *mut sched_param, ) -> c_int; - pub fn pthread_kill(thread: crate::pthread_t, signal: c_int) -> c_int; - pub fn pthread_mutex_consistent(mutex: *mut crate::pthread_mutex_t) -> c_int; - pub fn pthread_mutex_timedlock( - lock: *mut pthread_mutex_t, - abstime: *const crate::timespec, + + pub fn pthread_kill(thread: crate::pthread_t, sig: c_int) -> c_int; + + pub fn pthread_mutexattr_getprioceiling( + attr: *const crate::pthread_mutexattr_t, + prioceiling: *mut c_int, ) -> c_int; + pub fn pthread_mutexattr_getprotocol( attr: *const pthread_mutexattr_t, protocol: *mut c_int, ) -> c_int; + pub fn pthread_mutexattr_getpshared( attr: *const pthread_mutexattr_t, pshared: *mut c_int, ) -> c_int; + pub fn pthread_mutexattr_getrobust( - attr: *mut crate::pthread_mutexattr_t, + attr: *const crate::pthread_mutexattr_t, robust: *mut c_int, ) -> c_int; + + pub fn pthread_mutexattr_gettype( + attr: *const crate::pthread_mutexattr_t, + _type: *mut c_int, + ) -> c_int; + + pub fn pthread_mutexattr_setprioceiling( + attr: *mut crate::pthread_mutexattr_t, + prioceiling: c_int, + ) -> c_int; + pub fn pthread_mutexattr_setprotocol(attr: *mut pthread_mutexattr_t, protocol: c_int) -> c_int; + pub fn pthread_mutexattr_setpshared(attr: *mut pthread_mutexattr_t, pshared: c_int) -> c_int; + pub fn pthread_mutexattr_setrobust( attr: *mut crate::pthread_mutexattr_t, robust: c_int, ) -> c_int; + + pub fn pthread_mutex_consistent(mutex: *mut crate::pthread_mutex_t) -> c_int; + + pub fn pthread_mutex_getprioceiling( + mutex: *const crate::pthread_mutex_t, + prioceiling: *mut c_int, + ) -> c_int; + + pub fn pthread_mutex_setprioceiling( + mutex: *mut crate::pthread_mutex_t, + prioceiling: c_int, + old_ceiling: *mut c_int, + ) -> c_int; + + pub fn pthread_mutex_timedlock( + mutex: *mut pthread_mutex_t, + abstime: *const crate::timespec, + ) -> c_int; + + pub fn pthread_once( + once_control: *mut crate::pthread_once_t, + init_routine: Option<unsafe extern "C" fn()>, + ) -> c_int; + pub fn pthread_rwlockattr_getpshared( attr: *const pthread_rwlockattr_t, - val: *mut c_int, + pshared: *mut c_int, ) -> c_int; - pub fn pthread_rwlockattr_setpshared(attr: *mut pthread_rwlockattr_t, val: c_int) -> c_int; + + pub fn pthread_rwlockattr_setpshared(attr: *mut pthread_rwlockattr_t, pshared: c_int) -> c_int; + + pub fn pthread_rwlock_timedrdlock( + rwlock: *mut crate::pthread_rwlock_t, + abstime: *const crate::timespec, + ) -> c_int; + + pub fn pthread_rwlock_timedwrlock( + rwlock: *mut crate::pthread_rwlock_t, + abstime: *const crate::timespec, + ) -> c_int; + + pub fn pthread_setcancelstate(state: c_int, oldstate: *mut c_int) -> c_int; + pub fn pthread_setcanceltype(_type: c_int, oldtype: *mut c_int) -> c_int; + + pub fn pthread_setconcurrency(new_level: c_int) -> c_int; + pub fn pthread_setschedparam( thread: crate::pthread_t, policy: c_int, param: *const sched_param, ) -> c_int; - pub fn pthread_setschedprio(native: crate::pthread_t, priority: c_int) -> c_int; - pub fn pthread_sigmask(how: c_int, set: *const sigset_t, oldset: *mut sigset_t) -> c_int; + + pub fn pthread_setschedprio(thread: crate::pthread_t, prio: c_int) -> c_int; + + pub fn pthread_sigmask(how: c_int, set: *const sigset_t, oset: *mut sigset_t) -> c_int; + pub fn pthread_spin_destroy(lock: *mut pthread_spinlock_t) -> c_int; pub fn pthread_spin_init(lock: *mut pthread_spinlock_t, pshared: c_int) -> c_int; pub fn pthread_spin_lock(lock: *mut pthread_spinlock_t) -> c_int; pub fn pthread_spin_trylock(lock: *mut pthread_spinlock_t) -> c_int; pub fn pthread_spin_unlock(lock: *mut pthread_spinlock_t) -> c_int; + + pub fn pthread_testcancel() -> c_void; } #[link(name = "iconv")] @@ -2698,14 +2835,25 @@ } extern "C" { - pub fn acct(filename: *const c_char) -> c_int; + pub fn acct(filename: *mut c_char) -> c_int; + #[link_name = "_posix_aio_cancel"] pub fn aio_cancel(fildes: c_int, aiocbp: *mut crate::aiocb) -> c_int; - pub fn aio_error(aiocbp: *mut crate::aiocb) -> c_int; + #[link_name = "_posix_aio_error"] + pub fn aio_error(aiocbp: *const crate::aiocb) -> c_int; #[link_name = "_posix_aio_fsync"] pub fn aio_fsync(op: c_int, aiocbp: *mut crate::aiocb) -> c_int; + #[link_name = "_posix_aio_read"] pub fn aio_read(aiocbp: *mut crate::aiocb) -> c_int; - // pub fn aio_suspend - // pub fn aio_write + #[link_name = "_posix_aio_return"] + pub fn aio_return(aiocbp: *mut crate::aiocb) -> ssize_t; + #[link_name = "_posix_aio_suspend"] + pub fn aio_suspend( + list: *const *const crate::aiocb, + nent: c_int, + timeout: *const crate::timespec, + ) -> c_int; + #[link_name = "_posix_aio_write"] + pub fn aio_write(aiocbp: *mut crate::aiocb) -> c_int; pub fn basename(path: *mut c_char) -> *mut c_char; pub fn bind( socket: c_int, @@ -2771,6 +2919,7 @@ pub fn getdtablesize() -> c_int; pub fn getgrent() -> *mut crate::group; pub fn getgrgid(gid: crate::gid_t) -> *mut crate::group; + #[link_name = "_posix_getgrgid_r"] pub fn getgrgid_r( gid: crate::gid_t, grp: *mut crate::group, @@ -2779,14 +2928,15 @@ result: *mut *mut crate::group, ) -> c_int; pub fn getgrnam(name: *const c_char) -> *mut crate::group; + #[link_name = "_posix_getgrnam_r"] pub fn getgrnam_r( name: *const c_char, grp: *mut crate::group, buf: *mut c_char, - buflen: size_t, + buflen: c_int, result: *mut *mut crate::group, ) -> c_int; - pub fn getgrset(user: *mut c_char) -> *mut c_char; + pub fn getgrset(user: *const c_char) -> *mut c_char; pub fn gethostid() -> c_long; pub fn getmntent(stream: *mut crate::FILE) -> *mut crate::mntent; pub fn getnameinfo( @@ -2799,9 +2949,9 @@ flags: c_int, ) -> c_int; pub fn getpagesize() -> c_int; - pub fn getpeereid(socket: c_int, euid: *mut crate::uid_t, egid: *mut crate::gid_t) -> c_int; pub fn getpriority(which: c_int, who: crate::id_t) -> c_int; pub fn getpwent() -> *mut crate::passwd; + #[link_name = "_posix_getpwnam_r"] pub fn getpwnam_r( name: *const c_char, pwd: *mut passwd, @@ -2809,6 +2959,7 @@ buflen: size_t, result: *mut *mut passwd, ) -> c_int; + #[link_name = "_posix_getpwuid_r"] pub fn getpwuid_r( uid: crate::uid_t, pwd: *mut passwd, @@ -2836,7 +2987,7 @@ pub fn hasmntopt(mnt: *const crate::mntent, opt: *const c_char) -> *mut c_char; pub fn hcreate(nelt: size_t) -> c_int; pub fn hdestroy(); - pub fn hsearch(entry: entry, action: c_int) -> *mut entry; + pub fn hsearch(entry: entry, action: ACTION) -> *mut entry; pub fn if_freenameindex(ptr: *mut if_nameindex); pub fn if_nameindex() -> *mut if_nameindex; pub fn initgroups(name: *const c_char, basegid: crate::gid_t) -> c_int; @@ -2850,13 +3001,14 @@ width: size_t, compar: Option<unsafe extern "C" fn(*const c_void, *const c_void) -> c_int>, ) -> *mut c_void; + #[link_name = "_posix_lio_listio"] pub fn lio_listio( mode: c_int, aiocb_list: *const *mut aiocb, - nitems: c_int, + nent: c_int, sevp: *mut sigevent, ) -> c_int; - pub fn loadquery(flags: c_int, buf: *mut c_char, buflen: c_uint) -> c_int; + pub fn loadquery(flags: c_int, buf: *mut c_void, buflen: c_uint, ...) -> c_int; pub fn lpar_get_info(command: c_int, buf: *mut c_void, bufsize: size_t) -> c_int; pub fn lpar_set_resources(id: c_int, resource: *mut c_void) -> c_int; pub fn lrand48() -> c_long; @@ -2869,7 +3021,7 @@ ) -> *mut c_void; pub fn lseek64(fd: c_int, offset: off64_t, whence: c_int) -> off64_t; pub fn lstat64(path: *const c_char, buf: *mut stat64) -> c_int; - pub fn madvise(addr: *mut c_void, len: size_t, advice: c_int) -> c_int; + pub fn madvise(addr: caddr_t, len: size_t, advice: c_int) -> c_int; pub fn makecontext(ucp: *mut crate::ucontext_t, func: extern "C" fn(), argc: c_int, ...); pub fn mallinfo() -> crate::mallinfo; pub fn mallopt(param: c_int, value: c_int) -> c_int; @@ -2880,11 +3032,9 @@ needlelen: size_t, ) -> *mut c_void; pub fn memset_s(s: *mut c_void, smax: size_t, c: c_int, n: size_t) -> c_int; - pub fn mincore(addr: *const c_void, len: size_t, vec: *mut c_char) -> c_int; - pub fn mkfifoat(dirfd: c_int, pathname: *const c_char, mode: crate::mode_t) -> c_int; - pub fn mknodat(dirfd: c_int, pathname: *const c_char, mode: crate::mode_t, dev: dev_t) - -> c_int; - pub fn mount(device: *const c_char, path: *const c_char, flags: c_int) -> c_int; + pub fn mincore(addr: caddr_t, len: size_t, vec: *mut c_char) -> c_int; + pub fn mkfifoat(dirfd: c_int, pathname: *const c_char, mode: mode_t) -> c_int; + pub fn mknodat(dirfd: c_int, pathname: *const c_char, mode: mode_t, dev: dev_t) -> c_int; pub fn mprotect(addr: *mut c_void, len: size_t, prot: c_int) -> c_int; pub fn mq_close(mqd: crate::mqd_t) -> c_int; pub fn mq_getattr(mqd: crate::mqd_t, attr: *mut crate::mq_attr) -> c_int; @@ -2977,7 +3127,7 @@ fd: c_int, path: *const c_char, oflag: c_int, - mode: crate::mode_t, + mode: mode_t, ) -> c_int; pub fn posix_spawn_file_actions_destroy(actions: *mut posix_spawn_file_actions_t) -> c_int; pub fn posix_spawn_file_actions_init(actions: *mut posix_spawn_file_actions_t) -> c_int; @@ -3028,7 +3178,7 @@ envp: *const *mut c_char, ) -> c_int; pub fn pread64(fd: c_int, buf: *mut c_void, count: size_t, offset: off64_t) -> ssize_t; - pub fn preadv(fd: c_int, iov: *const crate::iovec, iovcnt: c_int, offset: off_t) -> ssize_t; + pub fn preadv(fd: c_int, iov: *const crate::iovec, iovcnt: c_int, offset: offset_t) -> ssize_t; pub fn ptrace64( request: c_int, id: c_longlong, @@ -3039,11 +3189,13 @@ pub fn pututline(u: *const utmp) -> *mut utmp; pub fn pututxline(ut: *const utmpx) -> *mut utmpx; pub fn pwrite64(fd: c_int, buf: *const c_void, count: size_t, offset: off64_t) -> ssize_t; - pub fn pwritev(fd: c_int, iov: *const crate::iovec, iovcnt: c_int, offset: off_t) -> ssize_t; - #[link_name = "__linux_quotactl"] - pub fn quotactl(cmd: c_int, special: *const c_char, id: c_int, data: *mut c_char) -> c_int; + pub fn pwritev(fd: c_int, iov: *const crate::iovec, iovcnt: c_int, offset: offset_t) + -> ssize_t; + pub fn quotactl(cmd: *mut c_char, special: c_int, id: c_int, data: caddr_t) -> c_int; pub fn rand() -> c_int; pub fn readv(fd: c_int, iov: *const crate::iovec, iovcnt: c_int) -> ssize_t; + // AIX header socket.h maps recvfrom() to nrecvfrom() + #[link_name = "nrecvfrom"] pub fn recvfrom( socket: c_int, buf: *mut c_void, @@ -3052,13 +3204,8 @@ addr: *mut crate::sockaddr, addrlen: *mut crate::socklen_t, ) -> ssize_t; - pub fn recvmmsg( - sockfd: c_int, - msgvec: *mut crate::mmsghdr, - vlen: c_uint, - flags: c_int, - timeout: *mut crate::timespec, - ) -> c_int; + // AIX header socket.h maps recvmsg() to nrecvmsg(). + #[link_name = "nrecvmsg"] pub fn recvmsg(sockfd: c_int, msg: *mut msghdr, flags: c_int) -> ssize_t; pub fn regcomp(preg: *mut regex_t, pattern: *const c_char, cflags: c_int) -> c_int; pub fn regerror( @@ -3087,14 +3234,6 @@ policy: c_int, param: *const crate::sched_param, ) -> c_int; - pub fn sctp_opt_info( - sd: c_int, - id: crate::sctp_assoc_t, - opt: c_int, - arg_size: *mut c_void, - size: *mut size_t, - ) -> c_int; - pub fn sctp_peeloff(s: c_int, id: crate::sctp_assoc_t) -> c_int; pub fn seed48(xseed: *mut c_ushort) -> *mut c_ushort; pub fn seekdir(dirp: *mut crate::DIR, loc: c_long); pub fn sem_close(sem: *mut sem_t) -> c_int; @@ -3108,20 +3247,19 @@ pub fn semget(key: crate::key_t, nsems: c_int, semflag: c_int) -> c_int; pub fn semop(semid: c_int, sops: *mut sembuf, nsops: size_t) -> c_int; pub fn send_file(socket: *mut c_int, iobuf: *mut sf_parms, flags: c_uint) -> ssize_t; - pub fn sendmmsg(sockfd: c_int, msgvec: *mut mmsghdr, vlen: c_uint, flags: c_int) -> c_int; + // AIX header socket.h maps sendmsg() to nsendmsg(). + #[link_name = "nsendmsg"] pub fn sendmsg(sockfd: c_int, msg: *const msghdr, flags: c_int) -> ssize_t; pub fn setcontext(ucp: *const ucontext_t) -> c_int; - pub fn setdomainname(name: *const c_char, len: c_int) -> c_int; - pub fn setgroups(ngroups: c_int, ptr: *const crate::gid_t) -> c_int; + pub fn setdomainname(name: *mut c_char, len: c_int) -> c_int; + pub fn setgroups(ngroups: c_int, ptr: *mut crate::gid_t) -> c_int; pub fn setgrent(); - pub fn sethostid(hostid: c_int) -> c_int; - pub fn sethostname(name: *const c_char, len: c_int) -> c_int; pub fn setmntent(filename: *const c_char, ty: *const c_char) -> *mut crate::FILE; pub fn setpriority(which: c_int, who: id_t, priority: c_int) -> c_int; pub fn setpwent(); pub fn setrlimit(resource: c_int, rlim: *const crate::rlimit) -> c_int; pub fn setrlimit64(resource: c_int, rlim: *const rlimit64) -> c_int; - pub fn settimeofday(tv: *const crate::timeval, tz: *const crate::timezone) -> c_int; + pub fn settimeofday(tv: *mut crate::timeval, tz: *mut crate::timezone) -> c_int; pub fn setitimer( which: c_int, new_value: *const crate::itimerval, @@ -3142,17 +3280,16 @@ pub fn shmdt(shmaddr: *const c_void) -> c_int; pub fn shmctl(shmid: c_int, cmd: c_int, buf: *mut crate::shmid_ds) -> c_int; pub fn shmget(key: key_t, size: size_t, shmflg: c_int) -> c_int; - pub fn shm_open(name: *const c_char, oflag: c_int, mode: crate::mode_t) -> c_int; + pub fn shm_open(name: *const c_char, oflag: c_int, mode: mode_t) -> c_int; pub fn shm_unlink(name: *const c_char) -> c_int; - pub fn splice(socket1: c_int, socket2: c_int, flags: c_int) -> c_int; pub fn srand(seed: c_uint); pub fn srand48(seed: c_long); pub fn stat64(path: *const c_char, buf: *mut stat64) -> c_int; pub fn stat64at(dirfd: c_int, path: *const c_char, buf: *mut stat64, flags: c_int) -> c_int; - pub fn statfs(path: *const c_char, buf: *mut statfs) -> c_int; - pub fn statfs64(path: *const c_char, buf: *mut statfs64) -> c_int; + pub fn statfs(path: *mut c_char, buf: *mut statfs) -> c_int; + pub fn statfs64(path: *mut c_char, buf: *mut statfs64) -> c_int; pub fn statvfs64(path: *const c_char, buf: *mut statvfs64) -> c_int; - pub fn statx(path: *const c_char, buf: *mut stat, length: c_int, command: c_int) -> c_int; + pub fn statx(path: *mut c_char, buf: *mut stat, length: c_int, command: c_int) -> c_int; pub fn strcasecmp_l( string1: *const c_char, string2: *const c_char, @@ -3174,8 +3311,8 @@ pub fn strptime(s: *const c_char, format: *const c_char, tm: *mut crate::tm) -> *mut c_char; pub fn strsep(string: *mut *mut c_char, delim: *const c_char) -> *mut c_char; pub fn swapcontext(uocp: *mut ucontext_t, ucp: *const ucontext_t) -> c_int; - pub fn swapoff(puath: *const c_char) -> c_int; - pub fn swapon(path: *const c_char) -> c_int; + pub fn swapoff(puath: *mut c_char) -> c_int; + pub fn swapon(path: *mut c_char) -> c_int; pub fn sync(); pub fn telldir(dirp: *mut crate::DIR) -> c_long; pub fn timer_create( @@ -3194,9 +3331,9 @@ ) -> c_int; pub fn truncate64(path: *const c_char, length: off64_t) -> c_int; pub fn uname(buf: *mut crate::utsname) -> c_int; - pub fn updwtmp(file: *const c_char, u: *mut utmp); + pub fn updwtmp(file: *const c_char, u: *const utmp); pub fn uselocale(loc: crate::locale_t) -> crate::locale_t; - pub fn utmpname(file: *const c_char) -> c_int; + pub fn utmpname(file: *mut c_char) -> c_int; pub fn utimensat( dirfd: c_int, path: *const c_char,
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/aix/powerpc64.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/aix/powerpc64.rs index fcb9e6e..f379e2df 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/aix/powerpc64.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/aix/powerpc64.rs
@@ -29,7 +29,7 @@ pub f_files: crate::fsfilcnt_t, pub f_ffree: crate::fsfilcnt_t, pub f_favail: crate::fsfilcnt_t, - pub f_fsid: c_ulong, + pub f_fsid: crate::fsid_t, pub f_basetype: [c_char; 16], pub f_flag: c_ulong, pub f_namemax: c_ulong, @@ -49,6 +49,10 @@ __mt_word: [c_long; 8], } + pub struct pthread_once_t { + __on_word: [c_long; 9], + } + pub struct stat { pub st_dev: crate::dev_t, pub st_ino: crate::ino_t, @@ -59,9 +63,9 @@ pub st_gid: crate::gid_t, pub st_rdev: crate::dev_t, pub st_ssize: c_int, - pub st_atime: crate::st_timespec, - pub st_mtime: crate::st_timespec, - pub st_ctime: crate::st_timespec, + pub st_atim: crate::st_timespec, + pub st_mtim: crate::st_timespec, + pub st_ctim: crate::st_timespec, pub st_blksize: crate::blksize_t, pub st_blocks: crate::blkcnt_t, pub st_vfstype: c_int, @@ -112,20 +116,47 @@ pub aio_sigev_tid: c_long, } - pub struct ucontext_t { - pub __sc_onstack: c_int, - pub uc_sigmask: crate::sigset_t, - pub __sc_uerror: c_int, - pub uc_mcontext: crate::mcontext_t, - pub uc_link: *mut ucontext_t, - pub uc_stack: crate::stack_t, - // Should be pointer to __extctx_t - pub __extctx: *mut c_void, - pub __extctx_magic: c_int, - pub __pad: [c_int; 1], + pub struct __vmxreg_t { + __v: [c_uint; 4], } - pub struct mcontext_t { + pub struct __vmx_context_t { + pub __vr: [crate::__vmxreg_t; 32], + pub __pad1: [c_uint; 3], + pub __vscr: c_uint, + pub __vrsave: c_uint, + pub __pad2: [c_uint; 3], + } + + pub struct __vsx_context_t { + pub __vsr_dw1: [c_ulonglong; 32], + } + + pub struct __tm_context_t { + pub vmx: crate::__vmx_context_t, + pub vsx: crate::__vsx_context_t, + pub gpr: [c_ulonglong; 32], + pub lr: c_ulonglong, + pub ctr: c_ulonglong, + pub cr: c_uint, + pub xer: c_uint, + pub amr: c_ulonglong, + pub texasr: c_ulonglong, + pub tfiar: c_ulonglong, + pub tfhar: c_ulonglong, + pub ppr: c_ulonglong, + pub dscr: c_ulonglong, + pub tar: c_ulonglong, + pub fpscr: c_uint, + pub fpscrx: c_uint, + pub fpr: [fpreg_t; 32], + pub tmcontext: c_char, + pub tmstate: c_char, + pub prevowner: c_char, + pub pad: [c_char; 5], + } + + pub struct __context64 { pub gpr: [c_ulonglong; 32], pub msr: c_ulonglong, pub iar: c_ulonglong, @@ -136,8 +167,7 @@ pub fpscr: c_uint, pub fpscrx: c_uint, pub except: [c_ulonglong; 1], - // Should be array of double type - pub fpr: [crate::uint64_t; 32], + pub fpr: [fpreg_t; 32], pub fpeu: c_char, pub fpinfo: c_char, pub fpscr24_31: c_char, @@ -145,6 +175,33 @@ pub excp_type: c_int, } + pub struct mcontext_t { + pub jmp_context: __context64, + } + + pub struct __extctx_t { + pub __flags: c_uint, + pub __rsvd1: [c_uint; 3], + pub __vmx: crate::__vmx_context_t, + pub __ukeys: [c_uint; 2], + pub __vsx: crate::__vsx_context_t, + pub __tm: crate::__tm_context_t, + pub __reserved: [c_char; 1860], + pub __extctx_magic: c_int, + } + + pub struct ucontext_t { + pub __sc_onstack: c_int, + pub uc_sigmask: crate::sigset_t, + pub __sc_uerror: c_int, + pub uc_mcontext: crate::mcontext_t, + pub uc_link: *mut ucontext_t, + pub uc_stack: crate::stack_t, + pub __extctx: *mut crate::__extctx_t, + pub __extctx_magic: c_int, + pub __pad: [c_int; 1], + } + pub struct utmpx { pub ut_user: [c_char; 256], pub ut_id: [c_char; 14], @@ -199,70 +256,6 @@ pub __pad: [c_int; 3], } - pub union _kernel_simple_lock { - pub _slock: c_long, - // Should be pointer to 'lock_data_instrumented' - pub _slockp: *mut c_void, - } - - pub struct fileops_t { - pub fo_rw: extern "C" fn( - file: *mut file, - rw: crate::uio_rw, - io: *mut c_void, - ext: c_long, - secattr: *mut c_void, - ) -> c_int, - pub fo_ioctl: extern "C" fn( - file: *mut file, - a: c_long, - b: crate::caddr_t, - c: c_long, - d: c_long, - ) -> c_int, - pub fo_select: - extern "C" fn(file: *mut file, a: c_int, b: *mut c_ushort, c: extern "C" fn()) -> c_int, - pub fo_close: extern "C" fn(file: *mut file) -> c_int, - pub fo_fstat: extern "C" fn(file: *mut file, sstat: *mut crate::stat) -> c_int, - } - - pub struct file { - pub f_flag: c_long, - pub f_count: c_int, - pub f_options: c_short, - pub f_type: c_short, - // Should be pointer to 'vnode' - pub f_data: *mut c_void, - pub f_offset: c_longlong, - pub f_dir_off: c_long, - // Should be pointer to 'cred' - pub f_cred: *mut c_void, - pub f_lock: _kernel_simple_lock, - pub f_offset_lock: _kernel_simple_lock, - pub f_vinfo: crate::caddr_t, - pub f_ops: *mut fileops_t, - pub f_parentp: crate::caddr_t, - pub f_fnamep: crate::caddr_t, - pub f_fdata: [c_char; 160], - } - - pub union __ld_info_file { - pub _ldinfo_fd: c_int, - pub _ldinfo_fp: *mut file, - pub _core_offset: c_long, - } - - pub struct ld_info { - pub ldinfo_next: c_uint, - pub ldinfo_flags: c_uint, - pub _file: __ld_info_file, - pub ldinfo_textorg: *mut c_void, - pub ldinfo_textsize: c_ulong, - pub ldinfo_dataorg: *mut c_void, - pub ldinfo_datasize: c_ulong, - pub ldinfo_filename: [c_char; 2], - } - pub union __pollfd_ext_u { pub addr: *mut c_void, pub data32: u32, @@ -271,10 +264,14 @@ pub struct pollfd_ext { pub fd: c_int, - pub events: c_ushort, - pub revents: c_ushort, + pub events: c_short, + pub revents: c_short, pub data: __pollfd_ext_u, } + + pub struct fpreg_t { + pub d: c_double, + } } impl siginfo_t { @@ -316,22 +313,6 @@ } } impl Eq for siginfo_t {} - impl fmt::Debug for siginfo_t { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("siginfo_t") - .field("si_signo", &self.si_signo) - .field("si_errno", &self.si_errno) - .field("si_code", &self.si_code) - .field("si_pid", &self.si_pid) - .field("si_uid", &self.si_uid) - .field("si_status", &self.si_status) - .field("si_addr", &self.si_addr) - .field("si_band", &self.si_band) - .field("si_value", &self.si_value) - .field("__si_flags", &self.__si_flags) - .finish() - } - } impl hash::Hash for siginfo_t { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.si_signo.hash(state); @@ -346,174 +327,6 @@ self.__si_flags.hash(state); } } - - impl PartialEq for _kernel_simple_lock { - fn eq(&self, other: &_kernel_simple_lock) -> bool { - unsafe { self._slock == other._slock && self._slockp == other._slockp } - } - } - impl Eq for _kernel_simple_lock {} - impl hash::Hash for _kernel_simple_lock { - fn hash<H: hash::Hasher>(&self, state: &mut H) { - unsafe { - self._slock.hash(state); - self._slockp.hash(state); - } - } - } - - impl PartialEq for fileops_t { - fn eq(&self, other: &fileops_t) -> bool { - self.fo_rw == other.fo_rw - && self.fo_ioctl == other.fo_ioctl - && self.fo_select == other.fo_select - && self.fo_close == other.fo_close - && self.fo_fstat == other.fo_fstat - } - } - impl Eq for fileops_t {} - impl fmt::Debug for fileops_t { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("fileops_t") - .field("fo_rw", &self.fo_rw) - .field("fo_ioctl", &self.fo_ioctl) - .field("fo_select", &self.fo_select) - .field("fo_close", &self.fo_close) - .field("fo_fstat", &self.fo_fstat) - .finish() - } - } - impl hash::Hash for fileops_t { - fn hash<H: hash::Hasher>(&self, state: &mut H) { - self.fo_rw.hash(state); - self.fo_ioctl.hash(state); - self.fo_select.hash(state); - self.fo_close.hash(state); - self.fo_fstat.hash(state); - } - } - - impl PartialEq for file { - fn eq(&self, other: &file) -> bool { - self.f_flag == other.f_flag - && self.f_count == other.f_count - && self.f_options == other.f_options - && self.f_type == other.f_type - && self.f_data == other.f_data - && self.f_offset == other.f_offset - && self.f_dir_off == other.f_dir_off - && self.f_cred == other.f_cred - && self.f_vinfo == other.f_vinfo - && self.f_ops == other.f_ops - && self.f_parentp == other.f_parentp - && self.f_fnamep == other.f_fnamep - && self.f_fdata == other.f_fdata - && self.f_lock == other.f_lock - && self.f_offset_lock == other.f_offset_lock - } - } - impl Eq for file {} - impl fmt::Debug for file { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("file") - .field("f_flag", &self.f_flag) - .field("f_count", &self.f_count) - .field("f_options", &self.f_options) - .field("f_type", &self.f_type) - .field("f_data", &self.f_data) - .field("f_offset", &self.f_offset) - .field("f_dir_off", &self.f_dir_off) - .field("f_cred", &self.f_cred) - .field("f_lock", &self.f_lock) - .field("f_offset_lock", &self.f_offset_lock) - .field("f_vinfo", &self.f_vinfo) - .field("f_ops", &self.f_ops) - .field("f_parentp", &self.f_parentp) - .field("f_fnamep", &self.f_fnamep) - .field("f_fdata", &self.f_fdata) - .finish() - } - } - impl hash::Hash for file { - fn hash<H: hash::Hasher>(&self, state: &mut H) { - self.f_flag.hash(state); - self.f_count.hash(state); - self.f_options.hash(state); - self.f_type.hash(state); - self.f_data.hash(state); - self.f_offset.hash(state); - self.f_dir_off.hash(state); - self.f_cred.hash(state); - self.f_lock.hash(state); - self.f_offset_lock.hash(state); - self.f_vinfo.hash(state); - self.f_ops.hash(state); - self.f_parentp.hash(state); - self.f_fnamep.hash(state); - self.f_fdata.hash(state); - } - } - - impl PartialEq for __ld_info_file { - fn eq(&self, other: &__ld_info_file) -> bool { - unsafe { - self._ldinfo_fd == other._ldinfo_fd - && self._ldinfo_fp == other._ldinfo_fp - && self._core_offset == other._core_offset - } - } - } - impl Eq for __ld_info_file {} - impl hash::Hash for __ld_info_file { - fn hash<H: hash::Hasher>(&self, state: &mut H) { - unsafe { - self._ldinfo_fd.hash(state); - self._ldinfo_fp.hash(state); - self._core_offset.hash(state); - } - } - } - - impl PartialEq for ld_info { - fn eq(&self, other: &ld_info) -> bool { - self.ldinfo_next == other.ldinfo_next - && self.ldinfo_flags == other.ldinfo_flags - && self.ldinfo_textorg == other.ldinfo_textorg - && self.ldinfo_textsize == other.ldinfo_textsize - && self.ldinfo_dataorg == other.ldinfo_dataorg - && self.ldinfo_datasize == other.ldinfo_datasize - && self.ldinfo_filename == other.ldinfo_filename - && self._file == other._file - } - } - impl Eq for ld_info {} - impl fmt::Debug for ld_info { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("ld_info") - .field("ldinfo_next", &self.ldinfo_next) - .field("ldinfo_flags", &self.ldinfo_flags) - .field("ldinfo_textorg", &self.ldinfo_textorg) - .field("ldinfo_textsize", &self.ldinfo_textsize) - .field("ldinfo_dataorg", &self.ldinfo_dataorg) - .field("ldinfo_datasize", &self.ldinfo_datasize) - .field("ldinfo_filename", &self.ldinfo_filename) - .field("_file", &self._file) - .finish() - } - } - impl hash::Hash for ld_info { - fn hash<H: hash::Hasher>(&self, state: &mut H) { - self.ldinfo_next.hash(state); - self.ldinfo_flags.hash(state); - self.ldinfo_textorg.hash(state); - self.ldinfo_textsize.hash(state); - self.ldinfo_dataorg.hash(state); - self.ldinfo_datasize.hash(state); - self.ldinfo_filename.hash(state); - self._file.hash(state); - } - } - impl PartialEq for __pollfd_ext_u { fn eq(&self, other: &__pollfd_ext_u) -> bool { unsafe { @@ -543,16 +356,6 @@ } } impl Eq for pollfd_ext {} - impl fmt::Debug for pollfd_ext { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("pollfd_ext") - .field("fd", &self.fd) - .field("events", &self.events) - .field("revents", &self.revents) - .field("data", &self.data) - .finish() - } - } impl hash::Hash for pollfd_ext { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.fd.hash(state); @@ -561,6 +364,20 @@ self.data.hash(state); } } + impl PartialEq for fpreg_t { + fn eq(&self, other: &fpreg_t) -> bool { + self.d == other.d + } + } + + impl Eq for fpreg_t {} + + impl hash::Hash for fpreg_t { + fn hash<H: hash::Hasher>(&self, state: &mut H) { + let d: u64 = unsafe { mem::transmute(self.d) }; + d.hash(state); + } + } } } @@ -573,6 +390,11 @@ pub const PTHREAD_RWLOCK_INITIALIZER: pthread_rwlock_t = pthread_rwlock_t { __rw_word: [2, 0, 0, 0, 0, 0, 0, 0, 0, 0], }; + +pub const PTHREAD_ONCE_INIT: pthread_once_t = pthread_once_t { + __on_word: [0, 0, 0, 0, 0, 2, 0, 0, 0], +}; + pub const RLIM_INFINITY: c_ulong = 0x7fffffffffffffff; extern "C" {
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/apple/b32/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/apple/b32/mod.rs index 3753ffb..bdc986d 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/apple/b32/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/apple/b32/mod.rs
@@ -80,14 +80,6 @@ } } impl Eq for pthread_attr_t {} - impl fmt::Debug for pthread_attr_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("pthread_attr_t") - .field("__sig", &self.__sig) - // FIXME(debug): .field("__opaque", &self.__opaque) - .finish() - } - } impl hash::Hash for pthread_attr_t { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.__sig.hash(state); @@ -105,13 +97,6 @@ } } impl Eq for pthread_once_t {} - impl fmt::Debug for pthread_once_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("pthread_once_t") - .field("__sig", &self.__sig) - .finish() - } - } impl hash::Hash for pthread_once_t { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.__sig.hash(state);
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/apple/b64/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/apple/b64/mod.rs index 2bd6823..3474346 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/apple/b64/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/apple/b64/mod.rs
@@ -73,14 +73,6 @@ } } impl Eq for pthread_attr_t {} - impl fmt::Debug for pthread_attr_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("pthread_attr_t") - .field("__sig", &self.__sig) - // FIXME(debug): .field("__opaque", &self.__opaque) - .finish() - } - } impl hash::Hash for pthread_attr_t { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.__sig.hash(state); @@ -98,13 +90,6 @@ } } impl Eq for pthread_once_t {} - impl fmt::Debug for pthread_once_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("pthread_once_t") - .field("__sig", &self.__sig) - .finish() - } - } impl hash::Hash for pthread_once_t { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.__sig.hash(state);
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/apple/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/apple/mod.rs index 56169a5..14b35e2 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/apple/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/apple/mod.rs
@@ -775,7 +775,7 @@ pub gid: crate::gid_t, pub cuid: crate::uid_t, pub cgid: crate::gid_t, - pub mode: crate::mode_t, + pub mode: mode_t, pub _seq: c_ushort, pub _key: crate::key_t, } @@ -1691,7 +1691,7 @@ si_value: crate::sigval, } - (*(self as *const siginfo_t as *const siginfo_timer)).si_value + (*(self as *const siginfo_t).cast::<siginfo_timer>()).si_value } pub unsafe fn si_pid(&self) -> crate::pid_t { @@ -1753,11 +1753,6 @@ } } impl Eq for ifconf {} - impl fmt::Debug for ifconf { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("ifconf").finish_non_exhaustive() - } - } impl PartialEq for kevent { fn eq(&self, other: &kevent) -> bool { @@ -1770,24 +1765,6 @@ } } impl Eq for kevent {} - impl fmt::Debug for kevent { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let ident = self.ident; - let filter = self.filter; - let flags = self.flags; - let fflags = self.fflags; - let data = self.data; - let udata = self.udata; - f.debug_struct("kevent") - .field("ident", &ident) - .field("filter", &filter) - .field("flags", &flags) - .field("fflags", &fflags) - .field("data", &data) - .field("udata", &udata) - .finish() - } - } impl hash::Hash for kevent { fn hash<H: hash::Hasher>(&self, state: &mut H) { let ident = self.ident; @@ -1822,28 +1799,6 @@ } } impl Eq for semid_ds {} - impl fmt::Debug for semid_ds { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let sem_perm = self.sem_perm; - let sem_base = self.sem_base; - let sem_nsems = self.sem_nsems; - let sem_otime = self.sem_otime; - let sem_pad1 = self.sem_pad1; - let sem_ctime = self.sem_ctime; - let sem_pad2 = self.sem_pad2; - let sem_pad3 = self.sem_pad3; - f.debug_struct("semid_ds") - .field("sem_perm", &sem_perm) - .field("sem_base", &sem_base) - .field("sem_nsems", &sem_nsems) - .field("sem_otime", &sem_otime) - .field("sem_pad1", &sem_pad1) - .field("sem_ctime", &sem_ctime) - .field("sem_pad2", &sem_pad2) - .field("sem_pad3", &sem_pad3) - .finish() - } - } impl hash::Hash for semid_ds { fn hash<H: hash::Hasher>(&self, state: &mut H) { let sem_perm = self.sem_perm; @@ -1881,30 +1836,6 @@ } } impl Eq for shmid_ds {} - impl fmt::Debug for shmid_ds { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let shm_perm = self.shm_perm; - let shm_segsz = self.shm_segsz; - let shm_lpid = self.shm_lpid; - let shm_cpid = self.shm_cpid; - let shm_nattch = self.shm_nattch; - let shm_atime = self.shm_atime; - let shm_dtime = self.shm_dtime; - let shm_ctime = self.shm_ctime; - let shm_internal = self.shm_internal; - f.debug_struct("shmid_ds") - .field("shm_perm", &shm_perm) - .field("shm_segsz", &shm_segsz) - .field("shm_lpid", &shm_lpid) - .field("shm_cpid", &shm_cpid) - .field("shm_nattch", &shm_nattch) - .field("shm_atime", &shm_atime) - .field("shm_dtime", &shm_dtime) - .field("shm_ctime", &shm_ctime) - .field("shm_internal", &shm_internal) - .finish() - } - } impl hash::Hash for shmid_ds { fn hash<H: hash::Hasher>(&self, state: &mut H) { let shm_perm = self.shm_perm; @@ -1948,23 +1879,6 @@ } } impl Eq for proc_threadinfo {} - impl fmt::Debug for proc_threadinfo { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("proc_threadinfo") - .field("pth_user_time", &self.pth_user_time) - .field("pth_system_time", &self.pth_system_time) - .field("pth_cpu_usage", &self.pth_cpu_usage) - .field("pth_policy", &self.pth_policy) - .field("pth_run_state", &self.pth_run_state) - .field("pth_flags", &self.pth_flags) - .field("pth_sleep_time", &self.pth_sleep_time) - .field("pth_curpri", &self.pth_curpri) - .field("pth_priority", &self.pth_priority) - .field("pth_maxpriority", &self.pth_maxpriority) - // FIXME(debug): .field("pth_name", &self.pth_name) - .finish() - } - } impl hash::Hash for proc_threadinfo { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.pth_user_time.hash(state); @@ -2011,28 +1925,6 @@ } impl Eq for statfs {} - impl fmt::Debug for statfs { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("statfs") - .field("f_bsize", &self.f_bsize) - .field("f_iosize", &self.f_iosize) - .field("f_blocks", &self.f_blocks) - .field("f_bfree", &self.f_bfree) - .field("f_bavail", &self.f_bavail) - .field("f_files", &self.f_files) - .field("f_ffree", &self.f_ffree) - .field("f_fsid", &self.f_fsid) - .field("f_owner", &self.f_owner) - .field("f_flags", &self.f_flags) - .field("f_fssubtype", &self.f_fssubtype) - .field("f_fstypename", &self.f_fstypename) - .field("f_type", &self.f_type) - // FIXME(debug): .field("f_mntonname", &self.f_mntonname) - // FIXME(debug): .field("f_mntfromname", &self.f_mntfromname) - .field("f_reserved", &self.f_reserved) - .finish() - } - } impl hash::Hash for statfs { fn hash<H: hash::Hasher>(&self, state: &mut H) { @@ -2070,18 +1962,6 @@ } } impl Eq for dirent {} - impl fmt::Debug for dirent { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("dirent") - .field("d_ino", &self.d_ino) - .field("d_seekoff", &self.d_seekoff) - .field("d_reclen", &self.d_reclen) - .field("d_namlen", &self.d_namlen) - .field("d_type", &self.d_type) - // FIXME(debug): .field("d_name", &self.d_name) - .finish() - } - } impl hash::Hash for dirent { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.d_ino.hash(state); @@ -2103,14 +1983,6 @@ } } impl Eq for pthread_rwlock_t {} - impl fmt::Debug for pthread_rwlock_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("pthread_rwlock_t") - .field("__sig", &self.__sig) - // FIXME(debug): .field("__opaque", &self.__opaque) - .finish() - } - } impl hash::Hash for pthread_rwlock_t { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.__sig.hash(state); @@ -2131,15 +2003,6 @@ impl Eq for pthread_mutex_t {} - impl fmt::Debug for pthread_mutex_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("pthread_mutex_t") - .field("__sig", &self.__sig) - // FIXME(debug): .field("__opaque", &self.__opaque) - .finish() - } - } - impl hash::Hash for pthread_mutex_t { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.__sig.hash(state); @@ -2160,15 +2023,6 @@ impl Eq for pthread_cond_t {} - impl fmt::Debug for pthread_cond_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("pthread_cond_t") - .field("__sig", &self.__sig) - // FIXME(debug): .field("__opaque", &self.__opaque) - .finish() - } - } - impl hash::Hash for pthread_cond_t { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.__sig.hash(state); @@ -2196,18 +2050,6 @@ impl Eq for sockaddr_storage {} - impl fmt::Debug for sockaddr_storage { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sockaddr_storage") - .field("ss_len", &self.ss_len) - .field("ss_family", &self.ss_family) - .field("__ss_pad1", &self.__ss_pad1) - .field("__ss_align", &self.__ss_align) - // FIXME(debug): .field("__ss_pad2", &self.__ss_pad2) - .finish() - } - } - impl hash::Hash for sockaddr_storage { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.ss_len.hash(state); @@ -2240,21 +2082,6 @@ impl Eq for utmpx {} - impl fmt::Debug for utmpx { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("utmpx") - // FIXME(debug): .field("ut_user", &self.ut_user) - .field("ut_id", &self.ut_id) - .field("ut_line", &self.ut_line) - .field("ut_pid", &self.ut_pid) - .field("ut_type", &self.ut_type) - .field("ut_tv", &self.ut_tv) - // FIXME(debug): .field("ut_host", &self.ut_host) - .field("ut_pad", &self.ut_pad) - .finish() - } - } - impl hash::Hash for utmpx { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.ut_user.hash(state); @@ -2279,17 +2106,6 @@ impl Eq for sigevent {} - impl fmt::Debug for sigevent { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sigevent") - .field("sigev_notify", &self.sigev_notify) - .field("sigev_signo", &self.sigev_signo) - .field("sigev_value", &self.sigev_value) - .field("sigev_notify_attributes", &self.sigev_notify_attributes) - .finish() - } - } - impl hash::Hash for sigevent { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.sigev_notify.hash(state); @@ -2305,13 +2121,6 @@ } } impl Eq for processor_cpu_load_info {} - impl fmt::Debug for processor_cpu_load_info { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("processor_cpu_load_info") - .field("cpu_ticks", &self.cpu_ticks) - .finish() - } - } impl hash::Hash for processor_cpu_load_info { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.cpu_ticks.hash(state); @@ -2328,17 +2137,6 @@ } } impl Eq for processor_basic_info {} - impl fmt::Debug for processor_basic_info { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("processor_basic_info") - .field("cpu_type", &self.cpu_type) - .field("cpu_subtype", &self.cpu_subtype) - .field("running", &self.running) - .field("slot_num", &self.slot_num) - .field("is_master", &self.is_master) - .finish() - } - } impl hash::Hash for processor_basic_info { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.cpu_type.hash(state); @@ -2356,14 +2154,6 @@ } } impl Eq for processor_set_basic_info {} - impl fmt::Debug for processor_set_basic_info { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("processor_set_basic_info") - .field("processor_count", &self.processor_count) - .field("default_policy", &self.default_policy) - .finish() - } - } impl hash::Hash for processor_set_basic_info { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.processor_count.hash(state); @@ -2380,16 +2170,6 @@ } } impl Eq for processor_set_load_info {} - impl fmt::Debug for processor_set_load_info { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("processor_set_load_info") - .field("task_count", &self.task_count) - .field("thread_count", &self.thread_count) - .field("load_average", &self.load_average) - .field("mach_factor", &self.mach_factor) - .finish() - } - } impl hash::Hash for processor_set_load_info { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.task_count.hash(state); @@ -2405,14 +2185,6 @@ } } impl Eq for time_value_t {} - impl fmt::Debug for time_value_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("time_value_t") - .field("seconds", &self.seconds) - .field("microseconds", &self.microseconds) - .finish() - } - } impl hash::Hash for time_value_t { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.seconds.hash(state); @@ -2432,20 +2204,6 @@ } } impl Eq for thread_basic_info {} - impl fmt::Debug for thread_basic_info { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("thread_basic_info") - .field("user_time", &self.user_time) - .field("system_time", &self.system_time) - .field("cpu_usage", &self.cpu_usage) - .field("policy", &self.policy) - .field("run_state", &self.run_state) - .field("flags", &self.flags) - .field("suspend_count", &self.suspend_count) - .field("sleep_time", &self.sleep_time) - .finish() - } - } impl hash::Hash for thread_basic_info { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.user_time.hash(state); @@ -2478,23 +2236,6 @@ } } impl Eq for thread_extended_info {} - impl fmt::Debug for thread_extended_info { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("proc_threadinfo") - .field("pth_user_time", &self.pth_user_time) - .field("pth_system_time", &self.pth_system_time) - .field("pth_cpu_usage", &self.pth_cpu_usage) - .field("pth_policy", &self.pth_policy) - .field("pth_run_state", &self.pth_run_state) - .field("pth_flags", &self.pth_flags) - .field("pth_sleep_time", &self.pth_sleep_time) - .field("pth_curpri", &self.pth_curpri) - .field("pth_priority", &self.pth_priority) - .field("pth_maxpriority", &self.pth_maxpriority) - // FIXME(debug): .field("pth_name", &self.pth_name) - .finish() - } - } impl hash::Hash for thread_extended_info { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.pth_user_time.hash(state); @@ -2518,15 +2259,6 @@ } } impl Eq for thread_identifier_info {} - impl fmt::Debug for thread_identifier_info { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("thread_identifier_info") - .field("thread_id", &self.thread_id) - .field("thread_handle", &self.thread_handle) - .field("dispatch_qaddr", &self.dispatch_qaddr) - .finish() - } - } impl hash::Hash for thread_identifier_info { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.thread_id.hash(state); @@ -2564,62 +2296,6 @@ } } impl Eq for if_data64 {} - impl fmt::Debug for if_data64 { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let ifi_type = self.ifi_type; - let ifi_typelen = self.ifi_typelen; - let ifi_physical = self.ifi_physical; - let ifi_addrlen = self.ifi_addrlen; - let ifi_hdrlen = self.ifi_hdrlen; - let ifi_recvquota = self.ifi_recvquota; - let ifi_xmitquota = self.ifi_xmitquota; - let ifi_unused1 = self.ifi_unused1; - let ifi_mtu = self.ifi_mtu; - let ifi_metric = self.ifi_metric; - let ifi_baudrate = self.ifi_baudrate; - let ifi_ipackets = self.ifi_ipackets; - let ifi_ierrors = self.ifi_ierrors; - let ifi_opackets = self.ifi_opackets; - let ifi_oerrors = self.ifi_oerrors; - let ifi_collisions = self.ifi_collisions; - let ifi_ibytes = self.ifi_ibytes; - let ifi_obytes = self.ifi_obytes; - let ifi_imcasts = self.ifi_imcasts; - let ifi_omcasts = self.ifi_omcasts; - let ifi_iqdrops = self.ifi_iqdrops; - let ifi_noproto = self.ifi_noproto; - let ifi_recvtiming = self.ifi_recvtiming; - let ifi_xmittiming = self.ifi_xmittiming; - let ifi_lastchange = self.ifi_lastchange; - f.debug_struct("if_data64") - .field("ifi_type", &ifi_type) - .field("ifi_typelen", &ifi_typelen) - .field("ifi_physical", &ifi_physical) - .field("ifi_addrlen", &ifi_addrlen) - .field("ifi_hdrlen", &ifi_hdrlen) - .field("ifi_recvquota", &ifi_recvquota) - .field("ifi_xmitquota", &ifi_xmitquota) - .field("ifi_unused1", &ifi_unused1) - .field("ifi_mtu", &ifi_mtu) - .field("ifi_metric", &ifi_metric) - .field("ifi_baudrate", &ifi_baudrate) - .field("ifi_ipackets", &ifi_ipackets) - .field("ifi_ierrors", &ifi_ierrors) - .field("ifi_opackets", &ifi_opackets) - .field("ifi_oerrors", &ifi_oerrors) - .field("ifi_collisions", &ifi_collisions) - .field("ifi_ibytes", &ifi_ibytes) - .field("ifi_obytes", &ifi_obytes) - .field("ifi_imcasts", &ifi_imcasts) - .field("ifi_omcasts", &ifi_omcasts) - .field("ifi_iqdrops", &ifi_iqdrops) - .field("ifi_noproto", &ifi_noproto) - .field("ifi_recvtiming", &ifi_recvtiming) - .field("ifi_xmittiming", &ifi_xmittiming) - .field("ifi_lastchange", &ifi_lastchange) - .finish() - } - } impl hash::Hash for if_data64 { fn hash<H: hash::Hasher>(&self, state: &mut H) { let ifi_type = self.ifi_type; @@ -2690,34 +2366,6 @@ } } impl Eq for if_msghdr2 {} - impl fmt::Debug for if_msghdr2 { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let ifm_msglen = self.ifm_msglen; - let ifm_version = self.ifm_version; - let ifm_type = self.ifm_type; - let ifm_addrs = self.ifm_addrs; - let ifm_flags = self.ifm_flags; - let ifm_index = self.ifm_index; - let ifm_snd_len = self.ifm_snd_len; - let ifm_snd_maxlen = self.ifm_snd_maxlen; - let ifm_snd_drops = self.ifm_snd_drops; - let ifm_timer = self.ifm_timer; - let ifm_data = self.ifm_data; - f.debug_struct("if_msghdr2") - .field("ifm_msglen", &ifm_msglen) - .field("ifm_version", &ifm_version) - .field("ifm_type", &ifm_type) - .field("ifm_addrs", &ifm_addrs) - .field("ifm_flags", &ifm_flags) - .field("ifm_index", &ifm_index) - .field("ifm_snd_len", &ifm_snd_len) - .field("ifm_snd_maxlen", &ifm_snd_maxlen) - .field("ifm_snd_drops", &ifm_snd_drops) - .field("ifm_timer", &ifm_timer) - .field("ifm_data", &ifm_data) - .finish() - } - } impl hash::Hash for if_msghdr2 { fn hash<H: hash::Hasher>(&self, state: &mut H) { let ifm_msglen = self.ifm_msglen; @@ -2775,64 +2423,6 @@ } } impl Eq for vm_statistics64 {} - impl fmt::Debug for vm_statistics64 { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let free_count = self.free_count; - let active_count = self.active_count; - let inactive_count = self.inactive_count; - let wire_count = self.wire_count; - let zero_fill_count = self.zero_fill_count; - let reactivations = self.reactivations; - let pageins = self.pageins; - let pageouts = self.pageouts; - let faults = self.faults; - let cow_faults = self.cow_faults; - let lookups = self.lookups; - let hits = self.hits; - let purges = self.purges; - let purgeable_count = self.purgeable_count; - let speculative_count = self.speculative_count; - let decompressions = self.decompressions; - let compressions = self.compressions; - let swapins = self.swapins; - let swapouts = self.swapouts; - let compressor_page_count = self.compressor_page_count; - let throttled_count = self.throttled_count; - let external_page_count = self.external_page_count; - let internal_page_count = self.internal_page_count; - // Otherwise rustfmt crashes... - let total_uncompressed = self.total_uncompressed_pages_in_compressor; - f.debug_struct("vm_statistics64") - .field("free_count", &free_count) - .field("active_count", &active_count) - .field("inactive_count", &inactive_count) - .field("wire_count", &wire_count) - .field("zero_fill_count", &zero_fill_count) - .field("reactivations", &reactivations) - .field("pageins", &pageins) - .field("pageouts", &pageouts) - .field("faults", &faults) - .field("cow_faults", &cow_faults) - .field("lookups", &lookups) - .field("hits", &hits) - .field("purges", &purges) - .field("purgeable_count", &purgeable_count) - .field("speculative_count", &speculative_count) - .field("decompressions", &decompressions) - .field("compressions", &compressions) - .field("swapins", &swapins) - .field("swapouts", &swapouts) - .field("compressor_page_count", &compressor_page_count) - .field("throttled_count", &throttled_count) - .field("external_page_count", &external_page_count) - .field("internal_page_count", &internal_page_count) - .field( - "total_uncompressed_pages_in_compressor", - &total_uncompressed, - ) - .finish() - } - } impl hash::Hash for vm_statistics64 { fn hash<H: hash::Hasher>(&self, state: &mut H) { let free_count = self.free_count; @@ -2899,26 +2489,6 @@ } } impl Eq for mach_task_basic_info {} - impl fmt::Debug for mach_task_basic_info { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let virtual_size = self.virtual_size; - let resident_size = self.resident_size; - let resident_size_max = self.resident_size_max; - let user_time = self.user_time; - let system_time = self.system_time; - let policy = self.policy; - let suspend_count = self.suspend_count; - f.debug_struct("mach_task_basic_info") - .field("virtual_size", &virtual_size) - .field("resident_size", &resident_size) - .field("resident_size_max", &resident_size_max) - .field("user_time", &user_time) - .field("system_time", &system_time) - .field("policy", &policy) - .field("suspend_count", &suspend_count) - .finish() - } - } impl hash::Hash for mach_task_basic_info { fn hash<H: hash::Hasher>(&self, state: &mut H) { let virtual_size = self.virtual_size; @@ -2946,18 +2516,6 @@ } } impl Eq for log2phys {} - impl fmt::Debug for log2phys { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let l2p_flags = self.l2p_flags; - let l2p_contigbytes = self.l2p_contigbytes; - let l2p_devoffset = self.l2p_devoffset; - f.debug_struct("log2phys") - .field("l2p_flags", &l2p_flags) - .field("l2p_contigbytes", &l2p_contigbytes) - .field("l2p_devoffset", &l2p_devoffset) - .finish() - } - } impl hash::Hash for log2phys { fn hash<H: hash::Hasher>(&self, state: &mut H) { let l2p_flags = self.l2p_flags; @@ -2976,14 +2534,6 @@ impl Eq for os_unfair_lock {} - impl fmt::Debug for os_unfair_lock { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("os_unfair_lock") - .field("_os_unfair_lock_opaque", &self._os_unfair_lock_opaque) - .finish() - } - } - impl hash::Hash for os_unfair_lock { fn hash<H: hash::Hasher>(&self, state: &mut H) { self._os_unfair_lock_opaque.hash(state); @@ -3002,24 +2552,6 @@ impl Eq for sockaddr_vm {} - impl fmt::Debug for sockaddr_vm { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let svm_len = self.svm_len; - let svm_family = self.svm_family; - let svm_reserved1 = self.svm_reserved1; - let svm_port = self.svm_port; - let svm_cid = self.svm_cid; - - f.debug_struct("sockaddr_vm") - .field("svm_len", &svm_len) - .field("svm_family", &svm_family) - .field("svm_reserved1", &svm_reserved1) - .field("svm_port", &svm_port) - .field("svm_cid", &svm_cid) - .finish() - } - } - impl hash::Hash for sockaddr_vm { fn hash<H: hash::Hasher>(&self, state: &mut H) { let svm_len = self.svm_len; @@ -3046,16 +2578,6 @@ impl Eq for ifdevmtu {} - impl fmt::Debug for ifdevmtu { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("ifdevmtu") - .field("ifdm_current", &self.ifdm_current) - .field("ifdm_min", &self.ifdm_min) - .field("ifdm_max", &self.ifdm_max) - .finish() - } - } - impl hash::Hash for ifdevmtu { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.ifdm_current.hash(state); @@ -3088,15 +2610,6 @@ impl Eq for ifkpi {} - impl fmt::Debug for ifkpi { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("ifkpi") - .field("ifk_module_id", &self.ifk_module_id) - .field("ifk_type", &self.ifk_type) - .finish() - } - } - impl hash::Hash for ifkpi { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.ifk_module_id.hash(state); @@ -3164,15 +2677,6 @@ impl Eq for ifreq {} - impl fmt::Debug for ifreq { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("ifreq") - .field("ifr_name", &self.ifr_name) - .field("ifr_ifru", &self.ifr_ifru) - .finish() - } - } - impl hash::Hash for ifreq { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.ifr_name.hash(state); @@ -3238,15 +2742,6 @@ } impl Eq for in6_ifreq {} - - impl fmt::Debug for in6_ifreq { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("in6_ifreq") - .field("ifr_name", &self.ifr_name) - .field("ifr_ifru", &self.ifr_ifru) - .finish() - } - } } } @@ -5635,7 +5130,7 @@ const fn __DARWIN_ALIGN32(p: usize) -> usize { const __DARWIN_ALIGNBYTES32: usize = mem::size_of::<u32>() - 1; - p + __DARWIN_ALIGNBYTES32 & !__DARWIN_ALIGNBYTES32 + (p + __DARWIN_ALIGNBYTES32) & !__DARWIN_ALIGNBYTES32 } pub const THREAD_EXTENDED_POLICY_COUNT: mach_msg_type_number_t = @@ -5710,7 +5205,7 @@ pub fn CMSG_NXTHDR(mhdr: *const crate::msghdr, cmsg: *const cmsghdr) -> *mut cmsghdr { if cmsg.is_null() { return crate::CMSG_FIRSTHDR(mhdr); - }; + } let cmsg_len = (*cmsg).cmsg_len as usize; let next = cmsg as usize + __DARWIN_ALIGN32(cmsg_len); let max = (*mhdr).msg_control as usize + (*mhdr).msg_controllen as usize; @@ -6341,7 +5836,7 @@ fd: c_int, path: *const c_char, oflag: c_int, - mode: crate::mode_t, + mode: mode_t, ) -> c_int; pub fn posix_spawn_file_actions_addclose( actions: *mut posix_spawn_file_actions_t, @@ -6660,9 +6155,8 @@ pub fn dirname(path: *mut c_char) -> *mut c_char; pub fn basename(path: *mut c_char) -> *mut c_char; - pub fn mkfifoat(dirfd: c_int, pathname: *const c_char, mode: crate::mode_t) -> c_int; - pub fn mknodat(dirfd: c_int, pathname: *const c_char, mode: crate::mode_t, dev: dev_t) - -> c_int; + pub fn mkfifoat(dirfd: c_int, pathname: *const c_char, mode: mode_t) -> c_int; + pub fn mknodat(dirfd: c_int, pathname: *const c_char, mode: mode_t, dev: dev_t) -> c_int; pub fn freadlink(fd: c_int, buf: *mut c_char, size: size_t) -> c_int; pub fn execvP( file: *const c_char,
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/dragonfly/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/dragonfly/mod.rs index 5dbe69e..168c850 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/dragonfly/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/dragonfly/mod.rs
@@ -554,24 +554,6 @@ } } impl Eq for utmpx {} - impl fmt::Debug for utmpx { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("utmpx") - .field("ut_name", &self.ut_name) - .field("ut_id", &self.ut_id) - .field("ut_line", &self.ut_line) - // FIXME(debug): .field("ut_host", &self.ut_host) - .field("ut_unused", &self.ut_unused) - .field("ut_session", &self.ut_session) - .field("ut_type", &self.ut_type) - .field("ut_pid", &self.ut_pid) - .field("ut_exit", &self.ut_exit) - .field("ut_ss", &self.ut_ss) - .field("ut_tv", &self.ut_tv) - .field("ut_unused2", &self.ut_unused2) - .finish() - } - } impl hash::Hash for utmpx { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.ut_name.hash(state); @@ -597,16 +579,6 @@ } } impl Eq for lastlogx {} - impl fmt::Debug for lastlogx { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("lastlogx") - .field("ll_tv", &self.ll_tv) - .field("ll_line", &self.ll_line) - .field("ll_host", &self.ll_host) - .field("ll_ss", &self.ll_ss) - .finish() - } - } impl hash::Hash for lastlogx { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.ll_tv.hash(state); @@ -631,18 +603,6 @@ } } impl Eq for dirent {} - impl fmt::Debug for dirent { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("dirent") - .field("d_fileno", &self.d_fileno) - .field("d_namlen", &self.d_namlen) - .field("d_type", &self.d_type) - // Ignore __unused1 - // Ignore __unused2 - // FIXME(debug): .field("d_name", &self.d_name) - .finish() - } - } impl hash::Hash for dirent { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.d_fileno.hash(state); @@ -685,29 +645,6 @@ } } impl Eq for statfs {} - impl fmt::Debug for statfs { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("statfs") - .field("f_bsize", &self.f_bsize) - .field("f_iosize", &self.f_iosize) - .field("f_blocks", &self.f_blocks) - .field("f_bfree", &self.f_bfree) - .field("f_bavail", &self.f_bavail) - .field("f_files", &self.f_files) - .field("f_ffree", &self.f_ffree) - .field("f_fsid", &self.f_fsid) - .field("f_owner", &self.f_owner) - .field("f_type", &self.f_type) - .field("f_flags", &self.f_flags) - .field("f_syncwrites", &self.f_syncwrites) - .field("f_asyncwrites", &self.f_asyncwrites) - // FIXME(debug): .field("f_mntonname", &self.f_mntonname) - .field("f_syncreads", &self.f_syncreads) - .field("f_asyncreads", &self.f_asyncreads) - // FIXME(debug): .field("f_mntfromname", &self.f_mntfromname) - .finish() - } - } impl hash::Hash for statfs { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.f_bsize.hash(state); @@ -739,15 +676,6 @@ } } impl Eq for sigevent {} - impl fmt::Debug for sigevent { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sigevent") - .field("sigev_notify", &self.sigev_notify) - .field("sigev_signo", &self.sigev_signo) - .field("sigev_value", &self.sigev_value) - .finish() - } - } impl hash::Hash for sigevent { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.sigev_notify.hash(state); @@ -790,42 +718,6 @@ } } impl Eq for mcontext_t {} - impl fmt::Debug for mcontext_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("mcontext_t") - .field("mc_onstack", &self.mc_onstack) - .field("mc_rdi", &self.mc_rdi) - .field("mc_rsi", &self.mc_rsi) - .field("mc_rdx", &self.mc_rdx) - .field("mc_rcx", &self.mc_rcx) - .field("mc_r8", &self.mc_r8) - .field("mc_r9", &self.mc_r9) - .field("mc_rax", &self.mc_rax) - .field("mc_rbx", &self.mc_rbx) - .field("mc_rbp", &self.mc_rbp) - .field("mc_r10", &self.mc_r10) - .field("mc_r11", &self.mc_r11) - .field("mc_r12", &self.mc_r12) - .field("mc_r13", &self.mc_r13) - .field("mc_r14", &self.mc_r14) - .field("mc_r15", &self.mc_r15) - .field("mc_xflags", &self.mc_xflags) - .field("mc_trapno", &self.mc_trapno) - .field("mc_addr", &self.mc_addr) - .field("mc_flags", &self.mc_flags) - .field("mc_err", &self.mc_err) - .field("mc_rip", &self.mc_rip) - .field("mc_cs", &self.mc_cs) - .field("mc_rflags", &self.mc_rflags) - .field("mc_rsp", &self.mc_rsp) - .field("mc_ss", &self.mc_ss) - .field("mc_len", &self.mc_len) - .field("mc_fpformat", &self.mc_fpformat) - .field("mc_ownedfp", &self.mc_ownedfp) - .field("mc_fpregs", &self.mc_fpregs) - .finish() - } - } impl hash::Hash for mcontext_t { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.mc_onstack.hash(state); @@ -875,18 +767,6 @@ } } impl Eq for ucontext_t {} - impl fmt::Debug for ucontext_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("ucontext_t") - .field("uc_sigmask", &self.uc_sigmask) - .field("uc_mcontext", &self.uc_mcontext) - .field("uc_link", &self.uc_link) - .field("uc_stack", &self.uc_stack) - .field("uc_cofunc", &self.uc_cofunc) - .field("uc_arg", &self.uc_arg) - .finish() - } - } impl hash::Hash for ucontext_t { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.uc_sigmask.hash(state); @@ -1560,7 +1440,7 @@ if next <= max { (cmsg as usize + _CMSG_ALIGN((*cmsg).cmsg_len as usize)) as *mut cmsghdr } else { - 0 as *mut cmsghdr + core::ptr::null_mut::<cmsghdr>() } }
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/aarch64.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/aarch64.rs index ae93648..7f5693d 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/aarch64.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/aarch64.rs
@@ -48,18 +48,6 @@ } } impl Eq for gpregs {} - impl fmt::Debug for gpregs { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("gpregs") - .field("gp_x", &self.gp_x) - .field("gp_lr", &self.gp_lr) - .field("gp_sp", &self.gp_sp) - .field("gp_elr", &self.gp_elr) - .field("gp_spsr", &self.gp_spsr) - .field("gp_pad", &self.gp_pad) - .finish() - } - } impl hash::Hash for gpregs { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.gp_x.hash(state); @@ -80,17 +68,6 @@ } } impl Eq for fpregs {} - impl fmt::Debug for fpregs { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("fpregs") - .field("fp_q", &self.fp_q) - .field("fp_sr", &self.fp_sr) - .field("fp_cr", &self.fp_cr) - .field("fp_flags", &self.fp_flags) - .field("fp_pad", &self.fp_pad) - .finish() - } - } impl hash::Hash for fpregs { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.fp_q.hash(state); @@ -114,17 +91,6 @@ } } impl Eq for mcontext_t {} - impl fmt::Debug for mcontext_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("mcontext_t") - .field("mc_gpregs", &self.mc_gpregs) - .field("mc_fpregs", &self.mc_fpregs) - .field("mc_flags", &self.mc_flags) - .field("mc_pad", &self.mc_pad) - .field("mc_spare", &self.mc_spare) - .finish() - } - } impl hash::Hash for mcontext_t { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.mc_gpregs.hash(state);
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/arm.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/arm.rs index e29c9ce..27eeafe 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/arm.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/arm.rs
@@ -32,16 +32,6 @@ } } impl Eq for mcontext_t {} - impl fmt::Debug for mcontext_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("mcontext_t") - .field("__gregs", &self.__gregs) - .field("mc_vfp_size", &self.mc_vfp_size) - .field("mc_vfp_ptr", &self.mc_vfp_ptr) - .field("mc_spare", &self.mc_spare) - .finish() - } - } impl hash::Hash for mcontext_t { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.__gregs.hash(state);
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/freebsd11/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/freebsd11/mod.rs index 5846447..9705e30 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/freebsd11/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/freebsd11/mod.rs
@@ -296,29 +296,6 @@ } } impl Eq for statfs {} - impl fmt::Debug for statfs { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("statfs") - .field("f_bsize", &self.f_bsize) - .field("f_iosize", &self.f_iosize) - .field("f_blocks", &self.f_blocks) - .field("f_bfree", &self.f_bfree) - .field("f_bavail", &self.f_bavail) - .field("f_files", &self.f_files) - .field("f_ffree", &self.f_ffree) - .field("f_syncwrites", &self.f_syncwrites) - .field("f_asyncwrites", &self.f_asyncwrites) - .field("f_syncreads", &self.f_syncreads) - .field("f_asyncreads", &self.f_asyncreads) - .field("f_namemax", &self.f_namemax) - .field("f_owner", &self.f_owner) - .field("f_fsid", &self.f_fsid) - .field("f_fstypename", &self.f_fstypename) - .field("f_mntfromname", &&self.f_mntfromname[..]) - .field("f_mntonname", &&self.f_mntonname[..]) - .finish() - } - } impl hash::Hash for statfs { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.f_version.hash(state); @@ -357,17 +334,6 @@ } } impl Eq for dirent {} - impl fmt::Debug for dirent { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("dirent") - .field("d_fileno", &self.d_fileno) - .field("d_reclen", &self.d_reclen) - .field("d_type", &self.d_type) - .field("d_namlen", &self.d_namlen) - .field("d_name", &&self.d_name[..self.d_namlen as _]) - .finish() - } - } impl hash::Hash for dirent { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.d_fileno.hash(state); @@ -394,22 +360,6 @@ } } impl Eq for vnstat {} - impl fmt::Debug for vnstat { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let self_vn_devname: &[c_char] = &self.vn_devname; - - f.debug_struct("vnstat") - .field("vn_fileid", &self.vn_fileid) - .field("vn_size", &self.vn_size) - .field("vn_mntdir", &self.vn_mntdir) - .field("vn_dev", &self.vn_dev) - .field("vn_fsid", &self.vn_fsid) - .field("vn_type", &self.vn_type) - .field("vn_mode", &self.vn_mode) - .field("vn_devname", &self_vn_devname) - .finish() - } - } impl hash::Hash for vnstat { fn hash<H: hash::Hasher>(&self, state: &mut H) { let self_vn_devname: &[c_char] = &self.vn_devname;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/freebsd12/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/freebsd12/mod.rs index 21062e5..005b268 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/freebsd12/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/freebsd12/mod.rs
@@ -340,29 +340,6 @@ } } impl Eq for statfs {} - impl fmt::Debug for statfs { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("statfs") - .field("f_bsize", &self.f_bsize) - .field("f_iosize", &self.f_iosize) - .field("f_blocks", &self.f_blocks) - .field("f_bfree", &self.f_bfree) - .field("f_bavail", &self.f_bavail) - .field("f_files", &self.f_files) - .field("f_ffree", &self.f_ffree) - .field("f_syncwrites", &self.f_syncwrites) - .field("f_asyncwrites", &self.f_asyncwrites) - .field("f_syncreads", &self.f_syncreads) - .field("f_asyncreads", &self.f_asyncreads) - .field("f_namemax", &self.f_namemax) - .field("f_owner", &self.f_owner) - .field("f_fsid", &self.f_fsid) - .field("f_fstypename", &self.f_fstypename) - .field("f_mntfromname", &&self.f_mntfromname[..]) - .field("f_mntonname", &&self.f_mntonname[..]) - .finish() - } - } impl hash::Hash for statfs { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.f_version.hash(state); @@ -403,18 +380,6 @@ } } impl Eq for dirent {} - impl fmt::Debug for dirent { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("dirent") - .field("d_fileno", &self.d_fileno) - .field("d_off", &self.d_off) - .field("d_reclen", &self.d_reclen) - .field("d_type", &self.d_type) - .field("d_namlen", &self.d_namlen) - .field("d_name", &&self.d_name[..self.d_namlen as _]) - .finish() - } - } impl hash::Hash for dirent { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.d_fileno.hash(state); @@ -442,22 +407,6 @@ } } impl Eq for vnstat {} - impl fmt::Debug for vnstat { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let self_vn_devname: &[c_char] = &self.vn_devname; - - f.debug_struct("vnstat") - .field("vn_fileid", &self.vn_fileid) - .field("vn_size", &self.vn_size) - .field("vn_dev", &self.vn_dev) - .field("vn_fsid", &self.vn_fsid) - .field("vn_mntdir", &self.vn_mntdir) - .field("vn_type", &self.vn_type) - .field("vn_mode", &self.vn_mode) - .field("vn_devname", &self_vn_devname) - .finish() - } - } impl hash::Hash for vnstat { fn hash<H: hash::Hasher>(&self, state: &mut H) { let self_vn_devname: &[c_char] = &self.vn_devname;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/freebsd13/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/freebsd13/mod.rs index 505d2d1..5c40a355 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/freebsd13/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/freebsd13/mod.rs
@@ -353,29 +353,6 @@ } } impl Eq for statfs {} - impl fmt::Debug for statfs { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("statfs") - .field("f_bsize", &self.f_bsize) - .field("f_iosize", &self.f_iosize) - .field("f_blocks", &self.f_blocks) - .field("f_bfree", &self.f_bfree) - .field("f_bavail", &self.f_bavail) - .field("f_files", &self.f_files) - .field("f_ffree", &self.f_ffree) - .field("f_syncwrites", &self.f_syncwrites) - .field("f_asyncwrites", &self.f_asyncwrites) - .field("f_syncreads", &self.f_syncreads) - .field("f_asyncreads", &self.f_asyncreads) - .field("f_namemax", &self.f_namemax) - .field("f_owner", &self.f_owner) - .field("f_fsid", &self.f_fsid) - .field("f_fstypename", &self.f_fstypename) - .field("f_mntfromname", &&self.f_mntfromname[..]) - .field("f_mntonname", &&self.f_mntonname[..]) - .finish() - } - } impl hash::Hash for statfs { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.f_version.hash(state); @@ -416,18 +393,6 @@ } } impl Eq for dirent {} - impl fmt::Debug for dirent { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("dirent") - .field("d_fileno", &self.d_fileno) - .field("d_off", &self.d_off) - .field("d_reclen", &self.d_reclen) - .field("d_type", &self.d_type) - .field("d_namlen", &self.d_namlen) - .field("d_name", &&self.d_name[..self.d_namlen as _]) - .finish() - } - } impl hash::Hash for dirent { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.d_fileno.hash(state); @@ -455,22 +420,6 @@ } } impl Eq for vnstat {} - impl fmt::Debug for vnstat { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let self_vn_devname: &[c_char] = &self.vn_devname; - - f.debug_struct("vnstat") - .field("vn_fileid", &self.vn_fileid) - .field("vn_size", &self.vn_size) - .field("vn_dev", &self.vn_dev) - .field("vn_fsid", &self.vn_fsid) - .field("vn_mntdir", &self.vn_mntdir) - .field("vn_type", &self.vn_type) - .field("vn_mode", &self.vn_mode) - .field("vn_devname", &self_vn_devname) - .finish() - } - } impl hash::Hash for vnstat { fn hash<H: hash::Hasher>(&self, state: &mut H) { let self_vn_devname: &[c_char] = &self.vn_devname;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/freebsd14/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/freebsd14/mod.rs index 44a3656..de1001b2 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/freebsd14/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/freebsd14/mod.rs
@@ -353,29 +353,6 @@ } } impl Eq for statfs {} - impl fmt::Debug for statfs { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("statfs") - .field("f_bsize", &self.f_bsize) - .field("f_iosize", &self.f_iosize) - .field("f_blocks", &self.f_blocks) - .field("f_bfree", &self.f_bfree) - .field("f_bavail", &self.f_bavail) - .field("f_files", &self.f_files) - .field("f_ffree", &self.f_ffree) - .field("f_syncwrites", &self.f_syncwrites) - .field("f_asyncwrites", &self.f_asyncwrites) - .field("f_syncreads", &self.f_syncreads) - .field("f_asyncreads", &self.f_asyncreads) - .field("f_namemax", &self.f_namemax) - .field("f_owner", &self.f_owner) - .field("f_fsid", &self.f_fsid) - .field("f_fstypename", &self.f_fstypename) - .field("f_mntfromname", &&self.f_mntfromname[..]) - .field("f_mntonname", &&self.f_mntonname[..]) - .finish() - } - } impl hash::Hash for statfs { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.f_version.hash(state); @@ -416,18 +393,6 @@ } } impl Eq for dirent {} - impl fmt::Debug for dirent { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("dirent") - .field("d_fileno", &self.d_fileno) - .field("d_off", &self.d_off) - .field("d_reclen", &self.d_reclen) - .field("d_type", &self.d_type) - .field("d_namlen", &self.d_namlen) - .field("d_name", &&self.d_name[..self.d_namlen as _]) - .finish() - } - } impl hash::Hash for dirent { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.d_fileno.hash(state); @@ -455,22 +420,6 @@ } } impl Eq for vnstat {} - impl fmt::Debug for vnstat { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let self_vn_devname: &[c_char] = &self.vn_devname; - - f.debug_struct("vnstat") - .field("vn_fileid", &self.vn_fileid) - .field("vn_size", &self.vn_size) - .field("vn_dev", &self.vn_dev) - .field("vn_fsid", &self.vn_fsid) - .field("vn_mntdir", &self.vn_mntdir) - .field("vn_type", &self.vn_type) - .field("vn_mode", &self.vn_mode) - .field("vn_devname", &self_vn_devname) - .finish() - } - } impl hash::Hash for vnstat { fn hash<H: hash::Hasher>(&self, state: &mut H) { let self_vn_devname: &[c_char] = &self.vn_devname;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/freebsd15/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/freebsd15/mod.rs index 29c9c0c..6a02d7b 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/freebsd15/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/freebsd15/mod.rs
@@ -354,29 +354,6 @@ } } impl Eq for statfs {} - impl fmt::Debug for statfs { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("statfs") - .field("f_bsize", &self.f_bsize) - .field("f_iosize", &self.f_iosize) - .field("f_blocks", &self.f_blocks) - .field("f_bfree", &self.f_bfree) - .field("f_bavail", &self.f_bavail) - .field("f_files", &self.f_files) - .field("f_ffree", &self.f_ffree) - .field("f_syncwrites", &self.f_syncwrites) - .field("f_asyncwrites", &self.f_asyncwrites) - .field("f_syncreads", &self.f_syncreads) - .field("f_asyncreads", &self.f_asyncreads) - .field("f_namemax", &self.f_namemax) - .field("f_owner", &self.f_owner) - .field("f_fsid", &self.f_fsid) - .field("f_fstypename", &self.f_fstypename) - .field("f_mntfromname", &&self.f_mntfromname[..]) - .field("f_mntonname", &&self.f_mntonname[..]) - .finish() - } - } impl hash::Hash for statfs { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.f_version.hash(state); @@ -417,18 +394,6 @@ } } impl Eq for dirent {} - impl fmt::Debug for dirent { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("dirent") - .field("d_fileno", &self.d_fileno) - .field("d_off", &self.d_off) - .field("d_reclen", &self.d_reclen) - .field("d_type", &self.d_type) - .field("d_namlen", &self.d_namlen) - .field("d_name", &&self.d_name[..self.d_namlen as _]) - .finish() - } - } impl hash::Hash for dirent { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.d_fileno.hash(state); @@ -456,22 +421,6 @@ } } impl Eq for vnstat {} - impl fmt::Debug for vnstat { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let self_vn_devname: &[c_char] = &self.vn_devname; - - f.debug_struct("vnstat") - .field("vn_fileid", &self.vn_fileid) - .field("vn_size", &self.vn_size) - .field("vn_dev", &self.vn_dev) - .field("vn_fsid", &self.vn_fsid) - .field("vn_mntdir", &self.vn_mntdir) - .field("vn_type", &self.vn_type) - .field("vn_mode", &self.vn_mode) - .field("vn_devname", &self_vn_devname) - .finish() - } - } impl hash::Hash for vnstat { fn hash<H: hash::Hasher>(&self, state: &mut H) { let self_vn_devname: &[c_char] = &self.vn_devname;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/mod.rs index 11830db..bd460157 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/mod.rs
@@ -1398,6 +1398,12 @@ tqh_first: *mut c_void, tqh_last: *mut *mut c_void, } + + pub struct splice { + pub sp_fd: c_int, + pub sp_max: off_t, + pub sp_idle: crate::timeval, + } } s_no_extra_traits! { @@ -1720,20 +1726,6 @@ } } impl Eq for utmpx {} - impl fmt::Debug for utmpx { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("utmpx") - .field("ut_type", &self.ut_type) - .field("ut_tv", &self.ut_tv) - .field("ut_id", &self.ut_id) - .field("ut_pid", &self.ut_pid) - .field("ut_user", &self.ut_user) - .field("ut_line", &self.ut_line) - // FIXME(debug): .field("ut_host", &self.ut_host) - // FIXME(debug): .field("__ut_spare", &self.__ut_spare) - .finish() - } - } impl hash::Hash for utmpx { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.ut_type.hash(state); @@ -1769,17 +1761,6 @@ } } impl Eq for xucred {} - impl fmt::Debug for xucred { - fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result { - f.debug_struct("xucred") - .field("cr_version", &self.cr_version) - .field("cr_uid", &self.cr_uid) - .field("cr_ngroups", &self.cr_ngroups) - .field("cr_groups", &self.cr_groups) - .field("cr_pid__c_anonymous_union", &self.cr_pid__c_anonymous_union) - .finish() - } - } impl hash::Hash for xucred { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.cr_version.hash(state); @@ -1807,20 +1788,6 @@ } } impl Eq for sockaddr_dl {} - impl fmt::Debug for sockaddr_dl { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sockaddr_dl") - .field("sdl_len", &self.sdl_len) - .field("sdl_family", &self.sdl_family) - .field("sdl_index", &self.sdl_index) - .field("sdl_type", &self.sdl_type) - .field("sdl_nlen", &self.sdl_nlen) - .field("sdl_alen", &self.sdl_alen) - .field("sdl_slen", &self.sdl_slen) - // FIXME(debug): .field("sdl_data", &self.sdl_data) - .finish() - } - } impl hash::Hash for sockaddr_dl { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.sdl_len.hash(state); @@ -1843,16 +1810,6 @@ } } impl Eq for mq_attr {} - impl fmt::Debug for mq_attr { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("mq_attr") - .field("mq_flags", &self.mq_flags) - .field("mq_maxmsg", &self.mq_maxmsg) - .field("mq_msgsize", &self.mq_msgsize) - .field("mq_curmsgs", &self.mq_curmsgs) - .finish() - } - } impl hash::Hash for mq_attr { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.mq_flags.hash(state); @@ -1871,16 +1828,6 @@ } } impl Eq for sigevent {} - impl fmt::Debug for sigevent { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sigevent") - .field("sigev_notify", &self.sigev_notify) - .field("sigev_signo", &self.sigev_signo) - .field("sigev_value", &self.sigev_value) - .field("sigev_notify_thread_id", &self.sigev_notify_thread_id) - .finish() - } - } impl hash::Hash for sigevent { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.sigev_notify.hash(state); @@ -1899,16 +1846,6 @@ } } impl Eq for ptsstat {} - impl fmt::Debug for ptsstat { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let self_devname: &[c_char] = &self.devname; - - f.debug_struct("ptsstat") - .field("dev", &self.dev) - .field("devname", &self_devname) - .finish() - } - } impl hash::Hash for ptsstat { fn hash<H: hash::Hasher>(&self, state: &mut H) { let self_devname: &[c_char] = &self.devname; @@ -1930,14 +1867,6 @@ } } impl Eq for Elf32_Auxinfo {} - impl fmt::Debug for Elf32_Auxinfo { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("Elf32_Auxinfo") - .field("a_type", &self.a_type) - .field("a_un", &self.a_un) - .finish() - } - } impl PartialEq for __c_anonymous_ifr_ifru { fn eq(&self, other: &__c_anonymous_ifr_ifru) -> bool { @@ -1987,14 +1916,6 @@ } } impl Eq for ifreq {} - impl fmt::Debug for ifreq { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("ifreq") - .field("ifr_name", &self.ifr_name) - .field("ifr_ifru", &self.ifr_ifru) - .finish() - } - } impl hash::Hash for ifreq { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.ifr_name.hash(state); @@ -2026,16 +1947,6 @@ } } impl Eq for ifstat {} - impl fmt::Debug for ifstat { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let ascii: &[c_char] = &self.ascii; - - f.debug_struct("ifstat") - .field("ifs_name", &self.ifs_name) - .field("ascii", &ascii) - .finish() - } - } impl hash::Hash for ifstat { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.ifs_name.hash(state); @@ -2056,19 +1967,6 @@ } } impl Eq for ifrsskey {} - impl fmt::Debug for ifrsskey { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let ifrk_key: &[u8] = &self.ifrk_key; - - f.debug_struct("ifrsskey") - .field("ifrk_name", &self.ifrk_name) - .field("ifrk_func", &self.ifrk_func) - .field("ifrk_spare0", &self.ifrk_spare0) - .field("ifrk_keylen", &self.ifrk_keylen) - .field("ifrk_key", &ifrk_key) - .finish() - } - } impl hash::Hash for ifrsskey { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.ifrk_name.hash(state); @@ -2091,18 +1989,6 @@ } } impl Eq for ifdownreason {} - impl fmt::Debug for ifdownreason { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let ifdr_msg: &[c_char] = &self.ifdr_msg; - - f.debug_struct("ifdownreason") - .field("ifdr_name", &self.ifdr_name) - .field("ifdr_reason", &self.ifdr_reason) - .field("ifdr_vendor", &self.ifdr_vendor) - .field("ifdr_msg", &ifdr_msg) - .finish() - } - } impl hash::Hash for ifdownreason { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.ifdr_name.hash(state); @@ -2172,37 +2058,6 @@ } } impl Eq for if_data {} - impl fmt::Debug for if_data { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("if_data") - .field("ifi_type", &self.ifi_type) - .field("ifi_physical", &self.ifi_physical) - .field("ifi_addrlen", &self.ifi_addrlen) - .field("ifi_hdrlen", &self.ifi_hdrlen) - .field("ifi_link_state", &self.ifi_link_state) - .field("ifi_vhid", &self.ifi_vhid) - .field("ifi_datalen", &self.ifi_datalen) - .field("ifi_mtu", &self.ifi_mtu) - .field("ifi_metric", &self.ifi_metric) - .field("ifi_baudrate", &self.ifi_baudrate) - .field("ifi_ipackets", &self.ifi_ipackets) - .field("ifi_ierrors", &self.ifi_ierrors) - .field("ifi_opackets", &self.ifi_opackets) - .field("ifi_oerrors", &self.ifi_oerrors) - .field("ifi_collisions", &self.ifi_collisions) - .field("ifi_ibytes", &self.ifi_ibytes) - .field("ifi_obytes", &self.ifi_obytes) - .field("ifi_imcasts", &self.ifi_imcasts) - .field("ifi_omcasts", &self.ifi_omcasts) - .field("ifi_iqdrops", &self.ifi_iqdrops) - .field("ifi_oqdrops", &self.ifi_oqdrops) - .field("ifi_noproto", &self.ifi_noproto) - .field("ifi_hwassist", &self.ifi_hwassist) - .field("__ifi_epoch", &self.__ifi_epoch) - .field("__ifi_lastchange", &self.__ifi_lastchange) - .finish() - } - } impl hash::Hash for if_data { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.ifi_type.hash(state); @@ -2242,16 +2097,6 @@ } } impl Eq for sctphdr {} - impl fmt::Debug for sctphdr { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sctphdr") - .field("src_port", &{ self.src_port }) - .field("dest_port", &{ self.dest_port }) - .field("v_tag", &{ self.v_tag }) - .field("checksum", &{ self.checksum }) - .finish() - } - } impl hash::Hash for sctphdr { fn hash<H: hash::Hasher>(&self, state: &mut H) { { self.src_port }.hash(state); @@ -2269,15 +2114,6 @@ } } impl Eq for sctp_chunkhdr {} - impl fmt::Debug for sctp_chunkhdr { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sctp_chunkhdr") - .field("chunk_type", &{ self.chunk_type }) - .field("chunk_flags", &{ self.chunk_flags }) - .field("chunk_length", &{ self.chunk_length }) - .finish() - } - } impl hash::Hash for sctp_chunkhdr { fn hash<H: hash::Hasher>(&self, state: &mut H) { { self.chunk_type }.hash(state); @@ -2294,14 +2130,6 @@ } } impl Eq for sctp_paramhdr {} - impl fmt::Debug for sctp_paramhdr { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sctp_paramhdr") - .field("param_type", &{ self.param_type }) - .field("param_length", &{ self.param_length }) - .finish() - } - } impl hash::Hash for sctp_paramhdr { fn hash<H: hash::Hasher>(&self, state: &mut H) { { self.param_type }.hash(state); @@ -2320,15 +2148,6 @@ } } impl Eq for sctp_gen_error_cause {} - impl fmt::Debug for sctp_gen_error_cause { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sctp_gen_error_cause") - .field("code", &{ self.code }) - .field("length", &{ self.length }) - // FIXME(debug): .field("info", &{self.info}) - .finish() - } - } impl hash::Hash for sctp_gen_error_cause { fn hash<H: hash::Hasher>(&self, state: &mut H) { { self.code }.hash(state); @@ -2343,14 +2162,6 @@ } } impl Eq for sctp_error_cause {} - impl fmt::Debug for sctp_error_cause { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sctp_error_cause") - .field("code", &{ self.code }) - .field("length", &{ self.length }) - .finish() - } - } impl hash::Hash for sctp_error_cause { fn hash<H: hash::Hasher>(&self, state: &mut H) { { self.code }.hash(state); @@ -2366,14 +2177,6 @@ } } impl Eq for sctp_error_invalid_stream {} - impl fmt::Debug for sctp_error_invalid_stream { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sctp_error_invalid_stream") - .field("cause", &{ self.cause }) - .field("stream_id", &{ self.stream_id }) - .finish() - } - } impl hash::Hash for sctp_error_invalid_stream { fn hash<H: hash::Hasher>(&self, state: &mut H) { { self.cause }.hash(state); @@ -2392,15 +2195,6 @@ } } impl Eq for sctp_error_missing_param {} - impl fmt::Debug for sctp_error_missing_param { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sctp_error_missing_param") - .field("cause", &{ self.cause }) - .field("num_missing_params", &{ self.num_missing_params }) - // FIXME(debug): .field("tpe", &{self.tpe}) - .finish() - } - } impl hash::Hash for sctp_error_missing_param { fn hash<H: hash::Hasher>(&self, state: &mut H) { { self.cause }.hash(state); @@ -2417,14 +2211,6 @@ } } impl Eq for sctp_error_stale_cookie {} - impl fmt::Debug for sctp_error_stale_cookie { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sctp_error_stale_cookie") - .field("cause", &{ self.cause }) - .field("stale_time", &{ self.stale_time }) - .finish() - } - } impl hash::Hash for sctp_error_stale_cookie { fn hash<H: hash::Hasher>(&self, state: &mut H) { { self.cause }.hash(state); @@ -2438,13 +2224,6 @@ } } impl Eq for sctp_error_out_of_resource {} - impl fmt::Debug for sctp_error_out_of_resource { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sctp_error_out_of_resource") - .field("cause", &{ self.cause }) - .finish() - } - } impl hash::Hash for sctp_error_out_of_resource { fn hash<H: hash::Hasher>(&self, state: &mut H) { { self.cause }.hash(state); @@ -2457,13 +2236,6 @@ } } impl Eq for sctp_error_unresolv_addr {} - impl fmt::Debug for sctp_error_unresolv_addr { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sctp_error_unresolv_addr") - .field("cause", &{ self.cause }) - .finish() - } - } impl hash::Hash for sctp_error_unresolv_addr { fn hash<H: hash::Hasher>(&self, state: &mut H) { { self.cause }.hash(state); @@ -2476,14 +2248,6 @@ } } impl Eq for sctp_error_unrecognized_chunk {} - impl fmt::Debug for sctp_error_unrecognized_chunk { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sctp_error_unrecognized_chunk") - .field("cause", &{ self.cause }) - .field("ch", &{ self.ch }) - .finish() - } - } impl hash::Hash for sctp_error_unrecognized_chunk { fn hash<H: hash::Hasher>(&self, state: &mut H) { { self.cause }.hash(state); @@ -2497,14 +2261,6 @@ } } impl Eq for sctp_error_no_user_data {} - impl fmt::Debug for sctp_error_no_user_data { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sctp_error_no_user_data") - .field("cause", &{ self.cause }) - .field("tsn", &{ self.tsn }) - .finish() - } - } impl hash::Hash for sctp_error_no_user_data { fn hash<H: hash::Hasher>(&self, state: &mut H) { { self.cause }.hash(state); @@ -2518,14 +2274,6 @@ } } impl Eq for sctp_error_auth_invalid_hmac {} - impl fmt::Debug for sctp_error_auth_invalid_hmac { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sctp_error_invalid_hmac") - .field("cause", &{ self.cause }) - .field("hmac_id", &{ self.hmac_id }) - .finish() - } - } impl hash::Hash for sctp_error_auth_invalid_hmac { fn hash<H: hash::Hasher>(&self, state: &mut H) { { self.cause }.hash(state); @@ -2551,21 +2299,6 @@ } } impl Eq for kinfo_file {} - impl fmt::Debug for kinfo_file { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("kinfo_file") - .field("kf_structsize", &self.kf_structsize) - .field("kf_type", &self.kf_type) - .field("kf_fd", &self.kf_fd) - .field("kf_ref_count", &self.kf_ref_count) - .field("kf_flags", &self.kf_flags) - .field("kf_offset", &self.kf_offset) - .field("kf_status", &self.kf_status) - .field("kf_cap_rights", &self.kf_cap_rights) - .field("kf_path", &&self.kf_path[..]) - .finish() - } - } impl hash::Hash for kinfo_file { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.kf_structsize.hash(state); @@ -2579,18 +2312,6 @@ self.kf_path.hash(state); } } - - impl fmt::Debug for ucontext_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("ucontext_t") - .field("uc_sigmask", &self.uc_sigmask) - .field("uc_mcontext", &self.uc_mcontext) - .field("uc_link", &self.uc_link) - .field("uc_stack", &self.uc_stack) - .field("uc_flags", &self.uc_flags) - .finish() - } - } } } @@ -3193,6 +2914,7 @@ pub const SO_PROTOTYPE: c_int = SO_PROTOCOL; pub const SO_TS_CLOCK: c_int = 0x1017; pub const SO_DOMAIN: c_int = 0x1019; +pub const SO_SPLICE: c_int = 0x1023; pub const SO_VENDOR: c_int = 0x80000000; pub const SO_TS_REALTIME_MICRO: c_int = 0; @@ -4930,7 +4652,7 @@ f! { pub fn CMSG_DATA(cmsg: *const cmsghdr) -> *mut c_uchar { - (cmsg as *mut c_uchar).offset(_ALIGN(mem::size_of::<cmsghdr>()) as isize) + (cmsg as *mut c_uchar).add(_ALIGN(mem::size_of::<cmsghdr>())) } pub {const} fn CMSG_LEN(length: c_uint) -> c_uint { @@ -4945,7 +4667,7 @@ cmsg as usize + _ALIGN((*cmsg).cmsg_len as usize) + _ALIGN(mem::size_of::<cmsghdr>()); let max = (*mhdr).msg_control as usize + (*mhdr).msg_controllen as usize; if next > max { - 0 as *mut cmsghdr + core::ptr::null_mut::<cmsghdr>() } else { (cmsg as usize + _ALIGN((*cmsg).cmsg_len as usize)) as *mut cmsghdr } @@ -4992,14 +4714,12 @@ let bitset_bits = 8 * mem::size_of::<c_long>(); let (idx, offset) = (cpu / bitset_bits, cpu % bitset_bits); cpuset.__bits[idx] |= 1 << offset; - () } pub fn CPU_CLR(cpu: usize, cpuset: &mut cpuset_t) -> () { let bitset_bits = 8 * mem::size_of::<c_long>(); let (idx, offset) = (cpu / bitset_bits, cpu % bitset_bits); cpuset.__bits[idx] &= !(1 << offset); - () } pub fn CPU_ISSET(cpu: usize, cpuset: &cpuset_t) -> bool {
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/powerpc.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/powerpc.rs index 9fde25d..a6d9ed6d 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/powerpc.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/powerpc.rs
@@ -37,21 +37,6 @@ } } impl Eq for mcontext_t {} - impl fmt::Debug for mcontext_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("mcontext_t") - .field("mc_vers", &self.mc_vers) - .field("mc_flags", &self.mc_flags) - .field("mc_onstack", &self.mc_onstack) - .field("mc_len", &self.mc_len) - .field("mc_avec", &self.mc_avec) - .field("mc_av", &self.mc_av) - .field("mc_frame", &self.mc_frame) - .field("mc_fpreg", &self.mc_fpreg) - .field("mc_vsxfpreg", &self.mc_vsxfpreg) - .finish() - } - } impl hash::Hash for mcontext_t { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.mc_vers.hash(state);
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/powerpc64.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/powerpc64.rs index e7df7f7..87b425ad 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/powerpc64.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/powerpc64.rs
@@ -37,21 +37,6 @@ } } impl Eq for mcontext_t {} - impl fmt::Debug for mcontext_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("mcontext_t") - .field("mc_vers", &self.mc_vers) - .field("mc_flags", &self.mc_flags) - .field("mc_onstack", &self.mc_onstack) - .field("mc_len", &self.mc_len) - .field("mc_avec", &self.mc_avec) - .field("mc_av", &self.mc_av) - .field("mc_frame", &self.mc_frame) - .field("mc_fpreg", &self.mc_fpreg) - .field("mc_vsxfpreg", &self.mc_vsxfpreg) - .finish() - } - } impl hash::Hash for mcontext_t { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.mc_vers.hash(state);
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/riscv64.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/riscv64.rs index 449a29f..bc065cfa5 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/riscv64.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/riscv64.rs
@@ -51,21 +51,6 @@ } } impl Eq for gpregs {} - impl fmt::Debug for gpregs { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("gpregs") - .field("gp_ra", &self.gp_ra) - .field("gp_sp", &self.gp_sp) - .field("gp_gp", &self.gp_gp) - .field("gp_tp", &self.gp_tp) - .field("gp_t", &self.gp_t) - .field("gp_s", &self.gp_s) - .field("gp_a", &self.gp_a) - .field("gp_sepc", &self.gp_sepc) - .field("gp_sstatus", &self.gp_sstatus) - .finish() - } - } impl hash::Hash for gpregs { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.gp_ra.hash(state); @@ -88,16 +73,6 @@ } } impl Eq for fpregs {} - impl fmt::Debug for fpregs { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("fpregs") - .field("fp_x", &self.fp_x) - .field("fp_fcsr", &self.fp_fcsr) - .field("fp_flags", &self.fp_flags) - .field("pad", &self.pad) - .finish() - } - } impl hash::Hash for fpregs { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.fp_x.hash(state); @@ -120,17 +95,6 @@ } } impl Eq for mcontext_t {} - impl fmt::Debug for mcontext_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("mcontext_t") - .field("mc_gpregs", &self.mc_gpregs) - .field("mc_fpregs", &self.mc_fpregs) - .field("mc_flags", &self.mc_flags) - .field("mc_pad", &self.mc_pad) - .field("mc_spare", &self.mc_spare) - .finish() - } - } impl hash::Hash for mcontext_t { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.mc_gpregs.hash(state);
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/x86.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/x86.rs index b196eafe..b7397193 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/x86.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/x86.rs
@@ -87,42 +87,6 @@ } } impl Eq for mcontext_t {} - impl fmt::Debug for mcontext_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("mcontext_t") - .field("mc_onstack", &self.mc_onstack) - .field("mc_gs", &self.mc_gs) - .field("mc_fs", &self.mc_fs) - .field("mc_es", &self.mc_es) - .field("mc_ds", &self.mc_ds) - .field("mc_edi", &self.mc_edi) - .field("mc_esi", &self.mc_esi) - .field("mc_ebp", &self.mc_ebp) - .field("mc_isp", &self.mc_isp) - .field("mc_ebx", &self.mc_ebx) - .field("mc_edx", &self.mc_edx) - .field("mc_ecx", &self.mc_ecx) - .field("mc_eax", &self.mc_eax) - .field("mc_trapno", &self.mc_trapno) - .field("mc_err", &self.mc_err) - .field("mc_eip", &self.mc_eip) - .field("mc_cs", &self.mc_cs) - .field("mc_eflags", &self.mc_eflags) - .field("mc_esp", &self.mc_esp) - .field("mc_ss", &self.mc_ss) - .field("mc_len", &self.mc_len) - .field("mc_fpformat", &self.mc_fpformat) - .field("mc_ownedfp", &self.mc_ownedfp) - .field("mc_flags", &self.mc_flags) - .field("mc_fpstate", &self.mc_fpstate) - .field("mc_fsbase", &self.mc_fsbase) - .field("mc_gsbase", &self.mc_gsbase) - .field("mc_xfpustate", &self.mc_xfpustate) - .field("mc_xfpustate_len", &self.mc_xfpustate_len) - .field("mc_spare2", &self.mc_spare2) - .finish() - } - } impl hash::Hash for mcontext_t { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.mc_onstack.hash(state);
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/x86_64/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/x86_64/mod.rs index 0658470..40e1d72 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/x86_64/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/freebsd/x86_64/mod.rs
@@ -156,16 +156,6 @@ } } impl Eq for fpreg32 {} - impl fmt::Debug for fpreg32 { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("fpreg32") - .field("fpr_env", &&self.fpr_env[..]) - .field("fpr_acc", &self.fpr_acc) - .field("fpr_ex_sw", &self.fpr_ex_sw) - .field("fpr_pad", &&self.fpr_pad[..]) - .finish() - } - } impl hash::Hash for fpreg32 { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.fpr_env.hash(state); @@ -184,16 +174,6 @@ } } impl Eq for fpreg {} - impl fmt::Debug for fpreg { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("fpreg") - .field("fpr_env", &self.fpr_env) - .field("fpr_acc", &self.fpr_acc) - .field("fpr_xacc", &self.fpr_xacc) - .field("fpr_spare", &self.fpr_spare) - .finish() - } - } impl hash::Hash for fpreg { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.fpr_env.hash(state); @@ -216,16 +196,6 @@ } } impl Eq for xmmreg {} - impl fmt::Debug for xmmreg { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("xmmreg") - .field("xmm_env", &self.xmm_env) - .field("xmm_acc", &self.xmm_acc) - .field("xmm_reg", &self.xmm_reg) - .field("xmm_pad", &&self.xmm_pad[..]) - .finish() - } - } impl hash::Hash for xmmreg { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.xmm_env.hash(state); @@ -253,14 +223,6 @@ } } impl Eq for Elf64_Auxinfo {} - impl fmt::Debug for Elf64_Auxinfo { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("Elf64_Auxinfo") - .field("a_type", &self.a_type) - .field("a_un", &self.a_un) - .finish() - } - } impl PartialEq for mcontext_t { fn eq(&self, other: &mcontext_t) -> bool { @@ -309,50 +271,6 @@ } } impl Eq for mcontext_t {} - impl fmt::Debug for mcontext_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("mcontext_t") - .field("mc_onstack", &self.mc_onstack) - .field("mc_rdi", &self.mc_rdi) - .field("mc_rsi", &self.mc_rsi) - .field("mc_rdx", &self.mc_rdx) - .field("mc_rcx", &self.mc_rcx) - .field("mc_r8", &self.mc_r8) - .field("mc_r9", &self.mc_r9) - .field("mc_rax", &self.mc_rax) - .field("mc_rbx", &self.mc_rbx) - .field("mc_rbp", &self.mc_rbp) - .field("mc_r10", &self.mc_r10) - .field("mc_r11", &self.mc_r11) - .field("mc_r12", &self.mc_r12) - .field("mc_r13", &self.mc_r13) - .field("mc_r14", &self.mc_r14) - .field("mc_r15", &self.mc_r15) - .field("mc_trapno", &self.mc_trapno) - .field("mc_fs", &self.mc_fs) - .field("mc_gs", &self.mc_gs) - .field("mc_addr", &self.mc_addr) - .field("mc_flags", &self.mc_flags) - .field("mc_es", &self.mc_es) - .field("mc_ds", &self.mc_ds) - .field("mc_err", &self.mc_err) - .field("mc_rip", &self.mc_rip) - .field("mc_cs", &self.mc_cs) - .field("mc_rflags", &self.mc_rflags) - .field("mc_rsp", &self.mc_rsp) - .field("mc_ss", &self.mc_ss) - .field("mc_len", &self.mc_len) - .field("mc_fpformat", &self.mc_fpformat) - .field("mc_ownedfp", &self.mc_ownedfp) - // FIXME(debug): .field("mc_fpstate", &self.mc_fpstate) - .field("mc_fsbase", &self.mc_fsbase) - .field("mc_gsbase", &self.mc_gsbase) - .field("mc_xfpustate", &self.mc_xfpustate) - .field("mc_xfpustate_len", &self.mc_xfpustate_len) - .field("mc_spare", &self.mc_spare) - .finish() - } - } impl hash::Hash for mcontext_t { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.mc_onstack.hash(state);
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/mod.rs index 5ed09c78..644e035 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/freebsdlike/mod.rs
@@ -378,7 +378,7 @@ pub cgid: crate::gid_t, pub uid: crate::uid_t, pub gid: crate::gid_t, - pub mode: crate::mode_t, + pub mode: mode_t, pub seq: c_ushort, pub key: crate::key_t, } @@ -414,17 +414,6 @@ } } impl Eq for sockaddr_storage {} - impl fmt::Debug for sockaddr_storage { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sockaddr_storage") - .field("ss_len", &self.ss_len) - .field("ss_family", &self.ss_family) - .field("__ss_pad1", &self.__ss_pad1) - .field("__ss_align", &self.__ss_align) - // FIXME(debug): .field("__ss_pad2", &self.__ss_pad2) - .finish() - } - } impl hash::Hash for sockaddr_storage { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.ss_len.hash(state); @@ -1602,13 +1591,12 @@ pub fn lchflags(path: *const c_char, flags: c_ulong) -> c_int; pub fn lutimes(file: *const c_char, times: *const crate::timeval) -> c_int; pub fn memrchr(cx: *const c_void, c: c_int, n: size_t) -> *mut c_void; - pub fn mkfifoat(dirfd: c_int, pathname: *const c_char, mode: crate::mode_t) -> c_int; + pub fn mkfifoat(dirfd: c_int, pathname: *const c_char, mode: mode_t) -> c_int; #[cfg_attr( all(target_os = "freebsd", any(freebsd11, freebsd10)), link_name = "mknodat@FBSD_1.1" )] - pub fn mknodat(dirfd: c_int, pathname: *const c_char, mode: crate::mode_t, dev: dev_t) - -> c_int; + pub fn mknodat(dirfd: c_int, pathname: *const c_char, mode: mode_t, dev: dev_t) -> c_int; pub fn malloc_usable_size(ptr: *const c_void) -> size_t; pub fn mincore(addr: *const c_void, len: size_t, vec: *mut c_char) -> c_int; pub fn newlocale(mask: c_int, locale: *const c_char, base: crate::locale_t) -> crate::locale_t; @@ -1730,7 +1718,7 @@ pub fn setresuid(ruid: crate::uid_t, euid: crate::uid_t, suid: crate::uid_t) -> c_int; pub fn settimeofday(tv: *const crate::timeval, tz: *const crate::timezone) -> c_int; pub fn setutxent(); - pub fn shm_open(name: *const c_char, oflag: c_int, mode: crate::mode_t) -> c_int; + pub fn shm_open(name: *const c_char, oflag: c_int, mode: mode_t) -> c_int; pub fn sigtimedwait( set: *const sigset_t, info: *mut siginfo_t, @@ -1872,7 +1860,7 @@ fd: c_int, path: *const c_char, oflag: c_int, - mode: crate::mode_t, + mode: mode_t, ) -> c_int; pub fn posix_spawn_file_actions_addclose( actions: *mut posix_spawn_file_actions_t,
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/mod.rs index 674fdc08..f2f17f4 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/mod.rs
@@ -180,16 +180,6 @@ impl Eq for sockaddr_un {} - impl fmt::Debug for sockaddr_un { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sockaddr_un") - .field("sun_len", &self.sun_len) - .field("sun_family", &self.sun_family) - // FIXME(debug): .field("sun_path", &self.sun_path) - .finish() - } - } - impl hash::Hash for sockaddr_un { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.sun_len.hash(state); @@ -229,18 +219,6 @@ impl Eq for utsname {} - impl fmt::Debug for utsname { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("utsname") - // FIXME(debug): .field("sysname", &self.sysname) - // FIXME(debug): .field("nodename", &self.nodename) - // FIXME(debug): .field("release", &self.release) - // FIXME(debug): .field("version", &self.version) - // FIXME(debug): .field("machine", &self.machine) - .finish() - } - } - impl hash::Hash for utsname { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.sysname.hash(state); @@ -596,7 +574,7 @@ f! { pub fn CMSG_FIRSTHDR(mhdr: *const crate::msghdr) -> *mut cmsghdr { if (*mhdr).msg_controllen as usize >= mem::size_of::<cmsghdr>() { - (*mhdr).msg_control as *mut cmsghdr + (*mhdr).msg_control.cast::<cmsghdr>() } else { core::ptr::null_mut() } @@ -623,7 +601,7 @@ } pub fn FD_ZERO(set: *mut fd_set) -> () { - for slot in (*set).fds_bits.iter_mut() { + for slot in &mut (*set).fds_bits { *slot = 0; } }
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/netbsdlike/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/netbsdlike/mod.rs index dfd58d7..682b8b7 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/netbsdlike/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/netbsdlike/mod.rs
@@ -78,7 +78,7 @@ pub cgid: crate::gid_t, pub uid: crate::uid_t, pub gid: crate::gid_t, - pub mode: crate::mode_t, + pub mode: mode_t, #[cfg(target_os = "openbsd")] pub seq: c_ushort, #[cfg(target_os = "netbsd")] @@ -689,7 +689,7 @@ #[cfg_attr(target_os = "netbsd", link_name = "__clock_settime50")] pub fn clock_settime(clk_id: crate::clockid_t, tp: *const crate::timespec) -> c_int; pub fn __errno() -> *mut c_int; - pub fn shm_open(name: *const c_char, oflag: c_int, mode: crate::mode_t) -> c_int; + pub fn shm_open(name: *const c_char, oflag: c_int, mode: mode_t) -> c_int; pub fn memrchr(cx: *const c_void, c: c_int, n: size_t) -> *mut c_void; pub fn mkostemp(template: *mut c_char, flags: c_int) -> c_int; pub fn mkostemps(template: *mut c_char, suffixlen: c_int, flags: c_int) -> c_int; @@ -707,9 +707,8 @@ pub fn getpriority(which: c_int, who: crate::id_t) -> c_int; pub fn setpriority(which: c_int, who: crate::id_t, prio: c_int) -> c_int; - pub fn mknodat(dirfd: c_int, pathname: *const c_char, mode: crate::mode_t, dev: dev_t) - -> c_int; - pub fn mkfifoat(dirfd: c_int, pathname: *const c_char, mode: crate::mode_t) -> c_int; + pub fn mknodat(dirfd: c_int, pathname: *const c_char, mode: mode_t, dev: dev_t) -> c_int; + pub fn mkfifoat(dirfd: c_int, pathname: *const c_char, mode: mode_t) -> c_int; pub fn sem_timedwait(sem: *mut sem_t, abstime: *const crate::timespec) -> c_int; pub fn sem_getvalue(sem: *mut sem_t, sval: *mut c_int) -> c_int; pub fn pthread_condattr_setclock( @@ -830,7 +829,7 @@ fd: c_int, path: *const c_char, oflag: c_int, - mode: crate::mode_t, + mode: mode_t, ) -> c_int; pub fn posix_spawn_file_actions_addclose( actions: *mut posix_spawn_file_actions_t,
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/netbsdlike/netbsd/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/netbsdlike/netbsd/mod.rs index 9f44907..3addd5a8 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/netbsdlike/netbsd/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/netbsdlike/netbsd/mod.rs
@@ -940,24 +940,6 @@ impl Eq for utmpx {} - impl fmt::Debug for utmpx { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("utmpx") - .field("ut_name", &self.ut_name) - .field("ut_id", &self.ut_id) - .field("ut_line", &self.ut_line) - // FIXME(debug) .field("ut_host", &self.ut_host) - .field("ut_session", &self.ut_session) - .field("ut_type", &self.ut_type) - .field("ut_pid", &self.ut_pid) - .field("ut_exit", &self.ut_exit) - .field("ut_ss", &self.ut_ss) - .field("ut_tv", &self.ut_tv) - // FIXME(debug) .field("ut_pad", &self.ut_pad) - .finish() - } - } - impl hash::Hash for utmpx { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.ut_name.hash(state); @@ -989,17 +971,6 @@ impl Eq for lastlogx {} - impl fmt::Debug for lastlogx { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("lastlogx") - .field("ll_tv", &self.ll_tv) - .field("ll_line", &self.ll_line) - // FIXME(debug).field("ll_host", &self.ll_host) - .field("ll_ss", &self.ll_ss) - .finish() - } - } - impl hash::Hash for lastlogx { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.ll_tv.hash(state); @@ -1015,14 +986,6 @@ } } impl Eq for in_pktinfo {} - impl fmt::Debug for in_pktinfo { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("in_pktinfo") - .field("ipi_addr", &self.ipi_addr) - .field("ipi_ifindex", &self.ipi_ifindex) - .finish() - } - } impl hash::Hash for in_pktinfo { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.ipi_addr.hash(state); @@ -1040,20 +1003,6 @@ } } impl Eq for arphdr {} - impl fmt::Debug for arphdr { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let ar_hrd = self.ar_hrd; - let ar_pro = self.ar_pro; - let ar_op = self.ar_op; - f.debug_struct("arphdr") - .field("ar_hrd", &ar_hrd) - .field("ar_pro", &ar_pro) - .field("ar_hln", &self.ar_hln) - .field("ar_pln", &self.ar_pln) - .field("ar_op", &ar_op) - .finish() - } - } impl hash::Hash for arphdr { fn hash<H: hash::Hasher>(&self, state: &mut H) { let ar_hrd = self.ar_hrd; @@ -1073,12 +1022,6 @@ } } impl Eq for in_addr {} - impl fmt::Debug for in_addr { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let s_addr = self.s_addr; - f.debug_struct("in_addr").field("s_addr", &s_addr).finish() - } - } impl hash::Hash for in_addr { fn hash<H: hash::Hasher>(&self, state: &mut H) { let s_addr = self.s_addr; @@ -1093,14 +1036,6 @@ } } impl Eq for ip_mreq {} - impl fmt::Debug for ip_mreq { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("ip_mreq") - .field("imr_multiaddr", &self.imr_multiaddr) - .field("imr_interface", &self.imr_interface) - .finish() - } - } impl hash::Hash for ip_mreq { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.imr_multiaddr.hash(state); @@ -1118,17 +1053,6 @@ } } impl Eq for sockaddr_in {} - impl fmt::Debug for sockaddr_in { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sockaddr_in") - .field("sin_len", &self.sin_len) - .field("sin_family", &self.sin_family) - .field("sin_port", &self.sin_port) - .field("sin_addr", &self.sin_addr) - .field("sin_zero", &self.sin_zero) - .finish() - } - } impl hash::Hash for sockaddr_in { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.sin_len.hash(state); @@ -1153,17 +1077,6 @@ } } impl Eq for dirent {} - impl fmt::Debug for dirent { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("dirent") - .field("d_fileno", &self.d_fileno) - .field("d_reclen", &self.d_reclen) - .field("d_namlen", &self.d_namlen) - .field("d_type", &self.d_type) - // FIXME(debug): .field("d_name", &self.d_name) - .finish() - } - } impl hash::Hash for dirent { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.d_fileno.hash(state); @@ -1211,36 +1124,6 @@ } } impl Eq for statvfs {} - impl fmt::Debug for statvfs { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("statvfs") - .field("f_flag", &self.f_flag) - .field("f_bsize", &self.f_bsize) - .field("f_frsize", &self.f_frsize) - .field("f_iosize", &self.f_iosize) - .field("f_blocks", &self.f_blocks) - .field("f_bfree", &self.f_bfree) - .field("f_bavail", &self.f_bavail) - .field("f_bresvd", &self.f_bresvd) - .field("f_files", &self.f_files) - .field("f_ffree", &self.f_ffree) - .field("f_favail", &self.f_favail) - .field("f_fresvd", &self.f_fresvd) - .field("f_syncreads", &self.f_syncreads) - .field("f_syncwrites", &self.f_syncwrites) - .field("f_asyncreads", &self.f_asyncreads) - .field("f_asyncwrites", &self.f_asyncwrites) - .field("f_fsidx", &self.f_fsidx) - .field("f_fsid", &self.f_fsid) - .field("f_namemax", &self.f_namemax) - .field("f_owner", &self.f_owner) - .field("f_spare", &self.f_spare) - .field("f_fstypename", &self.f_fstypename) - // FIXME(debug): .field("f_mntonname", &self.f_mntonname) - // FIXME(debug): .field("f_mntfromname", &self.f_mntfromname) - .finish() - } - } impl hash::Hash for statvfs { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.f_flag.hash(state); @@ -1284,17 +1167,6 @@ } } impl Eq for sockaddr_storage {} - impl fmt::Debug for sockaddr_storage { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sockaddr_storage") - .field("ss_len", &self.ss_len) - .field("ss_family", &self.ss_family) - .field("__ss_pad1", &self.__ss_pad1) - .field("__ss_pad2", &self.__ss_pad2) - // FIXME(debug): .field("__ss_pad3", &self.__ss_pad3) - .finish() - } - } impl hash::Hash for sockaddr_storage { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.ss_len.hash(state); @@ -1314,16 +1186,6 @@ } } impl Eq for sigevent {} - impl fmt::Debug for sigevent { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sigevent") - .field("sigev_notify", &self.sigev_notify) - .field("sigev_signo", &self.sigev_signo) - .field("sigev_value", &self.sigev_value) - .field("sigev_notify_attributes", &self.sigev_notify_attributes) - .finish() - } - } impl hash::Hash for sigevent { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.sigev_notify.hash(state); @@ -2423,7 +2285,7 @@ f! { pub fn CMSG_DATA(cmsg: *const cmsghdr) -> *mut c_uchar { - (cmsg as *mut c_uchar).offset(_ALIGN(mem::size_of::<cmsghdr>()) as isize) + (cmsg as *mut c_uchar).add(_ALIGN(mem::size_of::<cmsghdr>())) } pub {const} fn CMSG_LEN(length: c_uint) -> c_uint { @@ -2438,7 +2300,7 @@ cmsg as usize + _ALIGN((*cmsg).cmsg_len as usize) + _ALIGN(mem::size_of::<cmsghdr>()); let max = (*mhdr).msg_control as usize + (*mhdr).msg_controllen as usize; if next > max { - 0 as *mut cmsghdr + core::ptr::null_mut::<cmsghdr>() } else { (cmsg as usize + _ALIGN((*cmsg).cmsg_len as usize)) as *mut cmsghdr }
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/netbsdlike/openbsd/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/netbsdlike/openbsd/mod.rs index ff3a99f..3b397169 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/netbsdlike/openbsd/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/netbsdlike/openbsd/mod.rs
@@ -773,19 +773,6 @@ impl Eq for dirent {} - impl fmt::Debug for dirent { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("dirent") - .field("d_fileno", &self.d_fileno) - .field("d_off", &self.d_off) - .field("d_reclen", &self.d_reclen) - .field("d_type", &self.d_type) - .field("d_namlen", &self.d_namlen) - // FIXME(debug): .field("d_name", &self.d_name) - .finish() - } - } - impl hash::Hash for dirent { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.d_fileno.hash(state); @@ -805,15 +792,6 @@ impl Eq for sockaddr_storage {} - impl fmt::Debug for sockaddr_storage { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sockaddr_storage") - .field("ss_len", &self.ss_len) - .field("ss_family", &self.ss_family) - .finish() - } - } - impl hash::Hash for sockaddr_storage { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.ss_len.hash(state); @@ -832,17 +810,6 @@ impl Eq for siginfo_t {} - impl fmt::Debug for siginfo_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("siginfo_t") - .field("si_signo", &self.si_signo) - .field("si_code", &self.si_code) - .field("si_errno", &self.si_errno) - .field("si_addr", &self.si_addr) - .finish() - } - } - impl hash::Hash for siginfo_t { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.si_signo.hash(state); @@ -870,16 +837,6 @@ impl Eq for lastlog {} - impl fmt::Debug for lastlog { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("lastlog") - .field("ll_time", &self.ll_time) - // FIXME(debug): .field("ll_line", &self.ll_line) - // FIXME(debug): .field("ll_host", &self.ll_host) - .finish() - } - } - impl hash::Hash for lastlog { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.ll_time.hash(state); @@ -911,17 +868,6 @@ impl Eq for utmp {} - impl fmt::Debug for utmp { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("utmp") - // FIXME(debug): .field("ut_line", &self.ut_line) - // FIXME(debug): .field("ut_name", &self.ut_name) - // FIXME(debug): .field("ut_host", &self.ut_host) - .field("ut_time", &self.ut_time) - .finish() - } - } - impl hash::Hash for utmp { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.ut_line.hash(state); @@ -1029,35 +975,6 @@ impl Eq for statfs {} - impl fmt::Debug for statfs { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("statfs") - .field("f_flags", &self.f_flags) - .field("f_bsize", &self.f_bsize) - .field("f_iosize", &self.f_iosize) - .field("f_blocks", &self.f_blocks) - .field("f_bfree", &self.f_bfree) - .field("f_bavail", &self.f_bavail) - .field("f_files", &self.f_files) - .field("f_ffree", &self.f_ffree) - .field("f_favail", &self.f_favail) - .field("f_syncwrites", &self.f_syncwrites) - .field("f_syncreads", &self.f_syncreads) - .field("f_asyncwrites", &self.f_asyncwrites) - .field("f_asyncreads", &self.f_asyncreads) - .field("f_fsid", &self.f_fsid) - .field("f_namemax", &self.f_namemax) - .field("f_owner", &self.f_owner) - .field("f_ctime", &self.f_ctime) - // FIXME(debug): .field("f_fstypename", &self.f_fstypename) - // FIXME(debug): .field("f_mntonname", &self.f_mntonname) - // FIXME(debug): .field("f_mntfromname", &self.f_mntfromname) - // FIXME(debug): .field("f_mntfromspec", &self.f_mntfromspec) - .field("mount_info", &self.mount_info) - .finish() - } - } - impl hash::Hash for statfs { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.f_flags.hash(state); @@ -1957,7 +1874,7 @@ cmsg as usize + _ALIGN((*cmsg).cmsg_len as usize) + _ALIGN(mem::size_of::<cmsghdr>()); let max = (*mhdr).msg_control as usize + (*mhdr).msg_controllen as usize; if next > max { - 0 as *mut cmsghdr + core::ptr::null_mut::<cmsghdr>() } else { (cmsg as usize + _ALIGN((*cmsg).cmsg_len as usize)) as *mut cmsghdr }
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/netbsdlike/openbsd/x86_64.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/netbsdlike/openbsd/x86_64.rs index 9003f35..33a19f96 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/netbsdlike/openbsd/x86_64.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/bsd/netbsdlike/openbsd/x86_64.rs
@@ -81,22 +81,6 @@ } } impl Eq for fxsave64 {} - impl fmt::Debug for fxsave64 { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("fxsave64") - .field("fx_fcw", &{ self.fx_fcw }) - .field("fx_fsw", &{ self.fx_fsw }) - .field("fx_ftw", &{ self.fx_ftw }) - .field("fx_fop", &{ self.fx_fop }) - .field("fx_rip", &{ self.fx_rip }) - .field("fx_rdp", &{ self.fx_rdp }) - .field("fx_mxcsr", &{ self.fx_mxcsr }) - .field("fx_mxcsr_mask", &{ self.fx_mxcsr_mask }) - // FIXME(debug): .field("fx_st", &{self.fx_st}) - // FIXME(debug): .field("fx_xmm", &{self.fx_xmm}) - .finish() - } - } impl hash::Hash for fxsave64 { fn hash<H: hash::Hasher>(&self, state: &mut H) { { self.fx_fcw }.hash(state);
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/cygwin/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/cygwin/mod.rs index c2fda67..2986c7c 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/cygwin/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/cygwin/mod.rs
@@ -583,19 +583,6 @@ impl Eq for siginfo_t {} - impl fmt::Debug for siginfo_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("siginfo_t") - .field("si_signo", &self.si_signo) - .field("si_code", &self.si_code) - .field("si_pid", &self.si_pid) - .field("si_uid", &self.si_uid) - .field("si_errno", &self.si_errno) - // Ignore __pad - .finish() - } - } - impl hash::Hash for siginfo_t { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.si_signo.hash(state); @@ -607,24 +594,6 @@ } } - impl fmt::Debug for ifreq { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("ifreq") - .field("ifr_name", &self.ifr_name) - .field("ifr_ifru", &self.ifr_ifru) - .finish() - } - } - - impl fmt::Debug for ifconf { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("ifconf") - .field("ifc_len", &self.ifc_len) - .field("ifc_ifcu", &self.ifc_ifcu) - .finish() - } - } - impl PartialEq for dirent { fn eq(&self, other: &dirent) -> bool { self.d_ino == other.d_ino @@ -639,16 +608,6 @@ impl Eq for dirent {} - impl fmt::Debug for dirent { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("dirent") - .field("d_ino", &self.d_ino) - .field("d_type", &self.d_type) - // FIXME: .field("d_name", &self.d_name) - .finish() - } - } - impl hash::Hash for dirent { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.d_ino.hash(state); @@ -670,15 +629,6 @@ impl Eq for sockaddr_un {} - impl fmt::Debug for sockaddr_un { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sockaddr_un") - .field("sun_family", &self.sun_family) - // FIXME: .field("sun_path", &self.sun_path) - .finish() - } - } - impl hash::Hash for sockaddr_un { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.sun_family.hash(state); @@ -722,19 +672,6 @@ impl Eq for utsname {} - impl fmt::Debug for utsname { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("utsname") - // FIXME: .field("sysname", &self.sysname) - // FIXME: .field("nodename", &self.nodename) - // FIXME: .field("release", &self.release) - // FIXME: .field("version", &self.version) - // FIXME: .field("machine", &self.machine) - // FIXME: .field("domainname", &self.domainname) - .finish() - } - } - impl hash::Hash for utsname { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.sysname.hash(state);
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/haiku/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/haiku/mod.rs index 76e44cc7..6b168a47 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/haiku/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/haiku/mod.rs
@@ -420,7 +420,7 @@ pub gid: crate::gid_t, pub cuid: crate::uid_t, pub cgid: crate::gid_t, - pub mode: crate::mode_t, + pub mode: mode_t, } pub struct sembuf { @@ -517,22 +517,6 @@ } impl Eq for utmpx {} - - impl fmt::Debug for utmpx { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("utmpx") - .field("ut_type", &self.ut_type) - .field("ut_tv", &self.ut_tv) - .field("ut_id", &self.ut_id) - .field("ut_pid", &self.ut_pid) - .field("ut_user", &self.ut_user) - .field("ut_line", &self.ut_line) - .field("ut_host", &self.ut_host) - .field("__ut_reserved", &self.__ut_reserved) - .finish() - } - } - impl hash::Hash for utmpx { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.ut_type.hash(state); @@ -557,15 +541,6 @@ } } impl Eq for sockaddr_un {} - impl fmt::Debug for sockaddr_un { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sockaddr_un") - .field("sun_len", &self.sun_len) - .field("sun_family", &self.sun_family) - // FIXME(debug): .field("sun_path", &self.sun_path) - .finish() - } - } impl hash::Hash for sockaddr_un { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.sun_len.hash(state); @@ -592,17 +567,6 @@ } } impl Eq for sockaddr_storage {} - impl fmt::Debug for sockaddr_storage { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sockaddr_storage") - .field("ss_len", &self.ss_len) - .field("ss_family", &self.ss_family) - .field("__ss_pad1", &self.__ss_pad1) - .field("__ss_pad2", &self.__ss_pad2) - // FIXME(debug): .field("__ss_pad3", &self.__ss_pad3) - .finish() - } - } impl hash::Hash for sockaddr_storage { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.ss_len.hash(state); @@ -628,18 +592,6 @@ } } impl Eq for dirent {} - impl fmt::Debug for dirent { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("dirent") - .field("d_dev", &self.d_dev) - .field("d_pdev", &self.d_pdev) - .field("d_ino", &self.d_ino) - .field("d_pino", &self.d_pino) - .field("d_reclen", &self.d_reclen) - // FIXME(debug): .field("d_name", &self.d_name) - .finish() - } - } impl hash::Hash for dirent { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.d_dev.hash(state); @@ -660,16 +612,6 @@ } } impl Eq for sigevent {} - impl fmt::Debug for sigevent { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sigevent") - .field("sigev_notify", &self.sigev_notify) - .field("sigev_signo", &self.sigev_signo) - .field("sigev_value", &self.sigev_value) - .field("sigev_notify_attributes", &self.sigev_notify_attributes) - .finish() - } - } impl hash::Hash for sigevent { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.sigev_notify.hash(state); @@ -774,27 +716,27 @@ pub const O_NOCACHE: c_int = 0x00100000; pub const O_DIRECTORY: c_int = 0x00200000; -pub const S_IFIFO: crate::mode_t = 0o1_0000; -pub const S_IFCHR: crate::mode_t = 0o2_0000; -pub const S_IFBLK: crate::mode_t = 0o6_0000; -pub const S_IFDIR: crate::mode_t = 0o4_0000; -pub const S_IFREG: crate::mode_t = 0o10_0000; -pub const S_IFLNK: crate::mode_t = 0o12_0000; -pub const S_IFSOCK: crate::mode_t = 0o14_0000; -pub const S_IFMT: crate::mode_t = 0o17_0000; +pub const S_IFIFO: mode_t = 0o1_0000; +pub const S_IFCHR: mode_t = 0o2_0000; +pub const S_IFBLK: mode_t = 0o6_0000; +pub const S_IFDIR: mode_t = 0o4_0000; +pub const S_IFREG: mode_t = 0o10_0000; +pub const S_IFLNK: mode_t = 0o12_0000; +pub const S_IFSOCK: mode_t = 0o14_0000; +pub const S_IFMT: mode_t = 0o17_0000; -pub const S_IRWXU: crate::mode_t = 0o0700; -pub const S_IRUSR: crate::mode_t = 0o0400; -pub const S_IWUSR: crate::mode_t = 0o0200; -pub const S_IXUSR: crate::mode_t = 0o0100; -pub const S_IRWXG: crate::mode_t = 0o0070; -pub const S_IRGRP: crate::mode_t = 0o0040; -pub const S_IWGRP: crate::mode_t = 0o0020; -pub const S_IXGRP: crate::mode_t = 0o0010; -pub const S_IRWXO: crate::mode_t = 0o0007; -pub const S_IROTH: crate::mode_t = 0o0004; -pub const S_IWOTH: crate::mode_t = 0o0002; -pub const S_IXOTH: crate::mode_t = 0o0001; +pub const S_IRWXU: mode_t = 0o0700; +pub const S_IRUSR: mode_t = 0o0400; +pub const S_IWUSR: mode_t = 0o0200; +pub const S_IXUSR: mode_t = 0o0100; +pub const S_IRWXG: mode_t = 0o0070; +pub const S_IRGRP: mode_t = 0o0040; +pub const S_IWGRP: mode_t = 0o0020; +pub const S_IXGRP: mode_t = 0o0010; +pub const S_IRWXO: mode_t = 0o0007; +pub const S_IROTH: mode_t = 0o0004; +pub const S_IWOTH: mode_t = 0o0002; +pub const S_IXOTH: mode_t = 0o0001; pub const F_OK: c_int = 0; pub const R_OK: c_int = 4; @@ -1572,7 +1514,7 @@ if (*mhdr).msg_controllen as usize >= mem::size_of::<cmsghdr>() { (*mhdr).msg_control as *mut cmsghdr } else { - 0 as *mut cmsghdr + core::ptr::null_mut::<cmsghdr>() } } @@ -1597,7 +1539,7 @@ + CMSG_ALIGN(mem::size_of::<cmsghdr>()); let max = (*mhdr).msg_control as usize + (*mhdr).msg_controllen as usize; if next > max { - 0 as *mut cmsghdr + core::ptr::null_mut::<cmsghdr>() } else { (cmsg as usize + CMSG_ALIGN((*cmsg).cmsg_len as usize)) as *mut cmsghdr } @@ -1733,9 +1675,8 @@ bufferSize: size_t, res: *mut *mut spwd, ) -> c_int; - pub fn mkfifoat(dirfd: c_int, pathname: *const c_char, mode: crate::mode_t) -> c_int; - pub fn mknodat(dirfd: c_int, pathname: *const c_char, mode: crate::mode_t, dev: dev_t) - -> c_int; + pub fn mkfifoat(dirfd: c_int, pathname: *const c_char, mode: mode_t) -> c_int; + pub fn mknodat(dirfd: c_int, pathname: *const c_char, mode: mode_t, dev: dev_t) -> c_int; pub fn sem_destroy(sem: *mut sem_t) -> c_int; pub fn sem_init(sem: *mut sem_t, pshared: c_int, value: c_uint) -> c_int; @@ -1813,7 +1754,7 @@ pub fn posix_fadvise(fd: c_int, offset: off_t, len: off_t, advice: c_int) -> c_int; pub fn posix_fallocate(fd: c_int, offset: off_t, len: off_t) -> c_int; - pub fn shm_open(name: *const c_char, oflag: c_int, mode: crate::mode_t) -> c_int; + pub fn shm_open(name: *const c_char, oflag: c_int, mode: mode_t) -> c_int; pub fn shm_unlink(name: *const c_char) -> c_int; pub fn seekdir(dirp: *mut crate::DIR, loc: c_long); @@ -2032,7 +1973,7 @@ fildes: c_int, path: *const c_char, oflag: c_int, - mode: crate::mode_t, + mode: mode_t, ) -> c_int; pub fn posix_spawn_file_actions_addclose( file_actions: *mut posix_spawn_file_actions_t,
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/haiku/native.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/haiku/native.rs index d373a9ce..a5a5e53 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/haiku/native.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/haiku/native.rs
@@ -520,15 +520,6 @@ } impl Eq for cpu_topology_node_info {} - impl fmt::Debug for cpu_topology_node_info { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("cpu_topology_node_info") - .field("id", &self.id) - .field("type", &self.type_) - .field("level", &self.level) - .finish() - } - } } }
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/haiku/x86_64.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/haiku/x86_64.rs index 548c8e0..16e2612 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/haiku/x86_64.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/haiku/x86_64.rs
@@ -83,23 +83,6 @@ } } impl Eq for fpu_state {} - impl fmt::Debug for fpu_state { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("fpu_state") - .field("control", &self.control) - .field("status", &self.status) - .field("tag", &self.tag) - .field("opcode", &self.opcode) - .field("rip", &self.rip) - .field("rdp", &self.rdp) - .field("mxcsr", &self.mxcsr) - .field("mscsr_mask", &self.mscsr_mask) - // FIXME(debug): .field("_fpreg", &self._fpreg) - // FIXME(debug): .field("_xmm", &self._xmm) - // FIXME(debug): .field("_reserved_416_511", &self._reserved_416_511) - .finish() - } - } impl hash::Hash for fpu_state { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.control.hash(state); @@ -128,15 +111,6 @@ } } impl Eq for xstate_hdr {} - impl fmt::Debug for xstate_hdr { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("xstate_hdr") - .field("bv", &self.bv) - .field("xcomp_bv", &self.xcomp_bv) - // FIXME(debug): .field("_reserved", &field._reserved) - .finish() - } - } impl hash::Hash for xstate_hdr { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.bv.hash(state); @@ -157,15 +131,6 @@ } } impl Eq for savefpu {} - impl fmt::Debug for savefpu { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("savefpu") - .field("fp_fxsave", &self.fp_fxsave) - .field("fp_xstate", &self.fp_xstate) - // FIXME(debug): .field("_fp_ymm", &field._fp_ymm) - .finish() - } - } impl hash::Hash for savefpu { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.fp_fxsave.hash(state); @@ -198,31 +163,6 @@ } } impl Eq for mcontext_t {} - impl fmt::Debug for mcontext_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("mcontext_t") - .field("rax", &self.rax) - .field("rbx", &self.rbx) - .field("rcx", &self.rcx) - .field("rdx", &self.rdx) - .field("rdi", &self.rdi) - .field("rsi", &self.rsi) - .field("rbp", &self.rbp) - .field("r8", &self.r8) - .field("r9", &self.r9) - .field("r10", &self.r10) - .field("r11", &self.r11) - .field("r12", &self.r12) - .field("r13", &self.r13) - .field("r14", &self.r14) - .field("r15", &self.r15) - .field("rsp", &self.rsp) - .field("rip", &self.rip) - .field("rflags", &self.rflags) - .field("fpu", &self.fpu) - .finish() - } - } impl hash::Hash for mcontext_t { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.rax.hash(state); @@ -256,16 +196,6 @@ } } impl Eq for ucontext_t {} - impl fmt::Debug for ucontext_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("ucontext_t") - .field("uc_link", &self.uc_link) - .field("uc_sigmask", &self.uc_sigmask) - .field("uc_stack", &self.uc_stack) - .field("uc_mcontext", &self.uc_mcontext) - .finish() - } - } impl hash::Hash for ucontext_t { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.uc_link.hash(state);
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/hurd/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/hurd/mod.rs index 8703f4d..49bb076 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/hurd/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/hurd/mod.rs
@@ -1084,24 +1084,6 @@ impl Eq for utmpx {} - impl fmt::Debug for utmpx { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("utmpx") - .field("ut_type", &self.ut_type) - .field("ut_pid", &self.ut_pid) - .field("ut_line", &self.ut_line) - .field("ut_id", &self.ut_id) - .field("ut_user", &self.ut_user) - // FIXME(debug): .field("ut_host", &self.ut_host) - .field("ut_exit", &self.ut_exit) - .field("ut_session", &self.ut_session) - .field("ut_tv", &self.ut_tv) - .field("ut_addr_v6", &self.ut_addr_v6) - .field("__glibc_reserved", &self.__glibc_reserved) - .finish() - } - } - impl hash::Hash for utmpx { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.ut_type.hash(state); @@ -2150,35 +2132,35 @@ pub const SF_SNAPSHOT: c_uint = 2097152; pub const UTIME_NOW: c_long = -1; pub const UTIME_OMIT: c_long = -2; -pub const S_IFMT: crate::mode_t = 0o17_0000; -pub const S_IFDIR: crate::mode_t = 0o4_0000; -pub const S_IFCHR: crate::mode_t = 0o2_0000; -pub const S_IFBLK: crate::mode_t = 0o6_0000; -pub const S_IFREG: crate::mode_t = 0o10_0000; -pub const S_IFIFO: crate::mode_t = 0o1_0000; -pub const S_IFLNK: crate::mode_t = 0o12_0000; -pub const S_IFSOCK: crate::mode_t = 0o14_0000; -pub const S_ISUID: crate::mode_t = 0o4000; -pub const S_ISGID: crate::mode_t = 0o2000; -pub const S_ISVTX: crate::mode_t = 0o1000; -pub const S_IRUSR: crate::mode_t = 0o0400; -pub const S_IWUSR: crate::mode_t = 0o0200; -pub const S_IXUSR: crate::mode_t = 0o0100; -pub const S_IRWXU: crate::mode_t = 0o0700; -pub const S_IREAD: crate::mode_t = 0o0400; -pub const S_IWRITE: crate::mode_t = 0o0200; -pub const S_IEXEC: crate::mode_t = 0o0100; -pub const S_IRGRP: crate::mode_t = 0o0040; -pub const S_IWGRP: crate::mode_t = 0o0020; -pub const S_IXGRP: crate::mode_t = 0o0010; -pub const S_IRWXG: crate::mode_t = 0o0070; -pub const S_IROTH: crate::mode_t = 0o0004; -pub const S_IWOTH: crate::mode_t = 0o0002; -pub const S_IXOTH: crate::mode_t = 0o0001; -pub const S_IRWXO: crate::mode_t = 0o0007; -pub const ACCESSPERMS: crate::mode_t = 511; -pub const ALLPERMS: crate::mode_t = 4095; -pub const DEFFILEMODE: crate::mode_t = 438; +pub const S_IFMT: mode_t = 0o17_0000; +pub const S_IFDIR: mode_t = 0o4_0000; +pub const S_IFCHR: mode_t = 0o2_0000; +pub const S_IFBLK: mode_t = 0o6_0000; +pub const S_IFREG: mode_t = 0o10_0000; +pub const S_IFIFO: mode_t = 0o1_0000; +pub const S_IFLNK: mode_t = 0o12_0000; +pub const S_IFSOCK: mode_t = 0o14_0000; +pub const S_ISUID: mode_t = 0o4000; +pub const S_ISGID: mode_t = 0o2000; +pub const S_ISVTX: mode_t = 0o1000; +pub const S_IRUSR: mode_t = 0o0400; +pub const S_IWUSR: mode_t = 0o0200; +pub const S_IXUSR: mode_t = 0o0100; +pub const S_IRWXU: mode_t = 0o0700; +pub const S_IREAD: mode_t = 0o0400; +pub const S_IWRITE: mode_t = 0o0200; +pub const S_IEXEC: mode_t = 0o0100; +pub const S_IRGRP: mode_t = 0o0040; +pub const S_IWGRP: mode_t = 0o0020; +pub const S_IXGRP: mode_t = 0o0010; +pub const S_IRWXG: mode_t = 0o0070; +pub const S_IROTH: mode_t = 0o0004; +pub const S_IWOTH: mode_t = 0o0002; +pub const S_IXOTH: mode_t = 0o0001; +pub const S_IRWXO: mode_t = 0o0007; +pub const ACCESSPERMS: mode_t = 511; +pub const ALLPERMS: mode_t = 4095; +pub const DEFFILEMODE: mode_t = 438; pub const S_BLKSIZE: usize = 512; pub const STATX_TYPE: c_uint = 1; pub const STATX_MODE: c_uint = 2; @@ -3444,7 +3426,7 @@ if (*mhdr).msg_controllen as usize >= mem::size_of::<cmsghdr>() { (*mhdr).msg_control as *mut cmsghdr } else { - 0 as *mut cmsghdr + core::ptr::null_mut::<cmsghdr>() } } @@ -3462,14 +3444,14 @@ pub fn CMSG_NXTHDR(mhdr: *const msghdr, cmsg: *const cmsghdr) -> *mut cmsghdr { if ((*cmsg).cmsg_len as usize) < mem::size_of::<cmsghdr>() { - return 0 as *mut cmsghdr; + return core::ptr::null_mut::<cmsghdr>(); }; let next = (cmsg as usize + CMSG_ALIGN((*cmsg).cmsg_len as usize)) as *mut cmsghdr; let max = (*mhdr).msg_control as usize + (*mhdr).msg_controllen as usize; if (next.offset(1)) as usize > max || next as usize + CMSG_ALIGN((*next).cmsg_len as usize) > max { - 0 as *mut cmsghdr + core::ptr::null_mut::<cmsghdr>() } else { next as *mut cmsghdr } @@ -3574,8 +3556,7 @@ pub fn mkfifoat(__fd: c_int, __path: *const c_char, __mode: __mode_t) -> c_int; - pub fn mknodat(dirfd: c_int, pathname: *const c_char, mode: crate::mode_t, dev: dev_t) - -> c_int; + pub fn mknodat(dirfd: c_int, pathname: *const c_char, mode: mode_t, dev: dev_t) -> c_int; pub fn __libc_current_sigrtmin() -> c_int; @@ -4248,7 +4229,7 @@ fd: c_int, path: *const c_char, oflag: c_int, - mode: crate::mode_t, + mode: mode_t, ) -> c_int; pub fn posix_spawn_file_actions_addclose( actions: *mut posix_spawn_file_actions_t,
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/android/b32/arm.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/android/b32/arm.rs index a6170adc..b78c8a83 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/android/b32/arm.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/android/b32/arm.rs
@@ -65,14 +65,6 @@ } } impl Eq for __c_anonymous_uc_sigmask_with_padding {} - impl fmt::Debug for __c_anonymous_uc_sigmask_with_padding { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("uc_sigmask_with_padding") - .field("uc_sigmask_with_padding", &self.uc_sigmask) - // Ignore padding - .finish() - } - } impl hash::Hash for __c_anonymous_uc_sigmask_with_padding { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.uc_sigmask.hash(state) @@ -104,22 +96,6 @@ } } impl Eq for ucontext_t {} - impl fmt::Debug for ucontext_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("ucontext_t") - .field("uc_flags", &self.uc_flags) - .field("uc_link", &self.uc_link) - .field("uc_stack", &self.uc_stack) - .field("uc_mcontext", &self.uc_mcontext) - .field( - "uc_sigmask__c_anonymous_union", - &self.uc_sigmask__c_anonymous_union, - ) - .field("uc_regspace", &&self.uc_regspace[..]) - // Ignore padding field - .finish() - } - } impl hash::Hash for ucontext_t { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.uc_flags.hash(state);
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/android/b32/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/android/b32/mod.rs index 42be94d..43e739b 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/android/b32/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/android/b32/mod.rs
@@ -181,18 +181,6 @@ } } -cfg_if! { - if #[cfg(feature = "extra_traits")] { - impl fmt::Debug for sigset64_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sigset64_t") - .field("__bits", &self.__bits) - .finish() - } - } - } -} - // These constants must be of the same type of sigaction.sa_flags pub const SA_NOCLDSTOP: c_int = 0x00000001; pub const SA_NOCLDWAIT: c_int = 0x00000002;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/android/b32/x86/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/android/b32/x86/mod.rs index 2acbe771..edbfd38 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/android/b32/x86/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/android/b32/x86/mod.rs
@@ -67,14 +67,6 @@ } } impl Eq for __c_anonymous_uc_sigmask_with_padding {} - impl fmt::Debug for __c_anonymous_uc_sigmask_with_padding { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("uc_sigmask_with_padding") - .field("uc_sigmask_with_padding", &self.uc_sigmask) - // Ignore padding - .finish() - } - } impl hash::Hash for __c_anonymous_uc_sigmask_with_padding { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.uc_sigmask.hash(state) @@ -105,21 +97,6 @@ } } impl Eq for ucontext_t {} - impl fmt::Debug for ucontext_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("ucontext_t") - .field("uc_flags", &self.uc_flags) - .field("uc_link", &self.uc_link) - .field("uc_stack", &self.uc_stack) - .field("uc_mcontext", &self.uc_mcontext) - .field( - "uc_sigmask__c_anonymous_union", - &self.uc_sigmask__c_anonymous_union, - ) - // Ignore padding field - .finish() - } - } impl hash::Hash for ucontext_t { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.uc_flags.hash(state);
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/android/b64/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/android/b64/mod.rs index b507dac..b23c562c 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/android/b64/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/android/b64/mod.rs
@@ -155,15 +155,6 @@ impl Eq for pthread_mutex_t {} - impl fmt::Debug for pthread_mutex_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("pthread_mutex_t") - .field("value", &self.value) - // FIXME(debug): .field("__reserved", &self.__reserved) - .finish() - } - } - impl hash::Hash for pthread_mutex_t { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.value.hash(state); @@ -184,15 +175,6 @@ impl Eq for pthread_cond_t {} - impl fmt::Debug for pthread_cond_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("pthread_cond_t") - .field("value", &self.value) - // FIXME(debug): .field("__reserved", &self.__reserved) - .finish() - } - } - impl hash::Hash for pthread_cond_t { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.value.hash(state); @@ -217,19 +199,6 @@ impl Eq for pthread_rwlock_t {} - impl fmt::Debug for pthread_rwlock_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("pthread_rwlock_t") - .field("numLocks", &self.numLocks) - .field("writerThreadId", &self.writerThreadId) - .field("pendingReaders", &self.pendingReaders) - .field("pendingWriters", &self.pendingWriters) - .field("attr", &self.attr) - // FIXME(debug): .field("__reserved", &self.__reserved) - .finish() - } - } - impl hash::Hash for pthread_rwlock_t { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.numLocks.hash(state); @@ -240,14 +209,6 @@ self.__reserved.hash(state); } } - - impl fmt::Debug for sigset64_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sigset64_t") - .field("__bits", &self.__bits) - .finish() - } - } } }
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/android/b64/x86_64/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/android/b64/x86_64/mod.rs index ce2d7099..3288f05 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/android/b64/x86_64/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/android/b64/x86_64/mod.rs
@@ -195,15 +195,6 @@ } } impl Eq for _libc_fpxreg {} - impl fmt::Debug for _libc_fpxreg { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("_libc_fpxreg") - .field("significand", &self.significand) - .field("exponent", &self.exponent) - // Ignore padding field - .finish() - } - } impl hash::Hash for _libc_fpxreg { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.significand.hash(state); @@ -228,23 +219,6 @@ } } impl Eq for _libc_fpstate {} - impl fmt::Debug for _libc_fpstate { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("_libc_fpstate") - .field("cwd", &self.cwd) - .field("swd", &self.swd) - .field("ftw", &self.ftw) - .field("fop", &self.fop) - .field("rip", &self.rip) - .field("rdp", &self.rdp) - .field("mxcsr", &self.mxcsr) - .field("mxcr_mask", &self.mxcr_mask) - .field("_st", &self._st) - .field("_xmm", &self._xmm) - // Ignore padding field - .finish() - } - } impl hash::Hash for _libc_fpstate { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.cwd.hash(state); @@ -268,15 +242,6 @@ } } impl Eq for mcontext_t {} - impl fmt::Debug for mcontext_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("mcontext_t") - .field("gregs", &self.gregs) - .field("fpregs", &self.fpregs) - // Ignore padding field - .finish() - } - } impl hash::Hash for mcontext_t { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.gregs.hash(state); @@ -296,18 +261,6 @@ } } impl Eq for ucontext_t {} - impl fmt::Debug for ucontext_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("ucontext_t") - .field("uc_flags", &self.uc_flags) - .field("uc_link", &self.uc_link) - .field("uc_stack", &self.uc_stack) - .field("uc_mcontext", &self.uc_mcontext) - .field("uc_sigmask64", &self.uc_sigmask64) - // Ignore padding field - .finish() - } - } impl hash::Hash for ucontext_t { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.uc_flags.hash(state); @@ -341,24 +294,6 @@ impl Eq for user_fpregs_struct {} - impl fmt::Debug for user_fpregs_struct { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("user_fpregs_struct") - .field("cwd", &self.cwd) - .field("swd", &self.swd) - .field("ftw", &self.ftw) - .field("fop", &self.fop) - .field("rip", &self.rip) - .field("rdp", &self.rdp) - .field("mxcsr", &self.mxcsr) - .field("mxcr_mask", &self.mxcr_mask) - .field("st_space", &self.st_space) - // FIXME(debug): .field("xmm_space", &self.xmm_space) - // Ignore padding field - .finish() - } - } - impl hash::Hash for user_fpregs_struct { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.cwd.hash(state);
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/android/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/android/mod.rs index c5875f29..3dee96e 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/android/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/android/mod.rs
@@ -2,6 +2,15 @@ use crate::prelude::*; +cfg_if! { + if #[cfg(doc)] { + pub(crate) type Ioctl = c_int; + } else { + #[doc(hidden)] + pub type Ioctl = c_int; + } +} + pub type clock_t = c_long; pub type time_t = c_long; pub type suseconds_t = c_long; @@ -337,19 +346,6 @@ pub dlpi_tls_data: *mut c_void, } - // linux/filter.h - pub struct sock_filter { - pub code: crate::__u16, - pub jt: crate::__u8, - pub jf: crate::__u8, - pub k: crate::__u32, - } - - pub struct sock_fprog { - pub len: c_ushort, - pub filter: *mut sock_filter, - } - // linux/seccomp.h pub struct seccomp_data { pub nr: c_int, @@ -664,15 +660,6 @@ } } impl Eq for sockaddr_nl {} - impl fmt::Debug for sockaddr_nl { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sockaddr_nl") - .field("nl_family", &self.nl_family) - .field("nl_pid", &self.nl_pid) - .field("nl_groups", &self.nl_groups) - .finish() - } - } impl hash::Hash for sockaddr_nl { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.nl_family.hash(state); @@ -697,18 +684,6 @@ impl Eq for dirent {} - impl fmt::Debug for dirent { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("dirent") - .field("d_ino", &self.d_ino) - .field("d_off", &self.d_off) - .field("d_reclen", &self.d_reclen) - .field("d_type", &self.d_type) - // FIXME(debug): .field("d_name", &self.d_name) - .finish() - } - } - impl hash::Hash for dirent { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.d_ino.hash(state); @@ -735,18 +710,6 @@ impl Eq for dirent64 {} - impl fmt::Debug for dirent64 { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("dirent64") - .field("d_ino", &self.d_ino) - .field("d_off", &self.d_off) - .field("d_reclen", &self.d_reclen) - .field("d_type", &self.d_type) - // FIXME(debug): .field("d_name", &self.d_name) - .finish() - } - } - impl hash::Hash for dirent64 { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.d_ino.hash(state); @@ -769,18 +732,6 @@ impl Eq for siginfo_t {} - impl fmt::Debug for siginfo_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("siginfo_t") - .field("si_signo", &self.si_signo) - .field("si_errno", &self.si_errno) - .field("si_code", &self.si_code) - // Ignore _pad - // Ignore _align - .finish() - } - } - impl hash::Hash for siginfo_t { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.si_signo.hash(state); @@ -809,16 +760,6 @@ impl Eq for lastlog {} - impl fmt::Debug for lastlog { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("lastlog") - .field("ll_time", &self.ll_time) - .field("ll_line", &self.ll_line) - // FIXME(debug): .field("ll_host", &self.ll_host) - .finish() - } - } - impl hash::Hash for lastlog { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.ll_time.hash(state); @@ -857,24 +798,6 @@ impl Eq for utmp {} - impl fmt::Debug for utmp { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("utmp") - .field("ut_type", &self.ut_type) - .field("ut_pid", &self.ut_pid) - .field("ut_line", &self.ut_line) - .field("ut_id", &self.ut_id) - .field("ut_user", &self.ut_user) - // FIXME(debug): .field("ut_host", &self.ut_host) - .field("ut_exit", &self.ut_exit) - .field("ut_session", &self.ut_session) - .field("ut_tv", &self.ut_tv) - .field("ut_addr_v6", &self.ut_addr_v6) - .field("unused", &self.unused) - .finish() - } - } - impl hash::Hash for utmp { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.ut_type.hash(state); @@ -911,18 +834,6 @@ impl Eq for sockaddr_alg {} - impl fmt::Debug for sockaddr_alg { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sockaddr_alg") - .field("salg_family", &self.salg_family) - .field("salg_type", &self.salg_type) - .field("salg_feat", &self.salg_feat) - .field("salg_mask", &self.salg_mask) - .field("salg_name", &&self.salg_name[..]) - .finish() - } - } - impl hash::Hash for sockaddr_alg { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.salg_family.hash(state); @@ -942,16 +853,6 @@ } impl Eq for uinput_setup {} - impl fmt::Debug for uinput_setup { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("uinput_setup") - .field("id", &self.id) - .field("name", &&self.name[..]) - .field("ff_effects_max", &self.ff_effects_max) - .finish() - } - } - impl hash::Hash for uinput_setup { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.id.hash(state); @@ -973,20 +874,6 @@ } impl Eq for uinput_user_dev {} - impl fmt::Debug for uinput_user_dev { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("uinput_setup") - .field("name", &&self.name[..]) - .field("id", &self.id) - .field("ff_effects_max", &self.ff_effects_max) - .field("absmax", &&self.absmax[..]) - .field("absmin", &&self.absmin[..]) - .field("absfuzz", &&self.absfuzz[..]) - .field("absflat", &&self.absflat[..]) - .finish() - } - } - impl hash::Hash for uinput_user_dev { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.name.hash(state); @@ -999,24 +886,6 @@ } } - impl fmt::Debug for ifreq { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("ifreq") - .field("ifr_name", &self.ifr_name) - .field("ifr_ifru", &self.ifr_ifru) - .finish() - } - } - - impl fmt::Debug for ifconf { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("ifconf") - .field("ifc_len", &self.ifc_len) - .field("ifc_ifcu", &self.ifc_ifcu) - .finish() - } - } - #[allow(deprecated)] impl af_alg_iv { fn as_slice(&self) -> &[u8] { @@ -1035,15 +904,6 @@ impl Eq for af_alg_iv {} #[allow(deprecated)] - impl fmt::Debug for af_alg_iv { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("af_alg_iv") - .field("ivlen", &self.ivlen) - .finish() - } - } - - #[allow(deprecated)] impl hash::Hash for af_alg_iv { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.as_slice().hash(state); @@ -1058,15 +918,6 @@ } } impl Eq for prop_info {} - impl fmt::Debug for prop_info { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("prop_info") - .field("__name", &self.__name) - .field("__serial", &self.__serial) - .field("__value", &self.__value) - .finish() - } - } } } @@ -1698,27 +1549,6 @@ pub const TIOCCONS: c_int = 0x541D; pub const TIOCSBRK: c_int = 0x5427; pub const TIOCCBRK: c_int = 0x5428; -cfg_if! { - if #[cfg(any( - target_arch = "x86", - target_arch = "x86_64", - target_arch = "arm", - target_arch = "aarch64", - target_arch = "riscv64", - target_arch = "s390x" - ))] { - pub const FICLONE: c_int = 0x40049409; - pub const FICLONERANGE: c_int = 0x4020940D; - } else if #[cfg(any( - target_arch = "mips", - target_arch = "mips64", - target_arch = "powerpc", - target_arch = "powerpc64" - ))] { - pub const FICLONE: c_int = 0x80049409; - pub const FICLONERANGE: c_int = 0x8020940D; - } -} pub const ST_RDONLY: c_ulong = 1; pub const ST_NOSUID: c_ulong = 2; @@ -1900,38 +1730,6 @@ pub const BLKSSZGET: c_int = 0x1268; pub const BLKPBSZGET: c_int = 0x127B; -cfg_if! { - // Those type are constructed using the _IOC macro - // DD-SS_SSSS_SSSS_SSSS-TTTT_TTTT-NNNN_NNNN - // where D stands for direction (either None (00), Read (01) or Write (11)) - // where S stands for size (int, long, struct...) - // where T stands for type ('f','v','X'...) - // where N stands for NR (NumbeR) - if #[cfg(any(target_arch = "x86", target_arch = "arm"))] { - pub const FS_IOC_GETFLAGS: c_int = 0x80046601; - pub const FS_IOC_SETFLAGS: c_int = 0x40046602; - pub const FS_IOC_GETVERSION: c_int = 0x80047601; - pub const FS_IOC_SETVERSION: c_int = 0x40047602; - pub const FS_IOC32_GETFLAGS: c_int = 0x80046601; - pub const FS_IOC32_SETFLAGS: c_int = 0x40046602; - pub const FS_IOC32_GETVERSION: c_int = 0x80047601; - pub const FS_IOC32_SETVERSION: c_int = 0x40047602; - } else if #[cfg(any( - target_arch = "x86_64", - target_arch = "riscv64", - target_arch = "aarch64" - ))] { - pub const FS_IOC_GETFLAGS: c_int = 0x80086601; - pub const FS_IOC_SETFLAGS: c_int = 0x40086602; - pub const FS_IOC_GETVERSION: c_int = 0x80087601; - pub const FS_IOC_SETVERSION: c_int = 0x40087602; - pub const FS_IOC32_GETFLAGS: c_int = 0x80046601; - pub const FS_IOC32_SETFLAGS: c_int = 0x40046602; - pub const FS_IOC32_GETVERSION: c_int = 0x80047601; - pub const FS_IOC32_SETVERSION: c_int = 0x40047602; - } -} - pub const EAI_AGAIN: c_int = 2; pub const EAI_BADFLAGS: c_int = 3; pub const EAI_FAIL: c_int = 4; @@ -2666,65 +2464,6 @@ pub const UINPUT_VERSION: c_uint = 5; pub const UINPUT_MAX_NAME_SIZE: usize = 80; -// bionic/libc/kernel/uapi/linux/if_tun.h -pub const IFF_TUN: c_int = 0x0001; -pub const IFF_TAP: c_int = 0x0002; -pub const IFF_NAPI: c_int = 0x0010; -pub const IFF_NAPI_FRAGS: c_int = 0x0020; -pub const IFF_NO_CARRIER: c_int = 0x0040; -pub const IFF_NO_PI: c_int = 0x1000; -pub const IFF_ONE_QUEUE: c_int = 0x2000; -pub const IFF_VNET_HDR: c_int = 0x4000; -pub const IFF_TUN_EXCL: c_int = 0x8000; -pub const IFF_MULTI_QUEUE: c_int = 0x0100; -pub const IFF_ATTACH_QUEUE: c_int = 0x0200; -pub const IFF_DETACH_QUEUE: c_int = 0x0400; -pub const IFF_PERSIST: c_int = 0x0800; -pub const IFF_NOFILTER: c_int = 0x1000; -pub const TUN_TX_TIMESTAMP: c_int = 1; -// Features for GSO (TUNSETOFFLOAD) -pub const TUN_F_CSUM: c_uint = 0x01; -pub const TUN_F_TSO4: c_uint = 0x02; -pub const TUN_F_TSO6: c_uint = 0x04; -pub const TUN_F_TSO_ECN: c_uint = 0x08; -pub const TUN_F_UFO: c_uint = 0x10; -pub const TUN_F_USO4: c_uint = 0x20; -pub const TUN_F_USO6: c_uint = 0x40; -// Protocol info prepended to the packets (when IFF_NO_PI is not set) -pub const TUN_PKT_STRIP: c_int = 0x0001; -// Accept all multicast packets -pub const TUN_FLT_ALLMULTI: c_int = 0x0001; -// Ioctl operation codes -const T_TYPE: u32 = b'T' as u32; -pub const TUNSETNOCSUM: c_int = _IOW::<c_int>(T_TYPE, 200); -pub const TUNSETDEBUG: c_int = _IOW::<c_int>(T_TYPE, 201); -pub const TUNSETIFF: c_int = _IOW::<c_int>(T_TYPE, 202); -pub const TUNSETPERSIST: c_int = _IOW::<c_int>(T_TYPE, 203); -pub const TUNSETOWNER: c_int = _IOW::<c_int>(T_TYPE, 204); -pub const TUNSETLINK: c_int = _IOW::<c_int>(T_TYPE, 205); -pub const TUNSETGROUP: c_int = _IOW::<c_int>(T_TYPE, 206); -pub const TUNGETFEATURES: c_int = _IOR::<c_int>(T_TYPE, 207); -pub const TUNSETOFFLOAD: c_int = _IOW::<c_int>(T_TYPE, 208); -pub const TUNSETTXFILTER: c_int = _IOW::<c_int>(T_TYPE, 209); -pub const TUNGETIFF: c_int = _IOR::<c_int>(T_TYPE, 210); -pub const TUNGETSNDBUF: c_int = _IOR::<c_int>(T_TYPE, 211); -pub const TUNSETSNDBUF: c_int = _IOW::<c_int>(T_TYPE, 212); -pub const TUNATTACHFILTER: c_int = _IOW::<sock_fprog>(T_TYPE, 213); -pub const TUNDETACHFILTER: c_int = _IOW::<sock_fprog>(T_TYPE, 214); -pub const TUNGETVNETHDRSZ: c_int = _IOR::<c_int>(T_TYPE, 215); -pub const TUNSETVNETHDRSZ: c_int = _IOW::<c_int>(T_TYPE, 216); -pub const TUNSETQUEUE: c_int = _IOW::<c_int>(T_TYPE, 217); -pub const TUNSETIFINDEX: c_int = _IOW::<c_int>(T_TYPE, 218); -pub const TUNGETFILTER: c_int = _IOR::<sock_fprog>(T_TYPE, 219); -pub const TUNSETVNETLE: c_int = _IOW::<c_int>(T_TYPE, 220); -pub const TUNGETVNETLE: c_int = _IOR::<c_int>(T_TYPE, 221); -pub const TUNSETVNETBE: c_int = _IOW::<c_int>(T_TYPE, 222); -pub const TUNGETVNETBE: c_int = _IOR::<c_int>(T_TYPE, 223); -pub const TUNSETSTEERINGEBPF: c_int = _IOR::<c_int>(T_TYPE, 224); -pub const TUNSETFILTEREBPF: c_int = _IOR::<c_int>(T_TYPE, 225); -pub const TUNSETCARRIER: c_int = _IOW::<c_int>(T_TYPE, 226); -pub const TUNGETDEVNETNS: c_int = _IO(T_TYPE, 227); - // start android/platform/bionic/libc/kernel/uapi/linux/if_ether.h // from https://android.googlesource.com/platform/bionic/+/HEAD/libc/kernel/uapi/linux/if_ether.h pub const ETH_ALEN: c_int = 6; @@ -3653,7 +3392,7 @@ let next = (cmsg as usize + super::CMSG_ALIGN((*cmsg).cmsg_len as usize)) as *mut cmsghdr; let max = (*mhdr).msg_control as usize + (*mhdr).msg_controllen as usize; if (next.offset(1)) as usize > max { - 0 as *mut cmsghdr + core::ptr::null_mut::<cmsghdr>() } else { next as *mut cmsghdr } @@ -3758,7 +3497,6 @@ pub fn gettimeofday(tp: *mut crate::timeval, tz: *mut crate::timezone) -> c_int; pub fn mlock2(addr: *const c_void, len: size_t, flags: c_int) -> c_int; pub fn madvise(addr: *mut c_void, len: size_t, advice: c_int) -> c_int; - pub fn ioctl(fd: c_int, request: c_int, ...) -> c_int; pub fn msync(addr: *mut c_void, len: size_t, flags: c_int) -> c_int; pub fn mprotect(addr: *mut c_void, len: size_t, prot: c_int) -> c_int; pub fn recvfrom( @@ -4299,23 +4037,3 @@ self.sifields().sigchld.si_stime } } - -/// Build an ioctl number for an argumentless ioctl. -pub const fn _IO(ty: u32, nr: u32) -> c_int { - super::_IOC(super::_IOC_NONE, ty, nr, 0) as c_int -} - -/// Build an ioctl number for an read-only ioctl. -pub const fn _IOR<T>(ty: u32, nr: u32) -> c_int { - super::_IOC(super::_IOC_READ, ty, nr, mem::size_of::<T>()) as c_int -} - -/// Build an ioctl number for an write-only ioctl. -pub const fn _IOW<T>(ty: u32, nr: u32) -> c_int { - super::_IOC(super::_IOC_WRITE, ty, nr, mem::size_of::<T>()) as c_int -} - -/// Build an ioctl number for a read-write ioctl. -pub const fn _IOWR<T>(ty: u32, nr: u32) -> c_int { - super::_IOC(super::_IOC_READ | super::_IOC_WRITE, ty, nr, mem::size_of::<T>()) as c_int -}
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/emscripten/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/emscripten/mod.rs index 985b3c0c..deac314 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/emscripten/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/emscripten/mod.rs
@@ -171,7 +171,7 @@ pub gid: crate::gid_t, pub cuid: crate::uid_t, pub cgid: crate::gid_t, - pub mode: crate::mode_t, + pub mode: mode_t, pub __seq: c_int, __unused1: c_long, __unused2: c_long, @@ -229,7 +229,7 @@ __st_dev_padding: c_int, #[cfg(emscripten_old_stat_abi)] __st_ino_truncated: c_long, - pub st_mode: crate::mode_t, + pub st_mode: mode_t, pub st_nlink: crate::nlink_t, pub st_uid: crate::uid_t, pub st_gid: crate::gid_t, @@ -403,17 +403,6 @@ } } impl Eq for dirent {} - impl fmt::Debug for dirent { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("dirent") - .field("d_ino", &self.d_ino) - .field("d_off", &self.d_off) - .field("d_reclen", &self.d_reclen) - .field("d_type", &self.d_type) - // FIXME(debug): .field("d_name", &self.d_name) - .finish() - } - } impl hash::Hash for dirent { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.d_ino.hash(state); @@ -447,26 +436,6 @@ } } impl Eq for sysinfo {} - impl fmt::Debug for sysinfo { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sysinfo") - .field("uptime", &self.uptime) - .field("loads", &self.loads) - .field("totalram", &self.totalram) - .field("freeram", &self.freeram) - .field("sharedram", &self.sharedram) - .field("bufferram", &self.bufferram) - .field("totalswap", &self.totalswap) - .field("freeswap", &self.freeswap) - .field("procs", &self.procs) - .field("pad", &self.pad) - .field("totalhigh", &self.totalhigh) - .field("freehigh", &self.freehigh) - .field("mem_unit", &self.mem_unit) - // FIXME(debug): .field("__reserved", &self.__reserved) - .finish() - } - } impl hash::Hash for sysinfo { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.uptime.hash(state); @@ -495,16 +464,6 @@ } } impl Eq for mq_attr {} - impl fmt::Debug for mq_attr { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("mq_attr") - .field("mq_flags", &self.mq_flags) - .field("mq_maxmsg", &self.mq_maxmsg) - .field("mq_msgsize", &self.mq_msgsize) - .field("mq_curmsgs", &self.mq_curmsgs) - .finish() - } - } impl hash::Hash for mq_attr { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.mq_flags.hash(state); @@ -520,13 +479,6 @@ } } impl Eq for pthread_cond_t {} - impl fmt::Debug for pthread_cond_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("pthread_cond_t") - // FIXME(debug): .field("size", &self.size) - .finish() - } - } impl hash::Hash for pthread_cond_t { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.size.hash(state); @@ -1412,12 +1364,12 @@ f! { pub fn CMSG_NXTHDR(mhdr: *const msghdr, cmsg: *const cmsghdr) -> *mut cmsghdr { if ((*cmsg).cmsg_len as usize) < mem::size_of::<cmsghdr>() { - return 0 as *mut cmsghdr; + return core::ptr::null_mut::<cmsghdr>(); }; let next = (cmsg as usize + super::CMSG_ALIGN((*cmsg).cmsg_len as usize)) as *mut cmsghdr; let max = (*mhdr).msg_control as usize + (*mhdr).msg_controllen as usize; if (next.offset(1)) as usize > max { - 0 as *mut cmsghdr + core::ptr::null_mut::<cmsghdr>() } else { next as *mut cmsghdr } @@ -1530,7 +1482,7 @@ ) -> c_int; pub fn getloadavg(loadavg: *mut c_double, nelem: c_int) -> c_int; - pub fn mkfifoat(dirfd: c_int, pathname: *const c_char, mode: crate::mode_t) -> c_int; + pub fn mkfifoat(dirfd: c_int, pathname: *const c_char, mode: mode_t) -> c_int; pub fn if_nameindex() -> *mut if_nameindex; pub fn if_freenameindex(ptr: *mut if_nameindex);
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/arch/generic/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/arch/generic/mod.rs index ec3179b..465cedd 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/arch/generic/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/arch/generic/mod.rs
@@ -1,5 +1,5 @@ use crate::prelude::*; -use crate::{Ioctl, _IOR, _IOW}; +use crate::Ioctl; s! { pub struct termios2 { @@ -40,8 +40,6 @@ pub const SO_PEERCRED: c_int = 17; pub const SO_RCVLOWAT: c_int = 18; pub const SO_SNDLOWAT: c_int = 19; -const SO_RCVTIMEO_OLD: c_int = 20; -const SO_SNDTIMEO_OLD: c_int = 21; pub const SO_SECURITY_AUTHENTICATION: c_int = 22; pub const SO_SECURITY_ENCRYPTION_TRANSPORT: c_int = 23; pub const SO_SECURITY_ENCRYPTION_NETWORK: c_int = 24; @@ -50,9 +48,6 @@ pub const SO_DETACH_FILTER: c_int = 27; pub const SO_GET_FILTER: c_int = SO_ATTACH_FILTER; pub const SO_PEERNAME: c_int = 28; -const SO_TIMESTAMP_OLD: c_int = 29; -const SO_TIMESTAMPNS_OLD: c_int = 35; -const SO_TIMESTAMPING_OLD: c_int = 37; cfg_if! { if #[cfg(all( @@ -76,6 +71,12 @@ pub const SO_RCVTIMEO: c_int = 66; pub const SO_SNDTIMEO: c_int = 67; } else { + const SO_TIMESTAMP_OLD: c_int = 29; + const SO_TIMESTAMPNS_OLD: c_int = 35; + const SO_TIMESTAMPING_OLD: c_int = 37; + const SO_RCVTIMEO_OLD: c_int = 20; + const SO_SNDTIMEO_OLD: c_int = 21; + pub const SO_TIMESTAMP: c_int = SO_TIMESTAMP_OLD; pub const SO_TIMESTAMPNS: c_int = SO_TIMESTAMPNS_OLD; pub const SO_TIMESTAMPING: c_int = SO_TIMESTAMPING_OLD; @@ -158,9 +159,6 @@ pub const SO_DEVMEM_DMABUF: c_int = 79; pub const SO_DEVMEM_DONTNEED: c_int = 80; -pub const FICLONE: Ioctl = _IOW::<c_int>(0x94, 9) as Ioctl; -pub const FICLONERANGE: Ioctl = _IOW::<crate::file_clone_range>(0x94, 13) as Ioctl; - // Defined in unix/linux_like/mod.rs // pub const SCM_TIMESTAMP: c_int = SO_TIMESTAMP; pub const SCM_TIMESTAMPNS: c_int = SO_TIMESTAMPNS; @@ -251,47 +249,6 @@ pub const BLKIOOPT: Ioctl = 0x1279; pub const BLKSSZGET: Ioctl = 0x1268; pub const BLKPBSZGET: Ioctl = 0x127B; -// linux/if_tun.h -pub const TUNSETNOCSUM: Ioctl = 0x400454c8; -pub const TUNSETDEBUG: Ioctl = 0x400454c9; -pub const TUNSETIFF: Ioctl = 0x400454ca; -pub const TUNSETPERSIST: Ioctl = 0x400454cb; -pub const TUNSETOWNER: Ioctl = 0x400454cc; -pub const TUNSETLINK: Ioctl = 0x400454cd; -pub const TUNSETGROUP: Ioctl = 0x400454ce; -pub const TUNGETFEATURES: Ioctl = 0x800454cf; -pub const TUNSETOFFLOAD: Ioctl = 0x400454d0; -pub const TUNSETTXFILTER: Ioctl = 0x400454d1; -pub const TUNGETIFF: Ioctl = 0x800454d2; -pub const TUNGETSNDBUF: Ioctl = 0x800454d3; -pub const TUNSETSNDBUF: Ioctl = 0x400454d4; -pub const TUNGETVNETHDRSZ: Ioctl = 0x800454d7; -pub const TUNSETVNETHDRSZ: Ioctl = 0x400454d8; -pub const TUNSETQUEUE: Ioctl = 0x400454d9; -pub const TUNSETIFINDEX: Ioctl = 0x400454da; -pub const TUNSETVNETLE: Ioctl = 0x400454dc; -pub const TUNGETVNETLE: Ioctl = 0x800454dd; -/* The TUNSETVNETBE and TUNGETVNETBE ioctls are for cross-endian support on - * little-endian hosts. Not all kernel configurations support them, but all - * configurations that support SET also support GET. - */ -pub const TUNSETVNETBE: Ioctl = 0x400454de; -pub const TUNGETVNETBE: Ioctl = 0x800454df; -pub const TUNSETSTEERINGEBPF: Ioctl = 0x800454e0; -pub const TUNSETFILTEREBPF: Ioctl = 0x800454e1; - -pub const FS_IOC_GETFLAGS: Ioctl = _IOR::<c_long>('f' as u32, 1) as Ioctl; -pub const FS_IOC_SETFLAGS: Ioctl = _IOW::<c_long>('f' as u32, 2) as Ioctl; -pub const FS_IOC_GETVERSION: Ioctl = _IOR::<c_long>('v' as u32, 1) as Ioctl; -pub const FS_IOC_SETVERSION: Ioctl = _IOW::<c_long>('v' as u32, 2) as Ioctl; -pub const FS_IOC32_GETFLAGS: Ioctl = _IOR::<c_int>('f' as u32, 1) as Ioctl; -pub const FS_IOC32_SETFLAGS: Ioctl = _IOW::<c_int>('f' as u32, 2) as Ioctl; -pub const FS_IOC32_GETVERSION: Ioctl = _IOR::<c_int>('v' as u32, 1) as Ioctl; -pub const FS_IOC32_SETVERSION: Ioctl = _IOW::<c_int>('v' as u32, 2) as Ioctl; - -pub const TUNATTACHFILTER: Ioctl = _IOW::<crate::sock_fprog>('T' as u32, 213) as Ioctl; -pub const TUNDETACHFILTER: Ioctl = _IOW::<crate::sock_fprog>('T' as u32, 214) as Ioctl; -pub const TUNGETFILTER: Ioctl = _IOR::<crate::sock_fprog>('T' as u32, 219) as Ioctl; cfg_if! { if #[cfg(any(target_arch = "arm", target_arch = "s390x"))] { @@ -357,9 +314,6 @@ pub const RLIMIT_RTPRIO: c_int = 14; pub const RLIMIT_RTTIME: c_int = 15; #[deprecated(since = "0.2.64", note = "Not stable across OS versions")] - #[cfg(not(target_arch = "loongarch64"))] - pub const RLIM_NLIMITS: c_int = 15; - #[cfg(target_arch = "loongarch64")] pub const RLIM_NLIMITS: c_int = 16; #[allow(deprecated)] #[deprecated(since = "0.2.64", note = "Not stable across OS versions")]
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/arch/mips/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/arch/mips/mod.rs index eee7cc8..ba68894 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/arch/mips/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/arch/mips/mod.rs
@@ -33,16 +33,17 @@ pub const SO_RCVBUF: c_int = 0x1002; pub const SO_SNDLOWAT: c_int = 0x1003; pub const SO_RCVLOWAT: c_int = 0x1004; -// NOTE: These definitions are now being renamed with _OLD postfix, -// but CI haven't support them yet. -// Some related consts could be found in b32.rs and b64.rs -const SO_SNDTIMEO_OLD: c_int = 0x1005; -const SO_RCVTIMEO_OLD: c_int = 0x1006; cfg_if! { if #[cfg(linux_time_bits64)] { + const SO_RCVTIMEO_NEW: c_int = 66; + const SO_SNDTIMEO_NEW: c_int = 67; + pub const SO_SNDTIMEO: c_int = SO_SNDTIMEO_NEW; pub const SO_RCVTIMEO: c_int = SO_RCVTIMEO_NEW; } else { + const SO_SNDTIMEO_OLD: c_int = 0x1005; + const SO_RCVTIMEO_OLD: c_int = 0x1006; + pub const SO_SNDTIMEO: c_int = SO_SNDTIMEO_OLD; pub const SO_RCVTIMEO: c_int = SO_RCVTIMEO_OLD; } @@ -95,28 +96,27 @@ pub const SO_TXTIME: c_int = 61; pub const SCM_TXTIME: c_int = SO_TXTIME; pub const SO_BINDTOIFINDEX: c_int = 62; -// NOTE: These definitions are now being renamed with _OLD postfix, -// but CI haven't support them yet. -// Some related consts could be found in b32.rs and b64.rs -const SO_TIMESTAMP_OLD: c_int = 29; -const SO_RCVTIMEO_NEW: c_int = 66; -const SO_SNDTIMEO_NEW: c_int = 67; -const SO_TIMESTAMPNS_OLD: c_int = 35; -const SO_TIMESTAMPING_OLD: c_int = 37; -const SO_TIMESTAMP_NEW: c_int = 63; -const SO_TIMESTAMPNS_NEW: c_int = 64; -const SO_TIMESTAMPING_NEW: c_int = 65; + cfg_if! { if #[cfg(linux_time_bits64)] { + const SO_TIMESTAMP_NEW: c_int = 63; + const SO_TIMESTAMPNS_NEW: c_int = 64; + const SO_TIMESTAMPING_NEW: c_int = 65; + pub const SO_TIMESTAMP: c_int = SO_TIMESTAMP_NEW; pub const SO_TIMESTAMPNS: c_int = SO_TIMESTAMPNS_NEW; pub const SO_TIMESTAMPING: c_int = SO_TIMESTAMPING_NEW; } else { + const SO_TIMESTAMP_OLD: c_int = 29; + const SO_TIMESTAMPNS_OLD: c_int = 35; + const SO_TIMESTAMPING_OLD: c_int = 37; + pub const SO_TIMESTAMP: c_int = SO_TIMESTAMP_OLD; pub const SO_TIMESTAMPNS: c_int = SO_TIMESTAMPNS_OLD; pub const SO_TIMESTAMPING: c_int = SO_TIMESTAMPING_OLD; } } + // pub const SO_DETACH_REUSEPORT_BPF: c_int = 68; pub const SO_PREFER_BUSY_POLL: c_int = 69; pub const SO_BUSY_POLL_BUDGET: c_int = 70; @@ -131,9 +131,6 @@ pub const SO_DEVMEM_DMABUF: c_int = 79; pub const SO_DEVMEM_DONTNEED: c_int = 80; -pub const FICLONE: c_ulong = 0x80049409; -pub const FICLONERANGE: c_ulong = 0x8020940D; - // Defined in unix/linux_like/mod.rs // pub const SCM_TIMESTAMP: c_int = SO_TIMESTAMP; pub const SCM_TIMESTAMPNS: c_int = SO_TIMESTAMPNS; @@ -223,68 +220,6 @@ pub const BLKIOOPT: Ioctl = 0x20001279; pub const BLKSSZGET: Ioctl = 0x20001268; pub const BLKPBSZGET: Ioctl = 0x2000127B; -// linux/if_tun.h -pub const TUNSETNOCSUM: Ioctl = 0x800454c8; -pub const TUNSETDEBUG: Ioctl = 0x800454c9; -pub const TUNSETIFF: Ioctl = 0x800454ca; -pub const TUNSETPERSIST: Ioctl = 0x800454cb; -pub const TUNSETOWNER: Ioctl = 0x800454cc; -pub const TUNSETLINK: Ioctl = 0x800454cd; -pub const TUNSETGROUP: Ioctl = 0x800454ce; -pub const TUNGETFEATURES: Ioctl = 0x400454cf; -pub const TUNSETOFFLOAD: Ioctl = 0x800454d0; -pub const TUNSETTXFILTER: Ioctl = 0x800454d1; -pub const TUNGETIFF: Ioctl = 0x400454d2; -pub const TUNGETSNDBUF: Ioctl = 0x400454d3; -pub const TUNSETSNDBUF: Ioctl = 0x800454d4; -pub const TUNGETVNETHDRSZ: Ioctl = 0x400454d7; -pub const TUNSETVNETHDRSZ: Ioctl = 0x800454d8; -pub const TUNSETQUEUE: Ioctl = 0x800454d9; -pub const TUNSETIFINDEX: Ioctl = 0x800454da; -pub const TUNSETVNETLE: Ioctl = 0x800454dc; -pub const TUNGETVNETLE: Ioctl = 0x400454dd; -/* The TUNSETVNETBE and TUNGETVNETBE ioctls are for cross-endian support on - * little-endian hosts. Not all kernel configurations support them, but all - * configurations that support SET also support GET. - */ -pub const TUNSETVNETBE: Ioctl = 0x800454de; -pub const TUNGETVNETBE: Ioctl = 0x400454df; -pub const TUNSETSTEERINGEBPF: Ioctl = 0x400454e0; -pub const TUNSETFILTEREBPF: Ioctl = 0x400454e1; - -cfg_if! { - // Those type are constructed using the _IOC macro - // DD-SS_SSSS_SSSS_SSSS-TTTT_TTTT-NNNN_NNNN - // where D stands for direction (either None (00), Read (01) or Write (11)) - // where S stands for size (int, long, struct...) - // where T stands for type ('f','v','X'...) - // where N stands for NR (NumbeR) - if #[cfg(any(target_arch = "mips", target_arch = "mips32r6"))] { - pub const FS_IOC_GETFLAGS: Ioctl = 0x40046601; - pub const FS_IOC_SETFLAGS: Ioctl = 0x80046602; - pub const FS_IOC_GETVERSION: Ioctl = 0x40047601; - pub const FS_IOC_SETVERSION: Ioctl = 0x80047602; - pub const FS_IOC32_GETFLAGS: Ioctl = 0x40046601; - pub const FS_IOC32_SETFLAGS: Ioctl = 0x80046602; - pub const FS_IOC32_GETVERSION: Ioctl = 0x40047601; - pub const FS_IOC32_SETVERSION: Ioctl = 0x80047602; - pub const TUNATTACHFILTER: Ioctl = 0x800854d5; - pub const TUNDETACHFILTER: Ioctl = 0x800854d6; - pub const TUNGETFILTER: Ioctl = 0x400854db; - } else if #[cfg(any(target_arch = "mips64", target_arch = "mips64r6"))] { - pub const FS_IOC_GETFLAGS: Ioctl = 0x40086601; - pub const FS_IOC_SETFLAGS: Ioctl = 0x80086602; - pub const FS_IOC_GETVERSION: Ioctl = 0x40087601; - pub const FS_IOC_SETVERSION: Ioctl = 0x80087602; - pub const FS_IOC32_GETFLAGS: Ioctl = 0x40046601; - pub const FS_IOC32_SETFLAGS: Ioctl = 0x80046602; - pub const FS_IOC32_GETVERSION: Ioctl = 0x40047601; - pub const FS_IOC32_SETVERSION: Ioctl = 0x80047602; - pub const TUNATTACHFILTER: Ioctl = 0x801054d5; - pub const TUNDETACHFILTER: Ioctl = 0x801054d6; - pub const TUNGETFILTER: Ioctl = 0x401054db; - } -} cfg_if! { if #[cfg(target_env = "musl")] { @@ -349,7 +284,7 @@ pub const RLIMIT_RTPRIO: c_int = 14; pub const RLIMIT_RTTIME: c_int = 15; #[deprecated(since = "0.2.64", note = "Not stable across OS versions")] - pub const RLIM_NLIMITS: c_int = 15; + pub const RLIM_NLIMITS: c_int = 16; #[allow(deprecated)] #[deprecated(since = "0.2.64", note = "Not stable across OS versions")] pub const RLIMIT_NLIMITS: c_int = RLIM_NLIMITS;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/arch/powerpc/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/arch/powerpc/mod.rs index 588b99a..3249a9f 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/arch/powerpc/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/arch/powerpc/mod.rs
@@ -24,17 +24,23 @@ // powerpc only differs in these pub const SO_RCVLOWAT: c_int = 16; pub const SO_SNDLOWAT: c_int = 17; + cfg_if! { if #[cfg(linux_time_bits64)] { - pub const SO_SNDTIMEO: c_int = 67; - pub const SO_RCVTIMEO: c_int = 66; + const SO_RCVTIMEO_NEW: c_int = 66; + const SO_SNDTIMEO_NEW: c_int = 67; + + pub const SO_RCVTIMEO: c_int = SO_RCVTIMEO_NEW; + pub const SO_SNDTIMEO: c_int = SO_SNDTIMEO_NEW; } else { - pub const SO_SNDTIMEO: c_int = 19; - pub const SO_RCVTIMEO: c_int = 18; + const SO_RCVTIMEO_OLD: c_int = 18; + const SO_SNDTIMEO_OLD: c_int = 19; + + pub const SO_RCVTIMEO: c_int = SO_RCVTIMEO_OLD; + pub const SO_SNDTIMEO: c_int = SO_SNDTIMEO_OLD; } } -// pub const SO_RCVTIMEO_OLD: c_int = 18; -// pub const SO_SNDTIMEO_OLD: c_int = 19; + pub const SO_PASSCRED: c_int = 20; pub const SO_PEERCRED: c_int = 21; // end @@ -48,18 +54,23 @@ pub const SO_PEERNAME: c_int = 28; cfg_if! { if #[cfg(linux_time_bits64)] { + const SO_TIMESTAMP_NEW: c_int = 63; + const SO_TIMESTAMPNS_NEW: c_int = 64; + const SO_TIMESTAMPING_NEW: c_int = 65; + pub const SO_TIMESTAMP: c_int = SO_TIMESTAMP_NEW; pub const SO_TIMESTAMPNS: c_int = SO_TIMESTAMPNS_NEW; pub const SO_TIMESTAMPING: c_int = SO_TIMESTAMPING_NEW; } else { + const SO_TIMESTAMP_OLD: c_int = 29; + const SO_TIMESTAMPNS_OLD: c_int = 35; + const SO_TIMESTAMPING_OLD: c_int = 37; + pub const SO_TIMESTAMP: c_int = SO_TIMESTAMP_OLD; pub const SO_TIMESTAMPNS: c_int = SO_TIMESTAMPNS_OLD; pub const SO_TIMESTAMPING: c_int = SO_TIMESTAMPING_OLD; } } -const SO_TIMESTAMP_OLD: c_int = 29; -const SO_TIMESTAMPNS_OLD: c_int = 35; -const SO_TIMESTAMPING_OLD: c_int = 37; pub const SO_ACCEPTCONN: c_int = 30; pub const SO_PEERSEC: c_int = 31; pub const SO_SNDBUFFORCE: c_int = 32; @@ -94,11 +105,6 @@ pub const SO_TXTIME: c_int = 61; pub const SCM_TXTIME: c_int = SO_TXTIME; pub const SO_BINDTOIFINDEX: c_int = 62; -const SO_TIMESTAMP_NEW: c_int = 63; -const SO_TIMESTAMPNS_NEW: c_int = 64; -const SO_TIMESTAMPING_NEW: c_int = 65; -const SO_RCVTIMEO_NEW: c_int = 66; -const SO_SNDTIMEO_NEW: c_int = 67; // pub const SO_DETACH_REUSEPORT_BPF: c_int = 68; pub const SO_PREFER_BUSY_POLL: c_int = 69; pub const SO_BUSY_POLL_BUDGET: c_int = 70; @@ -113,9 +119,6 @@ pub const SO_DEVMEM_DMABUF: c_int = 79; pub const SO_DEVMEM_DONTNEED: c_int = 80; -pub const FICLONE: c_ulong = 0x80049409; -pub const FICLONERANGE: c_ulong = 0x8020940D; - // Defined in unix/linux_like/mod.rs // pub const SCM_TIMESTAMP: c_int = SO_TIMESTAMP; pub const SCM_TIMESTAMPNS: c_int = SO_TIMESTAMPNS; @@ -209,68 +212,6 @@ pub const BLKSSZGET: Ioctl = 0x20001268; pub const BLKPBSZGET: Ioctl = 0x2000127B; //pub const FIOQSIZE: Ioctl = 0x40086680; -// linux/if_tun.h -pub const TUNSETNOCSUM: Ioctl = 0x800454c8; -pub const TUNSETDEBUG: Ioctl = 0x800454c9; -pub const TUNSETIFF: Ioctl = 0x800454ca; -pub const TUNSETPERSIST: Ioctl = 0x800454cb; -pub const TUNSETOWNER: Ioctl = 0x800454cc; -pub const TUNSETLINK: Ioctl = 0x800454cd; -pub const TUNSETGROUP: Ioctl = 0x800454ce; -pub const TUNGETFEATURES: Ioctl = 0x400454cf; -pub const TUNSETOFFLOAD: Ioctl = 0x800454d0; -pub const TUNSETTXFILTER: Ioctl = 0x800454d1; -pub const TUNGETIFF: Ioctl = 0x400454d2; -pub const TUNGETSNDBUF: Ioctl = 0x400454d3; -pub const TUNSETSNDBUF: Ioctl = 0x800454d4; -pub const TUNGETVNETHDRSZ: Ioctl = 0x400454d7; -pub const TUNSETVNETHDRSZ: Ioctl = 0x800454d8; -pub const TUNSETQUEUE: Ioctl = 0x800454d9; -pub const TUNSETIFINDEX: Ioctl = 0x800454da; -pub const TUNSETVNETLE: Ioctl = 0x800454dc; -pub const TUNGETVNETLE: Ioctl = 0x400454dd; -/* The TUNSETVNETBE and TUNGETVNETBE ioctls are for cross-endian support on - * little-endian hosts. Not all kernel configurations support them, but all - * configurations that support SET also support GET. - */ -pub const TUNSETVNETBE: Ioctl = 0x800454de; -pub const TUNGETVNETBE: Ioctl = 0x400454df; -pub const TUNSETSTEERINGEBPF: Ioctl = 0x400454e0; -pub const TUNSETFILTEREBPF: Ioctl = 0x400454e1; - -cfg_if! { - // Those type are constructed using the _IOC macro - // DD-SS_SSSS_SSSS_SSSS-TTTT_TTTT-NNNN_NNNN - // where D stands for direction (either None (00), Read (01) or Write (11)) - // where S stands for size (int, long, struct...) - // where T stands for type ('f','v','X'...) - // where N stands for NR (NumbeR) - if #[cfg(target_arch = "powerpc")] { - pub const FS_IOC_GETFLAGS: Ioctl = 0x40046601; - pub const FS_IOC_SETFLAGS: Ioctl = 0x80046602; - pub const FS_IOC_GETVERSION: Ioctl = 0x40047601; - pub const FS_IOC_SETVERSION: Ioctl = 0x80047602; - pub const FS_IOC32_GETFLAGS: Ioctl = 0x40046601; - pub const FS_IOC32_SETFLAGS: Ioctl = 0x80046602; - pub const FS_IOC32_GETVERSION: Ioctl = 0x40047601; - pub const FS_IOC32_SETVERSION: Ioctl = 0x80047602; - pub const TUNATTACHFILTER: Ioctl = 0x800854d5; - pub const TUNDETACHFILTER: Ioctl = 0x800854d6; - pub const TUNGETFILTER: Ioctl = 0x400854db; - } else if #[cfg(target_arch = "powerpc64")] { - pub const FS_IOC_GETFLAGS: Ioctl = 0x40086601; - pub const FS_IOC_SETFLAGS: Ioctl = 0x80086602; - pub const FS_IOC_GETVERSION: Ioctl = 0x40087601; - pub const FS_IOC_SETVERSION: Ioctl = 0x80087602; - pub const FS_IOC32_GETFLAGS: Ioctl = 0x40046601; - pub const FS_IOC32_SETFLAGS: Ioctl = 0x80046602; - pub const FS_IOC32_GETVERSION: Ioctl = 0x40047601; - pub const FS_IOC32_SETVERSION: Ioctl = 0x80047602; - pub const TUNATTACHFILTER: Ioctl = 0x801054d5; - pub const TUNDETACHFILTER: Ioctl = 0x801054d6; - pub const TUNGETFILTER: Ioctl = 0x401054db; - } -} pub const TIOCM_LE: c_int = 0x001; pub const TIOCM_DTR: c_int = 0x002; @@ -330,7 +271,7 @@ pub const RLIMIT_RTPRIO: c_int = 14; pub const RLIMIT_RTTIME: c_int = 15; #[deprecated(since = "0.2.64", note = "Not stable across OS versions")] - pub const RLIM_NLIMITS: c_int = 15; + pub const RLIM_NLIMITS: c_int = 16; #[allow(deprecated)] #[deprecated(since = "0.2.64", note = "Not stable across OS versions")] pub const RLIMIT_NLIMITS: c_int = RLIM_NLIMITS;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/arch/sparc/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/arch/sparc/mod.rs index 86af2ad..4c108ba7 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/arch/sparc/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/arch/sparc/mod.rs
@@ -199,35 +199,6 @@ //pub const TIOCGRS485: Ioctl = 0x40205441; //pub const TIOCSRS485: Ioctl = 0xc0205442; -// linux/if_tun.h -pub const TUNSETNOCSUM: Ioctl = 0x800454c8; -pub const TUNSETDEBUG: Ioctl = 0x800454c9; -pub const TUNSETIFF: Ioctl = 0x800454ca; -pub const TUNSETPERSIST: Ioctl = 0x800454cb; -pub const TUNSETOWNER: Ioctl = 0x800454cc; -pub const TUNSETLINK: Ioctl = 0x800454cd; -pub const TUNSETGROUP: Ioctl = 0x800454ce; -pub const TUNGETFEATURES: Ioctl = 0x400454cf; -pub const TUNSETOFFLOAD: Ioctl = 0x800454d0; -pub const TUNSETTXFILTER: Ioctl = 0x800454d1; -pub const TUNGETIFF: Ioctl = 0x400454d2; -pub const TUNGETSNDBUF: Ioctl = 0x400454d3; -pub const TUNSETSNDBUF: Ioctl = 0x800454d4; -pub const TUNGETVNETHDRSZ: Ioctl = 0x400454d7; -pub const TUNSETVNETHDRSZ: Ioctl = 0x800454d8; -pub const TUNSETQUEUE: Ioctl = 0x800454d9; -pub const TUNSETIFINDEX: Ioctl = 0x800454da; -pub const TUNSETVNETLE: Ioctl = 0x800454dc; -pub const TUNGETVNETLE: Ioctl = 0x400454dd; -/* The TUNSETVNETBE and TUNGETVNETBE ioctls are for cross-endian support on - * little-endian hosts. Not all kernel configurations support them, but all - * configurations that support SET also support GET. - */ -pub const TUNSETVNETBE: Ioctl = 0x800454de; -pub const TUNGETVNETBE: Ioctl = 0x400454df; -pub const TUNSETSTEERINGEBPF: Ioctl = 0x400454e0; -pub const TUNSETFILTEREBPF: Ioctl = 0x400454e1; - pub const TIOCM_LE: c_int = 0x001; pub const TIOCM_DTR: c_int = 0x002; pub const TIOCM_RTS: c_int = 0x004; @@ -274,37 +245,3 @@ pub const RLIM_INFINITY: crate::rlim_t = 0x7fffffff; } } - -cfg_if! { - // Those type are constructed using the _IOC macro - // DD-SS_SSSS_SSSS_SSSS-TTTT_TTTT-NNNN_NNNN - // where D stands for direction (either None (00), Read (01) or Write (11)) - // where S stands for size (int, long, struct...) - // where T stands for type ('f','v','X'...) - // where N stands for NR (NumbeR) - if #[cfg(target_arch = "sparc")] { - pub const FS_IOC_GETFLAGS: Ioctl = 0x40046601; - pub const FS_IOC_SETFLAGS: Ioctl = 0x80046602; - pub const FS_IOC_GETVERSION: Ioctl = 0x40047601; - pub const FS_IOC_SETVERSION: Ioctl = 0x80047602; - pub const FS_IOC32_GETFLAGS: Ioctl = 0x40046601; - pub const FS_IOC32_SETFLAGS: Ioctl = 0x80046602; - pub const FS_IOC32_GETVERSION: Ioctl = 0x40047601; - pub const FS_IOC32_SETVERSION: Ioctl = 0x80047602; - pub const TUNATTACHFILTER: Ioctl = 0x800854d5; - pub const TUNDETACHFILTER: Ioctl = 0x800854d6; - pub const TUNGETFILTER: Ioctl = 0x400854db; - } else if #[cfg(target_arch = "sparc64")] { - pub const FS_IOC_GETFLAGS: Ioctl = 0x40086601; - pub const FS_IOC_SETFLAGS: Ioctl = 0x80086602; - pub const FS_IOC_GETVERSION: Ioctl = 0x40087601; - pub const FS_IOC_SETVERSION: Ioctl = 0x80087602; - pub const FS_IOC32_GETFLAGS: Ioctl = 0x40046601; - pub const FS_IOC32_SETFLAGS: Ioctl = 0x80046602; - pub const FS_IOC32_GETVERSION: Ioctl = 0x40047601; - pub const FS_IOC32_SETVERSION: Ioctl = 0x80047602; - pub const TUNATTACHFILTER: Ioctl = 0x801054d5; - pub const TUNDETACHFILTER: Ioctl = 0x801054d6; - pub const TUNGETFILTER: Ioctl = 0x401054db; - } -}
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b32/arm/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b32/arm/mod.rs index 2dd4a88..80d7be38 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b32/arm/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b32/arm/mod.rs
@@ -60,23 +60,35 @@ pub struct stat64 { pub st_dev: crate::dev_t, + #[cfg(not(gnu_time_bits64))] __pad1: c_uint, + #[cfg(not(gnu_time_bits64))] __st_ino: c_ulong, + #[cfg(gnu_time_bits64)] + pub st_ino: crate::ino_t, pub st_mode: crate::mode_t, pub st_nlink: crate::nlink_t, pub st_uid: crate::uid_t, pub st_gid: crate::gid_t, pub st_rdev: crate::dev_t, + #[cfg(not(gnu_time_bits64))] __pad2: c_uint, pub st_size: off64_t, pub st_blksize: crate::blksize_t, pub st_blocks: crate::blkcnt64_t, pub st_atime: crate::time_t, pub st_atime_nsec: c_long, + #[cfg(gnu_time_bits64)] + _atime_pad: c_int, pub st_mtime: crate::time_t, pub st_mtime_nsec: c_long, + #[cfg(gnu_time_bits64)] + _mtime_pad: c_int, pub st_ctime: crate::time_t, pub st_ctime_nsec: c_long, + #[cfg(gnu_time_bits64)] + _ctime_pad: c_int, + #[cfg(not(gnu_time_bits64))] pub st_ino: crate::ino64_t, } @@ -115,10 +127,13 @@ pub shm_perm: crate::ipc_perm, pub shm_segsz: size_t, pub shm_atime: crate::time_t, + #[cfg(not(gnu_time_bits64))] __unused1: c_ulong, pub shm_dtime: crate::time_t, + #[cfg(not(gnu_time_bits64))] __unused2: c_ulong, pub shm_ctime: crate::time_t, + #[cfg(not(gnu_time_bits64))] __unused3: c_ulong, pub shm_cpid: crate::pid_t, pub shm_lpid: crate::pid_t, @@ -130,10 +145,13 @@ pub struct msqid_ds { pub msg_perm: crate::ipc_perm, pub msg_stime: crate::time_t, + #[cfg(not(gnu_time_bits64))] __glibc_reserved1: c_ulong, pub msg_rtime: crate::time_t, + #[cfg(not(gnu_time_bits64))] __glibc_reserved2: c_ulong, pub msg_ctime: crate::time_t, + #[cfg(not(gnu_time_bits64))] __glibc_reserved3: c_ulong, pub __msg_cbytes: c_ulong, pub msg_qnum: crate::msgqnum_t, @@ -242,17 +260,6 @@ } } impl Eq for ucontext_t {} - impl fmt::Debug for ucontext_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("ucontext_t") - .field("uc_flags", &self.uc_link) - .field("uc_link", &self.uc_link) - .field("uc_stack", &self.uc_stack) - .field("uc_mcontext", &self.uc_mcontext) - .field("uc_sigmask", &self.uc_sigmask) - .finish() - } - } impl hash::Hash for ucontext_t { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.uc_flags.hash(state);
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b32/mips/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b32/mips/mod.rs index 649a8e0..6581d729 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b32/mips/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b32/mips/mod.rs
@@ -5,8 +5,12 @@ s! { pub struct stat { + #[cfg(not(gnu_time_bits64))] pub st_dev: c_ulong, + #[cfg(gnu_time_bits64)] + pub st_dev: crate::dev_t, + #[cfg(not(gnu_time_bits64))] st_pad1: [c_long; 3], pub st_ino: crate::ino_t, @@ -16,11 +20,14 @@ pub st_uid: crate::uid_t, pub st_gid: crate::gid_t, + #[cfg(not(gnu_time_bits64))] pub st_rdev: c_ulong, + #[cfg(gnu_time_bits64)] + pub st_rdev: crate::dev_t, #[cfg(not(gnu_file_offset_bits64))] st_pad2: [c_long; 2], - #[cfg(gnu_file_offset_bits64)] + #[cfg(all(not(gnu_time_bits64), gnu_file_offset_bits64))] st_pad2: [c_long; 3], pub st_size: off_t, @@ -28,40 +35,84 @@ #[cfg(not(gnu_file_offset_bits64))] st_pad3: c_long, + #[cfg(gnu_time_bits64)] + pub st_blksize: crate::blksize_t, + #[cfg(gnu_time_bits64)] + pub st_blocks: crate::blkcnt_t, + pub st_atime: crate::time_t, + #[cfg(gnu_time_bits64)] + _atime_pad: c_int, pub st_atime_nsec: c_long, pub st_mtime: crate::time_t, + #[cfg(gnu_time_bits64)] + _mtime_pad: c_int, pub st_mtime_nsec: c_long, pub st_ctime: crate::time_t, + #[cfg(gnu_time_bits64)] + _ctime_pad: c_int, pub st_ctime_nsec: c_long, + #[cfg(not(gnu_time_bits64))] pub st_blksize: crate::blksize_t, - #[cfg(gnu_file_offset_bits64)] + #[cfg(all(not(gnu_time_bits64), gnu_file_offset_bits64))] st_pad4: c_long, + #[cfg(not(gnu_time_bits64))] pub st_blocks: crate::blkcnt_t, + #[cfg(not(gnu_time_bits64))] st_pad5: [c_long; 14], } pub struct stat64 { + #[cfg(not(gnu_time_bits64))] pub st_dev: c_ulong, + #[cfg(gnu_time_bits64)] + pub st_dev: crate::dev_t, + + #[cfg(not(gnu_time_bits64))] st_pad1: [c_long; 3], + pub st_ino: crate::ino64_t, pub st_mode: crate::mode_t, pub st_nlink: crate::nlink_t, pub st_uid: crate::uid_t, pub st_gid: crate::gid_t, + + #[cfg(not(gnu_time_bits64))] pub st_rdev: c_ulong, + #[cfg(gnu_time_bits64)] + pub st_rdev: crate::dev_t, + + #[cfg(not(gnu_time_bits64))] st_pad2: [c_long; 3], + pub st_size: off64_t, + + #[cfg(gnu_time_bits64)] + pub st_blksize: crate::blksize_t, + #[cfg(gnu_time_bits64)] + pub st_blocks: crate::blkcnt_t, + pub st_atime: crate::time_t, + #[cfg(gnu_time_bits64)] + _atime_pad: c_int, pub st_atime_nsec: c_long, pub st_mtime: crate::time_t, + #[cfg(gnu_time_bits64)] + _mtime_pad: c_int, pub st_mtime_nsec: c_long, pub st_ctime: crate::time_t, + #[cfg(gnu_time_bits64)] + _ctime_pad: c_int, pub st_ctime_nsec: c_long, + + #[cfg(not(gnu_time_bits64))] pub st_blksize: crate::blksize_t, + #[cfg(not(gnu_time_bits64))] st_pad3: c_long, + #[cfg(not(gnu_time_bits64))] pub st_blocks: crate::blkcnt64_t, + #[cfg(not(gnu_time_bits64))] st_pad5: [c_long; 14], } @@ -161,22 +212,22 @@ pub struct msqid_ds { pub msg_perm: crate::ipc_perm, - #[cfg(target_endian = "big")] + #[cfg(all(not(gnu_time_bits64), target_endian = "big"))] __glibc_reserved1: c_ulong, pub msg_stime: crate::time_t, - #[cfg(target_endian = "little")] + #[cfg(all(not(gnu_time_bits64), target_endian = "little"))] __glibc_reserved1: c_ulong, - #[cfg(target_endian = "big")] + #[cfg(all(not(gnu_time_bits64), target_endian = "big"))] __glibc_reserved2: c_ulong, pub msg_rtime: crate::time_t, - #[cfg(target_endian = "little")] + #[cfg(all(not(gnu_time_bits64), target_endian = "little"))] __glibc_reserved2: c_ulong, - #[cfg(target_endian = "big")] + #[cfg(all(not(gnu_time_bits64), target_endian = "big"))] __glibc_reserved3: c_ulong, pub msg_ctime: crate::time_t, #[cfg(target_endian = "little")] __glibc_reserved3: c_ulong, - pub __msg_cbytes: c_ulong, + __msg_cbytes: c_ulong, pub msg_qnum: crate::msgqnum_t, pub msg_qbytes: crate::msglen_t, pub msg_lspid: crate::pid_t,
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b32/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b32/mod.rs index e9a9584..fe843a7 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b32/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b32/mod.rs
@@ -15,6 +15,7 @@ pub type fsblkcnt64_t = u64; pub type fsfilcnt64_t = u64; pub type __syscall_ulong_t = c_ulong; +pub type __suseconds64_t = i64; cfg_if! { if #[cfg(target_arch = "riscv32")] { @@ -29,6 +30,18 @@ pub type fsfilcnt_t = u64; pub type rlim_t = u64; pub type blksize_t = i64; + } else if #[cfg(gnu_time_bits64)] { + pub type time_t = i64; + pub type suseconds_t = i32; + type __ino_t = c_ulong; + type __ino64_t = u64; + pub type ino_t = __ino64_t; + pub type off_t = i64; + pub type blkcnt_t = i64; + pub type fsblkcnt_t = u64; + pub type fsfilcnt_t = u64; + pub type rlim_t = u64; + pub type blksize_t = i32; } else if #[cfg(gnu_file_offset_bits64)] { pub type time_t = i32; pub type suseconds_t = i32; @@ -67,11 +80,12 @@ pub struct stat { pub st_dev: crate::dev_t, + #[cfg(not(gnu_time_bits64))] __pad1: c_uint, - #[cfg(not(gnu_file_offset_bits64))] + #[cfg(any(gnu_time_bits64, not(gnu_file_offset_bits64)))] pub st_ino: crate::ino_t, - #[cfg(all(gnu_file_offset_bits64))] + #[cfg(all(not(gnu_time_bits64), gnu_file_offset_bits64))] __st_ino: __ino_t, pub st_mode: crate::mode_t, @@ -81,6 +95,7 @@ pub st_rdev: crate::dev_t, + #[cfg(not(gnu_time_bits64))] __pad2: c_uint, pub st_size: off_t, @@ -90,16 +105,22 @@ pub st_atime: crate::time_t, pub st_atime_nsec: c_long, + #[cfg(gnu_time_bits64)] + _atime_pad: c_int, pub st_mtime: crate::time_t, pub st_mtime_nsec: c_long, + #[cfg(gnu_time_bits64)] + _mtime_pad: c_int, pub st_ctime: crate::time_t, pub st_ctime_nsec: c_long, + #[cfg(gnu_time_bits64)] + _ctime_pad: c_int, #[cfg(not(gnu_file_offset_bits64))] __glibc_reserved4: c_long, #[cfg(not(gnu_file_offset_bits64))] __glibc_reserved5: c_long, - #[cfg(gnu_file_offset_bits64)] + #[cfg(all(not(gnu_time_bits64), gnu_file_offset_bits64))] pub st_ino: crate::ino_t, } } @@ -154,28 +175,114 @@ pub struct semid_ds { pub sem_perm: ipc_perm, - #[cfg(target_arch = "powerpc")] + #[cfg(all(not(gnu_time_bits64), target_arch = "powerpc"))] __reserved: crate::__syscall_ulong_t, pub sem_otime: crate::time_t, #[cfg(not(any( + gnu_time_bits64, target_arch = "mips", target_arch = "mips32r6", target_arch = "powerpc" )))] __reserved: crate::__syscall_ulong_t, - #[cfg(target_arch = "powerpc")] + #[cfg(all(not(gnu_time_bits64), target_arch = "powerpc"))] __reserved2: crate::__syscall_ulong_t, pub sem_ctime: crate::time_t, #[cfg(not(any( + gnu_time_bits64, target_arch = "mips", target_arch = "mips32r6", target_arch = "powerpc" )))] __reserved2: crate::__syscall_ulong_t, pub sem_nsems: crate::__syscall_ulong_t, + #[cfg(all( + gnu_time_bits64, + not(any( + target_arch = "mips", + target_arch = "mips32r6", + target_arch = "powerpc", + target_arch = "arm", + target_arch = "x86" + )) + ))] + __reserved2: crate::__syscall_ulong_t, __glibc_reserved3: crate::__syscall_ulong_t, __glibc_reserved4: crate::__syscall_ulong_t, } + + #[cfg(gnu_time_bits64)] + pub struct timex { + pub modes: c_uint, + _pad1: c_int, + pub offset: c_longlong, + pub freq: c_longlong, + pub maxerror: c_longlong, + pub esterror: c_longlong, + pub status: c_int, + _pad2: c_int, + pub constant: c_longlong, + pub precision: c_longlong, + pub tolerance: c_longlong, + pub time: crate::timeval, + pub tick: c_longlong, + pub ppsfreq: c_longlong, + pub jitter: c_longlong, + pub shift: c_int, + _pad3: c_int, + pub stabil: c_longlong, + pub jitcnt: c_longlong, + pub calcnt: c_longlong, + pub errcnt: c_longlong, + pub stbcnt: c_longlong, + pub tai: c_int, + pub __unused1: i32, + pub __unused2: i32, + pub __unused3: i32, + pub __unused4: i32, + pub __unused5: i32, + pub __unused6: i32, + pub __unused7: i32, + pub __unused8: i32, + pub __unused9: i32, + pub __unused10: i32, + pub __unused11: i32, + } + + #[cfg(not(gnu_time_bits64))] + pub struct timex { + pub modes: c_uint, + pub offset: c_long, + pub freq: c_long, + pub maxerror: c_long, + pub esterror: c_long, + pub status: c_int, + pub constant: c_long, + pub precision: c_long, + pub tolerance: c_long, + pub time: crate::timeval, + pub tick: c_long, + pub ppsfreq: c_long, + pub jitter: c_long, + pub shift: c_int, + pub stabil: c_long, + pub jitcnt: c_long, + pub calcnt: c_long, + pub errcnt: c_long, + pub stbcnt: c_long, + pub tai: c_int, + pub __unused1: i32, + pub __unused2: i32, + pub __unused3: i32, + pub __unused4: i32, + pub __unused5: i32, + pub __unused6: i32, + pub __unused7: i32, + pub __unused8: i32, + pub __unused9: i32, + pub __unused10: i32, + pub __unused11: i32, + } } pub const POSIX_FADV_DONTNEED: c_int = 4;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b32/powerpc.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b32/powerpc.rs index 36da977..d562aac 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b32/powerpc.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b32/powerpc.rs
@@ -67,17 +67,26 @@ pub st_uid: crate::uid_t, pub st_gid: crate::gid_t, pub st_rdev: crate::dev_t, + #[cfg(not(gnu_time_bits64))] __pad2: c_ushort, pub st_size: off_t, pub st_blksize: crate::blksize_t, pub st_blocks: crate::blkcnt_t, pub st_atime: crate::time_t, + #[cfg(gnu_time_bits64)] + _atime_pad: c_int, pub st_atime_nsec: c_long, pub st_mtime: crate::time_t, + #[cfg(gnu_time_bits64)] + _mtime_pad: c_int, pub st_mtime_nsec: c_long, pub st_ctime: crate::time_t, + #[cfg(gnu_time_bits64)] + _ctime_pad: c_int, pub st_ctime_nsec: c_long, + #[cfg(not(gnu_time_bits64))] __glibc_reserved4: c_ulong, + #[cfg(not(gnu_time_bits64))] __glibc_reserved5: c_ulong, } @@ -89,17 +98,26 @@ pub st_uid: crate::uid_t, pub st_gid: crate::gid_t, pub st_rdev: crate::dev_t, + #[cfg(not(gnu_time_bits64))] __pad2: c_ushort, pub st_size: off64_t, pub st_blksize: crate::blksize_t, pub st_blocks: crate::blkcnt64_t, pub st_atime: crate::time_t, + #[cfg(gnu_time_bits64)] + _atime_pad: c_int, pub st_atime_nsec: c_long, pub st_mtime: crate::time_t, + #[cfg(gnu_time_bits64)] + _mtime_pad: c_int, pub st_mtime_nsec: c_long, pub st_ctime: crate::time_t, + #[cfg(gnu_time_bits64)] + _ctime_pad: c_int, pub st_ctime_nsec: c_long, + #[cfg(not(gnu_time_bits64))] __glibc_reserved4: c_ulong, + #[cfg(not(gnu_time_bits64))] __glibc_reserved5: c_ulong, } @@ -136,13 +154,20 @@ pub struct shmid_ds { pub shm_perm: crate::ipc_perm, + #[cfg(gnu_time_bits64)] + pub shm_segsz: size_t, + #[cfg(not(gnu_time_bits64))] __glibc_reserved1: c_uint, pub shm_atime: crate::time_t, + #[cfg(not(gnu_time_bits64))] __glibc_reserved2: c_uint, pub shm_dtime: crate::time_t, + #[cfg(not(gnu_time_bits64))] __glibc_reserved3: c_uint, pub shm_ctime: crate::time_t, + #[cfg(not(gnu_time_bits64))] __glibc_reserved4: c_uint, + #[cfg(not(gnu_time_bits64))] pub shm_segsz: size_t, pub shm_cpid: crate::pid_t, pub shm_lpid: crate::pid_t, @@ -153,10 +178,13 @@ pub struct msqid_ds { pub msg_perm: crate::ipc_perm, + #[cfg(not(gnu_time_bits64))] __glibc_reserved1: c_uint, pub msg_stime: crate::time_t, + #[cfg(not(gnu_time_bits64))] __glibc_reserved2: c_uint, pub msg_rtime: crate::time_t, + #[cfg(not(gnu_time_bits64))] __glibc_reserved3: c_uint, pub msg_ctime: crate::time_t, pub __msg_cbytes: c_ulong,
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b32/sparc/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b32/sparc/mod.rs index 7533ad6..03760e72 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b32/sparc/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b32/sparc/mod.rs
@@ -154,12 +154,18 @@ pub struct shmid_ds { pub shm_perm: crate::ipc_perm, + #[cfg(gnu_time_bits64)] + pub shm_segsz: size_t, + #[cfg(not(gnu_time_bits64))] __pad1: c_uint, pub shm_atime: crate::time_t, + #[cfg(not(gnu_time_bits64))] __pad2: c_uint, pub shm_dtime: crate::time_t, + #[cfg(not(gnu_time_bits64))] __pad3: c_uint, pub shm_ctime: crate::time_t, + #[cfg(not(gnu_time_bits64))] pub shm_segsz: size_t, pub shm_cpid: crate::pid_t, pub shm_lpid: crate::pid_t, @@ -170,19 +176,22 @@ pub struct msqid_ds { pub msg_perm: crate::ipc_perm, + #[cfg(not(gnu_time_bits64))] __pad1: c_uint, pub msg_stime: crate::time_t, + #[cfg(not(gnu_time_bits64))] __pad2: c_uint, pub msg_rtime: crate::time_t, + #[cfg(not(gnu_time_bits64))] __pad3: c_uint, pub msg_ctime: crate::time_t, - pub __msg_cbytes: c_ushort, + pub __msg_cbytes: c_ulong, pub msg_qnum: crate::msgqnum_t, pub msg_qbytes: crate::msglen_t, pub msg_lspid: crate::pid_t, pub msg_lrpid: crate::pid_t, - __glibc_reserved1: c_ulong, - __glibc_reserved2: c_ulong, + __glibc_reserved4: c_ulong, + __glibc_reserved5: c_ulong, } }
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b32/x86/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b32/x86/mod.rs index c0eb9e8..0f23f003 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b32/x86/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b32/x86/mod.rs
@@ -134,23 +134,35 @@ pub struct stat64 { pub st_dev: crate::dev_t, + #[cfg(not(gnu_time_bits64))] __pad1: c_uint, + #[cfg(not(gnu_time_bits64))] __st_ino: c_ulong, + #[cfg(gnu_time_bits64)] + pub st_ino: crate::ino_t, pub st_mode: crate::mode_t, pub st_nlink: crate::nlink_t, pub st_uid: crate::uid_t, pub st_gid: crate::gid_t, pub st_rdev: crate::dev_t, + #[cfg(not(gnu_time_bits64))] __pad2: c_uint, pub st_size: off64_t, pub st_blksize: crate::blksize_t, pub st_blocks: crate::blkcnt64_t, pub st_atime: crate::time_t, pub st_atime_nsec: c_long, + #[cfg(gnu_time_bits64)] + _atime_pad: c_int, pub st_mtime: crate::time_t, pub st_mtime_nsec: c_long, + #[cfg(gnu_time_bits64)] + _mtime_pad: c_int, pub st_ctime: crate::time_t, pub st_ctime_nsec: c_long, + #[cfg(gnu_time_bits64)] + _ctime_pad: c_int, + #[cfg(not(gnu_time_bits64))] pub st_ino: crate::ino64_t, } @@ -189,10 +201,13 @@ pub shm_perm: crate::ipc_perm, pub shm_segsz: size_t, pub shm_atime: crate::time_t, + #[cfg(not(gnu_time_bits64))] __unused1: c_ulong, pub shm_dtime: crate::time_t, + #[cfg(not(gnu_time_bits64))] __unused2: c_ulong, pub shm_ctime: crate::time_t, + #[cfg(not(gnu_time_bits64))] __unused3: c_ulong, pub shm_cpid: crate::pid_t, pub shm_lpid: crate::pid_t, @@ -204,10 +219,13 @@ pub struct msqid_ds { pub msg_perm: crate::ipc_perm, pub msg_stime: crate::time_t, + #[cfg(not(gnu_time_bits64))] __glibc_reserved1: c_ulong, pub msg_rtime: crate::time_t, + #[cfg(not(gnu_time_bits64))] __glibc_reserved2: c_ulong, pub msg_ctime: crate::time_t, + #[cfg(not(gnu_time_bits64))] __glibc_reserved3: c_ulong, pub __msg_cbytes: c_ulong, pub msg_qnum: crate::msgqnum_t, @@ -296,26 +314,6 @@ impl Eq for user_fpxregs_struct {} - impl fmt::Debug for user_fpxregs_struct { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("user_fpxregs_struct") - .field("cwd", &self.cwd) - .field("swd", &self.swd) - .field("twd", &self.twd) - .field("fop", &self.fop) - .field("fip", &self.fip) - .field("fcs", &self.fcs) - .field("foo", &self.foo) - .field("fos", &self.fos) - .field("mxcsr", &self.mxcsr) - // Ignore __reserved field - .field("st_space", &self.st_space) - .field("xmm_space", &self.xmm_space) - // Ignore padding field - .finish() - } - } - impl hash::Hash for user_fpxregs_struct { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.cwd.hash(state); @@ -347,19 +345,6 @@ impl Eq for ucontext_t {} - impl fmt::Debug for ucontext_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("ucontext_t") - .field("uc_flags", &self.uc_flags) - .field("uc_link", &self.uc_link) - .field("uc_stack", &self.uc_stack) - .field("uc_mcontext", &self.uc_mcontext) - .field("uc_sigmask", &self.uc_sigmask) - // Ignore __private field - .finish() - } - } - impl hash::Hash for ucontext_t { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.uc_flags.hash(state);
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b64/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b64/mod.rs index 9d7608f6..ba5678b 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b64/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b64/mod.rs
@@ -97,6 +97,85 @@ __glibc_reserved3: crate::__syscall_ulong_t, __glibc_reserved4: crate::__syscall_ulong_t, } + + pub struct timex { + pub modes: c_uint, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub offset: i64, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub offset: c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub freq: i64, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub freq: c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub maxerror: i64, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub maxerror: c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub esterror: i64, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub esterror: c_long, + pub status: c_int, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub constant: i64, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub constant: c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub precision: i64, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub precision: c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub tolerance: i64, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub tolerance: c_long, + pub time: crate::timeval, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub tick: i64, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub tick: c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub ppsfreq: i64, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub ppsfreq: c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub jitter: i64, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub jitter: c_long, + pub shift: c_int, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub stabil: i64, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub stabil: c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub jitcnt: i64, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub jitcnt: c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub calcnt: i64, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub calcnt: c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub errcnt: i64, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub errcnt: c_long, + #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] + pub stbcnt: i64, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub stbcnt: c_long, + pub tai: c_int, + pub __unused1: i32, + pub __unused2: i32, + pub __unused3: i32, + pub __unused4: i32, + pub __unused5: i32, + pub __unused6: i32, + pub __unused7: i32, + pub __unused8: i32, + pub __unused9: i32, + pub __unused10: i32, + pub __unused11: i32, + } } pub const __SIZEOF_PTHREAD_RWLOCKATTR_T: usize = 8; @@ -119,7 +198,7 @@ } else if #[cfg(any(target_arch = "s390x"))] { mod s390x; pub use self::s390x::*; - } else if #[cfg(any(target_arch = "x86_64"))] { + } else if #[cfg(target_arch = "x86_64")] { mod x86_64; pub use self::x86_64::*; } else if #[cfg(any(target_arch = "riscv64"))] {
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b64/riscv64/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b64/riscv64/mod.rs index 578057c..d689bb1 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b64/riscv64/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b64/riscv64/mod.rs
@@ -601,6 +601,7 @@ pub const COMPAT_HWCAP_ISA_I: c_ulong = 1 << (b'I' - b'A'); pub const COMPAT_HWCAP_ISA_M: c_ulong = 1 << (b'M' - b'A'); +#[allow(clippy::eq_op)] pub const COMPAT_HWCAP_ISA_A: c_ulong = 1 << (b'A' - b'A'); pub const COMPAT_HWCAP_ISA_F: c_ulong = 1 << (b'F' - b'A'); pub const COMPAT_HWCAP_ISA_D: c_ulong = 1 << (b'D' - b'A');
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b64/s390x.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b64/s390x.rs index c08e1210..aa42a02 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b64/s390x.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b64/s390x.rs
@@ -227,15 +227,9 @@ impl Eq for fpreg_t {} - impl fmt::Debug for fpreg_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("fpreg_t").field("d", &self.d).finish() - } - } - impl hash::Hash for fpreg_t { fn hash<H: hash::Hasher>(&self, state: &mut H) { - let d: u64 = unsafe { mem::transmute(self.d) }; + let d: u64 = self.d.to_bits(); d.hash(state); } }
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs index 9bcc271..e76ae751 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/b64/x86_64/mod.rs
@@ -346,23 +346,6 @@ impl Eq for user_fpregs_struct {} - impl fmt::Debug for user_fpregs_struct { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("user_fpregs_struct") - .field("cwd", &self.cwd) - .field("ftw", &self.ftw) - .field("fop", &self.fop) - .field("rip", &self.rip) - .field("rdp", &self.rdp) - .field("mxcsr", &self.mxcsr) - .field("mxcr_mask", &self.mxcr_mask) - .field("st_space", &self.st_space) - // FIXME(debug): .field("xmm_space", &self.xmm_space) - // Ignore padding field - .finish() - } - } - impl hash::Hash for user_fpregs_struct { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.cwd.hash(state); @@ -391,19 +374,6 @@ impl Eq for ucontext_t {} - impl fmt::Debug for ucontext_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("ucontext_t") - .field("uc_flags", &self.uc_flags) - .field("uc_link", &self.uc_link) - .field("uc_stack", &self.uc_stack) - .field("uc_mcontext", &self.uc_mcontext) - .field("uc_sigmask", &self.uc_sigmask) - // Ignore __private field - .finish() - } - } - impl hash::Hash for ucontext_t { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.uc_flags.hash(state);
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/mod.rs index 823f495..4fc9a0aa 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/gnu/mod.rs
@@ -174,85 +174,6 @@ pub rt_irtt: c_ushort, } - pub struct timex { - pub modes: c_uint, - #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] - pub offset: i64, - #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] - pub offset: c_long, - #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] - pub freq: i64, - #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] - pub freq: c_long, - #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] - pub maxerror: i64, - #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] - pub maxerror: c_long, - #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] - pub esterror: i64, - #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] - pub esterror: c_long, - pub status: c_int, - #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] - pub constant: i64, - #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] - pub constant: c_long, - #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] - pub precision: i64, - #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] - pub precision: c_long, - #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] - pub tolerance: i64, - #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] - pub tolerance: c_long, - pub time: crate::timeval, - #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] - pub tick: i64, - #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] - pub tick: c_long, - #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] - pub ppsfreq: i64, - #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] - pub ppsfreq: c_long, - #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] - pub jitter: i64, - #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] - pub jitter: c_long, - pub shift: c_int, - #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] - pub stabil: i64, - #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] - pub stabil: c_long, - #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] - pub jitcnt: i64, - #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] - pub jitcnt: c_long, - #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] - pub calcnt: i64, - #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] - pub calcnt: c_long, - #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] - pub errcnt: i64, - #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] - pub errcnt: c_long, - #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] - pub stbcnt: i64, - #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] - pub stbcnt: c_long, - pub tai: c_int, - pub __unused1: i32, - pub __unused2: i32, - pub __unused3: i32, - pub __unused4: i32, - pub __unused5: i32, - pub __unused6: i32, - pub __unused7: i32, - pub __unused8: i32, - pub __unused9: i32, - pub __unused10: i32, - pub __unused11: i32, - } - pub struct ntptimeval { pub time: crate::timeval, pub maxerror: c_long, @@ -436,6 +357,18 @@ __pos: off64_t, __state: crate::mbstate_t, } + + // linux x32 compatibility + // See https://sourceware.org/bugzilla/show_bug.cgi?id=16437 + pub struct timespec { + pub tv_sec: time_t, + #[cfg(all(gnu_time_bits64, target_endian = "big"))] + __pad: i32, + #[cfg(not(all(target_arch = "x86_64", target_pointer_width = "32")))] + pub tv_nsec: c_long, + #[cfg(all(gnu_time_bits64, target_endian = "little"))] + __pad: i32, + } } impl siginfo_t { @@ -447,7 +380,7 @@ _si_code: c_int, si_addr: *mut c_void, } - (*(self as *const siginfo_t as *const siginfo_sigfault)).si_addr + (*(self as *const siginfo_t).cast::<siginfo_sigfault>()).si_addr } pub unsafe fn si_value(&self) -> crate::sigval { @@ -460,7 +393,7 @@ _si_overrun: c_int, si_sigval: crate::sigval, } - (*(self as *const siginfo_t as *const siginfo_timer)).si_sigval + (*(self as *const siginfo_t).cast::<siginfo_timer>()).si_sigval } } @@ -498,7 +431,7 @@ impl siginfo_t { unsafe fn sifields(&self) -> &sifields { - &(*(self as *const siginfo_t as *const siginfo_f)).sifields + &(*(self as *const siginfo_t).cast::<siginfo_f>()).sifields } pub unsafe fn si_pid(&self) -> crate::pid_t { @@ -522,19 +455,13 @@ } } -pub union __c_anonymous_ptrace_syscall_info_data { - pub entry: __c_anonymous_ptrace_syscall_info_entry, - pub exit: __c_anonymous_ptrace_syscall_info_exit, - pub seccomp: __c_anonymous_ptrace_syscall_info_seccomp, -} -impl Copy for __c_anonymous_ptrace_syscall_info_data {} -impl Clone for __c_anonymous_ptrace_syscall_info_data { - fn clone(&self) -> __c_anonymous_ptrace_syscall_info_data { - *self - } -} - s_no_extra_traits! { + pub union __c_anonymous_ptrace_syscall_info_data { + pub entry: __c_anonymous_ptrace_syscall_info_entry, + pub exit: __c_anonymous_ptrace_syscall_info_exit, + pub seccomp: __c_anonymous_ptrace_syscall_info_seccomp, + } + pub struct utmpx { pub ut_type: c_short, pub ut_pid: crate::pid_t, @@ -604,24 +531,6 @@ impl Eq for utmpx {} - impl fmt::Debug for utmpx { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("utmpx") - .field("ut_type", &self.ut_type) - .field("ut_pid", &self.ut_pid) - .field("ut_line", &self.ut_line) - .field("ut_id", &self.ut_id) - .field("ut_user", &self.ut_user) - // FIXME(debug): .field("ut_host", &self.ut_host) - .field("ut_exit", &self.ut_exit) - .field("ut_session", &self.ut_session) - .field("ut_tv", &self.ut_tv) - .field("ut_addr_v6", &self.ut_addr_v6) - .field("__glibc_reserved", &self.__glibc_reserved) - .finish() - } - } - impl hash::Hash for utmpx { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.ut_type.hash(state); @@ -650,18 +559,6 @@ impl Eq for __c_anonymous_ptrace_syscall_info_data {} - impl fmt::Debug for __c_anonymous_ptrace_syscall_info_data { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - unsafe { - f.debug_struct("__c_anonymous_ptrace_syscall_info_data") - .field("entry", &self.entry) - .field("exit", &self.exit) - .field("seccomp", &self.seccomp) - .finish() - } - } - } - impl hash::Hash for __c_anonymous_ptrace_syscall_info_data { fn hash<H: hash::Hasher>(&self, state: &mut H) { unsafe { @@ -751,7 +648,6 @@ pub const RTLD_DI_TLS_DATA: c_int = 10; pub const SOCK_NONBLOCK: c_int = O_NONBLOCK; -pub const PIDFD_NONBLOCK: c_uint = O_NONBLOCK as c_uint; pub const SOL_RXRPC: c_int = 272; pub const SOL_PPPOL2TP: c_int = 273; @@ -943,15 +839,6 @@ pub const PTRACE_SET_SYSCALL_USER_DISPATCH_CONFIG: crate::__u8 = 0x4210; pub const PTRACE_GET_SYSCALL_USER_DISPATCH_CONFIG: crate::__u8 = 0x4211; -// linux/fs.h - -// Flags for preadv2/pwritev2 -pub const RWF_HIPRI: c_int = 0x00000001; -pub const RWF_DSYNC: c_int = 0x00000002; -pub const RWF_SYNC: c_int = 0x00000004; -pub const RWF_NOWAIT: c_int = 0x00000008; -pub const RWF_APPEND: c_int = 0x00000010; - // linux/rtnetlink.h pub const TCA_PAD: c_ushort = 9; pub const TCA_DUMP_INVISIBLE: c_ushort = 10; @@ -1159,33 +1046,6 @@ pub const REG_ESIZE: c_int = 15; pub const REG_ERPAREN: c_int = 16; -cfg_if! { - if #[cfg(any( - target_arch = "x86", - target_arch = "x86_64", - target_arch = "arm", - target_arch = "aarch64", - target_arch = "loongarch64", - target_arch = "riscv64", - target_arch = "s390x" - ))] { - pub const TUNSETCARRIER: Ioctl = 0x400454e2; - pub const TUNGETDEVNETNS: Ioctl = 0x54e3; - } else if #[cfg(any( - target_arch = "mips", - target_arch = "mips64", - target_arch = "powerpc", - target_arch = "powerpc64", - target_arch = "sparc", - target_arch = "sparc64" - ))] { - pub const TUNSETCARRIER: Ioctl = 0x800454e2; - pub const TUNGETDEVNETNS: Ioctl = 0x200054e3; - } else { - // Unknown target_arch - } -} - extern "C" { pub fn fgetspent_r( fp: *mut crate::FILE, @@ -1214,12 +1074,14 @@ compar: Option<unsafe extern "C" fn(*const c_void, *const c_void, *mut c_void) -> c_int>, arg: *mut c_void, ); + #[cfg_attr(gnu_time_bits64, link_name = "__sendmmsg64")] pub fn sendmmsg( sockfd: c_int, msgvec: *mut crate::mmsghdr, vlen: c_uint, flags: c_int, ) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__recvmmsg64")] pub fn recvmmsg( sockfd: c_int, msgvec: *mut crate::mmsghdr, @@ -1258,15 +1120,20 @@ pub fn endutxent(); pub fn getpt() -> c_int; pub fn mallopt(param: c_int, value: c_int) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__gettimeofday64")] pub fn gettimeofday(tp: *mut crate::timeval, tz: *mut crate::timezone) -> c_int; pub fn getentropy(buf: *mut c_void, buflen: size_t) -> c_int; pub fn getrandom(buf: *mut c_void, buflen: size_t, flags: c_uint) -> ssize_t; pub fn getauxval(type_: c_ulong) -> c_ulong; + #[cfg_attr(gnu_time_bits64, link_name = "___adjtimex64")] pub fn adjtimex(buf: *mut timex) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "___adjtimex64")] pub fn ntp_adjtime(buf: *mut timex) -> c_int; - #[link_name = "ntp_gettimex"] + #[cfg_attr(not(gnu_time_bits64), link_name = "ntp_gettimex")] + #[cfg_attr(gnu_time_bits64, link_name = "__ntp_gettime64")] pub fn ntp_gettime(buf: *mut ntptimeval) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__clock_adjtime64")] pub fn clock_adjtime(clk_id: crate::clockid_t, buf: *mut crate::timex) -> c_int; pub fn fanotify_mark( @@ -1321,12 +1188,14 @@ pub fn ctermid(s: *mut c_char) -> *mut c_char; pub fn backtrace(buf: *mut *mut c_void, sz: c_int) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__glob64_time64")] pub fn glob64( pattern: *const c_char, flags: c_int, errfunc: Option<extern "C" fn(epath: *const c_char, errno: c_int) -> c_int>, pglob: *mut glob64_t, ) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__globfree64_time64")] pub fn globfree64(pglob: *mut glob64_t); pub fn ptrace(request: c_uint, ...) -> c_long; pub fn pthread_attr_getaffinity_np( @@ -1394,6 +1263,7 @@ pub fn eaccess(pathname: *const c_char, mode: c_int) -> c_int; pub fn asctime_r(tm: *const crate::tm, buf: *mut c_char) -> *mut c_char; + #[cfg_attr(gnu_time_bits64, link_name = "__ctime64_r")] pub fn ctime_r(timep: *const time_t, buf: *mut c_char) -> *mut c_char; pub fn dirname(path: *mut c_char) -> *mut c_char; @@ -1458,6 +1328,7 @@ pub fn mq_notify(mqdes: crate::mqd_t, sevp: *const crate::sigevent) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__epoll_pwait2_time64")] pub fn epoll_pwait2( epfd: c_int, events: *mut crate::epoll_event,
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/mod.rs index 5be701be..9439ce2 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/mod.rs
@@ -3,6 +3,7 @@ use core::mem::size_of; use crate::prelude::*; +use crate::{sock_filter, _IO, _IOR, _IOW, _IOWR}; pub type useconds_t = u32; pub type dev_t = u64; @@ -93,6 +94,16 @@ } } +c_enum! { + pid_type { + PIDTYPE_PID, + PIDTYPE_TGID, + PIDTYPE_PGID, + PIDTYPE_SID, + PIDTYPE_MAX, + } +} + s! { pub struct glob_t { pub gl_pathc: size_t, @@ -748,19 +759,6 @@ pub addr_mask: u8, } - // linux/filter.h - pub struct sock_filter { - pub code: __u16, - pub jt: __u8, - pub jf: __u8, - pub k: __u32, - } - - pub struct sock_fprog { - pub len: c_ushort, - pub filter: *mut sock_filter, - } - // linux/seccomp.h pub struct seccomp_data { pub nr: c_int, @@ -815,13 +813,6 @@ pub nla_type: u16, } - pub struct file_clone_range { - pub src_fd: crate::__s64, - pub src_offset: crate::__u64, - pub src_length: crate::__u64, - pub dest_offset: crate::__u64, - } - pub struct __c_anonymous_ifru_map { pub mem_start: c_ulong, pub mem_end: c_ulong, @@ -1366,6 +1357,32 @@ pub userns_fd: crate::__u64, } + // linux/nsfs.h + pub struct mnt_ns_info { + pub size: crate::__u32, + pub nr_mounts: crate::__u32, + pub mnt_ns_id: crate::__u64, + } + + // linux/pidfd.h + + pub struct pidfd_info { + mask: crate::__u64, + cgroupid: crate::__u64, + pid: crate::__u32, + tgid: crate::__u32, + ppid: crate::__u32, + ruid: crate::__u32, + rgid: crate::__u32, + euid: crate::__u32, + egid: crate::__u32, + suid: crate::__u32, + sgid: crate::__u32, + fsuid: crate::__u32, + fsgid: crate::__u32, + exit_code: crate::__s32, + } + // linux/uio.h pub struct dmabuf_cmsg { @@ -1863,15 +1880,6 @@ } } impl Eq for sockaddr_nl {} - impl fmt::Debug for sockaddr_nl { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sockaddr_nl") - .field("nl_family", &self.nl_family) - .field("nl_pid", &self.nl_pid) - .field("nl_groups", &self.nl_groups) - .finish() - } - } impl hash::Hash for sockaddr_nl { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.nl_family.hash(state); @@ -1896,18 +1904,6 @@ impl Eq for dirent {} - impl fmt::Debug for dirent { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("dirent") - .field("d_ino", &self.d_ino) - .field("d_off", &self.d_off) - .field("d_reclen", &self.d_reclen) - .field("d_type", &self.d_type) - // FIXME(debug): .field("d_name", &self.d_name) - .finish() - } - } - impl hash::Hash for dirent { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.d_ino.hash(state); @@ -1934,18 +1930,6 @@ impl Eq for dirent64 {} - impl fmt::Debug for dirent64 { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("dirent64") - .field("d_ino", &self.d_ino) - .field("d_off", &self.d_off) - .field("d_reclen", &self.d_reclen) - .field("d_type", &self.d_type) - // FIXME(debug): .field("d_name", &self.d_name) - .finish() - } - } - impl hash::Hash for dirent64 { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.d_ino.hash(state); @@ -1964,14 +1948,6 @@ impl Eq for pthread_cond_t {} - impl fmt::Debug for pthread_cond_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("pthread_cond_t") - // FIXME(debug): .field("size", &self.size) - .finish() - } - } - impl hash::Hash for pthread_cond_t { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.size.hash(state); @@ -1986,14 +1962,6 @@ impl Eq for pthread_mutex_t {} - impl fmt::Debug for pthread_mutex_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("pthread_mutex_t") - // FIXME(debug): .field("size", &self.size) - .finish() - } - } - impl hash::Hash for pthread_mutex_t { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.size.hash(state); @@ -2008,14 +1976,6 @@ impl Eq for pthread_rwlock_t {} - impl fmt::Debug for pthread_rwlock_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("pthread_rwlock_t") - // FIXME(debug): .field("size", &self.size) - .finish() - } - } - impl hash::Hash for pthread_rwlock_t { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.size.hash(state); @@ -2030,14 +1990,6 @@ impl Eq for pthread_barrier_t {} - impl fmt::Debug for pthread_barrier_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("pthread_barrier_t") - .field("size", &self.size) - .finish() - } - } - impl hash::Hash for pthread_barrier_t { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.size.hash(state); @@ -2064,18 +2016,6 @@ impl Eq for sockaddr_alg {} - impl fmt::Debug for sockaddr_alg { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sockaddr_alg") - .field("salg_family", &self.salg_family) - .field("salg_type", &self.salg_type) - .field("salg_feat", &self.salg_feat) - .field("salg_mask", &self.salg_mask) - .field("salg_name", &&self.salg_name[..]) - .finish() - } - } - impl hash::Hash for sockaddr_alg { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.salg_family.hash(state); @@ -2095,16 +2035,6 @@ } impl Eq for uinput_setup {} - impl fmt::Debug for uinput_setup { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("uinput_setup") - .field("id", &self.id) - .field("name", &&self.name[..]) - .field("ff_effects_max", &self.ff_effects_max) - .finish() - } - } - impl hash::Hash for uinput_setup { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.id.hash(state); @@ -2126,20 +2056,6 @@ } impl Eq for uinput_user_dev {} - impl fmt::Debug for uinput_user_dev { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("uinput_setup") - .field("name", &&self.name[..]) - .field("id", &self.id) - .field("ff_effects_max", &self.ff_effects_max) - .field("absmax", &&self.absmax[..]) - .field("absmin", &&self.absmin[..]) - .field("absfuzz", &&self.absfuzz[..]) - .field("absflat", &&self.absflat[..]) - .finish() - } - } - impl hash::Hash for uinput_user_dev { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.name.hash(state); @@ -2170,15 +2086,6 @@ impl Eq for af_alg_iv {} #[allow(deprecated)] - impl fmt::Debug for af_alg_iv { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("af_alg_iv") - .field("ivlen", &self.ivlen) - .finish() - } - } - - #[allow(deprecated)] impl hash::Hash for af_alg_iv { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.as_slice().hash(state); @@ -2194,16 +2101,6 @@ } } impl Eq for mq_attr {} - impl fmt::Debug for mq_attr { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("mq_attr") - .field("mq_flags", &self.mq_flags) - .field("mq_maxmsg", &self.mq_maxmsg) - .field("mq_msgsize", &self.mq_msgsize) - .field("mq_curmsgs", &self.mq_curmsgs) - .finish() - } - } impl hash::Hash for mq_attr { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.mq_flags.hash(state); @@ -2212,31 +2109,6 @@ self.mq_curmsgs.hash(state); } } - impl fmt::Debug for ifreq { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("ifreq") - .field("ifr_name", &self.ifr_name) - .field("ifr_ifru", &self.ifr_ifru) - .finish() - } - } - impl fmt::Debug for ifconf { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("ifconf") - .field("ifc_len", &self.ifc_len) - .field("ifc_ifcu", &self.ifc_ifcu) - .finish() - } - } - impl fmt::Debug for hwtstamp_config { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("hwtstamp_config") - .field("flags", &self.flags) - .field("tx_type", &self.tx_type) - .field("rx_filter", &self.rx_filter) - .finish() - } - } impl PartialEq for hwtstamp_config { fn eq(&self, other: &hwtstamp_config) -> bool { self.flags == other.flags @@ -2253,20 +2125,6 @@ } } - impl fmt::Debug for sched_attr { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sched_attr") - .field("size", &self.size) - .field("sched_policy", &self.sched_policy) - .field("sched_flags", &self.sched_flags) - .field("sched_nice", &self.sched_nice) - .field("sched_priority", &self.sched_priority) - .field("sched_runtime", &self.sched_runtime) - .field("sched_deadline", &self.sched_deadline) - .field("sched_period", &self.sched_period) - .finish() - } - } impl PartialEq for sched_attr { fn eq(&self, other: &sched_attr) -> bool { self.size == other.size @@ -2292,25 +2150,6 @@ self.sched_period.hash(state); } } - - impl fmt::Debug for iw_event { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("iw_event") - .field("len", &self.len) - .field("cmd", &self.cmd) - .field("u", &self.u) - .finish() - } - } - - impl fmt::Debug for iwreq { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("iwreq") - .field("ifr_ifrn", &self.ifr_ifrn) - .field("u", &self.u) - .finish() - } - } } } @@ -2861,6 +2700,18 @@ pub const IFA_F_MCAUTOJOIN: u32 = 0x400; pub const IFA_F_STABLE_PRIVACY: u32 = 0x800; +// linux/fs.h + +// Flags for preadv2/pwritev2 +pub const RWF_HIPRI: c_int = 0x00000001; +pub const RWF_DSYNC: c_int = 0x00000002; +pub const RWF_SYNC: c_int = 0x00000004; +pub const RWF_NOWAIT: c_int = 0x00000008; +pub const RWF_APPEND: c_int = 0x00000010; +pub const RWF_NOAPPEND: c_int = 0x00000020; +pub const RWF_ATOMIC: c_int = 0x00000040; +pub const RWF_DONTCACHE: c_int = 0x00000080; + // linux/if_link.h pub const IFLA_UNSPEC: c_ushort = 0; pub const IFLA_ADDRESS: c_ushort = 1; @@ -2933,46 +2784,6 @@ pub const IFLA_INFO_SLAVE_KIND: c_ushort = 4; pub const IFLA_INFO_SLAVE_DATA: c_ushort = 5; -// linux/if_tun.h -/* TUNSETIFF ifr flags */ -pub const IFF_TUN: c_int = 0x0001; -pub const IFF_TAP: c_int = 0x0002; -pub const IFF_NAPI: c_int = 0x0010; -pub const IFF_NAPI_FRAGS: c_int = 0x0020; -// Used in TUNSETIFF to bring up tun/tap without carrier -pub const IFF_NO_CARRIER: c_int = 0x0040; -pub const IFF_NO_PI: c_int = 0x1000; -// Read queue size -pub const TUN_READQ_SIZE: c_short = 500; -// TUN device type flags: deprecated. Use IFF_TUN/IFF_TAP instead. -pub const TUN_TUN_DEV: c_short = crate::IFF_TUN as c_short; -pub const TUN_TAP_DEV: c_short = crate::IFF_TAP as c_short; -pub const TUN_TYPE_MASK: c_short = 0x000f; -// This flag has no real effect -pub const IFF_ONE_QUEUE: c_int = 0x2000; -pub const IFF_VNET_HDR: c_int = 0x4000; -pub const IFF_TUN_EXCL: c_int = 0x8000; -pub const IFF_MULTI_QUEUE: c_int = 0x0100; -pub const IFF_ATTACH_QUEUE: c_int = 0x0200; -pub const IFF_DETACH_QUEUE: c_int = 0x0400; -// read-only flag -pub const IFF_PERSIST: c_int = 0x0800; -pub const IFF_NOFILTER: c_int = 0x1000; -// Socket options -pub const TUN_TX_TIMESTAMP: c_int = 1; -// Features for GSO (TUNSETOFFLOAD) -pub const TUN_F_CSUM: c_uint = 0x01; -pub const TUN_F_TSO4: c_uint = 0x02; -pub const TUN_F_TSO6: c_uint = 0x04; -pub const TUN_F_TSO_ECN: c_uint = 0x08; -pub const TUN_F_UFO: c_uint = 0x10; -pub const TUN_F_USO4: c_uint = 0x20; -pub const TUN_F_USO6: c_uint = 0x40; -// Protocol info prepended to the packets (when IFF_NO_PI is not set) -pub const TUN_PKT_STRIP: c_int = 0x0001; -// Accept all multicast packets -pub const TUN_FLT_ALLMULTI: c_int = 0x0001; - // Since Linux 3.1 pub const SEEK_DATA: c_int = 3; pub const SEEK_HOLE: c_int = 4; @@ -3182,6 +2993,56 @@ pub const MREMAP_FIXED: c_int = 2; pub const MREMAP_DONTUNMAP: c_int = 4; +// linux/nsfs.h +const NSIO: c_uint = 0xb7; + +pub const NS_GET_USERNS: Ioctl = _IO(NSIO, 0x1); +pub const NS_GET_PARENT: Ioctl = _IO(NSIO, 0x2); +pub const NS_GET_NSTYPE: Ioctl = _IO(NSIO, 0x3); +pub const NS_GET_OWNER_UID: Ioctl = _IO(NSIO, 0x4); + +pub const NS_GET_MNTNS_ID: Ioctl = _IOR::<__u64>(NSIO, 0x5); + +pub const NS_GET_PID_FROM_PIDNS: Ioctl = _IOR::<c_int>(NSIO, 0x6); +pub const NS_GET_TGID_FROM_PIDNS: Ioctl = _IOR::<c_int>(NSIO, 0x7); +pub const NS_GET_PID_IN_PIDNS: Ioctl = _IOR::<c_int>(NSIO, 0x8); +pub const NS_GET_TGID_IN_PIDNS: Ioctl = _IOR::<c_int>(NSIO, 0x9); + +pub const MNT_NS_INFO_SIZE_VER0: Ioctl = 16; + +pub const NS_MNT_GET_INFO: Ioctl = _IOR::<mnt_ns_info>(NSIO, 10); +pub const NS_MNT_GET_NEXT: Ioctl = _IOR::<mnt_ns_info>(NSIO, 11); +pub const NS_MNT_GET_PREV: Ioctl = _IOR::<mnt_ns_info>(NSIO, 12); + +// linux/pidfd.h +pub const PIDFD_NONBLOCK: c_uint = O_NONBLOCK as c_uint; +pub const PIDFD_THREAD: c_uint = O_EXCL as c_uint; + +pub const PIDFD_SIGNAL_THREAD: c_uint = 1 << 0; +pub const PIDFD_SIGNAL_THREAD_GROUP: c_uint = 1 << 1; +pub const PIDFD_SIGNAL_PROCESS_GROUP: c_uint = 1 << 2; + +pub const PIDFD_INFO_PID: c_uint = 1 << 0; +pub const PIDFD_INFO_CREDS: c_uint = 1 << 1; +pub const PIDFD_INFO_CGROUPID: c_uint = 1 << 2; +pub const PIDFD_INFO_EXIT: c_uint = 1 << 3; + +pub const PIDFD_INFO_SIZE_VER0: c_uint = 64; + +const PIDFS_IOCTL_MAGIC: c_uint = 0xFF; +pub const PIDFD_GET_CGROUP_NAMESPACE: Ioctl = _IO(PIDFS_IOCTL_MAGIC, 1); +pub const PIDFD_GET_IPC_NAMESPACE: Ioctl = _IO(PIDFS_IOCTL_MAGIC, 2); +pub const PIDFD_GET_MNT_NAMESPACE: Ioctl = _IO(PIDFS_IOCTL_MAGIC, 3); +pub const PIDFD_GET_NET_NAMESPACE: Ioctl = _IO(PIDFS_IOCTL_MAGIC, 4); +pub const PIDFD_GET_PID_NAMESPACE: Ioctl = _IO(PIDFS_IOCTL_MAGIC, 5); +pub const PIDFD_GET_PID_FOR_CHILDREN_NAMESPACE: Ioctl = _IO(PIDFS_IOCTL_MAGIC, 6); +pub const PIDFD_GET_TIME_NAMESPACE: Ioctl = _IO(PIDFS_IOCTL_MAGIC, 7); +pub const PIDFD_GET_TIME_FOR_CHILDREN_NAMESPACE: Ioctl = _IO(PIDFS_IOCTL_MAGIC, 8); +pub const PIDFD_GET_USER_NAMESPACE: Ioctl = _IO(PIDFS_IOCTL_MAGIC, 9); +pub const PIDFD_GET_UTS_NAMESPACE: Ioctl = _IO(PIDFS_IOCTL_MAGIC, 10); +pub const PIDFD_GET_INFO: Ioctl = _IOWR::<pidfd_info>(PIDFS_IOCTL_MAGIC, 11); + +// linux/prctl.h pub const PR_SET_PDEATHSIG: c_int = 1; pub const PR_GET_PDEATHSIG: c_int = 2; @@ -3284,6 +3145,11 @@ pub const PR_SET_NO_NEW_PRIVS: c_int = 38; pub const PR_GET_NO_NEW_PRIVS: c_int = 39; +pub const PR_SET_MDWE: c_int = 65; +pub const PR_GET_MDWE: c_int = 66; +pub const PR_MDWE_REFUSE_EXEC_GAIN: c_uint = 1 << 0; +pub const PR_MDWE_NO_INHERIT: c_uint = 1 << 1; + pub const PR_GET_TID_ADDRESS: c_int = 40; pub const PR_SET_THP_DISABLE: c_int = 41; @@ -3830,6 +3696,7 @@ pub const PACKET_TIMESTAMP: c_int = 17; pub const PACKET_FANOUT: c_int = 18; pub const PACKET_QDISC_BYPASS: c_int = 20; +pub const PACKET_IGNORE_OUTGOING: c_int = 23; pub const PACKET_FANOUT_HASH: c_uint = 0; pub const PACKET_FANOUT_LB: c_uint = 1; @@ -4689,6 +4556,51 @@ pub const RTNLGRP_TUNNEL: c_uint = 0x23; pub const RTNLGRP_STATS: c_uint = 0x24; +// linux/cn_proc.h +c_enum! { + proc_cn_mcast_op { + PROC_CN_MCAST_LISTEN = 1, + PROC_CN_MCAST_IGNORE = 2, + } +} + +c_enum! { + proc_cn_event { + PROC_EVENT_NONE = 0x00000000, + PROC_EVENT_FORK = 0x00000001, + PROC_EVENT_EXEC = 0x00000002, + PROC_EVENT_UID = 0x00000004, + PROC_EVENT_GID = 0x00000040, + PROC_EVENT_SID = 0x00000080, + PROC_EVENT_PTRACE = 0x00000100, + PROC_EVENT_COMM = 0x00000200, + PROC_EVENT_NONZERO_EXIT = 0x20000000, + PROC_EVENT_COREDUMP = 0x40000000, + PROC_EVENT_EXIT = 0x80000000, + } +} + +// linux/connector.h +pub const CN_IDX_PROC: c_uint = 0x1; +pub const CN_VAL_PROC: c_uint = 0x1; +pub const CN_IDX_CIFS: c_uint = 0x2; +pub const CN_VAL_CIFS: c_uint = 0x1; +pub const CN_W1_IDX: c_uint = 0x3; +pub const CN_W1_VAL: c_uint = 0x1; +pub const CN_IDX_V86D: c_uint = 0x4; +pub const CN_VAL_V86D_UVESAFB: c_uint = 0x1; +pub const CN_IDX_BB: c_uint = 0x5; +pub const CN_DST_IDX: c_uint = 0x6; +pub const CN_DST_VAL: c_uint = 0x1; +pub const CN_IDX_DM: c_uint = 0x7; +pub const CN_VAL_DM_USERSPACE_LOG: c_uint = 0x1; +pub const CN_IDX_DRBD: c_uint = 0x8; +pub const CN_VAL_DRBD: c_uint = 0x1; +pub const CN_KVP_IDX: c_uint = 0x9; +pub const CN_KVP_VAL: c_uint = 0x1; +pub const CN_VSS_IDX: c_uint = 0xA; +pub const CN_VSS_VAL: c_uint = 0x1; + // linux/module.h pub const MODULE_INIT_IGNORE_MODVERSIONS: c_uint = 0x0001; pub const MODULE_INIT_IGNORE_VERMAGIC: c_uint = 0x0002; @@ -4742,25 +4654,25 @@ const PTP_CLK_MAGIC: u32 = b'=' as u32; -pub const PTP_CLOCK_GETCAPS: c_uint = _IOR::<ptp_clock_caps>(PTP_CLK_MAGIC, 1); -pub const PTP_EXTTS_REQUEST: c_uint = _IOW::<ptp_extts_request>(PTP_CLK_MAGIC, 2); -pub const PTP_PEROUT_REQUEST: c_uint = _IOW::<ptp_perout_request>(PTP_CLK_MAGIC, 3); -pub const PTP_ENABLE_PPS: c_uint = _IOW::<c_int>(PTP_CLK_MAGIC, 4); -pub const PTP_SYS_OFFSET: c_uint = _IOW::<ptp_sys_offset>(PTP_CLK_MAGIC, 5); -pub const PTP_PIN_GETFUNC: c_uint = _IOWR::<ptp_pin_desc>(PTP_CLK_MAGIC, 6); -pub const PTP_PIN_SETFUNC: c_uint = _IOW::<ptp_pin_desc>(PTP_CLK_MAGIC, 7); -pub const PTP_SYS_OFFSET_PRECISE: c_uint = _IOWR::<ptp_sys_offset_precise>(PTP_CLK_MAGIC, 8); -pub const PTP_SYS_OFFSET_EXTENDED: c_uint = _IOWR::<ptp_sys_offset_extended>(PTP_CLK_MAGIC, 9); +pub const PTP_CLOCK_GETCAPS: Ioctl = _IOR::<ptp_clock_caps>(PTP_CLK_MAGIC, 1); +pub const PTP_EXTTS_REQUEST: Ioctl = _IOW::<ptp_extts_request>(PTP_CLK_MAGIC, 2); +pub const PTP_PEROUT_REQUEST: Ioctl = _IOW::<ptp_perout_request>(PTP_CLK_MAGIC, 3); +pub const PTP_ENABLE_PPS: Ioctl = _IOW::<c_int>(PTP_CLK_MAGIC, 4); +pub const PTP_SYS_OFFSET: Ioctl = _IOW::<ptp_sys_offset>(PTP_CLK_MAGIC, 5); +pub const PTP_PIN_GETFUNC: Ioctl = _IOWR::<ptp_pin_desc>(PTP_CLK_MAGIC, 6); +pub const PTP_PIN_SETFUNC: Ioctl = _IOW::<ptp_pin_desc>(PTP_CLK_MAGIC, 7); +pub const PTP_SYS_OFFSET_PRECISE: Ioctl = _IOWR::<ptp_sys_offset_precise>(PTP_CLK_MAGIC, 8); +pub const PTP_SYS_OFFSET_EXTENDED: Ioctl = _IOWR::<ptp_sys_offset_extended>(PTP_CLK_MAGIC, 9); -pub const PTP_CLOCK_GETCAPS2: c_uint = _IOR::<ptp_clock_caps>(PTP_CLK_MAGIC, 10); -pub const PTP_EXTTS_REQUEST2: c_uint = _IOW::<ptp_extts_request>(PTP_CLK_MAGIC, 11); -pub const PTP_PEROUT_REQUEST2: c_uint = _IOW::<ptp_perout_request>(PTP_CLK_MAGIC, 12); -pub const PTP_ENABLE_PPS2: c_uint = _IOW::<c_int>(PTP_CLK_MAGIC, 13); -pub const PTP_SYS_OFFSET2: c_uint = _IOW::<ptp_sys_offset>(PTP_CLK_MAGIC, 14); -pub const PTP_PIN_GETFUNC2: c_uint = _IOWR::<ptp_pin_desc>(PTP_CLK_MAGIC, 15); -pub const PTP_PIN_SETFUNC2: c_uint = _IOW::<ptp_pin_desc>(PTP_CLK_MAGIC, 16); -pub const PTP_SYS_OFFSET_PRECISE2: c_uint = _IOWR::<ptp_sys_offset_precise>(PTP_CLK_MAGIC, 17); -pub const PTP_SYS_OFFSET_EXTENDED2: c_uint = _IOWR::<ptp_sys_offset_extended>(PTP_CLK_MAGIC, 18); +pub const PTP_CLOCK_GETCAPS2: Ioctl = _IOR::<ptp_clock_caps>(PTP_CLK_MAGIC, 10); +pub const PTP_EXTTS_REQUEST2: Ioctl = _IOW::<ptp_extts_request>(PTP_CLK_MAGIC, 11); +pub const PTP_PEROUT_REQUEST2: Ioctl = _IOW::<ptp_perout_request>(PTP_CLK_MAGIC, 12); +pub const PTP_ENABLE_PPS2: Ioctl = _IOW::<c_int>(PTP_CLK_MAGIC, 13); +pub const PTP_SYS_OFFSET2: Ioctl = _IOW::<ptp_sys_offset>(PTP_CLK_MAGIC, 14); +pub const PTP_PIN_GETFUNC2: Ioctl = _IOWR::<ptp_pin_desc>(PTP_CLK_MAGIC, 15); +pub const PTP_PIN_SETFUNC2: Ioctl = _IOW::<ptp_pin_desc>(PTP_CLK_MAGIC, 16); +pub const PTP_SYS_OFFSET_PRECISE2: Ioctl = _IOWR::<ptp_sys_offset_precise>(PTP_CLK_MAGIC, 17); +pub const PTP_SYS_OFFSET_EXTENDED2: Ioctl = _IOWR::<ptp_sys_offset_extended>(PTP_CLK_MAGIC, 18); // enum ptp_pin_function pub const PTP_PF_NONE: c_uint = 0; @@ -5989,26 +5901,6 @@ pub const SI_DETHREAD: c_int = -7; pub const TRAP_PERF: c_int = 6; -/// Build an ioctl number for an argumentless ioctl. -pub const fn _IO(ty: u32, nr: u32) -> u32 { - super::_IOC(super::_IOC_NONE, ty, nr, 0) -} - -/// Build an ioctl number for an read-only ioctl. -pub const fn _IOR<T>(ty: u32, nr: u32) -> u32 { - super::_IOC(super::_IOC_READ, ty, nr, size_of::<T>()) -} - -/// Build an ioctl number for an write-only ioctl. -pub const fn _IOW<T>(ty: u32, nr: u32) -> u32 { - super::_IOC(super::_IOC_WRITE, ty, nr, size_of::<T>()) -} - -/// Build an ioctl number for a read-write ioctl. -pub const fn _IOWR<T>(ty: u32, nr: u32) -> u32 { - super::_IOC(super::_IOC_READ | super::_IOC_WRITE, ty, nr, size_of::<T>()) -} - f! { pub fn NLA_ALIGN(len: c_int) -> c_int { return ((len) + NLA_ALIGNTO - 1) & !(NLA_ALIGNTO - 1); @@ -6016,16 +5908,16 @@ pub fn CMSG_NXTHDR(mhdr: *const msghdr, cmsg: *const cmsghdr) -> *mut cmsghdr { if ((*cmsg).cmsg_len as usize) < size_of::<cmsghdr>() { - return 0 as *mut cmsghdr; - }; + return core::ptr::null_mut::<cmsghdr>(); + } let next = (cmsg as usize + super::CMSG_ALIGN((*cmsg).cmsg_len as usize)) as *mut cmsghdr; let max = (*mhdr).msg_control as usize + (*mhdr).msg_controllen as usize; if (next.wrapping_offset(1)) as usize > max || next as usize + super::CMSG_ALIGN((*next).cmsg_len as usize) > max { - 0 as *mut cmsghdr + core::ptr::null_mut::<cmsghdr>() } else { - next as *mut cmsghdr + next } } @@ -6036,7 +5928,7 @@ } pub fn CPU_ZERO(cpuset: &mut cpu_set_t) -> () { - for slot in cpuset.bits.iter_mut() { + for slot in &mut cpuset.bits { *slot = 0; } } @@ -6045,14 +5937,12 @@ let size_in_bits = 8 * mem::size_of_val(&cpuset.bits[0]); // 32, 64 etc let (idx, offset) = (cpu / size_in_bits, cpu % size_in_bits); cpuset.bits[idx] |= 1 << offset; - () } pub fn CPU_CLR(cpu: usize, cpuset: &mut cpu_set_t) -> () { let size_in_bits = 8 * mem::size_of_val(&cpuset.bits[0]); // 32, 64 etc let (idx, offset) = (cpu / size_in_bits, cpu % size_in_bits); cpuset.bits[idx] &= !(1 << offset); - () } pub fn CPU_ISSET(cpu: usize, cpuset: &cpu_set_t) -> bool { @@ -6064,7 +5954,7 @@ pub fn CPU_COUNT_S(size: usize, cpuset: &cpu_set_t) -> c_int { let mut s: u32 = 0; let size_of_mask = mem::size_of_val(&cpuset.bits[0]); - for i in cpuset.bits[..(size / size_of_mask)].iter() { + for i in &cpuset.bits[..(size / size_of_mask)] { s += i.count_ones(); } s as c_int @@ -6079,7 +5969,7 @@ } pub fn SCTP_PR_INDEX(policy: c_int) -> c_int { - policy >> 4 - 1 + policy >> (4 - 1) } pub fn SCTP_PR_POLICY(policy: c_int) -> c_int { @@ -6089,7 +5979,6 @@ pub fn SCTP_PR_SET_POLICY(flags: &mut c_int, policy: c_int) -> () { *flags &= !SCTP_PR_SCTP_MASK; *flags |= policy; - () } pub fn IPTOS_TOS(tos: u8) -> u8 { @@ -6150,20 +6039,15 @@ pub fn BPF_STMT(code: __u16, k: __u32) -> sock_filter { sock_filter { - code: code, + code, jt: 0, jf: 0, - k: k, + k, } } pub fn BPF_JUMP(code: __u16, k: __u32, jt: __u8, jf: __u8) -> sock_filter { - sock_filter { - code: code, - jt: jt, - jf: jf, - k: k, - } + sock_filter { code, jt, jf, k } } pub fn ELF32_R_SYM(val: Elf32_Word) -> Elf32_Word { @@ -6175,7 +6059,7 @@ } pub fn ELF32_R_INFO(sym: Elf32_Word, t: Elf32_Word) -> Elf32_Word { - sym << 8 + t & 0xff + sym << (8 + t) & 0xff } pub fn ELF64_R_SYM(val: Elf64_Xword) -> Elf64_Xword { @@ -6187,7 +6071,7 @@ } pub fn ELF64_R_INFO(sym: Elf64_Xword, t: Elf64_Xword) -> Elf64_Xword { - sym << 32 + t + sym << (32 + t) } } @@ -6254,6 +6138,7 @@ pub fn aio_error(aiocbp: *const aiocb) -> c_int; #[cfg_attr(gnu_file_offset_bits64, link_name = "aio_return64")] pub fn aio_return(aiocbp: *mut aiocb) -> ssize_t; + #[cfg_attr(gnu_time_bits64, link_name = "__aio_suspend_time64")] pub fn aio_suspend( aiocb_list: *const *const aiocb, nitems: c_int, @@ -6315,6 +6200,7 @@ riovcnt: c_ulong, flags: c_ulong, ) -> isize; + #[cfg_attr(gnu_time_bits64, link_name = "__futimes64")] pub fn futimes(fd: c_int, times: *const crate::timeval) -> c_int; } } @@ -6344,6 +6230,7 @@ msg_len: size_t, msg_prio: *mut c_uint, ) -> ssize_t; + #[cfg_attr(gnu_time_bits64, link_name = "__mq_timedreceive_time64")] pub fn mq_timedreceive( mqd: crate::mqd_t, msg_ptr: *mut c_char, @@ -6357,6 +6244,7 @@ msg_len: size_t, msg_prio: c_uint, ) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__mq_timedsend_time64")] pub fn mq_timedsend( mqd: crate::mqd_t, msg_ptr: *const c_char, @@ -6407,6 +6295,7 @@ pub fn seed48(xseed: *mut c_ushort) -> *mut c_ushort; pub fn lcong48(p: *mut c_ushort); + #[cfg_attr(gnu_time_bits64, link_name = "__lutimes64")] pub fn lutimes(file: *const c_char, times: *const crate::timeval) -> c_int; pub fn setpwent(); @@ -6428,11 +6317,14 @@ pub fn shmget(key: crate::key_t, size: size_t, shmflg: c_int) -> c_int; pub fn shmat(shmid: c_int, shmaddr: *const c_void, shmflg: c_int) -> *mut c_void; pub fn shmdt(shmaddr: *const c_void) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__shmctl64")] pub fn shmctl(shmid: c_int, cmd: c_int, buf: *mut crate::shmid_ds) -> c_int; pub fn ftok(pathname: *const c_char, proj_id: c_int) -> crate::key_t; pub fn semget(key: crate::key_t, nsems: c_int, semflag: c_int) -> c_int; pub fn semop(semid: c_int, sops: *mut crate::sembuf, nsops: size_t) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__semctl64")] pub fn semctl(semid: c_int, semnum: c_int, cmd: c_int, ...) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__msgctl64")] pub fn msgctl(msqid: c_int, cmd: c_int, buf: *mut msqid_ds) -> c_int; pub fn msgget(key: crate::key_t, msgflg: c_int) -> c_int; pub fn msgrcv( @@ -6499,7 +6391,9 @@ pub fn fremovexattr(filedes: c_int, name: *const c_char) -> c_int; pub fn signalfd(fd: c_int, mask: *const crate::sigset_t, flags: c_int) -> c_int; pub fn timerfd_create(clockid: crate::clockid_t, flags: c_int) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__timerfd_gettime64")] pub fn timerfd_gettime(fd: c_int, curr_value: *mut itimerspec) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__timerfd_settime64")] pub fn timerfd_settime( fd: c_int, flags: c_int, @@ -6515,6 +6409,7 @@ sigmask: *const crate::sigset_t, ) -> c_int; pub fn dup3(oldfd: c_int, newfd: c_int, flags: c_int) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__sigtimedwait64")] pub fn sigtimedwait( set: *const sigset_t, info: *mut siginfo_t, @@ -6544,7 +6439,7 @@ pub fn setfsuid(uid: crate::uid_t) -> c_int; // Not available now on Android - pub fn mkfifoat(dirfd: c_int, pathname: *const c_char, mode: crate::mode_t) -> c_int; + pub fn mkfifoat(dirfd: c_int, pathname: *const c_char, mode: mode_t) -> c_int; pub fn if_nameindex() -> *mut if_nameindex; pub fn if_freenameindex(ptr: *mut if_nameindex); pub fn sync_file_range(fd: c_int, offset: off64_t, nbytes: off64_t, flags: c_uint) -> c_int; @@ -6556,14 +6451,22 @@ ... ) -> *mut c_void; - #[cfg_attr(gnu_file_offset_bits64, link_name = "glob64")] + #[cfg_attr(gnu_time_bits64, link_name = "__glob64_time64")] + #[cfg_attr( + all(not(gnu_time_bits64), gnu_file_offset_bits64), + link_name = "glob64" + )] pub fn glob( pattern: *const c_char, flags: c_int, errfunc: Option<extern "C" fn(epath: *const c_char, errno: c_int) -> c_int>, pglob: *mut crate::glob_t, ) -> c_int; - #[cfg_attr(gnu_file_offset_bits64, link_name = "globfree64")] + #[cfg_attr(gnu_time_bits64, link_name = "__globfree64_time64")] + #[cfg_attr( + all(not(gnu_time_bits64), gnu_file_offset_bits64), + link_name = "globfree64" + )] pub fn globfree(pglob: *mut crate::glob_t); pub fn posix_madvise(addr: *mut c_void, len: size_t, advice: c_int) -> c_int; @@ -6626,6 +6529,7 @@ pub fn umount(target: *const c_char) -> c_int; pub fn sched_get_priority_max(policy: c_int) -> c_int; pub fn tee(fd_in: c_int, fd_out: c_int, len: size_t, flags: c_uint) -> ssize_t; + #[cfg_attr(gnu_time_bits64, link_name = "__settimeofday64")] pub fn settimeofday(tv: *const crate::timeval, tz: *const crate::timezone) -> c_int; pub fn splice( fd_in: c_int, @@ -6639,7 +6543,9 @@ pub fn eventfd_read(fd: c_int, value: *mut eventfd_t) -> c_int; pub fn eventfd_write(fd: c_int, value: eventfd_t) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__sched_rr_get_interval64")] pub fn sched_rr_get_interval(pid: crate::pid_t, tp: *mut crate::timespec) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__sem_timedwait64")] pub fn sem_timedwait(sem: *mut sem_t, abstime: *const crate::timespec) -> c_int; pub fn sem_getvalue(sem: *mut sem_t, sval: *mut c_int) -> c_int; pub fn sched_setparam(pid: crate::pid_t, param: *const crate::sched_param) -> c_int; @@ -6655,8 +6561,10 @@ data: *const c_void, ) -> c_int; pub fn personality(persona: c_ulong) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__prctl_time64")] pub fn prctl(option: c_int, ...) -> c_int; pub fn sched_getparam(pid: crate::pid_t, param: *mut crate::sched_param) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__ppoll64")] pub fn ppoll( fds: *mut crate::pollfd, nfds: nfds_t, @@ -6669,6 +6577,7 @@ ) -> c_int; pub fn pthread_mutexattr_setprotocol(attr: *mut pthread_mutexattr_t, protocol: c_int) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__pthread_mutex_timedlock64")] pub fn pthread_mutex_timedlock( lock: *mut pthread_mutex_t, abstime: *const crate::timespec, @@ -6703,6 +6612,7 @@ ... ) -> c_int; pub fn sched_getscheduler(pid: crate::pid_t) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__clock_nanosleep_time64")] pub fn clock_nanosleep( clk_id: crate::clockid_t, flags: c_int, @@ -6899,7 +6809,7 @@ fd: c_int, path: *const c_char, oflag: c_int, - mode: crate::mode_t, + mode: mode_t, ) -> c_int; pub fn posix_spawn_file_actions_addclose( actions: *mut posix_spawn_file_actions_t, @@ -6960,7 +6870,9 @@ ) -> c_int; pub fn timer_delete(timerid: crate::timer_t) -> c_int; pub fn timer_getoverrun(timerid: crate::timer_t) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__timer_gettime64")] pub fn timer_gettime(timerid: crate::timer_t, curr_value: *mut crate::itimerspec) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__timer_settime64")] pub fn timer_settime( timerid: crate::timer_t, flags: c_int, @@ -7001,8 +6913,6 @@ ) -> ssize_t; pub fn klogctl(syslog_type: c_int, bufp: *mut c_char, len: c_int) -> c_int; - - pub fn ioctl(fd: c_int, request: Ioctl, ...) -> c_int; } // LFS64 extensions
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b32/arm/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b32/arm/mod.rs index 292585fc..b9be033a 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b32/arm/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b32/arm/mod.rs
@@ -55,6 +55,14 @@ } pub struct ipc_perm { + #[cfg(musl_v1_2_3)] + pub __key: crate::key_t, + #[cfg(not(musl_v1_2_3))] + #[deprecated( + since = "0.2.173", + note = "This field is incorrectly named and will be changed + to __key in a future release." + )] pub __ipc_perm_key: crate::key_t, pub uid: crate::uid_t, pub gid: crate::gid_t, @@ -154,17 +162,6 @@ } } impl Eq for ucontext_t {} - impl fmt::Debug for ucontext_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("ucontext_t") - .field("uc_flags", &self.uc_link) - .field("uc_link", &self.uc_link) - .field("uc_stack", &self.uc_stack) - .field("uc_mcontext", &self.uc_mcontext) - .field("uc_sigmask", &self.uc_sigmask) - .finish() - } - } impl hash::Hash for ucontext_t { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.uc_flags.hash(state);
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b32/hexagon.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b32/hexagon.rs index 4aab076..b6879535 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b32/hexagon.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b32/hexagon.rs
@@ -34,6 +34,14 @@ } pub struct ipc_perm { + #[cfg(musl_v1_2_3)] + pub __key: crate::key_t, + #[cfg(not(musl_v1_2_3))] + #[deprecated( + since = "0.2.173", + note = "This field is incorrectly named and will be changed + to __key in a future release" + )] pub __ipc_perm_key: crate::key_t, pub uid: crate::uid_t, pub gid: crate::gid_t,
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b32/mips/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b32/mips/mod.rs index e0b35b6..3f2b73d 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b32/mips/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b32/mips/mod.rs
@@ -57,6 +57,14 @@ } pub struct ipc_perm { + #[cfg(musl_v1_2_3)] + pub __key: crate::key_t, + #[cfg(not(musl_v1_2_3))] + #[deprecated( + since = "0.2.173", + note = "This field is incorrectly named and will be changed + to __key in a future release." + )] pub __ipc_perm_key: crate::key_t, pub uid: crate::uid_t, pub gid: crate::gid_t,
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b32/powerpc.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b32/powerpc.rs index 0de40b1..460b2d8 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b32/powerpc.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b32/powerpc.rs
@@ -53,6 +53,14 @@ } pub struct ipc_perm { + #[cfg(musl_v1_2_3)] + pub __key: crate::key_t, + #[cfg(not(musl_v1_2_3))] + #[deprecated( + since = "0.2.173", + note = "This field is incorrectly named and will be changed + to __key in a future release." + )] pub __ipc_perm_key: crate::key_t, pub uid: crate::uid_t, pub gid: crate::gid_t,
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b32/riscv32/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b32/riscv32/mod.rs index 9c0525c..9b761059 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b32/riscv32/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b32/riscv32/mod.rs
@@ -246,6 +246,7 @@ pub const O_DIRECTORY: c_int = 65536; pub const O_LARGEFILE: c_int = 0o0100000; pub const O_NOFOLLOW: c_int = 131072; +pub const MADV_SOFT_OFFLINE: c_int = 101; pub const MAP_HUGETLB: c_int = 262144; pub const MAP_LOCKED: c_int = 8192; pub const MAP_NORESERVE: c_int = 16384;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b32/x86/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b32/x86/mod.rs index 22befbb0..583e0a51e 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b32/x86/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b32/x86/mod.rs
@@ -59,6 +59,14 @@ } pub struct ipc_perm { + #[cfg(musl_v1_2_3)] + pub __key: crate::key_t, + #[cfg(not(musl_v1_2_3))] + #[deprecated( + since = "0.2.173", + note = "This field is incorrectly named and will be changed + to __key in a future release." + )] pub __ipc_perm_key: crate::key_t, pub uid: crate::uid_t, pub gid: crate::gid_t, @@ -159,26 +167,6 @@ impl Eq for user_fpxregs_struct {} - impl fmt::Debug for user_fpxregs_struct { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("user_fpxregs_struct") - .field("cwd", &self.cwd) - .field("swd", &self.swd) - .field("twd", &self.twd) - .field("fop", &self.fop) - .field("fip", &self.fip) - .field("fcs", &self.fcs) - .field("foo", &self.foo) - .field("fos", &self.fos) - .field("mxcsr", &self.mxcsr) - // Ignore __reserved field - .field("st_space", &self.st_space) - .field("xmm_space", &self.xmm_space) - // Ignore padding field - .finish() - } - } - impl hash::Hash for user_fpxregs_struct { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.cwd.hash(state); @@ -214,19 +202,6 @@ impl Eq for ucontext_t {} - impl fmt::Debug for ucontext_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("ucontext_t") - .field("uc_flags", &self.uc_flags) - .field("uc_link", &self.uc_link) - .field("uc_stack", &self.uc_stack) - .field("uc_mcontext", &self.uc_mcontext) - .field("uc_sigmask", &self.uc_sigmask) - // Ignore __private field - .finish() - } - } - impl hash::Hash for ucontext_t { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.uc_flags.hash(state);
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/aarch64/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/aarch64/mod.rs index e84b9f5..243247e 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/aarch64/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/aarch64/mod.rs
@@ -60,15 +60,32 @@ } pub struct ipc_perm { + #[cfg(musl_v1_2_3)] + pub __key: crate::key_t, + #[cfg(not(musl_v1_2_3))] + #[deprecated( + since = "0.2.173", + note = "This field is incorrectly named and will be changed + to __key in a future release." + )] pub __ipc_perm_key: crate::key_t, pub uid: crate::uid_t, pub gid: crate::gid_t, pub cuid: crate::uid_t, pub cgid: crate::gid_t, pub mode: crate::mode_t, + + #[cfg(musl_v1_2_3)] + pub __seq: c_int, + #[cfg(not(musl_v1_2_3))] + #[deprecated( + since = "0.2.173", + note = "The type of this field has changed from c_ushort to c_int, + we'll follow that change in the future release." + )] pub __seq: c_ushort, - __unused1: c_ulong, - __unused2: c_ulong, + __unused1: c_long, + __unused2: c_long, } pub struct ucontext_t {
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/loongarch64/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/loongarch64/mod.rs index 36f05e1..17724b5 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/loongarch64/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/loongarch64/mod.rs
@@ -7,8 +7,6 @@ pub type nlink_t = c_uint; pub type blksize_t = c_int; -pub type fsblkcnt64_t = c_ulong; -pub type fsfilcnt64_t = c_ulong; pub type __u64 = c_ulonglong; pub type __s64 = c_longlong; @@ -65,7 +63,6 @@ pub cgid: crate::gid_t, pub mode: c_uint, pub __seq: c_int, - __pad2: c_ushort, __unused1: c_ulong, __unused2: c_ulong, } @@ -533,6 +530,8 @@ pub const EHWPOISON: c_int = 133; pub const ERFKILL: c_int = 132; +pub const MADV_SOFT_OFFLINE: c_int = 101; + pub const SA_ONSTACK: c_int = 0x08000000; pub const SA_SIGINFO: c_int = 0x00000004; pub const SA_NOCLDWAIT: c_int = 0x00000002;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/mips64.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/mips64.rs index 33afe4e..5cef5723 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/mips64.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/mips64.rs
@@ -57,6 +57,14 @@ } pub struct ipc_perm { + #[cfg(musl_v1_2_3)] + pub __key: crate::key_t, + #[cfg(not(musl_v1_2_3))] + #[deprecated( + since = "0.2.173", + note = "This field is incorrectly named and will be changed + to __key in a future release." + )] pub __ipc_perm_key: crate::key_t, pub uid: crate::uid_t, pub gid: crate::gid_t,
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/powerpc64.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/powerpc64.rs index fb9653bc..4f3c081f 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/powerpc64.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/powerpc64.rs
@@ -51,6 +51,14 @@ } pub struct ipc_perm { + #[cfg(musl_v1_2_3)] + pub __key: crate::key_t, + #[cfg(not(musl_v1_2_3))] + #[deprecated( + since = "0.2.173", + note = "This field is incorrectly named and will be changed + to __key in a future release." + )] pub __ipc_perm_key: crate::key_t, pub uid: crate::uid_t, pub gid: crate::gid_t,
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/riscv64/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/riscv64/mod.rs index 2b9b394..cf851c4 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/riscv64/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/riscv64/mod.rs
@@ -432,7 +432,7 @@ pub const O_APPEND: c_int = 1024; pub const O_DIRECT: c_int = 0x4000; pub const O_DIRECTORY: c_int = 0x10000; -pub const O_LARGEFILE: c_int = 0; +pub const O_LARGEFILE: c_int = 0o100000; pub const O_NOFOLLOW: c_int = 0x20000; pub const O_CREAT: c_int = 64; pub const O_EXCL: c_int = 128; @@ -572,6 +572,7 @@ pub const SOCK_STREAM: c_int = 1; pub const SOCK_DGRAM: c_int = 2; +pub const MADV_SOFT_OFFLINE: c_int = 101; pub const MAP_ANON: c_int = 0x0020; pub const MAP_GROWSDOWN: c_int = 0x0100; pub const MAP_DENYWRITE: c_int = 0x0800;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/s390x.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/s390x.rs index b992a2c..0f10628 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/s390x.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/s390x.rs
@@ -10,6 +10,14 @@ s! { pub struct ipc_perm { + #[cfg(musl_v1_2_3)] + pub __key: crate::key_t, + #[cfg(not(musl_v1_2_3))] + #[deprecated( + since = "0.2.173", + note = "This field is incorrectly named and will be changed + to __key in a future release." + )] pub __ipc_perm_key: crate::key_t, pub uid: crate::uid_t, pub gid: crate::gid_t, @@ -80,15 +88,9 @@ impl Eq for fpreg_t {} - impl fmt::Debug for fpreg_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("fpreg_t").field("d", &self.d).finish() - } - } - impl hash::Hash for fpreg_t { fn hash<H: hash::Hasher>(&self, state: &mut H) { - let d: u64 = unsafe { mem::transmute(self.d) }; + let d: u64 = self.d.to_bits(); d.hash(state); } }
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/wasm32/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/wasm32/mod.rs index 3ac15b8a..3f7a609 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/wasm32/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/wasm32/mod.rs
@@ -53,6 +53,14 @@ } pub struct ipc_perm { + #[cfg(musl_v1_2_3)] + pub __key: crate::key_t, + #[cfg(not(musl_v1_2_3))] + #[deprecated( + since = "0.2.173", + note = "This field is incorrectly named and will be changed + to __key in a future release." + )] pub __ipc_perm_key: crate::key_t, pub uid: crate::uid_t, pub gid: crate::gid_t,
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/x86_64/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/x86_64/mod.rs index b44b54de..17a9f6c 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/x86_64/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/b64/x86_64/mod.rs
@@ -112,6 +112,14 @@ } pub struct ipc_perm { + #[cfg(musl_v1_2_3)] + pub __key: crate::key_t, + #[cfg(not(musl_v1_2_3))] + #[deprecated( + since = "0.2.173", + note = "This field is incorrectly named and will be changed + to __key in a future release." + )] pub __ipc_perm_key: crate::key_t, pub uid: crate::uid_t, pub gid: crate::gid_t, @@ -194,23 +202,6 @@ impl Eq for user_fpregs_struct {} - impl fmt::Debug for user_fpregs_struct { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("user_fpregs_struct") - .field("cwd", &self.cwd) - .field("ftw", &self.ftw) - .field("fop", &self.fop) - .field("rip", &self.rip) - .field("rdp", &self.rdp) - .field("mxcsr", &self.mxcsr) - .field("mxcr_mask", &self.mxcr_mask) - .field("st_space", &self.st_space) - // FIXME(debug): .field("xmm_space", &self.xmm_space) - // Ignore padding field - .finish() - } - } - impl hash::Hash for user_fpregs_struct { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.cwd.hash(state); @@ -243,19 +234,6 @@ impl Eq for ucontext_t {} - impl fmt::Debug for ucontext_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("ucontext_t") - .field("uc_flags", &self.uc_flags) - .field("uc_link", &self.uc_link) - .field("uc_stack", &self.uc_stack) - .field("uc_mcontext", &self.uc_mcontext) - .field("uc_sigmask", &self.uc_sigmask) - // Ignore __private field - .finish() - } - } - impl hash::Hash for ucontext_t { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.uc_flags.hash(state); @@ -701,7 +679,7 @@ pub const O_APPEND: c_int = 1024; pub const O_DIRECT: c_int = 0x4000; pub const O_DIRECTORY: c_int = 0x10000; -pub const O_LARGEFILE: c_int = 0; +pub const O_LARGEFILE: c_int = 0o0100000; pub const O_NOFOLLOW: c_int = 0x20000; pub const O_CREAT: c_int = 64; pub const O_EXCL: c_int = 128;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/mod.rs index f850849..fb083fd 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/musl/mod.rs
@@ -323,16 +323,11 @@ pub tcpi_probes: u8, pub tcpi_backoff: u8, pub tcpi_options: u8, - /* - * FIXME(musl): enable on all targets once musl headers are more up to date - */ /// This contains the bitfields `tcpi_snd_wscale` and `tcpi_rcv_wscale`. /// Each is 4 bits. - #[cfg(target_arch = "loongarch64")] pub tcpi_snd_rcv_wscale: u8, /// This contains the bitfields `tcpi_delivery_rate_app_limited` (1 bit) and /// `tcpi_fastopen_client_fail` (2 bits). - #[cfg(target_arch = "loongarch64")] pub tcpi_delivery_fastopen_bitfields: u8, pub tcpi_rto: u32, pub tcpi_ato: u32, @@ -378,10 +373,7 @@ pub tcpi_bytes_retrans: u64, pub tcpi_dsack_dups: u32, pub tcpi_reord_seen: u32, - // FIXME(musl): enable on all targets once CI musl is updated - #[cfg(target_arch = "loongarch64")] pub tcpi_rcv_ooopack: u32, - #[cfg(target_arch = "loongarch64")] pub tcpi_snd_wnd: u32, } @@ -438,13 +430,6 @@ pub __reserved: [c_char; 256], } - // FIXME(musl): musl added paddings and adjusted - // layout in 1.2.0 but our CI is still 1.1.24. - // So, I'm leaving some fields as cfg for now. - // ref. https://github.com/bminor/musl/commit/ - // 1e7f0fcd7ff2096904fd93a2ee6d12a2392be392 - // - // OpenHarmony uses the musl 1.2 layout. pub struct utmpx { pub ut_type: c_short, __ut_pad1: c_short, @@ -455,32 +440,25 @@ pub ut_host: [c_char; 256], pub ut_exit: __exit_status, - #[cfg(target_env = "musl")] - #[cfg(not(target_arch = "loongarch64"))] + #[cfg(not(musl_v1_2_3))] + #[deprecated( + since = "0.2.173", + note = "The ABI of this field has changed from c_long to c_int with padding, \ + we'll follow that change in the future release. See #4443 for more info." + )] pub ut_session: c_long, - #[cfg(target_env = "musl")] - #[cfg(target_arch = "loongarch64")] - pub ut_session: c_int, - - #[cfg(target_env = "musl")] - #[cfg(target_arch = "loongarch64")] - __ut_pad2: c_int, - - #[cfg(target_env = "ohos")] - #[cfg(target_endian = "little")] - pub ut_session: c_int, - #[cfg(target_env = "ohos")] - #[cfg(target_endian = "little")] - __ut_pad2: c_int, - - #[cfg(target_env = "ohos")] + #[cfg(musl_v1_2_3)] #[cfg(not(target_endian = "little"))] __ut_pad2: c_int, - #[cfg(target_env = "ohos")] - #[cfg(not(target_endian = "little"))] + + #[cfg(musl_v1_2_3)] pub ut_session: c_int, + #[cfg(musl_v1_2_3)] + #[cfg(target_endian = "little")] + __ut_pad2: c_int, + pub ut_tv: crate::timeval, pub ut_addr_v6: [c_uint; 4], __unused: [c_char; 20], @@ -514,27 +492,6 @@ impl Eq for sysinfo {} - impl fmt::Debug for sysinfo { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sysinfo") - .field("uptime", &self.uptime) - .field("loads", &self.loads) - .field("totalram", &self.totalram) - .field("freeram", &self.freeram) - .field("sharedram", &self.sharedram) - .field("bufferram", &self.bufferram) - .field("totalswap", &self.totalswap) - .field("freeswap", &self.freeswap) - .field("procs", &self.procs) - .field("pad", &self.pad) - .field("totalhigh", &self.totalhigh) - .field("freehigh", &self.freehigh) - .field("mem_unit", &self.mem_unit) - // FIXME(debug): .field("__reserved", &self.__reserved) - .finish() - } - } - impl hash::Hash for sysinfo { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.uptime.hash(state); @@ -555,6 +512,7 @@ } impl PartialEq for utmpx { + #[allow(deprecated)] fn eq(&self, other: &utmpx) -> bool { self.ut_type == other.ut_type //&& self.__ut_pad1 == other.__ut_pad1 @@ -578,27 +536,8 @@ impl Eq for utmpx {} - impl fmt::Debug for utmpx { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("utmpx") - .field("ut_type", &self.ut_type) - //.field("__ut_pad1", &self.__ut_pad1) - .field("ut_pid", &self.ut_pid) - .field("ut_line", &self.ut_line) - .field("ut_id", &self.ut_id) - .field("ut_user", &self.ut_user) - //FIXME(debug): .field("ut_host", &self.ut_host) - .field("ut_exit", &self.ut_exit) - .field("ut_session", &self.ut_session) - //.field("__ut_pad2", &self.__ut_pad2) - .field("ut_tv", &self.ut_tv) - .field("ut_addr_v6", &self.ut_addr_v6) - .field("__unused", &self.__unused) - .finish() - } - } - impl hash::Hash for utmpx { + #[allow(deprecated)] fn hash<H: hash::Hasher>(&self, state: &mut H) { self.ut_type.hash(state); //self.__ut_pad1.hash(state); @@ -766,12 +705,6 @@ pub const PTRACE_GETSIGMASK: c_uint = 0x420a; pub const PTRACE_SETSIGMASK: c_uint = 0x420b; -pub const RWF_HIPRI: c_int = 0x00000001; -pub const RWF_DSYNC: c_int = 0x00000002; -pub const RWF_SYNC: c_int = 0x00000004; -pub const RWF_NOWAIT: c_int = 0x00000008; -pub const RWF_APPEND: c_int = 0x00000010; - pub const AF_IB: c_int = 27; pub const AF_MPLS: c_int = 28; pub const AF_NFC: c_int = 39; @@ -787,8 +720,6 @@ pub const SFD_NONBLOCK: c_int = crate::O_NONBLOCK; -pub const PIDFD_NONBLOCK: c_uint = O_NONBLOCK as c_uint; - pub const TCSANOW: c_int = 0; pub const TCSADRAIN: c_int = 1; pub const TCSAFLUSH: c_int = 2;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/uclibc/arm/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/uclibc/arm/mod.rs index 634161e..7a517f49 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/uclibc/arm/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/uclibc/arm/mod.rs
@@ -475,7 +475,6 @@ pub const POLLWRNORM: c_short = 0x100; pub const PTHREAD_STACK_MIN: size_t = 16384; pub const RTLD_GLOBAL: c_int = 0x00100; -pub const PIDFD_NONBLOCK: c_int = 0x800; // These are typed unsigned to match sigaction pub const SA_NOCLDSTOP: c_ulong = 0x1;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/uclibc/mips/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/uclibc/mips/mod.rs index f1934c3..0ad572a9 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/uclibc/mips/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/uclibc/mips/mod.rs
@@ -57,7 +57,6 @@ pub const O_NDELAY: c_int = 0x80; pub const SOCK_NONBLOCK: c_int = 128; -pub const PIDFD_NONBLOCK: c_int = 128; pub const EDEADLK: c_int = 45; pub const ENAMETOOLONG: c_int = 78;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/uclibc/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/uclibc/mod.rs index b7a34dd..4fef82e 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/uclibc/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/uclibc/mod.rs
@@ -1,3 +1,6 @@ +// FIXME(ulibc): this module has definitions that are redundant with the parent +#![allow(dead_code)] + use crate::off64_t; use crate::prelude::*;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/uclibc/x86_64/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/uclibc/x86_64/mod.rs index 3a4ee0d..4a6c19f 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/uclibc/x86_64/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/linux/uclibc/x86_64/mod.rs
@@ -342,7 +342,6 @@ pub const __SIZEOF_PTHREAD_RWLOCKATTR_T: usize = 8; pub const __SIZEOF_PTHREAD_BARRIER_T: usize = 32; pub const __SIZEOF_PTHREAD_BARRIERATTR_T: usize = 4; -pub const PIDFD_NONBLOCK: c_int = 0o4000; cfg_if! { if #[cfg(target_os = "l4re")] {
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/mod.rs index 64481a67..a2969e85 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/linux_like/mod.rs
@@ -208,6 +208,32 @@ } cfg_if! { + if #[cfg(not(target_os = "emscripten"))] { + s! { + pub struct file_clone_range { + pub src_fd: crate::__s64, + pub src_offset: crate::__u64, + pub src_length: crate::__u64, + pub dest_offset: crate::__u64, + } + + // linux/filter.h + pub struct sock_filter { + pub code: __u16, + pub jt: __u8, + pub jf: __u8, + pub k: __u32, + } + + pub struct sock_fprog { + pub len: c_ushort, + pub filter: *mut sock_filter, + } + } + } +} + +cfg_if! { if #[cfg(any(target_env = "gnu", target_os = "android"))] { s! { pub struct statx { @@ -308,16 +334,6 @@ } } impl Eq for epoll_event {} - impl fmt::Debug for epoll_event { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let events = self.events; - let u64 = self.u64; - f.debug_struct("epoll_event") - .field("events", &events) - .field("u64", &u64) - .finish() - } - } impl hash::Hash for epoll_event { fn hash<H: hash::Hasher>(&self, state: &mut H) { let events = self.events; @@ -338,14 +354,6 @@ } } impl Eq for sockaddr_un {} - impl fmt::Debug for sockaddr_un { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sockaddr_un") - .field("sun_family", &self.sun_family) - // FIXME(debug): .field("sun_path", &self.sun_path) - .finish() - } - } impl hash::Hash for sockaddr_un { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.sun_family.hash(state); @@ -366,16 +374,6 @@ impl Eq for sockaddr_storage {} - impl fmt::Debug for sockaddr_storage { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sockaddr_storage") - .field("ss_family", &self.ss_family) - .field("__ss_align", &self.__ss_align) - // FIXME(debug): .field("__ss_pad2", &self.__ss_pad2) - .finish() - } - } - impl hash::Hash for sockaddr_storage { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.ss_family.hash(state); @@ -419,19 +417,6 @@ impl Eq for utsname {} - impl fmt::Debug for utsname { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("utsname") - // FIXME(debug): .field("sysname", &self.sysname) - // FIXME(debug): .field("nodename", &self.nodename) - // FIXME(debug): .field("release", &self.release) - // FIXME(debug): .field("version", &self.version) - // FIXME(debug): .field("machine", &self.machine) - // FIXME(debug): .field("domainname", &self.domainname) - .finish() - } - } - impl hash::Hash for utsname { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.sysname.hash(state); @@ -452,16 +437,6 @@ } } impl Eq for sigevent {} - impl fmt::Debug for sigevent { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sigevent") - .field("sigev_value", &self.sigev_value) - .field("sigev_signo", &self.sigev_signo) - .field("sigev_notify", &self.sigev_notify) - .field("sigev_notify_thread_id", &self.sigev_notify_thread_id) - .finish() - } - } impl hash::Hash for sigevent { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.sigev_value.hash(state); @@ -545,26 +520,26 @@ pub const SOCK_CLOEXEC: c_int = O_CLOEXEC; -pub const S_IFIFO: crate::mode_t = 0o1_0000; -pub const S_IFCHR: crate::mode_t = 0o2_0000; -pub const S_IFBLK: crate::mode_t = 0o6_0000; -pub const S_IFDIR: crate::mode_t = 0o4_0000; -pub const S_IFREG: crate::mode_t = 0o10_0000; -pub const S_IFLNK: crate::mode_t = 0o12_0000; -pub const S_IFSOCK: crate::mode_t = 0o14_0000; -pub const S_IFMT: crate::mode_t = 0o17_0000; -pub const S_IRWXU: crate::mode_t = 0o0700; -pub const S_IXUSR: crate::mode_t = 0o0100; -pub const S_IWUSR: crate::mode_t = 0o0200; -pub const S_IRUSR: crate::mode_t = 0o0400; -pub const S_IRWXG: crate::mode_t = 0o0070; -pub const S_IXGRP: crate::mode_t = 0o0010; -pub const S_IWGRP: crate::mode_t = 0o0020; -pub const S_IRGRP: crate::mode_t = 0o0040; -pub const S_IRWXO: crate::mode_t = 0o0007; -pub const S_IXOTH: crate::mode_t = 0o0001; -pub const S_IWOTH: crate::mode_t = 0o0002; -pub const S_IROTH: crate::mode_t = 0o0004; +pub const S_IFIFO: mode_t = 0o1_0000; +pub const S_IFCHR: mode_t = 0o2_0000; +pub const S_IFBLK: mode_t = 0o6_0000; +pub const S_IFDIR: mode_t = 0o4_0000; +pub const S_IFREG: mode_t = 0o10_0000; +pub const S_IFLNK: mode_t = 0o12_0000; +pub const S_IFSOCK: mode_t = 0o14_0000; +pub const S_IFMT: mode_t = 0o17_0000; +pub const S_IRWXU: mode_t = 0o0700; +pub const S_IXUSR: mode_t = 0o0100; +pub const S_IWUSR: mode_t = 0o0200; +pub const S_IRUSR: mode_t = 0o0400; +pub const S_IRWXG: mode_t = 0o0070; +pub const S_IXGRP: mode_t = 0o0010; +pub const S_IWGRP: mode_t = 0o0020; +pub const S_IRGRP: mode_t = 0o0040; +pub const S_IRWXO: mode_t = 0o0007; +pub const S_IXOTH: mode_t = 0o0001; +pub const S_IWOTH: mode_t = 0o0002; +pub const S_IROTH: mode_t = 0o0004; pub const F_OK: c_int = 0; pub const R_OK: c_int = 4; pub const W_OK: c_int = 2; @@ -1483,6 +1458,93 @@ pub const ARPHRD_NONE: u16 = 0xFFFE; cfg_if! { + if #[cfg(not(target_os = "emscripten"))] { + // linux/if_tun.h + /* TUNSETIFF ifr flags */ + pub const IFF_TUN: c_int = 0x0001; + pub const IFF_TAP: c_int = 0x0002; + pub const IFF_NAPI: c_int = 0x0010; + pub const IFF_NAPI_FRAGS: c_int = 0x0020; + // Used in TUNSETIFF to bring up tun/tap without carrier + pub const IFF_NO_CARRIER: c_int = 0x0040; + pub const IFF_NO_PI: c_int = 0x1000; + // Read queue size + pub const TUN_READQ_SIZE: c_short = 500; + // TUN device type flags: deprecated. Use IFF_TUN/IFF_TAP instead. + pub const TUN_TUN_DEV: c_short = crate::IFF_TUN as c_short; + pub const TUN_TAP_DEV: c_short = crate::IFF_TAP as c_short; + pub const TUN_TYPE_MASK: c_short = 0x000f; + // This flag has no real effect + pub const IFF_ONE_QUEUE: c_int = 0x2000; + pub const IFF_VNET_HDR: c_int = 0x4000; + pub const IFF_TUN_EXCL: c_int = 0x8000; + pub const IFF_MULTI_QUEUE: c_int = 0x0100; + pub const IFF_ATTACH_QUEUE: c_int = 0x0200; + pub const IFF_DETACH_QUEUE: c_int = 0x0400; + // read-only flag + pub const IFF_PERSIST: c_int = 0x0800; + pub const IFF_NOFILTER: c_int = 0x1000; + // Socket options + pub const TUN_TX_TIMESTAMP: c_int = 1; + // Features for GSO (TUNSETOFFLOAD) + pub const TUN_F_CSUM: c_uint = 0x01; + pub const TUN_F_TSO4: c_uint = 0x02; + pub const TUN_F_TSO6: c_uint = 0x04; + pub const TUN_F_TSO_ECN: c_uint = 0x08; + pub const TUN_F_UFO: c_uint = 0x10; + pub const TUN_F_USO4: c_uint = 0x20; + pub const TUN_F_USO6: c_uint = 0x40; + // Protocol info prepended to the packets (when IFF_NO_PI is not set) + pub const TUN_PKT_STRIP: c_int = 0x0001; + // Accept all multicast packets + pub const TUN_FLT_ALLMULTI: c_int = 0x0001; + // Ioctl operation codes + const T_TYPE: u32 = b'T' as u32; + pub const TUNSETNOCSUM: Ioctl = _IOW::<c_int>(T_TYPE, 200); + pub const TUNSETDEBUG: Ioctl = _IOW::<c_int>(T_TYPE, 201); + pub const TUNSETIFF: Ioctl = _IOW::<c_int>(T_TYPE, 202); + pub const TUNSETPERSIST: Ioctl = _IOW::<c_int>(T_TYPE, 203); + pub const TUNSETOWNER: Ioctl = _IOW::<c_int>(T_TYPE, 204); + pub const TUNSETLINK: Ioctl = _IOW::<c_int>(T_TYPE, 205); + pub const TUNSETGROUP: Ioctl = _IOW::<c_int>(T_TYPE, 206); + pub const TUNGETFEATURES: Ioctl = _IOR::<c_int>(T_TYPE, 207); + pub const TUNSETOFFLOAD: Ioctl = _IOW::<c_int>(T_TYPE, 208); + pub const TUNSETTXFILTER: Ioctl = _IOW::<c_int>(T_TYPE, 209); + pub const TUNGETIFF: Ioctl = _IOR::<c_int>(T_TYPE, 210); + pub const TUNGETSNDBUF: Ioctl = _IOR::<c_int>(T_TYPE, 211); + pub const TUNSETSNDBUF: Ioctl = _IOW::<c_int>(T_TYPE, 212); + pub const TUNATTACHFILTER: Ioctl = _IOW::<sock_fprog>(T_TYPE, 213); + pub const TUNDETACHFILTER: Ioctl = _IOW::<sock_fprog>(T_TYPE, 214); + pub const TUNGETVNETHDRSZ: Ioctl = _IOR::<c_int>(T_TYPE, 215); + pub const TUNSETVNETHDRSZ: Ioctl = _IOW::<c_int>(T_TYPE, 216); + pub const TUNSETQUEUE: Ioctl = _IOW::<c_int>(T_TYPE, 217); + pub const TUNSETIFINDEX: Ioctl = _IOW::<c_int>(T_TYPE, 218); + pub const TUNGETFILTER: Ioctl = _IOR::<sock_fprog>(T_TYPE, 219); + pub const TUNSETVNETLE: Ioctl = _IOW::<c_int>(T_TYPE, 220); + pub const TUNGETVNETLE: Ioctl = _IOR::<c_int>(T_TYPE, 221); + pub const TUNSETVNETBE: Ioctl = _IOW::<c_int>(T_TYPE, 222); + pub const TUNGETVNETBE: Ioctl = _IOR::<c_int>(T_TYPE, 223); + pub const TUNSETSTEERINGEBPF: Ioctl = _IOR::<c_int>(T_TYPE, 224); + pub const TUNSETFILTEREBPF: Ioctl = _IOR::<c_int>(T_TYPE, 225); + pub const TUNSETCARRIER: Ioctl = _IOW::<c_int>(T_TYPE, 226); + pub const TUNGETDEVNETNS: Ioctl = _IO(T_TYPE, 227); + + // linux/fs.h + pub const FS_IOC_GETFLAGS: Ioctl = _IOR::<c_long>('f' as u32, 1); + pub const FS_IOC_SETFLAGS: Ioctl = _IOW::<c_long>('f' as u32, 2); + pub const FS_IOC_GETVERSION: Ioctl = _IOR::<c_long>('v' as u32, 1); + pub const FS_IOC_SETVERSION: Ioctl = _IOW::<c_long>('v' as u32, 2); + pub const FS_IOC32_GETFLAGS: Ioctl = _IOR::<c_int>('f' as u32, 1); + pub const FS_IOC32_SETFLAGS: Ioctl = _IOW::<c_int>('f' as u32, 2); + pub const FS_IOC32_GETVERSION: Ioctl = _IOR::<c_int>('v' as u32, 1); + pub const FS_IOC32_SETVERSION: Ioctl = _IOW::<c_int>('v' as u32, 2); + + pub const FICLONE: Ioctl = _IOW::<c_int>(0x94, 9); + pub const FICLONERANGE: Ioctl = _IOW::<crate::file_clone_range>(0x94, 13); + } +} + +cfg_if! { if #[cfg(target_os = "emscripten")] { // Emscripten does not define any `*_SUPER_MAGIC` constants. } else if #[cfg(not(target_arch = "s390x"))] { @@ -1633,11 +1695,7 @@ // https://github.com/search?q=repo%3Atorvalds%2Flinux+%22%23define+_IOC_NONE%22&type=code cfg_if! { - if #[cfg(any( - target_os = "linux", - target_os = "android", - target_os = "l4re" - ))] { + if #[cfg(not(target_os = "emscripten"))] { const _IOC_NRBITS: u32 = 8; const _IOC_TYPEBITS: u32 = 8; @@ -1681,7 +1739,7 @@ // adapted from https://github.com/torvalds/linux/blob/8a696a29c6905594e4abf78eaafcb62165ac61f1/rust/kernel/ioctl.rs /// Build an ioctl number, analogous to the C macro of the same name. - const fn _IOC(dir: u32, ty: u32, nr: u32, size: usize) -> u32 { + const fn _IOC(dir: u32, ty: u32, nr: u32, size: usize) -> Ioctl { // FIXME(ctest) the `garando_syntax` crate (used by ctest in the CI test suite) // cannot currently parse these `debug_assert!`s // @@ -1690,26 +1748,51 @@ // debug_assert!(nr <= _IOC_NRMASK); // debug_assert!(size <= (_IOC_SIZEMASK as usize)); - (dir << _IOC_DIRSHIFT) + ((dir << _IOC_DIRSHIFT) | (ty << _IOC_TYPESHIFT) | (nr << _IOC_NRSHIFT) - | ((size as u32) << _IOC_SIZESHIFT) + | ((size as u32) << _IOC_SIZESHIFT)) as Ioctl + } + + /// Build an ioctl number for an argumentless ioctl. + pub const fn _IO(ty: u32, nr: u32) -> Ioctl { + _IOC(_IOC_NONE, ty, nr, 0) + } + + /// Build an ioctl number for an read-only ioctl. + pub const fn _IOR<T>(ty: u32, nr: u32) -> Ioctl { + _IOC(_IOC_READ, ty, nr, mem::size_of::<T>()) + } + + /// Build an ioctl number for an write-only ioctl. + pub const fn _IOW<T>(ty: u32, nr: u32) -> Ioctl { + _IOC(_IOC_WRITE, ty, nr, mem::size_of::<T>()) + } + + /// Build an ioctl number for a read-write ioctl. + pub const fn _IOWR<T>(ty: u32, nr: u32) -> Ioctl { + _IOC(_IOC_READ | _IOC_WRITE, ty, nr, mem::size_of::<T>()) + } + + extern "C" { + #[cfg_attr(gnu_time_bits64, link_name = "__ioctl_time64")] + pub fn ioctl(fd: c_int, request: Ioctl, ...) -> c_int; } } } const_fn! { {const} fn CMSG_ALIGN(len: usize) -> usize { - len + mem::size_of::<usize>() - 1 & !(mem::size_of::<usize>() - 1) + (len + mem::size_of::<usize>() - 1) & !(mem::size_of::<usize>() - 1) } } f! { pub fn CMSG_FIRSTHDR(mhdr: *const msghdr) -> *mut cmsghdr { if (*mhdr).msg_controllen as usize >= mem::size_of::<cmsghdr>() { - (*mhdr).msg_control as *mut cmsghdr + (*mhdr).msg_control.cast::<cmsghdr>() } else { - 0 as *mut cmsghdr + core::ptr::null_mut::<cmsghdr>() } } @@ -1746,7 +1829,7 @@ } pub fn FD_ZERO(set: *mut fd_set) -> () { - for slot in (*set).fds_bits.iter_mut() { + for slot in &mut (*set).fds_bits { *slot = 0; } } @@ -1838,8 +1921,11 @@ pub fn fdatasync(fd: c_int) -> c_int; pub fn mincore(addr: *mut c_void, len: size_t, vec: *mut c_uchar) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__clock_getres64")] pub fn clock_getres(clk_id: crate::clockid_t, tp: *mut crate::timespec) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__clock_gettime64")] pub fn clock_gettime(clk_id: crate::clockid_t, tp: *mut crate::timespec) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__clock_settime64")] pub fn clock_settime(clk_id: crate::clockid_t, tp: *const crate::timespec) -> c_int; pub fn clock_getcpuclockid(pid: crate::pid_t, clk_id: *mut crate::clockid_t) -> c_int; @@ -1866,7 +1952,9 @@ pub fn memrchr(cx: *const c_void, c: c_int, n: size_t) -> *mut c_void; #[cfg_attr(gnu_file_offset_bits64, link_name = "posix_fadvise64")] pub fn posix_fadvise(fd: c_int, offset: off_t, len: off_t, advise: c_int) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__futimens64")] pub fn futimens(fd: c_int, times: *const crate::timespec) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__utimensat64")] pub fn utimensat( dirfd: c_int, path: *const c_char, @@ -1877,8 +1965,7 @@ pub fn freelocale(loc: crate::locale_t); pub fn newlocale(mask: c_int, locale: *const c_char, base: crate::locale_t) -> crate::locale_t; pub fn uselocale(loc: crate::locale_t) -> crate::locale_t; - pub fn mknodat(dirfd: c_int, pathname: *const c_char, mode: crate::mode_t, dev: dev_t) - -> c_int; + pub fn mknodat(dirfd: c_int, pathname: *const c_char, mode: mode_t, dev: dev_t) -> c_int; pub fn pthread_condattr_getclock( attr: *const pthread_condattr_t, clock_id: *mut clockid_t, @@ -1922,6 +2009,7 @@ pub fn vfork() -> crate::pid_t; pub fn setresgid(rgid: crate::gid_t, egid: crate::gid_t, sgid: crate::gid_t) -> c_int; pub fn setresuid(ruid: crate::uid_t, euid: crate::uid_t, suid: crate::uid_t) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__wait4_time64")] pub fn wait4( pid: crate::pid_t, status: *mut c_int, @@ -1949,7 +2037,9 @@ pub fn writev(fd: c_int, iov: *const crate::iovec, iovcnt: c_int) -> ssize_t; pub fn readv(fd: c_int, iov: *const crate::iovec, iovcnt: c_int) -> ssize_t; + #[cfg_attr(gnu_time_bits64, link_name = "__sendmsg64")] pub fn sendmsg(fd: c_int, msg: *const crate::msghdr, flags: c_int) -> ssize_t; + #[cfg_attr(gnu_time_bits64, link_name = "__recvmsg64")] pub fn recvmsg(fd: c_int, msg: *mut crate::msghdr, flags: c_int) -> ssize_t; pub fn uname(buf: *mut crate::utsname) -> c_int; @@ -1991,7 +2081,9 @@ pub fn fstatvfs64(fd: c_int, buf: *mut statvfs64) -> c_int; pub fn statfs64(path: *const c_char, buf: *mut statfs64) -> c_int; pub fn creat64(path: *const c_char, mode: mode_t) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__fstat64_time64")] pub fn fstat64(fildes: c_int, buf: *mut stat64) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__fstatat64_time64")] pub fn fstatat64( dirfd: c_int, pathname: *const c_char, @@ -2000,6 +2092,7 @@ ) -> c_int; pub fn ftruncate64(fd: c_int, length: off64_t) -> c_int; pub fn lseek64(fd: c_int, offset: off64_t, whence: c_int) -> off64_t; + #[cfg_attr(gnu_time_bits64, link_name = "__lstat64_time64")] pub fn lstat64(path: *const c_char, buf: *mut stat64) -> c_int; pub fn mmap64( addr: *mut c_void, @@ -2030,6 +2123,7 @@ entry: *mut crate::dirent64, result: *mut *mut crate::dirent64, ) -> c_int; + #[cfg_attr(gnu_time_bits64, link_name = "__stat64_time64")] pub fn stat64(path: *const c_char, buf: *mut stat64) -> c_int; pub fn truncate64(path: *const c_char, length: off64_t) -> c_int; }
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/mod.rs index 433eeec9..96209e7 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/mod.rs
@@ -56,14 +56,19 @@ pub modtime: time_t, } - // FIXME(time): Needs updates at least for glibc _TIME_BITS=64 pub struct timeval { pub tv_sec: time_t, + #[cfg(not(gnu_time_bits64))] pub tv_usec: suseconds_t, + // For 64 bit time on 32 bit linux glibc, suseconds_t is still + // a 32 bit type. Use __suseconds64_t instead + #[cfg(gnu_time_bits64)] + pub tv_usec: __suseconds64_t, } // linux x32 compatibility // See https://sourceware.org/bugzilla/show_bug.cgi?id=16437 + #[cfg(not(target_env = "gnu"))] pub struct timespec { pub tv_sec: time_t, #[cfg(all(target_arch = "x86_64", target_pointer_width = "32"))] @@ -155,6 +160,7 @@ pub revents: c_short, } + #[cfg(not(target_os = "aix"))] pub struct winsize { pub ws_row: c_ushort, pub ws_col: c_ushort, @@ -220,7 +226,7 @@ pub const SIG_ERR: sighandler_t = !0 as sighandler_t; cfg_if! { - if #[cfg(not(target_os = "nto"))] { + if #[cfg(all(not(target_os = "nto"), not(target_os = "aix")))] { pub const DT_UNKNOWN: u8 = 0; pub const DT_FIFO: u8 = 1; pub const DT_CHR: u8 = 2; @@ -245,9 +251,9 @@ } pub const SIGIOT: c_int = 6; -pub const S_ISUID: crate::mode_t = 0o4000; -pub const S_ISGID: crate::mode_t = 0o2000; -pub const S_ISVTX: crate::mode_t = 0o1000; +pub const S_ISUID: mode_t = 0o4000; +pub const S_ISGID: mode_t = 0o2000; +pub const S_ISVTX: mode_t = 0o1000; cfg_if! { if #[cfg(not(any( @@ -335,7 +341,7 @@ pub const ATF_USETRAILERS: c_int = 0x10; cfg_if! { - if #[cfg(target_os = "nto")] { + if #[cfg(any(target_os = "nto", target_os = "aix"))] { pub const FNM_PERIOD: c_int = 1 << 1; } else { pub const FNM_PERIOD: c_int = 1 << 2; @@ -346,7 +352,7 @@ cfg_if! { if #[cfg(any(target_os = "illumos", target_os = "solaris",))] { pub const FNM_CASEFOLD: c_int = 1 << 3; - } else { + } else if #[cfg(not(target_os = "aix"))] { pub const FNM_CASEFOLD: c_int = 1 << 4; } } @@ -375,6 +381,8 @@ pub const FNM_NOESCAPE: c_int = 1 << 0; } else if #[cfg(target_os = "nto")] { pub const FNM_NOESCAPE: c_int = 1 << 2; + } else if #[cfg(target_os = "aix")] { + pub const FNM_NOESCAPE: c_int = 1 << 3; } else { pub const FNM_NOESCAPE: c_int = 1 << 1; } @@ -559,7 +567,7 @@ } cfg_if! { - if #[cfg(not(target_env = "gnu"))] { + if #[cfg(not(all(target_os = "linux", target_env = "gnu")))] { missing! { #[cfg_attr(feature = "extra_traits", derive(Debug))] pub enum fpos_t {} // FIXME(unix): fill this out with a struct @@ -666,7 +674,9 @@ pub fn strtoll(s: *const c_char, endp: *mut *mut c_char, base: c_int) -> c_longlong; pub fn strtoul(s: *const c_char, endp: *mut *mut c_char, base: c_int) -> c_ulong; pub fn strtoull(s: *const c_char, endp: *mut *mut c_char, base: c_int) -> c_ulonglong; + #[cfg_attr(target_os = "aix", link_name = "vec_calloc")] pub fn calloc(nobj: size_t, size: size_t) -> *mut c_void; + #[cfg_attr(target_os = "aix", link_name = "vec_malloc")] pub fn malloc(size: size_t) -> *mut c_void; pub fn realloc(p: *mut c_void, size: size_t) -> *mut c_void; pub fn free(p: *mut c_void); @@ -778,6 +788,7 @@ link_name = "accept$UNIX2003" )] #[cfg_attr(target_os = "espidf", link_name = "lwip_accept")] + #[cfg_attr(target_os = "aix", link_name = "naccept")] pub fn accept(socket: c_int, address: *mut sockaddr, address_len: *mut socklen_t) -> c_int; #[cfg(not(all(target_arch = "powerpc", target_vendor = "nintendo")))] #[cfg_attr( @@ -785,6 +796,7 @@ link_name = "getpeername$UNIX2003" )] #[cfg_attr(target_os = "espidf", link_name = "lwip_getpeername")] + #[cfg_attr(target_os = "aix", link_name = "ngetpeername")] pub fn getpeername(socket: c_int, address: *mut sockaddr, address_len: *mut socklen_t) -> c_int; #[cfg(not(all(target_arch = "powerpc", target_vendor = "nintendo")))] @@ -793,9 +805,11 @@ link_name = "getsockname$UNIX2003" )] #[cfg_attr(target_os = "espidf", link_name = "lwip_getsockname")] + #[cfg_attr(target_os = "aix", link_name = "ngetsockname")] pub fn getsockname(socket: c_int, address: *mut sockaddr, address_len: *mut socklen_t) -> c_int; #[cfg_attr(target_os = "espidf", link_name = "lwip_setsockopt")] + #[cfg_attr(gnu_time_bits64, link_name = "__setsockopt64")] pub fn setsockopt( socket: c_int, level: c_int, @@ -858,7 +872,11 @@ all(target_os = "freebsd", any(freebsd11, freebsd10)), link_name = "fstat@FBSD_1.0" )] - #[cfg_attr(gnu_file_offset_bits64, link_name = "fstat64")] + #[cfg_attr(gnu_time_bits64, link_name = "__fstat64_time64")] + #[cfg_attr( + all(not(gnu_time_bits64), gnu_file_offset_bits64), + link_name = "fstat64" + )] pub fn fstat(fildes: c_int, buf: *mut stat) -> c_int; pub fn mkdir(path: *const c_char, mode: mode_t) -> c_int; @@ -872,7 +890,11 @@ all(target_os = "freebsd", any(freebsd11, freebsd10)), link_name = "stat@FBSD_1.0" )] - #[cfg_attr(gnu_file_offset_bits64, link_name = "stat64")] + #[cfg_attr(gnu_time_bits64, link_name = "__stat64_time64")] + #[cfg_attr( + all(not(gnu_time_bits64), gnu_file_offset_bits64), + link_name = "stat64" + )] pub fn stat(path: *const c_char, buf: *mut stat) -> c_int; pub fn pclose(stream: *mut crate::FILE) -> c_int; @@ -899,7 +921,11 @@ all(target_os = "macos", target_arch = "x86"), link_name = "fcntl$UNIX2003" )] - #[cfg_attr(gnu_file_offset_bits64, link_name = "__fcntl_time64")] + #[cfg_attr(gnu_time_bits64, link_name = "__fcntl_time64")] + #[cfg_attr( + all(not(gnu_time_bits64), gnu_file_offset_bits64), + link_name = "__fcntl_time64" + )] pub fn fcntl(fd: c_int, cmd: c_int, ...) -> c_int; #[cfg_attr( @@ -939,12 +965,7 @@ )] pub fn rewinddir(dirp: *mut crate::DIR); - pub fn fchmodat( - dirfd: c_int, - pathname: *const c_char, - mode: crate::mode_t, - flags: c_int, - ) -> c_int; + pub fn fchmodat(dirfd: c_int, pathname: *const c_char, mode: mode_t, flags: c_int) -> c_int; pub fn fchown(fd: c_int, owner: crate::uid_t, group: crate::gid_t) -> c_int; pub fn fchownat( dirfd: c_int, @@ -961,7 +982,11 @@ all(target_os = "freebsd", any(freebsd11, freebsd10)), link_name = "fstatat@FBSD_1.1" )] - #[cfg_attr(gnu_file_offset_bits64, link_name = "fstatat64")] + #[cfg_attr(gnu_time_bits64, link_name = "__fstatat64_time64")] + #[cfg_attr( + all(not(gnu_time_bits64), gnu_file_offset_bits64), + link_name = "fstatat64" + )] pub fn fstatat(dirfd: c_int, pathname: *const c_char, buf: *mut stat, flags: c_int) -> c_int; pub fn linkat( olddirfd: c_int, @@ -1066,6 +1091,7 @@ link_name = "nanosleep$UNIX2003" )] #[cfg_attr(target_os = "netbsd", link_name = "__nanosleep50")] + #[cfg_attr(gnu_time_bits64, link_name = "__nanosleep64")] pub fn nanosleep(rqtp: *const timespec, rmtp: *mut timespec) -> c_int; pub fn tcgetpgrp(fd: c_int) -> pid_t; pub fn tcsetpgrp(fd: c_int, pgrp: crate::pid_t) -> c_int; @@ -1110,6 +1136,7 @@ pub fn umask(mask: mode_t) -> mode_t; #[cfg_attr(target_os = "netbsd", link_name = "__utime50")] + #[cfg_attr(gnu_time_bits64, link_name = "__utime64")] pub fn utime(file: *const c_char, buf: *const utimbuf) -> c_int; #[cfg_attr( @@ -1159,7 +1186,11 @@ all(target_os = "freebsd", any(freebsd11, freebsd10)), link_name = "lstat@FBSD_1.0" )] - #[cfg_attr(gnu_file_offset_bits64, link_name = "lstat64")] + #[cfg_attr(gnu_time_bits64, link_name = "__lstat64_time64")] + #[cfg_attr( + all(not(gnu_time_bits64), gnu_file_offset_bits64), + link_name = "lstat64" + )] pub fn lstat(path: *const c_char, buf: *mut stat) -> c_int; #[cfg_attr( @@ -1190,6 +1221,7 @@ pub fn signal(signum: c_int, handler: sighandler_t) -> sighandler_t; #[cfg_attr(target_os = "netbsd", link_name = "__getrusage50")] + #[cfg_attr(gnu_time_bits64, link_name = "__getrusage64")] pub fn getrusage(resource: c_int, usage: *mut rusage) -> c_int; #[cfg_attr( @@ -1265,6 +1297,7 @@ all(target_os = "macos", target_arch = "x86"), link_name = "pthread_cond_timedwait$UNIX2003" )] + #[cfg_attr(gnu_time_bits64, link_name = "__pthread_cond_timedwait64")] pub fn pthread_cond_timedwait( cond: *mut pthread_cond_t, lock: *mut pthread_mutex_t, @@ -1321,6 +1354,7 @@ link_name = "__xnet_getsockopt" )] #[cfg_attr(target_os = "espidf", link_name = "lwip_getsockopt")] + #[cfg_attr(gnu_time_bits64, link_name = "__getsockopt64")] pub fn getsockopt( sockfd: c_int, level: c_int, @@ -1331,6 +1365,7 @@ pub fn raise(signum: c_int) -> c_int; #[cfg_attr(target_os = "netbsd", link_name = "__utimes50")] + #[cfg_attr(gnu_time_bits64, link_name = "__utimes64")] pub fn utimes(filename: *const c_char, times: *const crate::timeval) -> c_int; pub fn dlopen(filename: *const c_char, flag: c_int) -> *mut c_void; pub fn dlerror() -> *mut c_char; @@ -1377,15 +1412,18 @@ ), link_name = "res_9_init" )] + #[cfg_attr(target_os = "aix", link_name = "_res_init")] pub fn res_init() -> c_int; #[cfg_attr(target_os = "netbsd", link_name = "__gmtime_r50")] #[cfg_attr(any(target_env = "musl", target_env = "ohos"), allow(deprecated))] // FIXME(time): for `time_t` + #[cfg_attr(gnu_time_bits64, link_name = "__gmtime64_r")] pub fn gmtime_r(time_p: *const time_t, result: *mut tm) -> *mut tm; #[cfg_attr(target_os = "netbsd", link_name = "__localtime_r50")] #[cfg_attr(any(target_env = "musl", target_env = "ohos"), allow(deprecated))] // FIXME(time): for `time_t` + #[cfg_attr(gnu_time_bits64, link_name = "__localtime64_r")] pub fn localtime_r(time_p: *const time_t, result: *mut tm) -> *mut tm; #[cfg_attr( all(target_os = "macos", target_arch = "x86"), @@ -1394,26 +1432,33 @@ #[cfg_attr(target_os = "netbsd", link_name = "__mktime50")] #[cfg_attr(any(target_env = "musl", target_env = "ohos"), allow(deprecated))] // FIXME: for `time_t` + #[cfg_attr(gnu_time_bits64, link_name = "__mktime64")] pub fn mktime(tm: *mut tm) -> time_t; #[cfg_attr(target_os = "netbsd", link_name = "__time50")] #[cfg_attr(any(target_env = "musl", target_env = "ohos"), allow(deprecated))] // FIXME: for `time_t` + #[cfg_attr(gnu_time_bits64, link_name = "__time64")] pub fn time(time: *mut time_t) -> time_t; #[cfg_attr(target_os = "netbsd", link_name = "__gmtime50")] #[cfg_attr(any(target_env = "musl", target_env = "ohos"), allow(deprecated))] // FIXME(time): for `time_t` + #[cfg_attr(gnu_time_bits64, link_name = "__gmtime64")] pub fn gmtime(time_p: *const time_t) -> *mut tm; #[cfg_attr(target_os = "netbsd", link_name = "__locatime50")] #[cfg_attr(any(target_env = "musl", target_env = "ohos"), allow(deprecated))] // FIXME(time): for `time_t` + #[cfg_attr(gnu_time_bits64, link_name = "__localtime64")] pub fn localtime(time_p: *const time_t) -> *mut tm; #[cfg_attr(target_os = "netbsd", link_name = "__difftime50")] #[cfg_attr(any(target_env = "musl", target_env = "ohos"), allow(deprecated))] // FIXME(time): for `time_t` + #[cfg_attr(gnu_time_bits64, link_name = "__difftime64")] pub fn difftime(time1: time_t, time0: time_t) -> c_double; + #[cfg(not(target_os = "aix"))] #[cfg_attr(target_os = "netbsd", link_name = "__timegm50")] #[cfg_attr(any(target_env = "musl", target_env = "ohos"), allow(deprecated))] // FIXME(time): for `time_t` + #[cfg_attr(gnu_time_bits64, link_name = "__timegm64")] pub fn timegm(tm: *mut crate::tm) -> time_t; #[cfg_attr(target_os = "netbsd", link_name = "__mknod50")] @@ -1421,7 +1466,7 @@ all(target_os = "freebsd", any(freebsd11, freebsd10)), link_name = "mknod@FBSD_1.0" )] - pub fn mknod(pathname: *const c_char, mode: crate::mode_t, dev: crate::dev_t) -> c_int; + pub fn mknod(pathname: *const c_char, mode: mode_t, dev: crate::dev_t) -> c_int; pub fn gethostname(name: *mut c_char, len: size_t) -> c_int; pub fn endservent(); pub fn getservbyname(name: *const c_char, proto: *const c_char) -> *mut servent; @@ -1471,6 +1516,8 @@ link_name = "select$UNIX2003" )] #[cfg_attr(target_os = "netbsd", link_name = "__select50")] + #[cfg_attr(target_os = "aix", link_name = "__fd_select")] + #[cfg_attr(gnu_time_bits64, link_name = "__select64")] pub fn select( nfds: c_int, readfds: *mut fd_set, @@ -1556,6 +1603,7 @@ pub fn ptsname(fd: c_int) -> *mut c_char; pub fn unlockpt(fd: c_int) -> c_int; + #[cfg(not(target_os = "aix"))] pub fn strcasestr(cs: *const c_char, ct: *const c_char) -> *mut c_char; pub fn getline(lineptr: *mut *mut c_char, n: *mut size_t, stream: *mut FILE) -> ssize_t; @@ -1588,9 +1636,11 @@ target_os = "haiku", target_os = "nto", target_os = "solaris", - target_os = "cygwin" + target_os = "cygwin", + target_os = "aix", )))] { extern "C" { + #[cfg_attr(gnu_time_bits64, link_name = "__adjtime64")] pub fn adjtime(delta: *const timeval, olddelta: *mut timeval) -> c_int; } } else if #[cfg(target_os = "solaris")] { @@ -1659,7 +1709,7 @@ )] pub fn pause() -> c_int; - pub fn mkdirat(dirfd: c_int, pathname: *const c_char, mode: crate::mode_t) -> c_int; + pub fn mkdirat(dirfd: c_int, pathname: *const c_char, mode: mode_t) -> c_int; #[cfg_attr(gnu_file_offset_bits64, link_name = "openat64")] pub fn openat(dirfd: c_int, pathname: *const c_char, flags: c_int, ...) -> c_int; @@ -1744,6 +1794,7 @@ link_name = "pselect$UNIX2003" )] #[cfg_attr(target_os = "netbsd", link_name = "__pselect50")] + #[cfg_attr(gnu_time_bits64, link_name = "__pselect64")] pub fn pselect( nfds: c_int, readfds: *mut fd_set, @@ -1757,7 +1808,12 @@ } cfg_if! { - if #[cfg(not(any( + if #[cfg(target_os = "aix")] { + extern "C" { + pub fn cfmakeraw(termios: *mut crate::termios) -> c_int; + pub fn cfsetspeed(termios: *mut crate::termios, speed: crate::speed_t) -> c_int; + } + } else if #[cfg(not(any( target_os = "solaris", target_os = "illumos", target_os = "nto",
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/newlib/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/newlib/mod.rs index ae118b4..d49bdb3 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/newlib/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/newlib/mod.rs
@@ -568,28 +568,28 @@ pub const FIOCLEX: c_ulong = 0x20006601; pub const FIONCLEX: c_ulong = 0x20006602; -pub const S_BLKSIZE: crate::mode_t = 1024; -pub const S_IREAD: crate::mode_t = 0o0400; -pub const S_IWRITE: crate::mode_t = 0o0200; -pub const S_IEXEC: crate::mode_t = 0o0100; -pub const S_ENFMT: crate::mode_t = 0o2000; -pub const S_IFMT: crate::mode_t = 0o17_0000; -pub const S_IFDIR: crate::mode_t = 0o4_0000; -pub const S_IFCHR: crate::mode_t = 0o2_0000; -pub const S_IFBLK: crate::mode_t = 0o6_0000; -pub const S_IFREG: crate::mode_t = 0o10_0000; -pub const S_IFLNK: crate::mode_t = 0o12_0000; -pub const S_IFSOCK: crate::mode_t = 0o14_0000; -pub const S_IFIFO: crate::mode_t = 0o1_0000; -pub const S_IRUSR: crate::mode_t = 0o0400; -pub const S_IWUSR: crate::mode_t = 0o0200; -pub const S_IXUSR: crate::mode_t = 0o0100; -pub const S_IRGRP: crate::mode_t = 0o0040; -pub const S_IWGRP: crate::mode_t = 0o0020; -pub const S_IXGRP: crate::mode_t = 0o0010; -pub const S_IROTH: crate::mode_t = 0o0004; -pub const S_IWOTH: crate::mode_t = 0o0002; -pub const S_IXOTH: crate::mode_t = 0o0001; +pub const S_BLKSIZE: mode_t = 1024; +pub const S_IREAD: mode_t = 0o0400; +pub const S_IWRITE: mode_t = 0o0200; +pub const S_IEXEC: mode_t = 0o0100; +pub const S_ENFMT: mode_t = 0o2000; +pub const S_IFMT: mode_t = 0o17_0000; +pub const S_IFDIR: mode_t = 0o4_0000; +pub const S_IFCHR: mode_t = 0o2_0000; +pub const S_IFBLK: mode_t = 0o6_0000; +pub const S_IFREG: mode_t = 0o10_0000; +pub const S_IFLNK: mode_t = 0o12_0000; +pub const S_IFSOCK: mode_t = 0o14_0000; +pub const S_IFIFO: mode_t = 0o1_0000; +pub const S_IRUSR: mode_t = 0o0400; +pub const S_IWUSR: mode_t = 0o0200; +pub const S_IXUSR: mode_t = 0o0100; +pub const S_IRGRP: mode_t = 0o0040; +pub const S_IWGRP: mode_t = 0o0020; +pub const S_IXGRP: mode_t = 0o0010; +pub const S_IROTH: mode_t = 0o0004; +pub const S_IWOTH: mode_t = 0o0002; +pub const S_IXOTH: mode_t = 0o0001; pub const SOL_TCP: c_int = 6;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/nto/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/nto/mod.rs index e0a1c9b..581b99e6 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/nto/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/nto/mod.rs
@@ -98,7 +98,7 @@ pub __old_st_mtime: crate::_Time32t, pub __old_st_atime: crate::_Time32t, pub __old_st_ctime: crate::_Time32t, - pub st_mode: crate::mode_t, + pub st_mode: mode_t, pub st_nlink: crate::nlink_t, pub st_blocksize: crate::blksize_t, pub st_nblocks: i32, @@ -563,7 +563,7 @@ pub gid: crate::gid_t, pub cuid: crate::uid_t, pub cgid: crate::gid_t, - pub mode: crate::mode_t, + pub mode: mode_t, pub seq: c_uint, pub key: crate::key_t, _reserved: [c_int; 4], @@ -811,16 +811,6 @@ } } impl Eq for sigevent {} - impl fmt::Debug for sigevent { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sigevent") - .field("sigev_notify", &self.sigev_notify) - .field("sigev_signo", &self.sigev_signo) - .field("sigev_value", &self.sigev_value) - .field("__sigev_un2", &self.__sigev_un2) - .finish() - } - } impl hash::Hash for sigevent { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.sigev_notify.hash(state); @@ -842,15 +832,6 @@ } } impl Eq for sockaddr_un {} - impl fmt::Debug for sockaddr_un { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sockaddr_un") - .field("sun_len", &self.sun_len) - .field("sun_family", &self.sun_family) - // FIXME(debug): .field("sun_path", &self.sun_path) - .finish() - } - } impl hash::Hash for sockaddr_un { fn hash<H: hash::Hasher>(&self, state: &mut H) { @@ -867,13 +848,6 @@ } } impl Eq for sigset_t {} - impl fmt::Debug for sigset_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sigset_t") - .field("__val", &self.__val) - .finish() - } - } impl hash::Hash for sigset_t { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.__val.hash(state); @@ -881,50 +855,10 @@ } // msg - impl fmt::Debug for msg { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("msg") - .field("msg_next", &self.msg_next) - .field("msg_type", &self.msg_type) - .field("msg_ts", &self.msg_ts) - .field("msg_spot", &self.msg_spot) - .finish() - } - } // msqid_ds - impl fmt::Debug for msqid_ds { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("msqid_ds") - .field("msg_perm", &self.msg_perm) - .field("msg_first", &self.msg_first) - .field("msg_cbytes", &self.msg_cbytes) - .field("msg_qnum", &self.msg_qnum) - .field("msg_qbytes", &self.msg_qbytes) - .field("msg_lspid", &self.msg_lspid) - .field("msg_lrpid", &self.msg_lrpid) - .field("msg_stime", &self.msg_stime) - .field("msg_rtime", &self.msg_rtime) - .field("msg_ctime", &self.msg_ctime) - .finish() - } - } // sockaddr_dl - impl fmt::Debug for sockaddr_dl { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sockaddr_dl") - .field("sdl_len", &self.sdl_len) - .field("sdl_family", &self.sdl_family) - .field("sdl_index", &self.sdl_index) - .field("sdl_type", &self.sdl_type) - .field("sdl_nlen", &self.sdl_nlen) - .field("sdl_alen", &self.sdl_alen) - .field("sdl_slen", &self.sdl_slen) - .field("sdl_data", &self.sdl_data) - .finish() - } - } impl PartialEq for sockaddr_dl { fn eq(&self, other: &sockaddr_dl) -> bool { self.sdl_len == other.sdl_len @@ -955,73 +889,6 @@ } } - // sync_t - impl fmt::Debug for sync_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sync_t") - .field("__owner", &self.__owner) - .field("__u", &self.__u) - .finish() - } - } - - // pthread_barrier_t - impl fmt::Debug for pthread_barrier_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("pthread_barrier_t") - .field("__pad", &self.__pad) - .finish() - } - } - - // pthread_rwlock_t - impl fmt::Debug for pthread_rwlock_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("pthread_rwlock_t") - .field("__active", &self.__active) - .field("__blockedwriters", &self.__blockedwriters) - .field("__blockedreaders", &self.__blockedreaders) - .field("__heavy", &self.__heavy) - .field("__lock", &self.__lock) - .field("__rcond", &self.__rcond) - .field("__wcond", &self.__wcond) - .field("__owner", &self.__owner) - .field("__spare", &self.__spare) - .finish() - } - } - - // syspage_entry - impl fmt::Debug for syspage_entry { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("syspage_entry") - .field("size", &self.size) - .field("total_size", &self.total_size) - .field("type_", &self.type_) - .field("num_cpu", &self.num_cpu) - .field("system_private", &self.system_private) - .field("old_asinfo", &self.old_asinfo) - .field("hwinfo", &self.hwinfo) - .field("old_cpuinfo", &self.old_cpuinfo) - .field("old_cacheattr", &self.old_cacheattr) - .field("qtime", &self.qtime) - .field("callout", &self.callout) - .field("callin", &self.callin) - .field("typed_strings", &self.typed_strings) - .field("strings", &self.strings) - .field("old_intrinfo", &self.old_intrinfo) - .field("smp", &self.smp) - .field("pminfo", &self.pminfo) - .field("old_mdriver", &self.old_mdriver) - .field("new_asinfo", &self.new_asinfo) - .field("new_cpuinfo", &self.new_cpuinfo) - .field("new_cacheattr", &self.new_cacheattr) - .field("new_intrinfo", &self.new_intrinfo) - .field("new_mdriver", &self.new_mdriver) - .finish() - } - } - impl PartialEq for utsname { fn eq(&self, other: &utsname) -> bool { self.sysname @@ -1053,18 +920,6 @@ impl Eq for utsname {} - impl fmt::Debug for utsname { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("utsname") - // FIXME(debug): .field("sysname", &self.sysname) - // FIXME(debug): .field("nodename", &self.nodename) - // FIXME(debug): .field("release", &self.release) - // FIXME(debug): .field("version", &self.version) - // FIXME(debug): .field("machine", &self.machine) - .finish() - } - } - impl hash::Hash for utsname { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.sysname.hash(state); @@ -1089,19 +944,6 @@ impl Eq for mq_attr {} - impl fmt::Debug for mq_attr { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("mq_attr") - .field("mq_maxmsg", &self.mq_maxmsg) - .field("mq_msgsize", &self.mq_msgsize) - .field("mq_flags", &self.mq_flags) - .field("mq_curmsgs", &self.mq_curmsgs) - .field("mq_msgsize", &self.mq_msgsize) - .field("mq_sendwait", &self.mq_sendwait) - .field("mq_recvwait", &self.mq_recvwait) - .finish() - } - } impl hash::Hash for mq_attr { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.mq_maxmsg.hash(state); @@ -1129,18 +971,6 @@ impl Eq for sockaddr_storage {} - impl fmt::Debug for sockaddr_storage { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sockaddr_storage") - .field("ss_len", &self.ss_len) - .field("ss_family", &self.ss_family) - .field("__ss_pad1", &self.__ss_pad1) - .field("__ss_align", &self.__ss_align) - // FIXME(debug): .field("__ss_pad2", &self.__ss_pad2) - .finish() - } - } - impl hash::Hash for sockaddr_storage { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.ss_len.hash(state); @@ -1166,18 +996,6 @@ impl Eq for dirent {} - impl fmt::Debug for dirent { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("dirent") - .field("d_ino", &self.d_ino) - .field("d_offset", &self.d_offset) - .field("d_reclen", &self.d_reclen) - .field("d_namelen", &self.d_namelen) - .field("d_name", &&self.d_name[..self.d_namelen as _]) - .finish() - } - } - impl hash::Hash for dirent { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.d_ino.hash(state); @@ -2175,27 +1993,27 @@ pub const S_IWRITE: mode_t = crate::S_IWUSR; pub const S_IREAD: mode_t = crate::S_IRUSR; -pub const S_IFIFO: crate::mode_t = 0o1_0000; -pub const S_IFCHR: crate::mode_t = 0o2_0000; -pub const S_IFDIR: crate::mode_t = 0o4_0000; -pub const S_IFBLK: crate::mode_t = 0o6_0000; -pub const S_IFREG: crate::mode_t = 0o10_0000; -pub const S_IFLNK: crate::mode_t = 0o12_0000; -pub const S_IFSOCK: crate::mode_t = 0o14_0000; -pub const S_IFMT: crate::mode_t = 0o17_0000; +pub const S_IFIFO: mode_t = 0o1_0000; +pub const S_IFCHR: mode_t = 0o2_0000; +pub const S_IFDIR: mode_t = 0o4_0000; +pub const S_IFBLK: mode_t = 0o6_0000; +pub const S_IFREG: mode_t = 0o10_0000; +pub const S_IFLNK: mode_t = 0o12_0000; +pub const S_IFSOCK: mode_t = 0o14_0000; +pub const S_IFMT: mode_t = 0o17_0000; -pub const S_IXOTH: crate::mode_t = 0o0001; -pub const S_IWOTH: crate::mode_t = 0o0002; -pub const S_IROTH: crate::mode_t = 0o0004; -pub const S_IRWXO: crate::mode_t = 0o0007; -pub const S_IXGRP: crate::mode_t = 0o0010; -pub const S_IWGRP: crate::mode_t = 0o0020; -pub const S_IRGRP: crate::mode_t = 0o0040; -pub const S_IRWXG: crate::mode_t = 0o0070; -pub const S_IXUSR: crate::mode_t = 0o0100; -pub const S_IWUSR: crate::mode_t = 0o0200; -pub const S_IRUSR: crate::mode_t = 0o0400; -pub const S_IRWXU: crate::mode_t = 0o0700; +pub const S_IXOTH: mode_t = 0o0001; +pub const S_IWOTH: mode_t = 0o0002; +pub const S_IROTH: mode_t = 0o0004; +pub const S_IRWXO: mode_t = 0o0007; +pub const S_IXGRP: mode_t = 0o0010; +pub const S_IWGRP: mode_t = 0o0020; +pub const S_IRGRP: mode_t = 0o0040; +pub const S_IRWXG: mode_t = 0o0070; +pub const S_IXUSR: mode_t = 0o0100; +pub const S_IWUSR: mode_t = 0o0200; +pub const S_IRUSR: mode_t = 0o0400; +pub const S_IRWXU: mode_t = 0o0700; pub const F_LOCK: c_int = 1; pub const F_TEST: c_int = 3; @@ -2802,7 +2620,7 @@ if (*mhdr).msg_controllen as usize >= mem::size_of::<cmsghdr>() { (*mhdr).msg_control as *mut cmsghdr } else { - 0 as *mut cmsghdr + core::ptr::null_mut::<cmsghdr>() } } @@ -2810,7 +2628,7 @@ let msg = _CMSG_ALIGN((*cmsg).cmsg_len as usize); let next = cmsg as usize + msg + _CMSG_ALIGN(mem::size_of::<cmsghdr>()); if next > (*mhdr).msg_control as usize + (*mhdr).msg_controllen as usize { - 0 as *mut cmsghdr + core::ptr::null_mut::<cmsghdr>() } else { (cmsg as usize + msg) as *mut cmsghdr } @@ -2982,13 +2800,8 @@ pub fn fdatasync(fd: c_int) -> c_int; pub fn getpriority(which: c_int, who: crate::id_t) -> c_int; pub fn setpriority(which: c_int, who: crate::id_t, prio: c_int) -> c_int; - pub fn mkfifoat(dirfd: c_int, pathname: *const c_char, mode: crate::mode_t) -> c_int; - pub fn mknodat( - __fd: c_int, - pathname: *const c_char, - mode: crate::mode_t, - dev: crate::dev_t, - ) -> c_int; + pub fn mkfifoat(dirfd: c_int, pathname: *const c_char, mode: mode_t) -> c_int; + pub fn mknodat(__fd: c_int, pathname: *const c_char, mode: mode_t, dev: crate::dev_t) -> c_int; pub fn clock_getres(clk_id: crate::clockid_t, tp: *mut crate::timespec) -> c_int; pub fn clock_gettime(clk_id: crate::clockid_t, tp: *mut crate::timespec) -> c_int; @@ -3361,7 +3174,7 @@ fd: c_int, path: *const c_char, oflag: c_int, - mode: crate::mode_t, + mode: mode_t, ) -> c_int; pub fn posix_spawn_file_actions_addclose( actions: *mut posix_spawn_file_actions_t,
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/nuttx/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/nuttx/mod.rs index 015a2ba..de734f9e 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/nuttx/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/nuttx/mod.rs
@@ -591,4 +591,6 @@ pub fn pthread_setname_np(thread: pthread_t, name: *const c_char) -> i32; pub fn pthread_getname_np(thread: pthread_t, name: *mut c_char, len: usize) -> i32; pub fn getrandom(buf: *mut c_void, buflen: usize, flags: u32) -> isize; + pub fn arc4random() -> u32; + pub fn arc4random_buf(bytes: *mut c_void, nbytes: usize); }
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/redox/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/redox/mod.rs index d7ed748..859cdccd 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/redox/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/redox/mod.rs
@@ -196,7 +196,7 @@ pub st_dev: crate::dev_t, pub st_ino: crate::ino_t, pub st_nlink: crate::nlink_t, - pub st_mode: crate::mode_t, + pub st_mode: mode_t, pub st_uid: crate::uid_t, pub st_gid: crate::gid_t, pub st_rdev: crate::dev_t, @@ -661,14 +661,14 @@ pub const SIGSYS: c_int = 31; pub const NSIG: c_int = 32; -pub const SA_NOCLDSTOP: c_ulong = 0x00000001; -pub const SA_NOCLDWAIT: c_ulong = 0x00000002; -pub const SA_SIGINFO: c_ulong = 0x00000004; -pub const SA_RESTORER: c_ulong = 0x04000000; -pub const SA_ONSTACK: c_ulong = 0x08000000; -pub const SA_RESTART: c_ulong = 0x10000000; -pub const SA_NODEFER: c_ulong = 0x40000000; -pub const SA_RESETHAND: c_ulong = 0x80000000; +pub const SA_NOCLDWAIT: c_ulong = 0x0000_0002; +pub const SA_RESTORER: c_ulong = 0x0000_0004; // FIXME(redox): remove after relibc removes it +pub const SA_SIGINFO: c_ulong = 0x0200_0000; +pub const SA_ONSTACK: c_ulong = 0x0400_0000; +pub const SA_RESTART: c_ulong = 0x0800_0000; +pub const SA_NODEFER: c_ulong = 0x1000_0000; +pub const SA_RESETHAND: c_ulong = 0x2000_0000; +pub const SA_NOCLDSTOP: c_ulong = 0x4000_0000; // sys/file.h pub const LOCK_SH: c_int = 1; @@ -782,6 +782,7 @@ pub const MSG_TRUNC: c_int = 32; pub const MSG_DONTWAIT: c_int = 64; pub const MSG_WAITALL: c_int = 256; +pub const SCM_RIGHTS: c_int = 1; pub const SHUT_RD: c_int = 0; pub const SHUT_WR: c_int = 1; pub const SHUT_RDWR: c_int = 2; @@ -1014,8 +1015,19 @@ pub const PRIO_PGRP: c_int = 1; pub const PRIO_USER: c_int = 2; -// wait.h f! { + //sys/socket.h + pub {const} fn CMSG_ALIGN(len: size_t) -> size_t { + (len + mem::size_of::<size_t>() - 1) & !(mem::size_of::<size_t>() - 1) + } + pub {const} fn CMSG_LEN(length: c_uint) -> c_uint { + (CMSG_ALIGN(mem::size_of::<cmsghdr>()) + length as usize) as c_uint + } + pub {const} fn CMSG_SPACE(len: c_uint) -> c_uint { + (CMSG_ALIGN(len as size_t) + CMSG_ALIGN(mem::size_of::<cmsghdr>())) as c_uint + } + + // wait.h pub fn FD_CLR(fd: c_int, set: *mut fd_set) -> () { let fd = fd as usize; let size = mem::size_of_val(&(*set).fds_bits[0]) * 8; @@ -1228,12 +1240,9 @@ pub fn setrlimit(resource: c_int, rlim: *const crate::rlimit) -> c_int; // sys/socket.h - pub fn CMSG_ALIGN(len: size_t) -> size_t; pub fn CMSG_DATA(cmsg: *const cmsghdr) -> *mut c_uchar; pub fn CMSG_FIRSTHDR(mhdr: *const msghdr) -> *mut cmsghdr; - pub fn CMSG_LEN(len: c_uint) -> c_uint; pub fn CMSG_NXTHDR(mhdr: *const msghdr, cmsg: *const cmsghdr) -> *mut cmsghdr; - pub fn CMSG_SPACE(len: c_uint) -> c_uint; pub fn bind( socket: c_int, address: *const crate::sockaddr, @@ -1249,31 +1258,13 @@ ) -> ssize_t; pub fn recvmsg(socket: c_int, msg: *mut msghdr, flags: c_int) -> ssize_t; pub fn sendmsg(socket: c_int, msg: *const msghdr, flags: c_int) -> ssize_t; - pub fn sendto( - socket: c_int, - buf: *const c_void, - len: size_t, - flags: c_int, - addr: *const crate::sockaddr, - addrlen: crate::socklen_t, - ) -> ssize_t; // sys/stat.h pub fn futimens(fd: c_int, times: *const crate::timespec) -> c_int; // sys/uio.h - pub fn preadv( - fd: c_int, - iov: *const crate::iovec, - iovcnt: c_int, - offset: off_t, - ) -> ssize_t; - pub fn pwritev( - fd: c_int, - iov: *const crate::iovec, - iovcnt: c_int, - offset: off_t, - ) -> ssize_t; + pub fn preadv(fd: c_int, iov: *const crate::iovec, iovcnt: c_int, offset: off_t) -> ssize_t; + pub fn pwritev(fd: c_int, iov: *const crate::iovec, iovcnt: c_int, offset: off_t) -> ssize_t; pub fn readv(fd: c_int, iov: *const crate::iovec, iovcnt: c_int) -> ssize_t; pub fn writev(fd: c_int, iov: *const crate::iovec, iovcnt: c_int) -> ssize_t; @@ -1306,18 +1297,6 @@ impl Eq for dirent {} - impl fmt::Debug for dirent { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("dirent") - .field("d_ino", &self.d_ino) - .field("d_off", &self.d_off) - .field("d_reclen", &self.d_reclen) - .field("d_type", &self.d_type) - // FIXME(debug): .field("d_name", &self.d_name) - .finish() - } - } - impl hash::Hash for dirent { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.d_ino.hash(state); @@ -1341,15 +1320,6 @@ impl Eq for sockaddr_un {} - impl fmt::Debug for sockaddr_un { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sockaddr_un") - .field("sun_family", &self.sun_family) - // FIXME(debug): .field("sun_path", &self.sun_path) - .finish() - } - } - impl hash::Hash for sockaddr_un { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.sun_family.hash(state); @@ -1371,16 +1341,6 @@ impl Eq for sockaddr_storage {} - impl fmt::Debug for sockaddr_storage { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sockaddr_storage") - .field("ss_family", &self.ss_family) - .field("__ss_align", &self.__ss_align) - // FIXME(debug): .field("__ss_padding", &self.__ss_padding) - .finish() - } - } - impl hash::Hash for sockaddr_storage { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.ss_family.hash(state); @@ -1425,19 +1385,6 @@ impl Eq for utsname {} - impl fmt::Debug for utsname { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("utsname") - // FIXME(debug): .field("sysname", &self.sysname) - // FIXME(debug): .field("nodename", &self.nodename) - // FIXME(debug): .field("release", &self.release) - // FIXME(debug): .field("version", &self.version) - // FIXME(debug): .field("machine", &self.machine) - // FIXME(debug): .field("domainname", &self.domainname) - .finish() - } - } - impl hash::Hash for utsname { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.sysname.hash(state);
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/solarish/compat.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/solarish/compat.rs index 649d6ac..22bcf12e 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/solarish/compat.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/solarish/compat.rs
@@ -5,9 +5,6 @@ use crate::unix::solarish::*; use crate::{c_char, c_int, size_t}; -const PTEM: &[u8] = b"ptem\0"; -const LDTERM: &[u8] = b"ldterm\0"; - pub unsafe fn cfmakeraw(termios: *mut crate::termios) { (*termios).c_iflag &= !(IMAXBEL | IGNBRK | BRKINT | PARMRK | ISTRIP | INLCR | IGNCR | ICRNL | IXON); @@ -41,6 +38,7 @@ 0 } +#[cfg(target_os = "illumos")] unsafe fn bail(fdm: c_int, fds: c_int) -> c_int { let e = *___errno(); if fds >= 0 { @@ -50,7 +48,7 @@ crate::close(fdm); } *___errno() = e; - return -1; + -1 } #[cfg(target_os = "illumos")] @@ -61,6 +59,9 @@ termp: *const termios, winp: *const crate::winsize, ) -> c_int { + const PTEM: &[u8] = b"ptem\0"; + const LDTERM: &[u8] = b"ldterm\0"; + // Open the main pseudo-terminal device, making sure not to set it as the // controlling terminal for this process: let fdm = crate::posix_openpt(O_RDWR | O_NOCTTY); @@ -184,7 +185,7 @@ ) -> c_int { let old_errno = *crate::___errno(); *crate::___errno() = 0; - *result = native_getpwent_r(pwd, buf, min(buflen, c_int::max_value() as size_t) as c_int); + *result = native_getpwent_r(pwd, buf, min(buflen, c_int::MAX as size_t) as c_int); let ret = if (*result).is_null() { *crate::___errno() @@ -204,7 +205,7 @@ ) -> c_int { let old_errno = *crate::___errno(); *crate::___errno() = 0; - *result = native_getgrent_r(grp, buf, min(buflen, c_int::max_value() as size_t) as c_int); + *result = native_getgrent_r(grp, buf, min(buflen, c_int::MAX as size_t) as c_int); let ret = if (*result).is_null() { *crate::___errno()
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/solarish/illumos.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/solarish/illumos.rs index 3cb68e4..fbeadaf 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/solarish/illumos.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/solarish/illumos.rs
@@ -89,24 +89,6 @@ impl Eq for utmpx {} - impl fmt::Debug for utmpx { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("utmpx") - .field("ut_user", &self.ut_user) - .field("ut_id", &self.ut_id) - .field("ut_line", &self.ut_line) - .field("ut_pid", &self.ut_pid) - .field("ut_type", &self.ut_type) - .field("ut_exit", &self.ut_exit) - .field("ut_tv", &self.ut_tv) - .field("ut_session", &self.ut_session) - .field("ut_pad", &self.ut_pad) - .field("ut_syslen", &self.ut_syslen) - .field("ut_host", &&self.ut_host[..]) - .finish() - } - } - impl hash::Hash for utmpx { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.ut_user.hash(state); @@ -129,16 +111,6 @@ } } impl Eq for epoll_event {} - impl fmt::Debug for epoll_event { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - let events = self.events; - let u64 = self.u64; - f.debug_struct("epoll_event") - .field("events", &events) - .field("u64", &u64) - .finish() - } - } impl hash::Hash for epoll_event { fn hash<H: hash::Hasher>(&self, state: &mut H) { let events = self.events;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/solarish/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/solarish/mod.rs index 3ddde8d..9f90c4c 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/solarish/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/solarish/mod.rs
@@ -96,7 +96,7 @@ pub gid: crate::gid_t, pub cuid: crate::uid_t, pub cgid: crate::gid_t, - pub mode: crate::mode_t, + pub mode: mode_t, pub seq: c_uint, pub key: crate::key_t, } @@ -328,7 +328,7 @@ pub struct stat { pub st_dev: crate::dev_t, pub st_ino: crate::ino_t, - pub st_mode: crate::mode_t, + pub st_mode: mode_t, pub st_nlink: crate::nlink_t, pub st_uid: crate::uid_t, pub st_gid: crate::gid_t, @@ -585,14 +585,6 @@ } } impl Eq for sockaddr_un {} - impl fmt::Debug for sockaddr_un { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sockaddr_un") - .field("sun_family", &self.sun_family) - // FIXME(debug): .field("sun_path", &self.sun_path) - .finish() - } - } impl hash::Hash for sockaddr_un { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.sun_family.hash(state); @@ -629,17 +621,6 @@ } } impl Eq for utsname {} - impl fmt::Debug for utsname { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("utsname") - // FIXME(debug): .field("sysname", &self.sysname) - // FIXME(debug): .field("nodename", &self.nodename) - // FIXME(debug): .field("release", &self.release) - // FIXME(debug): .field("version", &self.version) - // FIXME(debug): .field("machine", &self.machine) - .finish() - } - } impl hash::Hash for utsname { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.sysname.hash(state); @@ -659,13 +640,6 @@ } } impl Eq for fd_set {} - impl fmt::Debug for fd_set { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("fd_set") - // FIXME(debug): .field("fds_bits", &self.fds_bits) - .finish() - } - } impl hash::Hash for fd_set { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.fds_bits.hash(state); @@ -685,16 +659,6 @@ } } impl Eq for sockaddr_storage {} - impl fmt::Debug for sockaddr_storage { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sockaddr_storage") - .field("ss_family", &self.ss_family) - .field("__ss_pad1", &self.__ss_pad1) - .field("__ss_align", &self.__ss_align) - // FIXME(debug): .field("__ss_pad2", &self.__ss_pad2) - .finish() - } - } impl hash::Hash for sockaddr_storage { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.ss_family.hash(state); @@ -754,16 +718,6 @@ } } impl Eq for siginfo_t {} - impl fmt::Debug for siginfo_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("siginfo_t") - .field("si_signo", &self.si_signo) - .field("si_code", &self.si_code) - .field("si_errno", &self.si_errno) - // FIXME(debug): .field("__pad", &self.__pad) - .finish() - } - } impl hash::Hash for siginfo_t { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.si_signo.hash(state); @@ -794,19 +748,6 @@ } } impl Eq for sockaddr_dl {} - impl fmt::Debug for sockaddr_dl { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sockaddr_dl") - .field("sdl_family", &self.sdl_family) - .field("sdl_index", &self.sdl_index) - .field("sdl_type", &self.sdl_type) - .field("sdl_nlen", &self.sdl_nlen) - .field("sdl_alen", &self.sdl_alen) - .field("sdl_slen", &self.sdl_slen) - // FIXME(debug): .field("sdl_data", &self.sdl_data) - .finish() - } - } impl hash::Hash for sockaddr_dl { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.sdl_family.hash(state); @@ -829,17 +770,6 @@ } } impl Eq for sigevent {} - impl fmt::Debug for sigevent { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sigevent") - .field("sigev_notify", &self.sigev_notify) - .field("sigev_signo", &self.sigev_signo) - .field("sigev_value", &self.sigev_value) - .field("ss_sp", &self.ss_sp) - .field("sigev_notify_attributes", &self.sigev_notify_attributes) - .finish() - } - } impl hash::Hash for sigevent { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.sigev_notify.hash(state); @@ -2483,7 +2413,7 @@ pub fn CMSG_FIRSTHDR(mhdr: *const crate::msghdr) -> *mut cmsghdr { if ((*mhdr).msg_controllen as usize) < size_of::<cmsghdr>() { - 0 as *mut cmsghdr + core::ptr::null_mut::<cmsghdr>() } else { (*mhdr).msg_control as *mut cmsghdr } @@ -2497,7 +2427,7 @@ _CMSG_HDR_ALIGN(cmsg as usize + (*cmsg).cmsg_len as usize + size_of::<cmsghdr>()); let max = (*mhdr).msg_control as usize + (*mhdr).msg_controllen as usize; if next > max { - 0 as *mut cmsghdr + core::ptr::null_mut::<cmsghdr>() } else { _CMSG_HDR_ALIGN(cmsg as usize + (*cmsg).cmsg_len as usize) as *mut cmsghdr } @@ -2648,9 +2578,8 @@ pub fn getpriority(which: c_int, who: c_int) -> c_int; pub fn setpriority(which: c_int, who: c_int, prio: c_int) -> c_int; - pub fn mknodat(dirfd: c_int, pathname: *const c_char, mode: crate::mode_t, dev: dev_t) - -> c_int; - pub fn mkfifoat(dirfd: c_int, pathname: *const c_char, mode: crate::mode_t) -> c_int; + pub fn mknodat(dirfd: c_int, pathname: *const c_char, mode: mode_t, dev: dev_t) -> c_int; + pub fn mkfifoat(dirfd: c_int, pathname: *const c_char, mode: mode_t) -> c_int; pub fn sethostname(name: *const c_char, len: c_int) -> c_int; pub fn if_nameindex() -> *mut if_nameindex; pub fn if_freenameindex(ptr: *mut if_nameindex); @@ -2727,7 +2656,7 @@ fildes: c_int, path: *const c_char, oflag: c_int, - mode: crate::mode_t, + mode: mode_t, ) -> c_int; pub fn posix_spawn_file_actions_addclose( file_actions: *mut posix_spawn_file_actions_t, @@ -2810,7 +2739,7 @@ pub fn shmget(key: key_t, size: size_t, shmflg: c_int) -> c_int; - pub fn shm_open(name: *const c_char, oflag: c_int, mode: crate::mode_t) -> c_int; + pub fn shm_open(name: *const c_char, oflag: c_int, mode: mode_t) -> c_int; pub fn shm_unlink(name: *const c_char) -> c_int; pub fn seekdir(dirp: *mut crate::DIR, loc: c_long);
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/solarish/solaris.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/solarish/solaris.rs index 7baa8a1..097ff1c 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/solarish/solaris.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/solarish/solaris.rs
@@ -125,24 +125,6 @@ impl Eq for utmpx {} - impl fmt::Debug for utmpx { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("utmpx") - .field("ut_user", &self.ut_user) - .field("ut_id", &self.ut_id) - .field("ut_line", &self.ut_line) - .field("ut_pid", &self.ut_pid) - .field("ut_type", &self.ut_type) - .field("ut_exit", &self.ut_exit) - .field("ut_tv", &self.ut_tv) - .field("ut_session", &self.ut_session) - .field("pad", &self.pad) - .field("ut_syslen", &self.ut_syslen) - .field("ut_host", &&self.ut_host[..]) - .finish() - } - } - impl hash::Hash for utmpx { fn hash<H: hash::Hasher>(&self, state: &mut H) { self.ut_user.hash(state);
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/solarish/x86_64.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/solarish/x86_64.rs index 4deaac0f..a45ca4b7 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/solarish/x86_64.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/unix/solarish/x86_64.rs
@@ -91,7 +91,9 @@ #[cfg(target_os = "solaris")] pub uc_xrs: solaris::xrs_t, #[cfg(target_os = "solaris")] - pub uc_filler: [c_long; 3], + pub uc_lwpid: c_uint, + #[cfg(target_os = "solaris")] + pub uc_filler: [c_long; 2], } } @@ -116,27 +118,12 @@ } } impl Eq for fpregset_t {} - impl fmt::Debug for fpregset_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("fpregset_t") - .field("fp_reg_set", &self.fp_reg_set) - .finish() - } - } impl PartialEq for mcontext_t { fn eq(&self, other: &mcontext_t) -> bool { self.gregs == other.gregs && self.fpregs == other.fpregs } } impl Eq for mcontext_t {} - impl fmt::Debug for mcontext_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("mcontext_t") - .field("gregs", &self.gregs) - .field("fpregs", &self.fpregs) - .finish() - } - } impl PartialEq for ucontext_t { fn eq(&self, other: &ucontext_t) -> bool { self.uc_flags == other.uc_flags @@ -148,18 +135,6 @@ } } impl Eq for ucontext_t {} - impl fmt::Debug for ucontext_t { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("ucontext_t") - .field("uc_flags", &self.uc_flags) - .field("uc_link", &self.uc_link) - .field("uc_sigmask", &self.uc_sigmask) - .field("uc_stack", &self.uc_stack) - .field("uc_mcontext", &self.uc_mcontext) - .field("uc_filler", &self.uc_filler) - .finish() - } - } } }
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/vxworks/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/vxworks/mod.rs index 3a44adc..deef310d 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/vxworks/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/vxworks/mod.rs
@@ -220,7 +220,7 @@ pub struct stat { pub st_dev: crate::dev_t, pub st_ino: crate::ino_t, - pub st_mode: crate::mode_t, + pub st_mode: mode_t, pub st_nlink: crate::nlink_t, pub st_uid: crate::uid_t, pub st_gid: crate::gid_t, @@ -454,53 +454,6 @@ cfg_if! { if #[cfg(feature = "extra_traits")] { - impl fmt::Debug for dirent { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("dirent") - .field("d_ino", &self.d_ino) - .field("d_name", &&self.d_name[..]) - .field("d_type", &self.d_type) - .finish() - } - } - - impl fmt::Debug for sockaddr_un { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sockaddr_un") - .field("sun_len", &self.sun_len) - .field("sun_family", &self.sun_family) - .field("sun_path", &&self.sun_path[..]) - .finish() - } - } - - impl fmt::Debug for RTP_DESC { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("RTP_DESC") - .field("status", &self.status) - .field("options", &self.options) - .field("entrAddr", &self.entrAddr) - .field("initTaskId", &self.initTaskId) - .field("parentId", &self.parentId) - .field("pathName", &&self.pathName[..]) - .field("taskCnt", &self.taskCnt) - .field("textStart", &self.textStart) - .field("textEnd", &self.textEnd) - .finish() - } - } - impl fmt::Debug for sockaddr_storage { - fn fmt(&self, f: &mut fmt::Formatter) -> fmt::Result { - f.debug_struct("sockaddr_storage") - .field("ss_len", &self.ss_len) - .field("ss_family", &self.ss_family) - .field("__ss_pad1", &&self.__ss_pad1[..]) - .field("__ss_align", &self.__ss_align) - .field("__ss_pad2", &&self.__ss_pad2[..]) - .finish() - } - } - impl PartialEq for sa_u_t { fn eq(&self, other: &sa_u_t) -> bool { unsafe { @@ -745,6 +698,7 @@ // FIXME(vxworks): could also be useful for TASK_DESC type pub const VX_TASK_NAME_LENGTH: c_int = 31; +pub const VX_TASK_RENAME_LENGTH: c_int = 16; // semLibCommon.h pub const S_semLib_INVALID_STATE: c_int = semErrorBase + 0x0065; @@ -806,6 +760,9 @@ pub const S_IXOTH: c_int = 0o0001; pub const S_IRWXO: c_int = 0o0007; +pub const UTIME_OMIT: c_long = 0x3ffffffe; +pub const UTIME_NOW: c_long = 0x3fffffff; + // socket.h pub const SOL_SOCKET: c_int = 0xffff; pub const SOMAXCONN: c_int = 128; @@ -1128,7 +1085,7 @@ if next <= max { (cmsg as usize + CMSG_ALIGN((*cmsg).cmsg_len as usize)) as *mut cmsghdr } else { - 0 as *mut cmsghdr + core::ptr::null_mut::<cmsghdr>() } } @@ -1136,7 +1093,7 @@ if (*mhdr).msg_controllen as usize > 0 { (*mhdr).msg_control as *mut cmsghdr } else { - 0 as *mut cmsghdr + core::ptr::null_mut::<cmsghdr>() } } @@ -1299,7 +1256,7 @@ pub fn msync(addr: *mut c_void, len: size_t, flags: c_int) -> c_int; pub fn truncate(path: *const c_char, length: off_t) -> c_int; - pub fn shm_open(name: *const c_char, oflag: c_int, mode: crate::mode_t) -> c_int; + pub fn shm_open(name: *const c_char, oflag: c_int, mode: mode_t) -> c_int; pub fn shm_unlink(name: *const c_char) -> c_int; pub fn gettimeofday(tp: *mut crate::timeval, tz: *mut c_void) -> c_int; @@ -1810,13 +1767,13 @@ pub fn rmdir(path: *const c_char) -> c_int; // stat.h - pub fn mkdir(dirName: *const c_char, mode: crate::mode_t) -> c_int; + pub fn mkdir(dirName: *const c_char, mode: mode_t) -> c_int; // stat.h - pub fn chmod(path: *const c_char, mode: crate::mode_t) -> c_int; + pub fn chmod(path: *const c_char, mode: mode_t) -> c_int; // stat.h - pub fn fchmod(attr1: c_int, attr2: crate::mode_t) -> c_int; + pub fn fchmod(attr1: c_int, attr2: mode_t) -> c_int; // unistd.h pub fn fsync(fd: c_int) -> c_int;
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/wasi/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/wasi/mod.rs index 035ff895..61061918 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/wasi/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/wasi/mod.rs
@@ -653,7 +653,7 @@ newpath: *const c_char, flags: c_int, ) -> c_int; - pub fn mkdirat(dirfd: c_int, pathname: *const c_char, mode: crate::mode_t) -> c_int; + pub fn mkdirat(dirfd: c_int, pathname: *const c_char, mode: mode_t) -> c_int; pub fn readlinkat( dirfd: c_int, pathname: *const c_char,
diff --git a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/windows/mod.rs b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/windows/mod.rs index 06cab0e5..5cafc85 100644 --- a/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/windows/mod.rs +++ b/third_party/rust/chromium_crates_io/vendor/libc-v0_2/src/windows/mod.rs
@@ -382,12 +382,30 @@ pub fn signal(signum: c_int, handler: sighandler_t) -> sighandler_t; pub fn raise(signum: c_int) -> c_int; + pub fn clock() -> clock_t; + pub fn ctime(sourceTime: *const time_t) -> *mut c_char; + pub fn difftime(timeEnd: time_t, timeStart: time_t) -> c_double; #[link_name = "_gmtime64_s"] pub fn gmtime_s(destTime: *mut tm, srcTime: *const time_t) -> c_int; + #[link_name = "_get_daylight"] + pub fn get_daylight(hours: *mut c_int) -> errno_t; + #[link_name = "_get_dstbias"] + pub fn get_dstbias(seconds: *mut c_long) -> errno_t; + #[link_name = "_get_timezone"] + pub fn get_timezone(seconds: *mut c_long) -> errno_t; + #[link_name = "_get_tzname"] + pub fn get_tzname( + p_return_value: *mut size_t, + time_zone_name: *mut c_char, + size_in_bytes: size_t, + index: c_int, + ) -> errno_t; #[link_name = "_localtime64_s"] pub fn localtime_s(tmDest: *mut tm, sourceTime: *const time_t) -> crate::errno_t; #[link_name = "_time64"] pub fn time(destTime: *mut time_t) -> time_t; + #[link_name = "_tzset"] + pub fn tzset(); #[link_name = "_chmod"] pub fn chmod(path: *const c_char, mode: c_int) -> c_int; #[link_name = "_wchmod"]
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-v2/.cargo_vcs_info.json b/third_party/rust/chromium_crates_io/vendor/syn-v2/.cargo_vcs_info.json index 26a2a29..a20d321 100644 --- a/third_party/rust/chromium_crates_io/vendor/syn-v2/.cargo_vcs_info.json +++ b/third_party/rust/chromium_crates_io/vendor/syn-v2/.cargo_vcs_info.json
@@ -1,6 +1,6 @@ { "git": { - "sha1": "b1cc55995dc2ff30ffdf10fc428f9df0bb85f28d" + "sha1": "85d427679f81de7abba97bedf6be990417ce77cc" }, "path_in_vcs": "" } \ No newline at end of file
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-v2/Cargo.lock b/third_party/rust/chromium_crates_io/vendor/syn-v2/Cargo.lock index 7d156136..f03e04f8 100644 --- a/third_party/rust/chromium_crates_io/vendor/syn-v2/Cargo.lock +++ b/third_party/rust/chromium_crates_io/vendor/syn-v2/Cargo.lock
@@ -43,7 +43,7 @@ dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.102", ] [[package]] @@ -170,7 +170,7 @@ dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.102", ] [[package]] @@ -326,7 +326,7 @@ dependencies = [ "cfg-if", "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi 0.11.1+wasi-snapshot-preview1", ] [[package]] @@ -687,9 +687,9 @@ [[package]] name = "memchr" -version = "2.7.4" +version = "2.7.5" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "78ca9ab1a0babb1e7d5695e3530886289c18cf2f87ec19a575a0abdce112e3a3" +checksum = "32a282da65faaf38286cf3be983213fcf1d2e2a58700e808f83f4ea9a4804bc0" [[package]] name = "mime" @@ -713,7 +713,7 @@ checksum = "78bed444cc8a2160f01cbcf811ef18cac863ad68ae8ca62092e8db51d51c761c" dependencies = [ "libc", - "wasi 0.11.0+wasi-snapshot-preview1", + "wasi 0.11.1+wasi-snapshot-preview1", "windows-sys 0.59.0", ] @@ -772,7 +772,7 @@ dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.102", ] [[package]] @@ -872,9 +872,9 @@ [[package]] name = "redox_syscall" -version = "0.5.12" +version = "0.5.13" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "928fca9cf2aa042393a8325b9ead81d2f0df4cb12e1e24cef072922ccd99c5af" +checksum = "0d04b7d0ee6b4a0207a0a7adb104d23ecb0b47d6beae7152d0fa34b692b29fd6" dependencies = [ "bitflags", ] @@ -896,14 +896,14 @@ dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.102", ] [[package]] name = "reqwest" -version = "0.12.19" +version = "0.12.20" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "a2f8e5513d63f2e5b386eb5106dc67eaf3f84e95258e210489136b8b92ad6119" +checksum = "eabf4c97d9130e2bf606614eb937e86edac8292eaa6f422f995d7e8de1eb1813" dependencies = [ "base64", "bytes", @@ -919,12 +919,10 @@ "hyper-rustls", "hyper-tls", "hyper-util", - "ipnet", "js-sys", "log", "mime", "native-tls", - "once_cell", "percent-encoding", "pin-project-lite", "rustls-pki-types", @@ -1079,7 +1077,7 @@ dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.102", ] [[package]] @@ -1157,9 +1155,9 @@ [[package]] name = "syn" -version = "2.0.101" +version = "2.0.102" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "8ce2b7fc941b3a24138a0a7cf8e858bfc6a992e7978a068a5c760deb0ed43caf" +checksum = "f6397daf94fa90f058bd0fd88429dd9e5738999cca8d701813c80723add80462" dependencies = [ "proc-macro2", "quote", @@ -1168,7 +1166,7 @@ [[package]] name = "syn" -version = "2.0.102" +version = "2.0.103" dependencies = [ "anyhow", "automod", @@ -1210,7 +1208,7 @@ dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.102", ] [[package]] @@ -1451,9 +1449,9 @@ [[package]] name = "wasi" -version = "0.11.0+wasi-snapshot-preview1" +version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "9c8d87e72b64a3b4db28d11ce29237c246188f4f51057d65a7eab63b7987e423" +checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" [[package]] name = "wasi" @@ -1486,7 +1484,7 @@ "log", "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.102", "wasm-bindgen-shared", ] @@ -1521,7 +1519,7 @@ dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.102", "wasm-bindgen-backend", "wasm-bindgen-shared", ] @@ -1556,9 +1554,9 @@ [[package]] name = "windows-link" -version = "0.1.1" +version = "0.1.3" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "76840935b766e1b0a05c0066835fb9ec80071d4c09a16f6bd5f7e655e3c14c38" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" [[package]] name = "windows-registry" @@ -1716,7 +1714,7 @@ dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.102", "synstructure", ] @@ -1737,7 +1735,7 @@ dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.102", "synstructure", ] @@ -1777,5 +1775,5 @@ dependencies = [ "proc-macro2", "quote", - "syn 2.0.101", + "syn 2.0.102", ]
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-v2/Cargo.toml b/third_party/rust/chromium_crates_io/vendor/syn-v2/Cargo.toml index d704b49e..9af47ea 100644 --- a/third_party/rust/chromium_crates_io/vendor/syn-v2/Cargo.toml +++ b/third_party/rust/chromium_crates_io/vendor/syn-v2/Cargo.toml
@@ -13,7 +13,7 @@ edition = "2021" rust-version = "1.61" name = "syn" -version = "2.0.102" +version = "2.0.103" authors = ["David Tolnay <dtolnay@gmail.com>"] build = false include = [
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-v2/Cargo.toml.orig b/third_party/rust/chromium_crates_io/vendor/syn-v2/Cargo.toml.orig index 218cd928..9317df48 100644 --- a/third_party/rust/chromium_crates_io/vendor/syn-v2/Cargo.toml.orig +++ b/third_party/rust/chromium_crates_io/vendor/syn-v2/Cargo.toml.orig
@@ -1,6 +1,6 @@ [package] name = "syn" -version = "2.0.102" +version = "2.0.103" authors = ["David Tolnay <dtolnay@gmail.com>"] categories = ["development-tools::procedural-macro-helpers", "parser-implementations"] description = "Parser for Rust source code"
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-v2/src/expr.rs b/third_party/rust/chromium_crates_io/vendor/syn-v2/src/expr.rs index b59bc76a..551a3f33 100644 --- a/third_party/rust/chromium_crates_io/vendor/syn-v2/src/expr.rs +++ b/third_party/rust/chromium_crates_io/vendor/syn-v2/src/expr.rs
@@ -3287,17 +3287,35 @@ } #[cfg(feature = "full")] - fn print_expr_assign(e: &ExprAssign, tokens: &mut TokenStream, fixup: FixupContext) { + fn print_expr_assign(e: &ExprAssign, tokens: &mut TokenStream, mut fixup: FixupContext) { outer_attrs_to_tokens(&e.attrs, tokens); - let (left_prec, left_fixup) = - fixup.leftmost_subexpression_with_operator(&e.left, false, false, Precedence::Assign); - print_subexpression(&e.left, left_prec <= Precedence::Range, tokens, left_fixup); - e.eq_token.to_tokens(tokens); - print_expr( - &e.right, - tokens, - fixup.rightmost_subexpression_fixup(false, false, Precedence::Assign), - ); + + let needs_group = !e.attrs.is_empty(); + if needs_group { + fixup = FixupContext::NONE; + } + + let do_print_expr = |tokens: &mut TokenStream| { + let (left_prec, left_fixup) = fixup.leftmost_subexpression_with_operator( + &e.left, + false, + false, + Precedence::Assign, + ); + print_subexpression(&e.left, left_prec <= Precedence::Range, tokens, left_fixup); + e.eq_token.to_tokens(tokens); + print_expr( + &e.right, + tokens, + fixup.rightmost_subexpression_fixup(false, false, Precedence::Assign), + ); + }; + + if needs_group { + token::Paren::default().surround(tokens, do_print_expr); + } else { + do_print_expr(tokens); + } } #[cfg(feature = "full")] @@ -3340,51 +3358,64 @@ } } - fn print_expr_binary(e: &ExprBinary, tokens: &mut TokenStream, fixup: FixupContext) { + fn print_expr_binary(e: &ExprBinary, tokens: &mut TokenStream, mut fixup: FixupContext) { outer_attrs_to_tokens(&e.attrs, tokens); - let binop_prec = Precedence::of_binop(&e.op); - let (left_prec, left_fixup) = fixup.leftmost_subexpression_with_operator( - &e.left, - #[cfg(feature = "full")] - match &e.op { - BinOp::Sub(_) - | BinOp::Mul(_) - | BinOp::And(_) - | BinOp::Or(_) - | BinOp::BitAnd(_) - | BinOp::BitOr(_) - | BinOp::Shl(_) - | BinOp::Lt(_) => true, - _ => false, - }, - match &e.op { - BinOp::Shl(_) | BinOp::Lt(_) => true, - _ => false, - }, - #[cfg(feature = "full")] - binop_prec, - ); - let left_needs_group = match binop_prec { - Precedence::Assign => left_prec <= Precedence::Range, - Precedence::Compare => left_prec <= binop_prec, - _ => left_prec < binop_prec, + let needs_group = !e.attrs.is_empty(); + if needs_group { + fixup = FixupContext::NONE; + } + + let do_print_expr = |tokens: &mut TokenStream| { + let binop_prec = Precedence::of_binop(&e.op); + let (left_prec, left_fixup) = fixup.leftmost_subexpression_with_operator( + &e.left, + #[cfg(feature = "full")] + match &e.op { + BinOp::Sub(_) + | BinOp::Mul(_) + | BinOp::And(_) + | BinOp::Or(_) + | BinOp::BitAnd(_) + | BinOp::BitOr(_) + | BinOp::Shl(_) + | BinOp::Lt(_) => true, + _ => false, + }, + match &e.op { + BinOp::Shl(_) | BinOp::Lt(_) => true, + _ => false, + }, + #[cfg(feature = "full")] + binop_prec, + ); + let left_needs_group = match binop_prec { + Precedence::Assign => left_prec <= Precedence::Range, + Precedence::Compare => left_prec <= binop_prec, + _ => left_prec < binop_prec, + }; + + let right_fixup = fixup.rightmost_subexpression_fixup( + #[cfg(feature = "full")] + false, + #[cfg(feature = "full")] + false, + #[cfg(feature = "full")] + binop_prec, + ); + let right_needs_group = binop_prec != Precedence::Assign + && right_fixup.rightmost_subexpression_precedence(&e.right) <= binop_prec; + + print_subexpression(&e.left, left_needs_group, tokens, left_fixup); + e.op.to_tokens(tokens); + print_subexpression(&e.right, right_needs_group, tokens, right_fixup); }; - let right_fixup = fixup.rightmost_subexpression_fixup( - #[cfg(feature = "full")] - false, - #[cfg(feature = "full")] - false, - #[cfg(feature = "full")] - binop_prec, - ); - let right_needs_group = binop_prec != Precedence::Assign - && right_fixup.rightmost_subexpression_precedence(&e.right) <= binop_prec; - - print_subexpression(&e.left, left_needs_group, tokens, left_fixup); - e.op.to_tokens(tokens); - print_subexpression(&e.right, right_needs_group, tokens, right_fixup); + if needs_group { + token::Paren::default().surround(tokens, do_print_expr); + } else { + do_print_expr(tokens); + } } #[cfg(feature = "full")] @@ -3462,19 +3493,33 @@ } } - fn print_expr_cast(e: &ExprCast, tokens: &mut TokenStream, fixup: FixupContext) { + fn print_expr_cast(e: &ExprCast, tokens: &mut TokenStream, mut fixup: FixupContext) { outer_attrs_to_tokens(&e.attrs, tokens); - let (left_prec, left_fixup) = fixup.leftmost_subexpression_with_operator( - &e.expr, - #[cfg(feature = "full")] - false, - false, - #[cfg(feature = "full")] - Precedence::Cast, - ); - print_subexpression(&e.expr, left_prec < Precedence::Cast, tokens, left_fixup); - e.as_token.to_tokens(tokens); - e.ty.to_tokens(tokens); + + let needs_group = !e.attrs.is_empty(); + if needs_group { + fixup = FixupContext::NONE; + } + + let do_print_expr = |tokens: &mut TokenStream| { + let (left_prec, left_fixup) = fixup.leftmost_subexpression_with_operator( + &e.expr, + #[cfg(feature = "full")] + false, + false, + #[cfg(feature = "full")] + Precedence::Cast, + ); + print_subexpression(&e.expr, left_prec < Precedence::Cast, tokens, left_fixup); + e.as_token.to_tokens(tokens); + e.ty.to_tokens(tokens); + }; + + if needs_group { + token::Paren::default().surround(tokens, do_print_expr); + } else { + do_print_expr(tokens); + } } #[cfg(feature = "full")]
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-v2/src/fixup.rs b/third_party/rust/chromium_crates_io/vendor/syn-v2/src/fixup.rs index b0973df2..5dfc257 100644 --- a/third_party/rust/chromium_crates_io/vendor/syn-v2/src/fixup.rs +++ b/third_party/rust/chromium_crates_io/vendor/syn-v2/src/fixup.rs
@@ -510,7 +510,7 @@ return consume_by_precedence; } match expr { - Expr::Assign(e) => { + Expr::Assign(e) if e.attrs.is_empty() => { if match fixup.next_operator { Precedence::Unambiguous => fail_offset >= 2, _ => bailout_offset >= 1, @@ -536,7 +536,7 @@ Scan::Bailout } } - Expr::Binary(e) => { + Expr::Binary(e) if e.attrs.is_empty() => { if match fixup.next_operator { Precedence::Unambiguous => { fail_offset >= 2 @@ -732,8 +732,10 @@ } } Expr::Array(_) + | Expr::Assign(_) | Expr::Async(_) | Expr::Await(_) + | Expr::Binary(_) | Expr::Block(_) | Expr::Call(_) | Expr::Cast(_)
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-v2/src/lib.rs b/third_party/rust/chromium_crates_io/vendor/syn-v2/src/lib.rs index b2fe1f8c..7e88f58 100644 --- a/third_party/rust/chromium_crates_io/vendor/syn-v2/src/lib.rs +++ b/third_party/rust/chromium_crates_io/vendor/syn-v2/src/lib.rs
@@ -249,7 +249,7 @@ //! dynamic library libproc_macro from rustc toolchain. // Syn types in rustdoc of other crates get linked to here. -#![doc(html_root_url = "https://docs.rs/syn/2.0.102")] +#![doc(html_root_url = "https://docs.rs/syn/2.0.103")] #![cfg_attr(docsrs, feature(doc_cfg))] #![deny(unsafe_op_in_unsafe_fn)] #![allow(non_camel_case_types)]
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-v2/tests/common/visit.rs b/third_party/rust/chromium_crates_io/vendor/syn-v2/tests/common/visit.rs index b4ae5ec..2d2a6c5 100644 --- a/third_party/rust/chromium_crates_io/vendor/syn-v2/tests/common/visit.rs +++ b/third_party/rust/chromium_crates_io/vendor/syn-v2/tests/common/visit.rs
@@ -3,9 +3,23 @@ use syn::visit_mut::{self, VisitMut}; use syn::{Expr, File, Generics, LifetimeParam, MacroDelimiter, Stmt, StmtMacro, TypeParam}; -pub struct FlattenParens; +pub struct FlattenParens { + discard_paren_attrs: bool, +} impl FlattenParens { + pub fn discard_attrs() -> Self { + FlattenParens { + discard_paren_attrs: true, + } + } + + pub fn combine_attrs() -> Self { + FlattenParens { + discard_paren_attrs: false, + } + } + pub fn visit_token_stream_mut(tokens: &mut TokenStream) { *tokens = mem::take(tokens) .into_iter() @@ -30,7 +44,18 @@ impl VisitMut for FlattenParens { fn visit_expr_mut(&mut self, e: &mut Expr) { while let Expr::Paren(paren) = e { + let paren_attrs = mem::take(&mut paren.attrs); *e = mem::replace(&mut *paren.expr, Expr::PLACEHOLDER); + if !paren_attrs.is_empty() && !self.discard_paren_attrs { + let nested_attrs = match e { + Expr::Assign(e) => &mut e.attrs, + Expr::Binary(e) => &mut e.attrs, + Expr::Cast(e) => &mut e.attrs, + _ => unimplemented!(), + }; + assert!(nested_attrs.is_empty()); + *nested_attrs = paren_attrs; + } } visit_mut::visit_expr_mut(self, e); }
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-v2/tests/test_expr.rs b/third_party/rust/chromium_crates_io/vendor/syn-v2/tests/test_expr.rs index 5203ec0..100b8a8 100644 --- a/third_party/rust/chromium_crates_io/vendor/syn-v2/tests/test_expr.rs +++ b/third_party/rust/chromium_crates_io/vendor/syn-v2/tests/test_expr.rs
@@ -830,6 +830,11 @@ quote! { (1 < 2) == (3 < 4) }, quote! { { (let _ = ()) } }, quote! { (#[attr] thing).field }, + quote! { #[attr] (1 + 1) }, + quote! { #[attr] (x = 1) }, + quote! { #[attr] (x += 1) }, + quote! { #[attr] (1 as T) }, + quote! { (return #[attr] (x + ..)).field }, quote! { (self.f)() }, quote! { (return)..=return }, quote! { 1 + (return)..=1 + return }, @@ -838,7 +843,7 @@ let original: Expr = syn::parse2(tokens).unwrap(); let mut flat = original.clone(); - FlattenParens.visit_expr_mut(&mut flat); + FlattenParens::combine_attrs().visit_expr_mut(&mut flat); let reconstructed: Expr = match syn::parse2(flat.to_token_stream()) { Ok(reconstructed) => reconstructed, Err(err) => panic!("failed to parse `{}`: {}", flat.to_token_stream(), err), @@ -1615,7 +1620,7 @@ ); }; AsIfPrinted.visit_expr_mut(&mut original); - FlattenParens.visit_expr_mut(&mut parsed); + FlattenParens::combine_attrs().visit_expr_mut(&mut parsed); if original != parsed { fail!( "before: {}\n{:#?}\nafter: {}\n{:#?}", @@ -1629,7 +1634,7 @@ FlattenParens::visit_token_stream_mut(&mut tokens_no_paren); if tokens.to_string() != tokens_no_paren.to_string() { if let Ok(mut parsed2) = syn::parse2::<Expr>(tokens_no_paren) { - FlattenParens.visit_expr_mut(&mut parsed2); + FlattenParens::combine_attrs().visit_expr_mut(&mut parsed2); if original == parsed2 { fail!("redundant parens: {}", tokens); }
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-v2/tests/test_round_trip.rs b/third_party/rust/chromium_crates_io/vendor/syn-v2/tests/test_round_trip.rs index 42869ed0..3657da2 100644 --- a/third_party/rust/chromium_crates_io/vendor/syn-v2/tests/test_round_trip.rs +++ b/third_party/rust/chromium_crates_io/vendor/syn-v2/tests/test_round_trip.rs
@@ -27,10 +27,9 @@ use crate::common::eq::SpanlessEq; use quote::quote; use rustc_ast::ast::{ - AngleBracketedArg, AngleBracketedArgs, Crate, GenericArg, GenericParamKind, Generics, - WhereClause, + AngleBracketedArg, Crate, GenericArg, GenericArgs, GenericParamKind, Generics, }; -use rustc_ast::mut_visit::MutVisitor; +use rustc_ast::mut_visit::{self, MutVisitor}; use rustc_ast_pretty::pprust; use rustc_data_structures::flat_map_in_place::FlatMapInPlace; use rustc_error_messages::{DiagMessage, LazyFallbackBundle}; @@ -207,28 +206,23 @@ struct NormalizeVisitor; impl MutVisitor for NormalizeVisitor { - fn visit_angle_bracketed_parameter_data(&mut self, e: &mut AngleBracketedArgs) { - #[derive(Ord, PartialOrd, Eq, PartialEq)] - enum Group { - Lifetimes, - TypesAndConsts, - Constraints, - } - e.args.sort_by_key(|arg| match arg { - AngleBracketedArg::Arg(arg) => match arg { - GenericArg::Lifetime(_) => Group::Lifetimes, - GenericArg::Type(_) | GenericArg::Const(_) => Group::TypesAndConsts, - }, - AngleBracketedArg::Constraint(_) => Group::Constraints, - }); - for arg in &mut e.args { - match arg { - AngleBracketedArg::Arg(arg) => self.visit_generic_arg(arg), - AngleBracketedArg::Constraint(constraint) => { - self.visit_assoc_item_constraint(constraint); - } + fn visit_generic_args(&mut self, e: &mut GenericArgs) { + if let GenericArgs::AngleBracketed(e) = e { + #[derive(Ord, PartialOrd, Eq, PartialEq)] + enum Group { + Lifetimes, + TypesAndConsts, + Constraints, } + e.args.sort_by_key(|arg| match arg { + AngleBracketedArg::Arg(arg) => match arg { + GenericArg::Lifetime(_) => Group::Lifetimes, + GenericArg::Type(_) | GenericArg::Const(_) => Group::TypesAndConsts, + }, + AngleBracketedArg::Constraint(_) => Group::Constraints, + }); } + mut_visit::walk_generic_args(self, e); } fn visit_generics(&mut self, e: &mut Generics) { @@ -245,12 +239,8 @@ }); e.params .flat_map_in_place(|param| self.flat_map_generic_param(param)); - self.visit_where_clause(&mut e.where_clause); - } - - fn visit_where_clause(&mut self, e: &mut WhereClause) { - if e.predicates.is_empty() { - e.has_where_token = false; + if e.where_clause.predicates.is_empty() { + e.where_clause.has_where_token = false; } } }
diff --git a/third_party/rust/chromium_crates_io/vendor/syn-v2/tests/test_unparenthesize.rs b/third_party/rust/chromium_crates_io/vendor/syn-v2/tests/test_unparenthesize.rs index ece2c2e..5fa2e59e 100644 --- a/third_party/rust/chromium_crates_io/vendor/syn-v2/tests/test_unparenthesize.rs +++ b/third_party/rust/chromium_crates_io/vendor/syn-v2/tests/test_unparenthesize.rs
@@ -43,10 +43,10 @@ match panic::catch_unwind(|| -> syn::Result<()> { let mut before = syn::parse_file(&content)?; - FlattenParens.visit_file_mut(&mut before); + FlattenParens::discard_attrs().visit_file_mut(&mut before); let printed = before.to_token_stream(); let mut after = syn::parse2::<syn::File>(printed.clone())?; - FlattenParens.visit_file_mut(&mut after); + FlattenParens::discard_attrs().visit_file_mut(&mut after); // Normalize features that we expect Syn not to print. AsIfPrinted.visit_file_mut(&mut before); if before != after {
diff --git a/third_party/rust/libc/v0_2/BUILD.gn b/third_party/rust/libc/v0_2/BUILD.gn index b36fbef..8143cbf 100644 --- a/third_party/rust/libc/v0_2/BUILD.gn +++ b/third_party/rust/libc/v0_2/BUILD.gn
@@ -203,7 +203,7 @@ cargo_pkg_authors = "The Rust Project Developers" cargo_pkg_name = "libc" cargo_pkg_description = "Raw FFI bindings to platform libraries like libc." - cargo_pkg_version = "0.2.172" + cargo_pkg_version = "0.2.173" allow_unsafe = true
diff --git a/third_party/rust/libc/v0_2/README.chromium b/third_party/rust/libc/v0_2/README.chromium index 07a3567..eb12c98 100644 --- a/third_party/rust/libc/v0_2/README.chromium +++ b/third_party/rust/libc/v0_2/README.chromium
@@ -1,11 +1,10 @@ Name: libc URL: https://crates.io/crates/libc -Version: 0.2.172 -Revision: a5eab581f9c9c03f29e3edd4a4d4f850d748f2e9 +Version: 0.2.173 +Revision: 9288ec0123086439f27ea47a2b120345e6007e24 License: Apache-2.0 License File: //third_party/rust/chromium_crates_io/vendor/libc-v0_2/LICENSE-APACHE Shipped: yes Security Critical: yes Description: Raw FFI bindings to platform libraries like libc. -
diff --git a/third_party/rust/syn/v2/BUILD.gn b/third_party/rust/syn/v2/BUILD.gn index db797d8a..4e9b925 100644 --- a/third_party/rust/syn/v2/BUILD.gn +++ b/third_party/rust/syn/v2/BUILD.gn
@@ -77,7 +77,7 @@ cargo_pkg_authors = "David Tolnay <dtolnay@gmail.com>" cargo_pkg_name = "syn" cargo_pkg_description = "Parser for Rust source code" - cargo_pkg_version = "2.0.102" + cargo_pkg_version = "2.0.103" allow_unsafe = true
diff --git a/third_party/rust/syn/v2/README.chromium b/third_party/rust/syn/v2/README.chromium index 4177b6c..b15e391 100644 --- a/third_party/rust/syn/v2/README.chromium +++ b/third_party/rust/syn/v2/README.chromium
@@ -1,7 +1,7 @@ Name: syn URL: https://crates.io/crates/syn -Version: 2.0.102 -Revision: b1cc55995dc2ff30ffdf10fc428f9df0bb85f28d +Version: 2.0.103 +Revision: 85d427679f81de7abba97bedf6be990417ce77cc License: Apache-2.0 License File: //third_party/rust/chromium_crates_io/vendor/syn-v2/LICENSE-APACHE Shipped: yes
diff --git a/third_party/skia b/third_party/skia index dc1958e..6d29cd6 160000 --- a/third_party/skia +++ b/third_party/skia
@@ -1 +1 @@ -Subproject commit dc1958e7118c351cef5adae548337f7f11746b95 +Subproject commit 6d29cd66e2059acd5491a733c2c7dfd3c4f8b2f6
diff --git a/third_party/vulkan-deps b/third_party/vulkan-deps index 3395378..8d1a39b 160000 --- a/third_party/vulkan-deps +++ b/third_party/vulkan-deps
@@ -1 +1 @@ -Subproject commit 3395378f6990e79066b5f1647f6f8ac5de07e26d +Subproject commit 8d1a39bd39e47a078f784e038d4561d2cfdc5f21
diff --git a/third_party/vulkan-loader/src b/third_party/vulkan-loader/src index 22c0f13..7ef1581 160000 --- a/third_party/vulkan-loader/src +++ b/third_party/vulkan-loader/src
@@ -1 +1 @@ -Subproject commit 22c0f133e6675f9313c12fb5e58337f8fa9b9195 +Subproject commit 7ef1581a996ba3ac58ae739fd7bfcf24d3bf2a57
diff --git a/third_party/vulkan-validation-layers/src b/third_party/vulkan-validation-layers/src index 3fa19fc..1c9f820 160000 --- a/third_party/vulkan-validation-layers/src +++ b/third_party/vulkan-validation-layers/src
@@ -1 +1 @@ -Subproject commit 3fa19fccc75171a6b607f95510c37739c606b809 +Subproject commit 1c9f8202b87119b23c81dad7f44cba2b8bc79180
diff --git a/third_party/webpagereplay b/third_party/webpagereplay index 18172a3..e463cb4 160000 --- a/third_party/webpagereplay +++ b/third_party/webpagereplay
@@ -1 +1 @@ -Subproject commit 18172a359f6dab8e3f70b6c5c8c7c55d3e97537a +Subproject commit e463cb47fd355a21463d0f567ee78c0316e198d6
diff --git a/third_party/webrtc b/third_party/webrtc index 2f61be1..b98efd4 160000 --- a/third_party/webrtc +++ b/third_party/webrtc
@@ -1 +1 @@ -Subproject commit 2f61be11629916ec0d3f083ef16b85113ee1db54 +Subproject commit b98efd4b57d927b119a0c5fd70181c423d179339
diff --git a/tools/binary_size/sizes.gni b/tools/binary_size/sizes.gni index 7a99c11..b9053d8a 100644 --- a/tools/binary_size/sizes.gni +++ b/tools/binary_size/sizes.gni
@@ -2,6 +2,7 @@ # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. +import("//build/config/clang/clang.gni") import("//build/util/generate_wrapper.gni") if (is_mac) { import("//build/config/mac/mac_sdk.gni") @@ -26,16 +27,21 @@ if (defined(invoker.executable_args)) { executable_args += invoker.executable_args } + + if (!defined(data)) { + data = [] + } + data += [ + "${clang_base_path}/bin/llvm-strip", + "${clang_base_path}/bin/llvm-objcopy", + ] + if (is_mac) { executable_args += [ "--size-path", mac_bin_path + "size", ] - if (!defined(data)) { - data = [] - } - # 'size' is a symlink to 'llvm-size', so throw both in there, but don't # add the entire bin path since it's large. data += [
diff --git a/tools/binary_size/sizes.py b/tools/binary_size/sizes.py index 77abc008..0daccb64 100755 --- a/tools/binary_size/sizes.py +++ b/tools/binary_size/sizes.py
@@ -59,17 +59,16 @@ def get_linux_stripped_size(filename): - EU_STRIP_NAME = 'eu-strip' # Assumes |filename| is in out/Release - # build/linux/bin/eu-strip' src_dir = os.path.dirname(os.path.dirname(os.path.dirname(filename))) - eu_strip_path = os.path.join(src_dir, 'build', 'linux', 'bin', EU_STRIP_NAME) - if (platform.architecture()[0] == '64bit' - or not os.path.exists(eu_strip_path)): - eu_strip_path = EU_STRIP_NAME + llvm_strip_path = os.path.join(src_dir, 'third_party', 'llvm-build', + 'Release+Asserts', 'bin', 'llvm-strip') with tempfile.NamedTemporaryFile() as stripped_file: - strip_cmd = [eu_strip_path, '-o', stripped_file.name, filename] + strip_cmd = [ + llvm_strip_path, '--strip-unneeded', '--strip-debug', '-o', + stripped_file.name, filename + ] result = 0 result, _ = run_process(result, strip_cmd) if result != 0:
diff --git a/tools/crates/create_update_cl.md b/tools/crates/create_update_cl.md index a76abeb..29d1dd9 100644 --- a/tools/crates/create_update_cl.md +++ b/tools/crates/create_update_cl.md
@@ -114,7 +114,7 @@ updates): ```sh -$ tools/crates/run_cargo.py -Zunstable-options -C third_party/rust/chromium_crates_io -Zbindeps update --dry-run --verbose +$ tools/crates/run_gnrt.py update -- --verbose --dry-run ... Unchanged serde_json_lenient v0.1.8 (latest: v0.2.0) Unchanged syn v1.0.109 (latest: v2.0.53)
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml index 946f7100..d50a765 100644 --- a/tools/metrics/actions/actions.xml +++ b/tools/metrics/actions/actions.xml
@@ -44766,6 +44766,36 @@ </description> </action> +<action name="TabGroups.ArchivedTabGroupManualCloseOnInactiveSurface"> + <owner>wylieb@google.com</owner> + <owner>evanluo@google.com</owner> + <owner>clank-tab-dev@google.com</owner> + <description> + Recorded when archived tab group is closed due to user manually clicking the + X button of the tab group in the inactive pane. + </description> +</action> + +<action name="TabGroups.RestoreFromTabGroupPane"> + <owner>wylieb@google.com</owner> + <owner>evanluo@google.com</owner> + <owner>clank-tab-dev@google.com</owner> + <description> + Recorded when an archived tab group is restored when the user opens the same + tab group from the tab group pane. + </description> +</action> + +<action name="TabGroups.RestoreSingleTabGroup"> + <owner>wylieb@google.com</owner> + <owner>evanluo@google.com</owner> + <owner>clank-tab-dev@google.com</owner> + <description> + Recorded when archived tab group is restored due to user manually clicking + into the tab group in the inactive pane. + </description> +</action> + <action name="TabGroups.Shared.SwitchGroupedTab"> <owner>dljames@chromium.org</owner> <owner>top-chrome-desktop-ui@google.com</owner>
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index 4c2c206..b9b45c1 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -8249,6 +8249,7 @@ <int value="-2117169027" label="UpdateHoverAtBeginFrame:enabled"/> <int value="-2117048251" label="MediaApp:enabled"/> <int value="-2116440101" label="EnablePenetratingImageSelection:enabled"/> + <int value="-2116226068" label="ReaderModeDistillInApp:disabled"/> <int value="-2116063296" label="DesktopPartialTranslate:disabled"/> <int value="-2115072824" label="EnableLogControllerForDiagnosticsApp:disabled"/> @@ -12070,6 +12071,7 @@ <int value="-703851482" label="AudioPeripheralVolumeGranularity:enabled"/> <int value="-703552662" label="PrefetchAndroidFonts:disabled"/> <int value="-703519655" label="SystemLiveCaption:enabled"/> + <int value="-702783087" label="ReaderModeDistillInApp:enabled"/> <int value="-702477233" label="ContentFullscreen:enabled"/> <int value="-700762821" label="RequestDesktopSiteForTablets:disabled"/> <int value="-700490514" label="DeviceBoundSessionsRefreshQuota:enabled"/> @@ -21397,7 +21399,8 @@ <int value="0" label="Success"/> <int value="1" label="Key Not Found"/> <int value="2" label="Key Decode Failure"/> - <int value="4" label="Invalid Key Header"/> + <int value="3" label="Invalid Key Header"/> + <int value="4" label="Key Too Short"/> </enum> <enum name="OSCryptDPAPIKeyStatus">
diff --git a/tools/metrics/histograms/metadata/actor/enums.xml b/tools/metrics/histograms/metadata/actor/enums.xml index db39848c..56c46bf5 100644 --- a/tools/metrics/histograms/metadata/actor/enums.xml +++ b/tools/metrics/histograms/metadata/actor/enums.xml
@@ -43,6 +43,7 @@ <int value="22" label="ArgumentsInvalid"/> <int value="23" label="TaskPaused"/> <int value="24" label="kExecutorDestroyed"/> + <int value="25" label="kWindowWentAway"/> <int value="100" label="NavigateInvalidUrl"/> <int value="200" label="ClickSuppressed"/> <int value="300" label="DragAndReleaseFromOffscreen"/>
diff --git a/tools/metrics/histograms/metadata/ash_growth/histograms.xml b/tools/metrics/histograms/metadata/ash_growth/histograms.xml index f8d65065..8c4d7d4 100644 --- a/tools/metrics/histograms/metadata/ash_growth/histograms.xml +++ b/tools/metrics/histograms/metadata/ash_growth/histograms.xml
@@ -30,7 +30,7 @@ </variants> <histogram name="Ash.Growth.CampaignsComponent.DownloadDurationInOobe" - units="ms" expires_after="2025-08-31"> + units="ms" expires_after="2026-05-22"> <owner>llin@google.com</owner> <owner>cros-growth@google.com</owner> <summary> @@ -42,7 +42,7 @@ </histogram> <histogram name="Ash.Growth.CampaignsComponent.DownloadDurationSessionStart" - units="ms" expires_after="2025-06-29"> + units="ms" expires_after="2026-05-22"> <owner>llin@google.com</owner> <owner>cros-growth@google.com</owner> <summary> @@ -54,7 +54,7 @@ </histogram> <histogram name="Ash.Growth.CampaignsComponent.ParseDuration" units="ms" - expires_after="2025-11-02"> + expires_after="2026-05-22"> <owner>llin@google.com</owner> <owner>cros-growth@google.com</owner> <summary> @@ -64,7 +64,7 @@ </histogram> <histogram name="Ash.Growth.CampaignsManager.Error" - enum="CampaignsManagerError" expires_after="2025-11-02"> + enum="CampaignsManagerError" expires_after="2026-05-22"> <owner>llin@google.com</owner> <owner>cros-growth@google.com</owner> <summary> @@ -84,7 +84,7 @@ </histogram> <histogram name="Ash.Growth.CampaignsManager.GetCampaignBySlot.Attempt" - enum="CampaignSlot" expires_after="2025-12-07"> + enum="CampaignSlot" expires_after="2026-05-22"> <owner>llin@google.com</owner> <owner>cros-growth@google.com</owner> <summary> @@ -94,7 +94,7 @@ </histogram> <histogram name="Ash.Growth.CampaignsManager.GetCampaignBySlot.Campaigns500" - units="int" expires_after="2025-12-07"> + units="int" expires_after="2026-05-22"> <owner>wutao@chromium.org</owner> <owner>cros-growth@google.com</owner> <summary> @@ -105,7 +105,7 @@ </histogram> <histogram name="Ash.Growth.CampaignsManager.MatchDuration" units="ms" - expires_after="2025-06-29"> + expires_after="2026-05-22"> <owner>llin@google.com</owner> <owner>cros-growth@google.com</owner> <summary> @@ -116,7 +116,7 @@ </histogram> <histogram name="Ash.Growth.Ui.ButtonPressed.Button{ButtonId}.Campaigns500" - units="int" expires_after="2025-11-09"> + units="int" expires_after="2026-05-22"> <owner>wutao@chromium.org</owner> <owner>cros-growth@google.com</owner> <summary> @@ -128,7 +128,7 @@ </histogram> <histogram name="Ash.Growth.Ui.Dismissed.Campaigns500" units="int" - expires_after="2025-11-09"> + expires_after="2026-05-22"> <owner>wutao@chromium.org</owner> <owner>cros-growth@google.com</owner> <summary> @@ -138,7 +138,7 @@ </histogram> <histogram name="Ash.Growth.Ui.Impression.Campaigns500" units="int" - expires_after="2025-11-09"> + expires_after="2026-05-22"> <owner>wutao@chromium.org</owner> <owner>cros-growth@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/data/histograms.xml b/tools/metrics/histograms/metadata/data/histograms.xml index f457201..c324db21 100644 --- a/tools/metrics/histograms/metadata/data/histograms.xml +++ b/tools/metrics/histograms/metadata/data/histograms.xml
@@ -141,7 +141,7 @@ </histogram> <histogram name="DataUse.TrafficSize.User{DataUse_Dimensions}" units="bytes" - expires_after="2025-03-25"> + expires_after="2026-06-13"> <owner>spelchat@chromium.org</owner> <owner>curranmax@chromium.org</owner> <owner>chrome-brapp-loading@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/enterprise/enums.xml b/tools/metrics/histograms/metadata/enterprise/enums.xml index 65e9479b9..d4000246 100644 --- a/tools/metrics/histograms/metadata/enterprise/enums.xml +++ b/tools/metrics/histograms/metadata/enterprise/enums.xml
@@ -2236,6 +2236,7 @@ <int value="1365" label="PrefetchWithServiceWorkerEnabled"/> <int value="1367" label="AIModeSettings"/> <int value="1368" label="WatermarkStyle"/> + <int value="1369" label="KioskApplicationLogCollectionEnabled"/> </enum> <enum name="EnterprisePoliciesSources">
diff --git a/tools/metrics/histograms/metadata/magic_stack/histograms.xml b/tools/metrics/histograms/metadata/magic_stack/histograms.xml index 1290678..a46d3a81 100644 --- a/tools/metrics/histograms/metadata/magic_stack/histograms.xml +++ b/tools/metrics/histograms/metadata/magic_stack/histograms.xml
@@ -120,7 +120,7 @@ <histogram name="MagicStack.Clank.NewTabPage.Module.FetchDataTimeoutDurationMs.{ModuleType}" - units="ms" expires_after="2025-06-16"> + units="ms" expires_after="2025-11-26"> <owner>hanxi@chromium.org</owner> <owner>xinyiji@chromium.org</owner> <summary> @@ -132,7 +132,7 @@ </histogram> <histogram name="MagicStack.Clank.NewTabPage.Module.FetchDataTimeoutTypeV2" - enum="ModuleType" expires_after="2025-06-22"> + enum="ModuleType" expires_after="2025-11-26"> <owner>hanxi@chromium.org</owner> <owner>xinyiji@chromium.org</owner> <summary> @@ -143,7 +143,7 @@ </histogram> <histogram name="MagicStack.Clank.NewTabPage.Module.FirstModuleShownDurationMs" - units="ms" expires_after="2025-06-16"> + units="ms" expires_after="2025-11-26"> <owner>hanxi@chromium.org</owner> <owner>xinyiji@chromium.org</owner> <summary> @@ -155,7 +155,7 @@ </histogram> <histogram name="MagicStack.Clank.NewTabPage.Module.ProfileReadyDelayMs" - units="ms" expires_after="2025-06-16"> + units="ms" expires_after="2025-11-26"> <owner>hanxi@chromium.org</owner> <owner>xinyiji@chromium.org</owner> <summary> @@ -176,7 +176,7 @@ </histogram> <histogram name="MagicStack.Clank.NewTabPage.NotScrollable" units="count" - expires_after="2025-06-16"> + expires_after="2025-11-26"> <owner>hanxi@chromium.org</owner> <owner>xinyiji@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/others/histograms.xml b/tools/metrics/histograms/metadata/others/histograms.xml index 427d720..c4358e1 100644 --- a/tools/metrics/histograms/metadata/others/histograms.xml +++ b/tools/metrics/histograms/metadata/others/histograms.xml
@@ -4544,7 +4544,7 @@ </histogram> <histogram name="Feedback.ChromeOSApp.CanContactUser" - enum="FeedbackAppContactUserConsentType" expires_after="2025-07-30"> + enum="FeedbackAppContactUserConsentType" expires_after="2026-07-30"> <owner>longbowei@google.com</owner> <owner>xiangdongkong@google.com</owner> <owner>cros-device-enablement@google.com</owner> @@ -4555,7 +4555,7 @@ </histogram> <histogram name="Feedback.ChromeOSApp.DescriptionLength" units="characters" - expires_after="2025-07-30"> + expires_after="2026-07-30"> <owner>longbowei@google.com</owner> <owner>xiangdongkong@google.com</owner> <owner>cros-device-enablement@google.com</owner> @@ -4566,7 +4566,7 @@ </histogram> <histogram name="Feedback.ChromeOSApp.Duration.GetBigFeedbackLogs" units="ms" - expires_after="2025-11-03"> + expires_after="2026-07-30"> <owner>xiangdongkong@google.com</owner> <owner>cros-device-enablement@google.com</owner> <summary> @@ -4579,7 +4579,7 @@ </histogram> <histogram name="Feedback.ChromeOSApp.ExitPath" enum="FeedbackAppExitPath" - expires_after="2026-05-25"> + expires_after="2026-07-30"> <owner>longbowei@google.com</owner> <owner>xiangdongkong@google.com</owner> <owner>cros-device-enablement@google.com</owner> @@ -4596,7 +4596,7 @@ </histogram> <histogram name="Feedback.ChromeOSApp.GetBigFeedbackLogs.EmptyCount" - units="logs" expires_after="2025-11-03"> + units="logs" expires_after="2026-07-30"> <owner>xiangdongkong@google.com</owner> <owner>cros-device-enablement@google.com</owner> <summary> @@ -4608,7 +4608,7 @@ </histogram> <histogram name="Feedback.ChromeOSApp.GetBigFeedbackLogs.NotAvailableCount" - units="logs" expires_after="2025-11-03"> + units="logs" expires_after="2026-07-30"> <owner>xiangdongkong@google.com</owner> <owner>cros-device-enablement@google.com</owner> <summary> @@ -4620,7 +4620,7 @@ </histogram> <histogram name="Feedback.ChromeOSApp.GetBigFeedbackLogs.OtherCount" - units="logs" expires_after="2025-11-03"> + units="logs" expires_after="2026-07-30"> <owner>xiangdongkong@google.com</owner> <owner>cros-device-enablement@google.com</owner> <summary> @@ -4632,7 +4632,7 @@ </histogram> <histogram name="Feedback.ChromeOSApp.GetBigFeedbackLogs.Success" - enum="Boolean" expires_after="2025-11-03"> + enum="Boolean" expires_after="2026-07-30"> <owner>xiangdongkong@google.com</owner> <owner>cros-device-enablement@google.com</owner> <summary> @@ -4644,7 +4644,7 @@ </histogram> <histogram name="Feedback.ChromeOSApp.GetFeedbackLogsV2.DBusResult" - enum="GetFeedbackLogsV2DbusResult" expires_after="2025-11-03"> + enum="GetFeedbackLogsV2DbusResult" expires_after="2026-07-30"> <owner>xiangdongkong@google.com</owner> <owner>cros-device-enablement@google.com</owner> <summary> @@ -4656,7 +4656,7 @@ </histogram> <histogram name="Feedback.ChromeOSApp.HelpContentOutcome" - enum="FeedbackAppHelpContentOutcome" expires_after="2025-09-28"> + enum="FeedbackAppHelpContentOutcome" expires_after="2026-07-30"> <owner>longbowei@google.com</owner> <owner>xiangdongkong@google.com</owner> <owner>cros-device-enablement@google.com</owner> @@ -4668,7 +4668,7 @@ </histogram> <histogram name="Feedback.ChromeOSApp.HelpContentSearchResultCount" - units="numbers" expires_after="2025-07-30"> + units="numbers" expires_after="2026-07-30"> <owner>longbowei@google.com</owner> <owner>xiangdongkong@google.com</owner> <owner>cros-device-enablement@google.com</owner> @@ -4679,7 +4679,7 @@ </histogram> <histogram name="Feedback.ChromeOSApp.IncludedEmail" enum="Boolean" - expires_after="2025-07-30"> + expires_after="2026-07-30"> <owner>longbowei@google.com</owner> <owner>xiangdongkong@google.com</owner> <owner>cros-device-enablement@google.com</owner> @@ -4690,7 +4690,7 @@ </histogram> <histogram name="Feedback.ChromeOSApp.IncludedFile" enum="Boolean" - expires_after="2025-07-30"> + expires_after="2026-07-30"> <owner>longbowei@google.com</owner> <owner>xiangdongkong@google.com</owner> <owner>cros-device-enablement@google.com</owner> @@ -4701,7 +4701,7 @@ </histogram> <histogram name="Feedback.ChromeOSApp.IncludedScreenshot" enum="Boolean" - expires_after="2025-07-30"> + expires_after="2026-07-30"> <owner>longbowei@google.com</owner> <owner>xiangdongkong@google.com</owner> <owner>cros-device-enablement@google.com</owner> @@ -4712,7 +4712,7 @@ </histogram> <histogram name="Feedback.ChromeOSApp.IncludedSystemInfo" enum="Boolean" - expires_after="2025-07-30"> + expires_after="2026-07-30"> <owner>longbowei@google.com</owner> <owner>xiangdongkong@google.com</owner> <owner>cros-device-enablement@google.com</owner> @@ -4723,7 +4723,7 @@ </histogram> <histogram name="Feedback.ChromeOSApp.IncludedUrl" enum="Boolean" - expires_after="2025-07-30"> + expires_after="2026-07-30"> <owner>longbowei@google.com</owner> <owner>xiangdongkong@google.com</owner> <owner>cros-device-enablement@google.com</owner> @@ -4734,7 +4734,7 @@ </histogram> <histogram name="Feedback.ChromeOSApp.Openduration" units="ms" - expires_after="2025-07-30"> + expires_after="2026-07-30"> <owner>longbowei@google.com</owner> <owner>xiangdongkong@google.com</owner> <owner>cros-device-enablement@google.com</owner> @@ -4745,7 +4745,7 @@ </histogram> <histogram name="Feedback.ChromeOSApp.PostSubmitAction" - enum="FeedbackAppPostSubmitAction" expires_after="2025-07-30"> + enum="FeedbackAppPostSubmitAction" expires_after="2026-07-30"> <owner>longbowei@google.com</owner> <owner>xiangdongkong@google.com</owner> <owner>cros-device-enablement@google.com</owner> @@ -4757,7 +4757,7 @@ </histogram> <histogram name="Feedback.ChromeOSApp.TimeOnPage.{FeedbackAppPage}" units="s" - expires_after="2025-07-30"> + expires_after="2026-07-30"> <owner>longbowei@google.com</owner> <owner>xiangdongkong@google.com</owner> <owner>cros-device-enablement@google.com</owner> @@ -4774,7 +4774,7 @@ </histogram> <histogram name="Feedback.ChromeOSApp.ViewedHelpContent" enum="Boolean" - expires_after="2025-07-30"> + expires_after="2026-07-30"> <owner>longbowei@google.com</owner> <owner>xiangdongkong@google.com</owner> <owner>cros-device-enablement@google.com</owner> @@ -4785,7 +4785,7 @@ </histogram> <histogram name="Feedback.ChromeOSApp.ViewedImage" enum="Boolean" - expires_after="2025-07-30"> + expires_after="2026-07-30"> <owner>longbowei@google.com</owner> <owner>xiangdongkong@google.com</owner> <owner>cros-device-enablement@google.com</owner> @@ -4796,7 +4796,7 @@ </histogram> <histogram name="Feedback.ChromeOSApp.ViewedMetrics" enum="Boolean" - expires_after="2025-07-30"> + expires_after="2026-07-30"> <owner>longbowei@google.com</owner> <owner>xiangdongkong@google.com</owner> <owner>cros-device-enablement@google.com</owner> @@ -4807,7 +4807,7 @@ </histogram> <histogram name="Feedback.ChromeOSApp.ViewedScreenshot" enum="Boolean" - expires_after="2025-07-30"> + expires_after="2026-07-30"> <owner>longbowei@google.com</owner> <owner>xiangdongkong@google.com</owner> <owner>cros-device-enablement@google.com</owner> @@ -4818,7 +4818,7 @@ </histogram> <histogram name="Feedback.ChromeOSApp.ViewedSystemAndAppInfo" enum="Boolean" - expires_after="2025-07-30"> + expires_after="2026-07-30"> <owner>longbowei@google.com</owner> <owner>xiangdongkong@google.com</owner> <owner>cros-device-enablement@google.com</owner> @@ -4829,7 +4829,7 @@ </histogram> <histogram name="Feedback.Duration.FetchSystemInformation" units="ms" - expires_after="2025-11-03"> + expires_after="2026-07-30"> <owner>xiangdongkong@google.com</owner> <owner>fernandex@google.com</owner> <owner>cros-device-enablement@google.com</owner> @@ -4841,7 +4841,7 @@ </histogram> <histogram name="Feedback.Duration.FormOpenToSubmit" units="ms" - expires_after="2025-07-30"> + expires_after="2026-07-30"> <owner>xiangdongkong@google.com</owner> <owner>fernandex@google.com</owner> <owner>cros-device-enablement@google.com</owner> @@ -4866,7 +4866,7 @@ </histogram> <histogram name="Feedback.Duration.FormSubmitToSendQueue" units="ms" - expires_after="2025-07-30"> + expires_after="2026-07-30"> <owner>xiangdongkong@google.com</owner> <owner>cros-device-enablement@google.com</owner> <summary> @@ -6231,6 +6231,7 @@ <variant name="GpuMain"/> <variant name="NetworkService"/> <variant name="RendererMain"/> + <variant name="VizCompositor"/> </token> </histogram>
diff --git a/tools/metrics/histograms/metadata/page/histograms.xml b/tools/metrics/histograms/metadata/page/histograms.xml index ca29724..0f27140 100644 --- a/tools/metrics/histograms/metadata/page/histograms.xml +++ b/tools/metrics/histograms/metadata/page/histograms.xml
@@ -713,7 +713,7 @@ <histogram name="PageLoad.Clients.AMP.Experimental.PageTiming.InputToNavigation.Subframe" - units="ms" expires_after="2025-11-30"> + units="ms" expires_after="2026-07-03"> <owner>iclelland@chromium.org</owner> <owner>sullivan@chromium.org</owner> <owner>speed-metrics-dev@chromium.org</owner> @@ -730,7 +730,7 @@ <histogram name="PageLoad.Clients.AMP.InteractiveTiming.NumInteractions.Subframe" - units="Count" expires_after="2025-11-09"> + units="Count" expires_after="2026-07-03"> <owner>iclelland@chromium.org</owner> <owner>sullivan@chromium.org</owner> <owner>speed-metrics-dev@chromium.org</owner> @@ -743,7 +743,7 @@ <histogram name="PageLoad.Clients.AMP.InteractiveTiming.{NormalizedResponsivenessMetric}.{UserInteractionLatency}.Subframe{FullNavigation}" - units="ms" expires_after="2025-07-03"> + units="ms" expires_after="2026-07-03"> <owner>iclelland@chromium.org</owner> <owner>sullivan@chromium.org</owner> <owner>speed-metrics-dev@chromium.org</owner> @@ -802,7 +802,7 @@ <histogram name="PageLoad.Clients.AMP.LayoutInstability.MaxCumulativeShiftScore.Subframe.{Navigation}{Window}.Gap{Gap}.Max{MaxWindowSize}" - units="scorex10" expires_after="2025-07-03"> + units="scorex10" expires_after="2026-07-03"> <owner>iclelland@chromium.org</owner> <owner>sullivan@chromium.org</owner> <owner>speed-metrics-dev@chromium.org</owner> @@ -834,7 +834,7 @@ <histogram name="PageLoad.Clients.AMP.PaintTiming.InputToFirstContentfulPaint.Subframe" - units="ms" expires_after="2025-11-09"> + units="ms" expires_after="2026-07-03"> <owner>iclelland@chromium.org</owner> <owner>sullivan@chromium.org</owner> <owner>speed-metrics-dev@chromium.org</owner> @@ -850,7 +850,7 @@ <histogram name="PageLoad.Clients.AMP.PaintTiming.InputToFirstContentfulPaint.Subframe.FullNavigation" - units="ms" expires_after="2025-07-03"> + units="ms" expires_after="2026-07-03"> <owner>iclelland@chromium.org</owner> <owner>sullivan@chromium.org</owner> <owner>speed-metrics-dev@chromium.org</owner> @@ -865,7 +865,7 @@ <histogram name="PageLoad.Clients.AMP.PaintTiming.InputToLargestContentfulPaint.Subframe" - units="ms" expires_after="2025-09-07"> + units="ms" expires_after="2026-07-03"> <owner>iclelland@chromium.org</owner> <owner>sullivan@chromium.org</owner> <owner>speed-metrics-dev@chromium.org</owner> @@ -887,7 +887,7 @@ <histogram name="PageLoad.Clients.AMP.PaintTiming.InputToLargestContentfulPaint.Subframe.FullNavigation" - units="ms" expires_after="2025-07-03"> + units="ms" expires_after="2026-07-03"> <owner>iclelland@chromium.org</owner> <owner>sullivan@chromium.org</owner> <owner>speed-metrics-dev@chromium.org</owner> @@ -2299,7 +2299,7 @@ <histogram name="PageLoad.Clients.PrivacySandboxAds.LayoutInstability.MaxCumulativeShiftScore.SessionWindow.Gap1000ms.Max5000ms2.{PrivacySandboxAdsApi}" - units="ms" expires_after="2025-07-06"> + units="ms" expires_after="2025-12-02"> <owner>linnan@chromium.org</owner> <owner>measurement-api-dev+metrics@google.com</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/password/histograms.xml b/tools/metrics/histograms/metadata/password/histograms.xml index d9781a30..6609595b 100644 --- a/tools/metrics/histograms/metadata/password/histograms.xml +++ b/tools/metrics/histograms/metadata/password/histograms.xml
@@ -2378,7 +2378,7 @@ </histogram> <histogram name="PasswordManager.MediationConditional" - enum="CredentialManagerGetResult" expires_after="2025-06-22"> + enum="CredentialManagerGetResult" expires_after="2025-11-22"> <owner>goto@google.com</owner> <owner>markusheintz@google.com</owner> <owner>yigu@google.com</owner>
diff --git a/tools/metrics/histograms/metadata/sync/histograms.xml b/tools/metrics/histograms/metadata/sync/histograms.xml index 555219b..50dc38e 100644 --- a/tools/metrics/histograms/metadata/sync/histograms.xml +++ b/tools/metrics/histograms/metadata/sync/histograms.xml
@@ -175,7 +175,7 @@ </histogram> <histogram name="Sync.AssociateWindowsTime.On{Type}" units="ms" - expires_after="2025-06-22"> + expires_after="2026-06-01"> <owner>skym@chromium.org</owner> <owner>ckitagawa@chromium.org</owner> <summary>
diff --git a/tools/metrics/histograms/metadata/tab/histograms.xml b/tools/metrics/histograms/metadata/tab/histograms.xml index ab3a7af..89160436 100644 --- a/tools/metrics/histograms/metadata/tab/histograms.xml +++ b/tools/metrics/histograms/metadata/tab/histograms.xml
@@ -798,6 +798,74 @@ </summary> </histogram> +<histogram + name="TabGroups.ArchivedTabGroupManualCloseOnInactiveSurface.TabGroupTabCount" + units="tabs" expires_after="2025-11-09"> + <owner>wylieb@google.com</owner> + <owner>evanluo@google.com</owner> + <owner>clank-tab-dev@google.com</owner> + <summary> + Records number of tabs within an archived tab group closed by pressing the X + button on the tab group in the inactive surface. + </summary> +</histogram> + +<histogram name="TabGroups.CloseAllArchivedTabGroups.TabGroupCount" + units="groups" expires_after="2025-11-09"> + <owner>wylieb@google.com</owner> + <owner>evanluo@google.com</owner> + <owner>clank-tab-dev@google.com</owner> + <summary> + Records when archived tab groups are closed through the "Close all + inactive tabs" button in inactive pane. + </summary> +</histogram> + +<histogram name="TabGroups.CloseAllArchivedTabGroups.TabGroupTabCount" + units="tabs" expires_after="2025-11-09"> + <owner>wylieb@google.com</owner> + <owner>evanluo@google.com</owner> + <owner>clank-tab-dev@google.com</owner> + <summary> + Records number of tabs within archived tab groups closed through the + "Close all inactive tabs" button in inactive pane. + </summary> +</histogram> + +<histogram name="TabGroups.CloseArchivedTabsMenuItem.TabGroupCount" + units="groups" expires_after="2025-11-09"> + <owner>wylieb@google.com</owner> + <owner>evanluo@google.com</owner> + <owner>clank-tab-dev@google.com</owner> + <summary> + Records when archived tab groups are closed through the "Close + tab" menu item after user selects which tab groups to be closed. + </summary> +</histogram> + +<histogram name="TabGroups.CloseArchivedTabsMenuItem.TabGroupTabCount" + units="tabs" expires_after="2025-11-09"> + <owner>wylieb@google.com</owner> + <owner>evanluo@google.com</owner> + <owner>clank-tab-dev@google.com</owner> + <summary> + Records number of tabs within archived tab groups closed through the + "Close tab" menu item after user selects which tab groups to be + closed. + </summary> +</histogram> + +<histogram name="TabGroups.CloseTabGroupsDeletedRemotely" units="groups" + expires_after="2025-11-09"> + <owner>wylieb@google.com</owner> + <owner>evanluo@google.com</owner> + <owner>clank-tab-dev@google.com</owner> + <summary> + Records when tab groups are closed locally due to the synced tab group being + deleted elsewhere (e.g. another device logged into same account). + </summary> +</histogram> + <histogram name="TabGroups.CollapsedGroupCountPerLoad" units="groups" expires_after="2025-09-28"> <owner>dpenning@chromium.org</owner> @@ -864,6 +932,72 @@ </summary> </histogram> +<histogram name="TabGroups.RestoreAllArchivedTabsMenuItem.TabGroupCount" + units="groups" expires_after="2025-11-09"> + <owner>wylieb@google.com</owner> + <owner>evanluo@google.com</owner> + <owner>clank-tab-dev@google.com</owner> + <summary> + Records when archived tab groups are restored through the "Restore + all" option menu item. + </summary> +</histogram> + +<histogram name="TabGroups.RestoreAllArchivedTabsMenuItem.TabGroupTabCount" + units="tabs" expires_after="2025-11-09"> + <owner>wylieb@google.com</owner> + <owner>evanluo@google.com</owner> + <owner>clank-tab-dev@google.com</owner> + <summary> + Records number of tabs within archived tab groups restored by the + "Restore all" option menu item. + </summary> +</histogram> + +<histogram name="TabGroups.RestoreArchivedTabsMenuItem.TabGroupCount" + units="groups" expires_after="2025-11-09"> + <owner>wylieb@google.com</owner> + <owner>evanluo@google.com</owner> + <owner>clank-tab-dev@google.com</owner> + <summary> + Records when archived tab groups are restored through the "Restore + tab" menu option after user selects which tab groups to restore. + </summary> +</histogram> + +<histogram name="TabGroups.RestoreArchivedTabsMenuItem.TabGroupTabCount" + units="tabs" expires_after="2025-11-09"> + <owner>wylieb@google.com</owner> + <owner>evanluo@google.com</owner> + <owner>clank-tab-dev@google.com</owner> + <summary> + Records number of tabs within archived tab groups restored by user selecting + tab groups and using the "Restore tab" menu option. + </summary> +</histogram> + +<histogram name="TabGroups.RestoreFromTabGroupPane.TabCount" units="tabs" + expires_after="2025-11-09"> + <owner>wylieb@google.com</owner> + <owner>evanluo@google.com</owner> + <owner>clank-tab-dev@google.com</owner> + <summary> + Records number of tabs within an archived tab group restored by user opening + the synced tab group from the tab group pane. + </summary> +</histogram> + +<histogram name="TabGroups.RestoreSingleTabGroup.TabGroupTabCount" units="tabs" + expires_after="2025-11-09"> + <owner>wylieb@google.com</owner> + <owner>evanluo@google.com</owner> + <owner>clank-tab-dev@google.com</owner> + <summary> + Records number of tabs within archived tab groups restored by user manually + clicking into the tab group in the inactive surface. + </summary> +</histogram> + <histogram name="TabGroups.SavedTabGroupActiveCount" units="groups" expires_after="2025-10-26"> <owner>dljames@chromium.org</owner> @@ -1579,6 +1713,27 @@ </summary> </histogram> +<histogram name="TabGroups.TabGroupDeclutter.ArchivedTabGroups" units="groups" + expires_after="2025-11-09"> + <owner>wylieb@google.com</owner> + <owner>evanluo@google.com</owner> + <owner>clank-tab-dev@google.com</owner> + <summary> + Records number of tab groups that are archived due to tab group declutter. + </summary> +</histogram> + +<histogram name="TabGroups.TabGroupDeclutter.ArchivedTabGroupTabCount" + units="tabs" expires_after="2025-11-09"> + <owner>wylieb@google.com</owner> + <owner>evanluo@google.com</owner> + <owner>clank-tab-dev@google.com</owner> + <summary> + Records number of tabs within each archived tab group that are archived when + the tab group is archived. + </summary> +</histogram> + <histogram name="TabGroups.TabsPerGroupCountAtStartup" units="tabs" expires_after="2025-10-26"> <owner>gambard@chromium.org</owner>
diff --git a/tools/perf/core/bot_platforms.py b/tools/perf/core/bot_platforms.py index df9a4e6..e6bda5e 100644 --- a/tools/perf/core/bot_platforms.py +++ b/tools/perf/core/bot_platforms.py
@@ -561,7 +561,9 @@ arguments=[ '--wpr=crossbench_android_loading_000.wprgo', '--probe=chrome_histograms:{"baseline":false,"metrics":' - '{"Android.WebView.Startup.CreationTime.StartChromiumLocked":["mean"]}}', + '{"Android.WebView.Startup.CreationTime.StartChromiumLocked":["mean"],' + '"Android.WebView.Startup.CreationTime.Stage1.FactoryInit":["mean"],' + '"PageLoad.PaintTiming.NavigationToFirstContentfulPaint":["mean"]}}', '--repetitions=50', '--stories=cnn', ]
diff --git a/tools/perf/core/perfetto_binary_roller/binary_deps.json b/tools/perf/core/perfetto_binary_roller/binary_deps.json index b131e2b..26efaa7 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": "ca5569771bdaf64998daa87da60550e4351b79b8", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/167e1f0dab2691a4b2a911e001317353405d83d9/trace_processor_shell.exe" + "hash": "9896fe58e66ba405cca1b1cebdb90c83a347d833", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/win/9a55fc8a8e2598fc924db3643d9b47a2e3d0480e/trace_processor_shell.exe" }, "linux_arm": { "hash": "99f971ca131f6d11c73f4b918099d434bdd8093c", @@ -21,8 +21,8 @@ "full_remote_path": "perfetto-luci-artifacts/v50.1/mac-arm64/trace_processor_shell" }, "linux": { - "hash": "873b0054b9679de17bf8de3ba8bbc665cb00e8f1", - "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/167e1f0dab2691a4b2a911e001317353405d83d9/trace_processor_shell" + "hash": "e1fbcf7a7c7ae7ab3737c3d1e04c85a899e58e8f", + "full_remote_path": "chromium-telemetry/perfetto_binaries/trace_processor_shell/linux/9a55fc8a8e2598fc924db3643d9b47a2e3d0480e/trace_processor_shell" } }, "power_profile.sql": {
diff --git a/tools/perf/core/shard_maps/android-pixel4_webview-perf-pgo_map.json b/tools/perf/core/shard_maps/android-pixel4_webview-perf-pgo_map.json index a9b3166..1250168f 100644 --- a/tools/perf/core/shard_maps/android-pixel4_webview-perf-pgo_map.json +++ b/tools/perf/core/shard_maps/android-pixel4_webview-perf-pgo_map.json
@@ -8,7 +8,7 @@ "abridged": false }, "blink_perf.bindings": { - "end": 45, + "end": 46, "abridged": false }, "speedometer2": { @@ -22,14 +22,14 @@ "1": { "benchmarks": { "blink_perf.bindings": { - "begin": 45, + "begin": 46, "abridged": false }, "blink_perf.css": { "abridged": false }, "blink_perf.dom": { - "end": 1, + "end": 3, "abridged": false }, "speedometer2": { @@ -43,7 +43,7 @@ "2": { "benchmarks": { "blink_perf.dom": { - "begin": 1, + "begin": 3, "abridged": false }, "blink_perf.events": { @@ -53,7 +53,7 @@ "abridged": false }, "blink_perf.layout": { - "end": 24, + "end": 25, "abridged": false }, "speedometer2": { @@ -67,8 +67,8 @@ "3": { "benchmarks": { "blink_perf.layout": { - "begin": 24, - "end": 97, + "begin": 25, + "end": 99, "abridged": false }, "speedometer2": { @@ -82,7 +82,7 @@ "4": { "benchmarks": { "blink_perf.layout": { - "begin": 97, + "begin": 99, "abridged": false }, "blink_perf.owp_storage": { @@ -92,7 +92,7 @@ "abridged": false }, "blink_perf.shadow_dom": { - "end": 29, + "end": 37, "abridged": false }, "speedometer2": { @@ -106,7 +106,7 @@ "5": { "benchmarks": { "blink_perf.shadow_dom": { - "begin": 29, + "begin": 37, "abridged": false }, "blink_perf.webaudio": { @@ -134,7 +134,7 @@ "abridged": false }, "rasterize_and_record_micro.top_25": { - "end": 3, + "end": 12, "abridged": false }, "speedometer2": { @@ -149,7 +149,7 @@ "display_name": "loading.crossbench", "arguments": [ "--wpr=crossbench_android_loading_000.wprgo", - "--probe=chrome_histograms:{\"baseline\":false,\"metrics\":{\"Android.WebView.Startup.CreationTime.StartChromiumLocked\":[\"mean\"]}}", + "--probe=chrome_histograms:{\"baseline\":false,\"metrics\":{\"Android.WebView.Startup.CreationTime.StartChromiumLocked\":[\"mean\"],\"Android.WebView.Startup.CreationTime.Stage1.FactoryInit\":[\"mean\"],\"PageLoad.PaintTiming.NavigationToFirstContentfulPaint\":[\"mean\"]}}", "--repetitions=50", "--stories=cnn" ] @@ -159,11 +159,11 @@ "6": { "benchmarks": { "rasterize_and_record_micro.top_25": { - "begin": 3, + "begin": 12, "abridged": false }, "rendering.mobile": { - "end": 42, + "end": 46, "abridged": false }, "speedometer2": { @@ -177,8 +177,8 @@ "7": { "benchmarks": { "rendering.mobile": { - "begin": 42, - "end": 94, + "begin": 46, + "end": 96, "abridged": false }, "speedometer2": { @@ -192,8 +192,8 @@ "8": { "benchmarks": { "rendering.mobile": { - "begin": 94, - "end": 152, + "begin": 96, + "end": 155, "abridged": false }, "speedometer2": { @@ -207,8 +207,8 @@ "9": { "benchmarks": { "rendering.mobile": { - "begin": 152, - "end": 203, + "begin": 155, + "end": 208, "abridged": false }, "speedometer2": { @@ -222,8 +222,8 @@ "10": { "benchmarks": { "rendering.mobile": { - "begin": 203, - "end": 262, + "begin": 208, + "end": 267, "abridged": false }, "speedometer2": { @@ -237,8 +237,8 @@ "11": { "benchmarks": { "rendering.mobile": { - "begin": 262, - "end": 327, + "begin": 267, + "end": 328, "abridged": false }, "speedometer2": { @@ -252,8 +252,8 @@ "12": { "benchmarks": { "rendering.mobile": { - "begin": 327, - "end": 378, + "begin": 328, + "end": 377, "abridged": false }, "speedometer2": { @@ -267,7 +267,7 @@ "13": { "benchmarks": { "rendering.mobile": { - "begin": 378, + "begin": 377, "abridged": false }, "rendering.mobile.notracing": { @@ -295,7 +295,7 @@ "abridged": false }, "system_health.common_mobile": { - "end": 23, + "end": 22, "abridged": false } } @@ -303,7 +303,7 @@ "14": { "benchmarks": { "system_health.common_mobile": { - "begin": 23, + "begin": 22, "abridged": false }, "system_health.memory_mobile": { @@ -322,7 +322,7 @@ "benchmarks": { "system_health.memory_mobile": { "begin": 3, - "end": 24, + "end": 25, "abridged": false }, "speedometer2": { @@ -336,8 +336,8 @@ "16": { "benchmarks": { "system_health.memory_mobile": { - "begin": 24, - "end": 42, + "begin": 25, + "end": 43, "abridged": false }, "speedometer2": { @@ -351,7 +351,7 @@ "17": { "benchmarks": { "system_health.memory_mobile": { - "begin": 42, + "begin": 43, "end": 60, "abridged": false }, @@ -369,6 +369,9 @@ "begin": 60, "abridged": false }, + "system_health.webview_startup": { + "abridged": false + }, "speedometer2": { "abridged": false }, @@ -379,9 +382,6 @@ }, "19": { "benchmarks": { - "system_health.webview_startup": { - "abridged": false - }, "v8.browsing_mobile": { "abridged": false }, @@ -400,30 +400,30 @@ } }, "extra_infos": { - "num_stories": 1114, - "predicted_min_shard_time": 2448.0, - "predicted_min_shard_index": 18, - "predicted_max_shard_time": 3660.0, - "predicted_max_shard_index": 19, - "shard #0": 3012.0, - "shard #1": 3029.0, - "shard #2": 3026.0, - "shard #3": 3030.0, - "shard #4": 3019.0, - "shard #5": 3001.0, - "shard #6": 3008.0, - "shard #7": 3018.0, - "shard #8": 3033.0, - "shard #9": 2980.0, - "shard #10": 3026.0, - "shard #11": 3006.0, - "shard #12": 3022.0, - "shard #13": 3036.0, - "shard #14": 2984.0, - "shard #15": 2970.0, - "shard #16": 2970.0, - "shard #17": 2991.0, - "shard #18": 2448.0, - "shard #19": 3660.0 + "num_stories": 1115, + "predicted_min_shard_time": 2510.0, + "predicted_min_shard_index": 19, + "predicted_max_shard_time": 3490.0, + "predicted_max_shard_index": 18, + "shard #0": 3075.0, + "shard #1": 3045.0, + "shard #2": 3087.0, + "shard #3": 3065.0, + "shard #4": 3080.0, + "shard #5": 3081.0, + "shard #6": 3061.0, + "shard #7": 3074.0, + "shard #8": 3077.0, + "shard #9": 3078.0, + "shard #10": 3047.0, + "shard #11": 3107.0, + "shard #12": 3073.0, + "shard #13": 3041.0, + "shard #14": 3078.0, + "shard #15": 3190.0, + "shard #16": 3052.0, + "shard #17": 3010.0, + "shard #18": 3490.0, + "shard #19": 2510.0 } }
diff --git a/tools/perf/core/shard_maps/android-pixel4_webview-perf_map.json b/tools/perf/core/shard_maps/android-pixel4_webview-perf_map.json index 0e5bb071..cb1a52a 100644 --- a/tools/perf/core/shard_maps/android-pixel4_webview-perf_map.json +++ b/tools/perf/core/shard_maps/android-pixel4_webview-perf_map.json
@@ -8,7 +8,7 @@ "abridged": false }, "blink_perf.bindings": { - "end": 41, + "end": 33, "abridged": false }, "speedometer2": { @@ -22,7 +22,7 @@ "1": { "benchmarks": { "blink_perf.bindings": { - "begin": 41, + "begin": 33, "abridged": false }, "blink_perf.css": { @@ -50,7 +50,7 @@ "abridged": false }, "blink_perf.image_decoder": { - "end": 4, + "end": 2, "abridged": false }, "speedometer2": { @@ -64,11 +64,11 @@ "3": { "benchmarks": { "blink_perf.image_decoder": { - "begin": 4, + "begin": 2, "abridged": false }, "blink_perf.layout": { - "end": 59, + "end": 51, "abridged": false }, "speedometer2": { @@ -82,11 +82,8 @@ "4": { "benchmarks": { "blink_perf.layout": { - "begin": 59, - "abridged": false - }, - "blink_perf.owp_storage": { - "end": 4, + "begin": 51, + "end": 110, "abridged": false }, "speedometer2": { @@ -99,15 +96,18 @@ }, "5": { "benchmarks": { + "blink_perf.layout": { + "begin": 110, + "abridged": false + }, "blink_perf.owp_storage": { - "begin": 4, "abridged": false }, "blink_perf.parser": { "abridged": false }, "blink_perf.shadow_dom": { - "end": 31, + "end": 18, "abridged": false }, "speedometer2": { @@ -121,7 +121,7 @@ "6": { "benchmarks": { "blink_perf.shadow_dom": { - "begin": 31, + "begin": 18, "abridged": false }, "blink_perf.webaudio": { @@ -148,17 +148,6 @@ "speedometer3": { "abridged": false } - }, - "crossbench": { - "loading": { - "display_name": "loading.crossbench", - "arguments": [ - "--wpr=crossbench_android_loading_000.wprgo", - "--probe=chrome_histograms:{\"baseline\":false,\"metrics\":{\"Android.WebView.Startup.CreationTime.StartChromiumLocked\":[\"mean\"]}}", - "--repetitions=50", - "--stories=cnn" - ] - } } }, "7": { @@ -173,7 +162,7 @@ "abridged": false }, "rendering.mobile": { - "end": 22, + "end": 4, "abridged": false }, "speedometer2": { @@ -182,13 +171,24 @@ "speedometer3": { "abridged": false } + }, + "crossbench": { + "loading": { + "display_name": "loading.crossbench", + "arguments": [ + "--wpr=crossbench_android_loading_000.wprgo", + "--probe=chrome_histograms:{\"baseline\":false,\"metrics\":{\"Android.WebView.Startup.CreationTime.StartChromiumLocked\":[\"mean\"],\"Android.WebView.Startup.CreationTime.Stage1.FactoryInit\":[\"mean\"],\"PageLoad.PaintTiming.NavigationToFirstContentfulPaint\":[\"mean\"]}}", + "--repetitions=50", + "--stories=cnn" + ] + } } }, "8": { "benchmarks": { "rendering.mobile": { - "begin": 22, - "end": 67, + "begin": 4, + "end": 50, "abridged": false }, "speedometer2": { @@ -202,8 +202,8 @@ "9": { "benchmarks": { "rendering.mobile": { - "begin": 67, - "end": 110, + "begin": 50, + "end": 99, "abridged": false }, "speedometer2": { @@ -217,8 +217,8 @@ "10": { "benchmarks": { "rendering.mobile": { - "begin": 110, - "end": 160, + "begin": 99, + "end": 144, "abridged": false }, "speedometer2": { @@ -232,8 +232,8 @@ "11": { "benchmarks": { "rendering.mobile": { - "begin": 160, - "end": 204, + "begin": 144, + "end": 189, "abridged": false }, "speedometer2": { @@ -247,8 +247,8 @@ "12": { "benchmarks": { "rendering.mobile": { - "begin": 204, - "end": 265, + "begin": 189, + "end": 247, "abridged": false }, "speedometer2": { @@ -262,8 +262,8 @@ "13": { "benchmarks": { "rendering.mobile": { - "begin": 265, - "end": 328, + "begin": 247, + "end": 317, "abridged": false }, "speedometer2": { @@ -277,8 +277,8 @@ "14": { "benchmarks": { "rendering.mobile": { - "begin": 328, - "end": 381, + "begin": 317, + "end": 365, "abridged": false }, "speedometer2": { @@ -292,7 +292,7 @@ "15": { "benchmarks": { "rendering.mobile": { - "begin": 381, + "begin": 365, "abridged": false }, "rendering.mobile.notracing": { @@ -320,7 +320,7 @@ "abridged": false }, "system_health.common_mobile": { - "end": 19, + "end": 5, "abridged": false } } @@ -328,7 +328,8 @@ "16": { "benchmarks": { "system_health.common_mobile": { - "begin": 19, + "begin": 5, + "end": 62, "abridged": false }, "speedometer2": { @@ -341,8 +342,12 @@ }, "17": { "benchmarks": { + "system_health.common_mobile": { + "begin": 62, + "abridged": false + }, "system_health.memory_mobile": { - "end": 19, + "end": 13, "abridged": false }, "speedometer2": { @@ -356,8 +361,8 @@ "18": { "benchmarks": { "system_health.memory_mobile": { - "begin": 19, - "end": 29, + "begin": 13, + "end": 26, "abridged": false }, "speedometer2": { @@ -371,8 +376,8 @@ "19": { "benchmarks": { "system_health.memory_mobile": { - "begin": 29, - "end": 47, + "begin": 26, + "end": 45, "abridged": false }, "speedometer2": { @@ -386,8 +391,8 @@ "20": { "benchmarks": { "system_health.memory_mobile": { - "begin": 47, - "end": 66, + "begin": 45, + "end": 62, "abridged": false } } @@ -395,7 +400,7 @@ "21": { "benchmarks": { "system_health.memory_mobile": { - "begin": 66, + "begin": 62, "abridged": false }, "system_health.webview_startup": { @@ -417,33 +422,33 @@ } }, "extra_infos": { - "num_stories": 1114, - "predicted_min_shard_time": 1860.0, + "num_stories": 1115, + "predicted_min_shard_time": 1814.0, "predicted_min_shard_index": 22, - "predicted_max_shard_time": 2460.0, + "predicted_max_shard_time": 2327.0, "predicted_max_shard_index": 21, - "shard #0": 2147.0, - "shard #1": 2145.0, - "shard #2": 2147.0, - "shard #3": 2144.0, - "shard #4": 2156.0, - "shard #5": 2138.0, - "shard #6": 2335.0, - "shard #7": 2105.0, - "shard #8": 2138.0, - "shard #9": 2147.0, + "shard #0": 2113.0, + "shard #1": 2116.0, + "shard #2": 2124.0, + "shard #3": 2137.0, + "shard #4": 2138.0, + "shard #5": 2114.0, + "shard #6": 1998.0, + "shard #7": 2100.0, + "shard #8": 2136.0, + "shard #9": 2152.0, "shard #10": 2125.0, - "shard #11": 2130.0, - "shard #12": 2129.0, - "shard #13": 2134.0, - "shard #14": 2125.0, - "shard #15": 2141.0, - "shard #16": 2099.0, - "shard #17": 2152.0, - "shard #18": 2128.0, - "shard #19": 2116.0, - "shard #20": 2088.0, - "shard #21": 2460.0, - "shard #22": 1860.0 + "shard #11": 2125.0, + "shard #12": 2130.0, + "shard #13": 2150.0, + "shard #14": 2131.0, + "shard #15": 2120.0, + "shard #16": 2139.0, + "shard #17": 2156.0, + "shard #18": 2199.0, + "shard #19": 2166.0, + "shard #20": 2139.0, + "shard #21": 2327.0, + "shard #22": 1814.0 } }
diff --git a/tools/pgo/generate_profile.py b/tools/pgo/generate_profile.py index eb3eca06..246ed35 100755 --- a/tools/pgo/generate_profile.py +++ b/tools/pgo/generate_profile.py
@@ -462,6 +462,7 @@ '--print-only=stories', '--print-only-runnable', # This is essential to skip filtered stories. f'--browser={args.android_browser}', + '-vv', ] _LOGGER.debug(f"Running command: {' '.join(print_stories_cmd)}")
diff --git a/ui/accessibility/platform/ax_platform_node_cocoa.h b/ui/accessibility/platform/ax_platform_node_cocoa.h index 8a5a3aeb..1a953530 100644 --- a/ui/accessibility/platform/ax_platform_node_cocoa.h +++ b/ui/accessibility/platform/ax_platform_node_cocoa.h
@@ -42,9 +42,6 @@ // Determines if this object is alive, i.e. it hasn't been detached. - (BOOL)instanceActive; -// Returns true if this accessible element should be included into the ax tree. -- (BOOL)isIncludedInPlatformTree; - // Returns true if this object should expose its accessible name using // accessibilityLabel (legacy AXDescription attribute). - (BOOL)isNameFromLabel;
diff --git a/ui/accessibility/platform/ax_platform_node_cocoa.mm b/ui/accessibility/platform/ax_platform_node_cocoa.mm index 1f10479..3a04af375 100644 --- a/ui/accessibility/platform/ax_platform_node_cocoa.mm +++ b/ui/accessibility/platform/ax_platform_node_cocoa.mm
@@ -537,14 +537,6 @@ return _node != nullptr; } -- (BOOL)isIncludedInPlatformTree { - // TODO(accessibility): Do we really need to have invisible objects in - // the platform tree? - return [self instanceActive] && - ![[self AXRole] isEqualToString:NSAccessibilityUnknownRole] && - !_node->IsInvisibleOrIgnored(); -} - - (id)titleUIElement { // True only if it's a control, if there's a single label, and the label has // nonempty text. @@ -835,8 +827,6 @@ return NSAccessibilityButtonRole; case ax::mojom::Role::kCanvas: return NSAccessibilityImageRole; - case ax::mojom::Role::kCaret: - return NSAccessibilityUnknownRole; case ax::mojom::Role::kCell: return @"AXCell"; case ax::mojom::Role::kCheckBox: @@ -893,14 +883,10 @@ return @"AXHeading"; case ax::mojom::Role::kImage: return NSAccessibilityImageRole; - case ax::mojom::Role::kImeCandidate: - return NSAccessibilityUnknownRole; case ax::mojom::Role::kInlineTextBox: return NSAccessibilityStaticTextRole; case ax::mojom::Role::kInputTime: return @"AXTimeField"; - case ax::mojom::Role::kKeyboard: - return NSAccessibilityUnknownRole; case ax::mojom::Role::kLink: return NSAccessibilityLinkRole; case ax::mojom::Role::kList: @@ -945,8 +931,6 @@ return NSAccessibilityRowRole; case ax::mojom::Role::kRowHeader: return @"AXCell"; - case ax::mojom::Role::kRubyAnnotation: - return NSAccessibilityUnknownRole; case ax::mojom::Role::kScrollBar: return NSAccessibilityScrollBarRole; case ax::mojom::Role::kScrollView: @@ -986,18 +970,25 @@ case ax::mojom::Role::kTreeItem: return NSAccessibilityRowRole; case ax::mojom::Role::kUnknown: - return NSAccessibilityUnknownRole; + // This occurs in the case where a View has no widget, and while this will + // not be exposed to users, it allows isAccessibilityElement() to have + // fewer rules. + return NSAccessibilityGroupRole; case ax::mojom::Role::kWindow: // Use the group role as the BrowserNativeWidgetWindow already provides // a kWindow role, and having extra window roles, which are treated // specially by screen readers, can break their ability to find the // content window. See http://crbug.com/875843 for more information. return NSAccessibilityGroupRole; + case ax::mojom::Role::kCaret: case ax::mojom::Role::kDescriptionListTermDeprecated: case ax::mojom::Role::kDescriptionListDetailDeprecated: case ax::mojom::Role::kDirectoryDeprecated: + case ax::mojom::Role::kImeCandidate: + case ax::mojom::Role::kKeyboard: case ax::mojom::Role::kPreDeprecated: case ax::mojom::Role::kPortalDeprecated: + case ax::mojom::Role::kRubyAnnotation: NOTREACHED(); } } @@ -1052,19 +1043,15 @@ } - (ax::mojom::Role)internalRole { - if ([self instanceActive]) { - ax::mojom::Role role = static_cast<ax::mojom::Role>(_node->GetRole()); - // Make sure to use Role::kPopupButton instead of Role::kButton for all - // values of kHasPopup. This is normally already true, but the default - // implementation does not use kPopupButton if aria-haspopup="dialog". - if (role == ax::mojom::Role::kButton && - _node->HasIntAttribute(ax::mojom::IntAttribute::kHasPopup)) { - return ax::mojom::Role::kPopUpButton; - } - return role; + ax::mojom::Role role = static_cast<ax::mojom::Role>(_node->GetRole()); + // Make sure to use Role::kPopupButton instead of Role::kButton for all + // values of kHasPopup. This is normally already true, but the default + // implementation does not use kPopupButton if aria-haspopup="dialog". + if (role == ax::mojom::Role::kButton && + _node->HasIntAttribute(ax::mojom::IntAttribute::kHasPopup)) { + return ax::mojom::Role::kPopUpButton; } - - return ax::mojom::Role::kUnknown; + return role; } - (BOOL)hasAction:(ax::mojom::Action)action { @@ -1095,8 +1082,7 @@ bool has_image_semantics = ui::IsImage(_node->GetRole()) && !_node->GetBoolAttribute(ax::mojom::BoolAttribute::kCanvasHasFallback) && - !_node->GetChildCount() && - _node->GetNameFrom() != ax::mojom::NameFrom::kAttributeExplicitlyEmpty; + !_node->GetChildCount(); #if DCHECK_IS_ON() bool is_native_image = [[self accessibilityRole] isEqualToString:NSAccessibilityImageRole]; @@ -2340,14 +2326,7 @@ for (auto child_iterator_ptr = _node->GetDelegate()->ChildrenBegin(); *child_iterator_ptr != *_node->GetDelegate()->ChildrenEnd(); ++(*child_iterator_ptr)) { - ui::AXPlatformNodeDelegate* child = child_iterator_ptr->get(); - if (child && child->IsInvisibleOrIgnored()) { - [children - addObjectsFromArray:[child_iterator_ptr->GetNativeViewAccessible() - .Get() accessibilityChildren]]; - } else { - [children addObject:child_iterator_ptr->GetNativeViewAccessible().Get()]; - } + [children addObject:child_iterator_ptr->GetNativeViewAccessible().Get()]; } return NSAccessibilityUnignoredChildren(children); } @@ -2619,12 +2598,27 @@ // NSAccessibility: Configuring Accessibility. - (BOOL)isAccessibilityElement { - if (![self instanceActive]) + if (!_node) { return NO; + } + DCHECK(_node->GetDelegate()); + DCHECK([self instanceActive]); - return (![[[self class] nativeRoleFromAXRole:_node->GetRole()] - isEqualToString:NSAccessibilityUnknownRole] && - !_node->GetDelegate()->IsIgnored()); + // After ViewsAX lands, we should be able to add this DCHECK. + // DCHECK(!_node->GetDelegate()->IsIgnored()) + // << "Ignored nodes should be removed by PlatformGet*() methods:" + // << _node->GetDelegate()->ToString(); + + if (_node->GetDelegate()->IsInvisibleOrIgnored()) { + return NO; + } + + if ([self internalRole] == ax::mojom::Role::kImage && + _node->GetData().GetNameFrom() == + ax::mojom::NameFrom::kAttributeExplicitlyEmpty) { + return NO; + } + return YES; } - (BOOL)isAccessibilityEnabled {
diff --git a/ui/accessibility/platform/browser_accessibility_cocoa.mm b/ui/accessibility/platform/browser_accessibility_cocoa.mm index a2b8ef2..403d4aa2 100644 --- a/ui/accessibility/platform/browser_accessibility_cocoa.mm +++ b/ui/accessibility/platform/browser_accessibility_cocoa.mm
@@ -630,10 +630,7 @@ AXPlatformNodeCocoa* child = base::apple::ObjCCastStrict<AXPlatformNodeCocoa>( it->GetNativeViewAccessible().Get()); - if ([child isIncludedInPlatformTree]) - [_children addObject:child]; - else - [_children addObjectsFromArray:[child accessibilityChildren]]; + [_children addObject:child]; } // Also, add indirect children (if any). @@ -649,7 +646,7 @@ } } } - return _children; + return NSAccessibilityUnignoredChildren(_children); } - (void)childrenChanged { @@ -660,14 +657,12 @@ return; } _children = nil; - if (![self isIncludedInPlatformTree]) { - BrowserAccessibility* parent = _owner->PlatformGetParent(); - if (parent) { - BrowserAccessibilityCocoa* parentCocoa = - base::apple::ObjCCastStrict<BrowserAccessibilityCocoa>( - parent->GetNativeViewAccessible().Get()); - [parentCocoa childrenChanged]; - } + BrowserAccessibility* parent = _owner->PlatformGetParent(); + if (parent) { + BrowserAccessibilityCocoa* parentCocoa = + base::apple::ObjCCastStrict<BrowserAccessibilityCocoa>( + parent->GetNativeViewAccessible().Get()); + [parentCocoa childrenChanged]; } } @@ -1178,9 +1173,6 @@ } else if (ui::IsImage(_owner->GetRole()) && _owner->GetChildCount()) { // An image map is an image with children, and exposed on Mac as a group. cocoa_role = NSAccessibilityGroupRole; - } else if (ui::IsImage(_owner->GetRole()) && - _owner->HasExplicitlyEmptyName()) { - cocoa_role = NSAccessibilityUnknownRole; } else if (_owner->IsRootWebAreaForPresentationalIframe()) { cocoa_role = NSAccessibilityGroupRole; } else if (role == ax::mojom::Role::kListBoxOption && _owner->IsWebContent()) { @@ -1196,6 +1188,7 @@ TRACE_EVENT1("accessibility", "BrowserAccessibilityCocoa::role", "role=", base::SysNSStringToUTF8(cocoa_role)); + DCHECK(cocoa_role != NSAccessibilityUnknownRole); return cocoa_role; } @@ -2957,16 +2950,4 @@ return _owner; } -- (BOOL)isAccessibilityElement { - if (![self instanceActive]) - return NO; - - if ([self internalRole] == ax::mojom::Role::kImage && - _owner->HasExplicitlyEmptyName()) { - return NO; - } - - return [super isAccessibilityElement]; -} - @end
diff --git a/ui/accessibility/platform/browser_accessibility_manager_mac.mm b/ui/accessibility/platform/browser_accessibility_manager_mac.mm index 3e38738..7dd52ce4 100644 --- a/ui/accessibility/platform/browser_accessibility_manager_mac.mm +++ b/ui/accessibility/platform/browser_accessibility_manager_mac.mm
@@ -369,6 +369,10 @@ mac_notification = NSAccessibilityTitleChangedNotification; break; + case AXEventGenerator::Event::CHILDREN_CHANGED: + [native_node childrenChanged]; + return; + // Currently unused events on this platform. case AXEventGenerator::Event::NONE: case AXEventGenerator::Event::ACCESS_KEY_CHANGED: @@ -379,7 +383,6 @@ case AXEventGenerator::Event::AUTOFILL_AVAILABILITY_CHANGED: case AXEventGenerator::Event::CARET_BOUNDS_CHANGED: case AXEventGenerator::Event::CHECKED_STATE_DESCRIPTION_CHANGED: - case AXEventGenerator::Event::CHILDREN_CHANGED: case AXEventGenerator::Event::CONTROLS_CHANGED: case AXEventGenerator::Event::DETAILS_CHANGED: case AXEventGenerator::Event::DESCRIBED_BY_CHANGED: @@ -528,13 +531,12 @@ BrowserAccessibilityMac* node = static_cast<BrowserAccessibilityMac*>(GetFromID(new_node_data.id)); CHECK(node); - if (!features::IsMacAccessibilityOptimizeChildrenChangedEnabled() || - (old_node_data.child_ids == new_node_data.child_ids && - !node->node()->GetExtraMacNodes())) { - return; + if (old_node_data.GetIntListAttribute( + ax::mojom::IntListAttribute::kIndirectChildIds) != + new_node_data.GetIntListAttribute( + ax::mojom::IntListAttribute::kIndirectChildIds)) { + [node->GetNativeWrapper() childrenChanged]; } - - [node->GetNativeWrapper() childrenChanged]; } NSDictionary* BrowserAccessibilityManagerMac::
diff --git a/ui/accessibility/platform/inspect/ax_event_recorder_mac.mm b/ui/accessibility/platform/inspect/ax_event_recorder_mac.mm index 9879f71..7a86ac7 100644 --- a/ui/accessibility/platform/inspect/ax_event_recorder_mac.mm +++ b/ui/accessibility/platform/inspect/ax_event_recorder_mac.mm
@@ -17,7 +17,9 @@ #include "base/strings/string_util.h" #include "base/strings/stringprintf.h" #include "base/strings/sys_string_conversions.h" +#include "ui/accessibility/platform/ax_platform_node.h" #include "ui/accessibility/platform/ax_platform_tree_manager.h" +#include "ui/accessibility/platform/ax_private_attributes_mac.h" #include "ui/accessibility/platform/ax_private_webkit_constants_mac.h" #include "ui/accessibility/platform/inspect/ax_inspect_utils_mac.h" #include "ui/accessibility/platform/inspect/ax_tree_formatter_mac.h" @@ -150,6 +152,17 @@ return; } +#if DCHECK_IS_ON() + // Log the AXNodeData for incoming events, for easier debugging. + AXElementWrapper wrapper((__bridge id)element); + NSString* chrome_node_id = + *wrapper.GetAttributeValue(NSAccessibilityChromeAXNodeIdAttribute); + AXPlatformNode* ax_platform_node = + manager_->GetPlatformNodeFromTree([chrome_node_id intValue]); + DVLOG(1) << "Receiving event: " << notification_str + << " with AXNodeData: " << ax_platform_node->ToString(); +#endif + auto formatter = AXTreeFormatterMac(); formatter.SetPropertyFilters(property_filters_, AXTreeFormatter::kFiltersDefaultSet);
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 b3c1e07..6bdba56 100644 --- a/ui/android/java/src/org/chromium/ui/base/ViewAndroidDelegate.java +++ b/ui/android/java/src/org/chromium/ui/base/ViewAndroidDelegate.java
@@ -4,6 +4,8 @@ package org.chromium.ui.base; +import static org.chromium.build.NullUtil.assumeNonNull; + import android.content.ClipData; import android.content.Context; import android.graphics.Bitmap; @@ -44,18 +46,15 @@ private static @Nullable DragAndDropDelegate sDragAndDropDelegateForTesting; private final DragAndDropDelegateImpl mDragAndDropDelegateImpl; - /** - * The current container view. This view can be updated with - * {@link #setContainerView()}. - */ - protected ViewGroup mContainerView; + /** The current container view. This view can be updated with {@link #setContainerView()}. */ + protected @Nullable ViewGroup mContainerView; // Temporary storage for use as a parameter of getLocationOnScreen(). private final int[] mTemporaryContainerLocation = new int[2]; /** Notifies the observer when container view is updated. */ public interface ContainerViewObserver { - void onUpdateContainerView(ViewGroup view); + void onUpdateContainerView(@Nullable ViewGroup view); } private final ObserverList<ContainerViewObserver> mContainerViewObservers = @@ -87,14 +86,15 @@ /** * Create and return a basic implementation of {@link ViewAndroidDelegate}. + * * @param containerView {@link ViewGroup} to be used as a container view. * @return a new instance of {@link ViewAndroidDelegate}. */ - public static ViewAndroidDelegate createBasicDelegate(ViewGroup containerView) { + public static ViewAndroidDelegate createBasicDelegate(@Nullable ViewGroup containerView) { return new ViewAndroidDelegate(containerView); } - protected ViewAndroidDelegate(ViewGroup containerView) { + protected ViewAndroidDelegate(@Nullable ViewGroup containerView) { mContainerView = containerView; mDragAndDropDelegateImpl = new DragAndDropDelegateImpl(); } @@ -134,22 +134,23 @@ /** * Updates the current container view to which this class delegates. * - * <p>WARNING: This method can also be used to replace the existing container view, - * but you should only do it if you have a very good reason to. Replacing the - * container view has been designed to support fullscreen in the Webview so it - * might not be appropriate for other use cases. + * <p>WARNING: This method can also be used to replace the existing container view, but you + * should only do it if you have a very good reason to. Replacing the container view has been + * designed to support fullscreen in the Webview so it might not be appropriate for other use + * cases. * - * <p>This method only performs a small part of replacing the container view and - * embedders are responsible for: + * <p>This method only performs a small part of replacing the container view and embedders are + * responsible for: + * * <ul> - * <li>Disconnecting the old container view from all the references</li> - * <li>Updating the InternalAccessDelegate</li> - * <li>Reconciling the state with the new container view</li> - * <li>Tearing down and recreating the native GL rendering where appropriate</li> - * <li>etc.</li> + * <li>Disconnecting the old container view from all the references + * <li>Updating the InternalAccessDelegate + * <li>Reconciling the state with the new container view + * <li>Tearing down and recreating the native GL rendering where appropriate + * <li>etc. * </ul> */ - public final void setContainerView(ViewGroup containerView) { + public final void setContainerView(@Nullable ViewGroup containerView) { ViewGroup oldContainerView = mContainerView; mContainerView = containerView; updateAnchorViews(oldContainerView); @@ -183,7 +184,7 @@ * * @param oldContainerView Old container view just replaced by a new one. */ - public void updateAnchorViews(ViewGroup oldContainerView) {} + public void updateAnchorViews(@Nullable ViewGroup oldContainerView) {} /** * @return An anchor view that can be used to anchor decoration views like Autofill popup. @@ -296,7 +297,7 @@ public void onCursorChangedToCustom(Bitmap customCursorBitmap, int hotspotX, int hotspotY) { PointerIcon icon = PointerIcon.create(customCursorBitmap, hotspotX, hotspotY); - getContainerViewGroup().setPointerIcon(icon); + assumeNonNull(getContainerViewGroup()).setPointerIcon(icon); } @VisibleForTesting @@ -423,6 +424,7 @@ break; } ViewGroup containerView = getContainerViewGroup(); + assumeNonNull(containerView); PointerIcon icon = PointerIcon.getSystemIcon(containerView.getContext(), pointerIconType); containerView.setPointerIcon(icon); @@ -492,12 +494,11 @@ * @return container view that the anchor views are added to. May be null. */ @CalledByNative - @Nullable - public final View getContainerView() { + public final @Nullable View getContainerView() { return mContainerView; } - protected final ViewGroup getContainerViewGroup() { + protected final @Nullable ViewGroup getContainerViewGroup() { return mContainerView; }
diff --git a/ui/android/java/src/org/chromium/ui/insets/InsetObserver.java b/ui/android/java/src/org/chromium/ui/insets/InsetObserver.java index 400124f4c..240b1ac 100644 --- a/ui/android/java/src/org/chromium/ui/insets/InsetObserver.java +++ b/ui/android/java/src/org/chromium/ui/insets/InsetObserver.java
@@ -62,6 +62,9 @@ private @Nullable WindowInsetsCompat mLastSeenRawWindowInset; private static @Nullable WindowInsetsCompat sInitialRawWindowInsetsForTesting; + // Edge-to-edge investigations + private boolean mHasSeenNonZeroNavBar; + /** Allows observing changes to the window insets from Android system UI. */ public interface WindowInsetObserver { /** @@ -317,9 +320,28 @@ return mWindowInsetsAnimationProxyCallback; } + private void checkForNavigationBar(WindowInsetsCompat insets) { + Insets navigationBarInsets = + insets.getInsetsIgnoringVisibility(WindowInsetsCompat.Type.navigationBars()); + boolean nonZeroNavBarInsets = + navigationBarInsets.left > 0 + || navigationBarInsets.bottom > 0 + || navigationBarInsets.right > 0; + mHasSeenNonZeroNavBar |= nonZeroNavBarInsets; + } + + /** + * Returns whether the InsetObserver has observed non-zero navigation bar insets (ignoring + * visibility). + */ + public boolean hasSeenNonZeroNavigationBarInsets() { + return mHasSeenNonZeroNavBar; + } + @Override public WindowInsetsCompat onApplyWindowInsets(View view, WindowInsetsCompat insets) { mLastSeenRawWindowInset = insets; + checkForNavigationBar(insets); updateDisplayCutoutRect(insets); insets = forwardToInsetConsumers(insets);
diff --git a/ui/android/junit/src/org/chromium/ui/insets/InsetObserverTest.java b/ui/android/junit/src/org/chromium/ui/insets/InsetObserverTest.java index c735134..7fe537d 100644 --- a/ui/android/junit/src/org/chromium/ui/insets/InsetObserverTest.java +++ b/ui/android/junit/src/org/chromium/ui/insets/InsetObserverTest.java
@@ -76,6 +76,9 @@ private static final Insets SYSTEM_GESTURES_INSETS_MODIFIED = Insets.of(1, 1, 1, 2); + private static final Insets NAVIGATION_BAR_INSETS = Insets.of(0, 0, 0, 1); + private static final Insets NAVIGATION_BAR_INSETS_MODIFIED = Insets.of(0, 0, 0, 2); + @Mock private InsetObserver.WindowInsetObserver mObserver; @Mock private WindowInsetsCompat mInsets; @@ -111,6 +114,12 @@ .onApplyWindowInsets(mModifiedNonCompatInsets); doReturn(SYSTEM_BAR_INSETS).when(mInsets).getInsets(WindowInsetsCompat.Type.systemBars()); + doReturn(NAVIGATION_BAR_INSETS) + .when(mInsets) + .getInsets(WindowInsetsCompat.Type.navigationBars()); + doReturn(NAVIGATION_BAR_INSETS) + .when(mInsets) + .getInsetsIgnoringVisibility(WindowInsetsCompat.Type.navigationBars()); doReturn(SYSTEM_BAR_INSETS_MODIFIED) .when(mModifiedInsets) .getInsets(WindowInsetsCompat.Type.systemBars()); @@ -120,6 +129,12 @@ doReturn(SYSTEM_GESTURES_INSETS_MODIFIED) .when(mModifiedInsets) .getInsets(WindowInsetsCompat.Type.systemGestures()); + doReturn(NAVIGATION_BAR_INSETS_MODIFIED) + .when(mModifiedInsets) + .getInsets(WindowInsetsCompat.Type.navigationBars()); + doReturn(NAVIGATION_BAR_INSETS_MODIFIED) + .when(mModifiedInsets) + .getInsetsIgnoringVisibility(WindowInsetsCompat.Type.navigationBars()); mInsetObserver = new InsetObserver(
diff --git a/ui/base/ui_base_features.cc b/ui/base/ui_base_features.cc index 19f4980..20a312a6 100644 --- a/ui/base/ui_base_features.cc +++ b/ui/base/ui_base_features.cc
@@ -156,7 +156,7 @@ // See https://crbug.com/412608405 for context. BASE_FEATURE(kXInput2KeyEvents, "XInput2KeyEvents", - base::FEATURE_DISABLED_BY_DEFAULT); + base::FEATURE_ENABLED_BY_DEFAULT); // Update of the virtual keyboard settings UI as described in // https://crbug.com/876901.
diff --git a/ui/ozone/platform/wayland/host/wayland_buffer_backing.cc b/ui/ozone/platform/wayland/host/wayland_buffer_backing.cc index 8d34a506..98a9b186 100644 --- a/ui/ozone/platform/wayland/host/wayland_buffer_backing.cc +++ b/ui/ozone/platform/wayland/host/wayland_buffer_backing.cc
@@ -13,11 +13,13 @@ WaylandBufferBacking::WaylandBufferBacking(const WaylandConnection* connection, uint32_t buffer_id, const gfx::Size& size, + BufferBackingType type, uint32_t format) : connection_(connection), format_(format), buffer_id_(buffer_id), - size_(size) { + size_(size), + type_(type) { DCHECK(connection_); DCHECK_NE(buffer_id_, kInvalidBufferId); } @@ -25,7 +27,8 @@ WaylandBufferBacking::~WaylandBufferBacking() = default; bool WaylandBufferBacking::UseExplicitSyncRelease() const { - return connection_->SupportsExplicitSync(); + return connection_->SupportsExplicitSync() && + type() == BufferBackingType::kDmabuf; } WaylandBufferHandle* WaylandBufferBacking::EnsureBufferHandle(
diff --git a/ui/ozone/platform/wayland/host/wayland_buffer_backing.h b/ui/ozone/platform/wayland/host/wayland_buffer_backing.h index 50e38ca3..4175757 100644 --- a/ui/ozone/platform/wayland/host/wayland_buffer_backing.h +++ b/ui/ozone/platform/wayland/host/wayland_buffer_backing.h
@@ -30,8 +30,7 @@ enum class BufferBackingType { kShm = 0, kDmabuf = 1, - kSolidColor = 2, - kSinglePixel = 3, + kSinglePixel = 2, }; WaylandBufferBacking() = delete; @@ -40,6 +39,7 @@ WaylandBufferBacking(const WaylandConnection* connection, uint32_t buffer_id, const gfx::Size& size, + BufferBackingType type, uint32_t format = DRM_FORMAT_INVALID); virtual ~WaylandBufferBacking(); @@ -60,7 +60,7 @@ WaylandBufferHandle* GetBufferHandle(WaylandSurface* requestor); // Returns type of the backing. See BufferBackingType. - virtual BufferBackingType GetBackingType() const = 0; + BufferBackingType type() const { return type_; } private: // Non-owned pointer to the main connection. @@ -83,6 +83,8 @@ // Actual buffer size in pixels. const gfx::Size size_; + const BufferBackingType type_; + // Collection of wl_buffers objects backed by this backing. Maintains the // relationship of wl_surfaces to wl_buffers, corresponding to the // wl_surface.attach(wl_buffer) request. |buffer_handles_[nullptr]| represents
diff --git a/ui/ozone/platform/wayland/host/wayland_buffer_backing_dmabuf.cc b/ui/ozone/platform/wayland/host/wayland_buffer_backing_dmabuf.cc index c2b529a..5837867 100644 --- a/ui/ozone/platform/wayland/host/wayland_buffer_backing_dmabuf.cc +++ b/ui/ozone/platform/wayland/host/wayland_buffer_backing_dmabuf.cc
@@ -19,7 +19,11 @@ uint32_t format, uint32_t planes_count, uint32_t buffer_id) - : WaylandBufferBacking(connection, buffer_id, size, format), + : WaylandBufferBacking(connection, + buffer_id, + size, + BufferBackingType::kDmabuf, + format), fd_(std::move(fd)), strides_(std::move(strides)), offsets_(std::move(offsets)), @@ -40,9 +44,4 @@ auto close = std::move(fd_); } -WaylandBufferBacking::BufferBackingType -WaylandBufferBackingDmabuf::GetBackingType() const { - return WaylandBufferBacking::BufferBackingType::kDmabuf; -} - } // namespace ui
diff --git a/ui/ozone/platform/wayland/host/wayland_buffer_backing_dmabuf.h b/ui/ozone/platform/wayland/host/wayland_buffer_backing_dmabuf.h index 61b7bd8b..44064c6 100644 --- a/ui/ozone/platform/wayland/host/wayland_buffer_backing_dmabuf.h +++ b/ui/ozone/platform/wayland/host/wayland_buffer_backing_dmabuf.h
@@ -32,7 +32,6 @@ // WaylandBufferBacking override: void RequestBufferHandle( base::OnceCallback<void(wl::Object<wl_buffer>)> callback) override; - BufferBackingType GetBackingType() const override; base::ScopedFD fd_; const std::vector<uint32_t> strides_;
diff --git a/ui/ozone/platform/wayland/host/wayland_buffer_backing_shm.cc b/ui/ozone/platform/wayland/host/wayland_buffer_backing_shm.cc index b1dbc4b..d0b6182 100644 --- a/ui/ozone/platform/wayland/host/wayland_buffer_backing_shm.cc +++ b/ui/ozone/platform/wayland/host/wayland_buffer_backing_shm.cc
@@ -15,7 +15,10 @@ uint64_t length, const gfx::Size& size, uint32_t buffer_id) - : WaylandBufferBacking(connection, buffer_id, size), + : WaylandBufferBacking(connection, + buffer_id, + size, + BufferBackingType::kShm), fd_(std::move(fd)), length_(length) {} @@ -32,9 +35,4 @@ auto close = std::move(fd_); } -WaylandBufferBacking::BufferBackingType -WaylandBufferBackingShm::GetBackingType() const { - return WaylandBufferBacking::BufferBackingType::kShm; -} - } // namespace ui
diff --git a/ui/ozone/platform/wayland/host/wayland_buffer_backing_shm.h b/ui/ozone/platform/wayland/host/wayland_buffer_backing_shm.h index 82ee7b29a..877bcf70 100644 --- a/ui/ozone/platform/wayland/host/wayland_buffer_backing_shm.h +++ b/ui/ozone/platform/wayland/host/wayland_buffer_backing_shm.h
@@ -27,7 +27,6 @@ // WaylandBufferBacking override: void RequestBufferHandle( base::OnceCallback<void(wl::Object<wl_buffer>)> callback) override; - BufferBackingType GetBackingType() const override; base::ScopedFD fd_; const uint64_t length_;
diff --git a/ui/ozone/platform/wayland/host/wayland_buffer_backing_single_pixel.cc b/ui/ozone/platform/wayland/host/wayland_buffer_backing_single_pixel.cc index f88209e..2b1be81 100644 --- a/ui/ozone/platform/wayland/host/wayland_buffer_backing_single_pixel.cc +++ b/ui/ozone/platform/wayland/host/wayland_buffer_backing_single_pixel.cc
@@ -13,7 +13,10 @@ const WaylandConnection* connection, SkColor4f color, uint32_t buffer_id) - : WaylandBufferBacking(connection, buffer_id, gfx::Size(1, 1)), + : WaylandBufferBacking(connection, + buffer_id, + gfx::Size(1, 1), + BufferBackingType::kSinglePixel), color_(color) {} WaylandBufferBackingSinglePixel::~WaylandBufferBackingSinglePixel() = default; @@ -25,9 +28,4 @@ connection()->single_pixel_buffer()->CreateSinglePixelBuffer(color_)); } -WaylandBufferBacking::BufferBackingType -WaylandBufferBackingSinglePixel::GetBackingType() const { - return WaylandBufferBacking::BufferBackingType::kSinglePixel; -} - } // namespace ui
diff --git a/ui/ozone/platform/wayland/host/wayland_buffer_backing_single_pixel.h b/ui/ozone/platform/wayland/host/wayland_buffer_backing_single_pixel.h index cf6e324e..e6b135b 100644 --- a/ui/ozone/platform/wayland/host/wayland_buffer_backing_single_pixel.h +++ b/ui/ozone/platform/wayland/host/wayland_buffer_backing_single_pixel.h
@@ -27,7 +27,6 @@ // WaylandBufferBacking override: void RequestBufferHandle( base::OnceCallback<void(wl::Object<wl_buffer>)> callback) override; - BufferBackingType GetBackingType() const override; SkColor4f color_; };
diff --git a/ui/ozone/platform/wayland/host/wayland_buffer_handle.cc b/ui/ozone/platform/wayland/host/wayland_buffer_handle.cc index 026a0e8..bb7e43d 100644 --- a/ui/ozone/platform/wayland/host/wayland_buffer_handle.cc +++ b/ui/ozone/platform/wayland/host/wayland_buffer_handle.cc
@@ -6,17 +6,41 @@ #include <ostream> +#include "ui/ozone/platform/wayland/host/wayland_buffer_backing.h" #include "ui/ozone/platform/wayland/host/wayland_connection.h" #include "ui/ozone/platform/wayland/host/wayland_syncobj_timeline.h" namespace ui { +namespace { +WaylandBufferHandle::SyncMethod determine_sync_method( + WaylandBufferBacking* backing) { + switch (backing->type()) { + case WaylandBufferBacking::BufferBackingType::kSinglePixel: + return WaylandBufferHandle::SyncMethod::kNone; + case WaylandBufferBacking::BufferBackingType::kShm: + return WaylandBufferHandle::SyncMethod::kImplicit; + case WaylandBufferBacking::BufferBackingType::kDmabuf: + if (backing->connection()->SupportsExplicitSync()) { + return WaylandBufferHandle::SyncMethod::kSyncobj; + } else if (backing->connection()->UseImplicitSyncInterop()) { + return WaylandBufferHandle::SyncMethod::kDMAFence; + } else { + return WaylandBufferHandle::SyncMethod::kImplicit; + } + default: + NOTREACHED(); + } +} +} // namespace WaylandBufferHandle::WaylandBufferHandle(WaylandBufferBacking* backing) - : backing_(backing), weak_factory_(this) {} + : backing_(backing), + sync_method_(determine_sync_method(backing)), + weak_factory_(this) {} WaylandBufferHandle::~WaylandBufferHandle() { for (auto& cb : released_callbacks_) - std::move(cb.second).Run(wl_buffer_.get()); + std::move(cb.second).Run(wl_buffer_.get(), /*is_destruct=*/true); } void WaylandBufferHandle::OnWlBufferCreated(wl::Object<wl_buffer> wl_buffer) { @@ -28,10 +52,10 @@ static constexpr wl_buffer_listener kBufferListener = { .release = &OnRelease, }; - if (backing_->UseExplicitSyncRelease()) { + if (sync_method_ == SyncMethod::kSyncobj) { release_timeline_ = WaylandSyncobjReleaseTimeline::Create(backing_->connection()); - } else { + } else if (sync_method_ != SyncMethod::kNone) { wl_buffer_add_listener(wl_buffer_.get(), &kBufferListener, this); } @@ -47,11 +71,13 @@ void WaylandBufferHandle::OnWlBufferReleased(wl_buffer* wl_buff) { DCHECK_EQ(wl_buff, wl_buffer_.get()); - DCHECK(!backing_->UseExplicitSyncRelease()); + DCHECK(sync_method_ == SyncMethod::kDMAFence || + sync_method_ == SyncMethod::kImplicit); DCHECK_LE(released_callbacks_.size(), 1u); - if (!released_callbacks_.empty()) - std::move(released_callbacks_.begin()->second).Run(wl_buff); + if (!released_callbacks_.empty()) { + std::move(released_callbacks_.begin()->second).Run(wl_buff, false); + } released_callbacks_.clear(); }
diff --git a/ui/ozone/platform/wayland/host/wayland_buffer_handle.h b/ui/ozone/platform/wayland/host/wayland_buffer_handle.h index c852aec..f775eb1 100644 --- a/ui/ozone/platform/wayland/host/wayland_buffer_handle.h +++ b/ui/ozone/platform/wayland/host/wayland_buffer_handle.h
@@ -21,6 +21,17 @@ // corresponding WaylandBufferBackings. class WaylandBufferHandle { public: + enum class SyncMethod { + // No acquire or release needed + kNone = 0, + // Attach and release are treated as ready to use/reuse + kImplicit = 1, + // Using DRM syncobj timeline + kSyncobj = 2, + // Using fence packaged in dmabuf, should not co-exist with kSyncObj + kDMAFence = 3, + }; + WaylandBufferHandle() = delete; WaylandBufferHandle(const WaylandBufferHandle&) = delete; WaylandBufferHandle& operator=(const WaylandBufferHandle&) = delete; @@ -32,7 +43,7 @@ created_callback_ = std::move(callback); } void set_buffer_released_callback( - base::OnceCallback<void(wl_buffer*)> callback, + base::OnceCallback<void(wl_buffer*, bool)> callback, WaylandSurface* requestor) { released_callbacks_.emplace(requestor, std::move(callback)); } @@ -61,8 +72,9 @@ void OnExplicitRelease(WaylandSurface* requestor); WaylandBufferBacking::BufferBackingType backing_type() const { - return backing_->GetBackingType(); + return backing_->type(); } + SyncMethod sync_method() const { return sync_method_; } private: void OnWlBufferCreated(wl::Object<wl_buffer> wl_buffer); @@ -76,6 +88,9 @@ // A wl_buffer backed by the dmabuf/shm |backing_| created on the GPU side. wl::Object<wl_buffer> wl_buffer_; + // How synchronization of this buffer is managed. + const SyncMethod sync_method_; + // A callback that runs when the wl_buffer is created. base::OnceClosure created_callback_; @@ -96,7 +111,7 @@ // from the wl_compositor. // When linux explicit synchronization is adopted, buffer_listener is unset // and this callback should be reset by OnExplicitRelease() instead. - base::flat_map<WaylandSurface*, base::OnceCallback<void(wl_buffer*)>> + base::flat_map<WaylandSurface*, base::OnceCallback<void(wl_buffer*, bool)>> released_callbacks_; friend WaylandBufferBacking;
diff --git a/ui/ozone/platform/wayland/host/wayland_frame_manager.cc b/ui/ozone/platform/wayland/host/wayland_frame_manager.cc index 9d1ea0c..0ea6f4b 100644 --- a/ui/ozone/platform/wayland/host/wayland_frame_manager.cc +++ b/ui/ozone/platform/wayland/host/wayland_frame_manager.cc
@@ -466,12 +466,6 @@ bool needs_commit = false; - // If it's a solid color buffer, do not set a release callback as it's not - // required to wait for this buffer - Wayland compositor only uses that to - // produce a config for the quad. - const bool is_solid_color_buffer = - buffer_handle->backing_type() == - WaylandBufferBacking::BufferBackingType::kSolidColor; if (will_attach) { // Setup frame callback if wayland_surface will commit this buffer. // On Mutter, we don't receive frame.callback acks if we don't attach a @@ -496,16 +490,24 @@ needs_commit = true; } - if (!is_solid_color_buffer) { - if (connection_->SupportsExplicitSync()) { + switch (buffer_handle->sync_method()) { + case WaylandBufferHandle::SyncMethod::kNone: + break; + case WaylandBufferHandle::SyncMethod::kSyncobj: surface->RequestExplicitRelease( base::BindOnce(&WaylandFrameManager::OnExplicitBufferRelease, weak_factory_.GetWeakPtr(), surface)); - } - buffer_handle->set_buffer_released_callback( - base::BindOnce(&WaylandFrameManager::OnWlBufferRelease, - weak_factory_.GetWeakPtr(), surface), - surface); + [[fallthrough]]; + case WaylandBufferHandle::SyncMethod::kDMAFence: + [[fallthrough]]; + case WaylandBufferHandle::SyncMethod::kImplicit: + buffer_handle->set_buffer_released_callback( + base::BindOnce(&WaylandFrameManager::OnWlBufferRelease, + weak_factory_.GetWeakPtr(), surface), + surface); + break; + default: + NOTREACHED(); } } @@ -521,7 +523,7 @@ needs_commit = true; } - if (!is_solid_color_buffer) { + if (buffer_handle->sync_method() != WaylandBufferHandle::SyncMethod::kNone) { // If we have submitted this buffer in a previous frame and it is not // released yet, submitting the buffer again will not make wayland // compositor to release it twice. Remove it from the previous frame. @@ -754,7 +756,8 @@ } void WaylandFrameManager::OnWlBufferRelease(WaylandSurface* surface, - wl_buffer* buffer) { + wl_buffer* buffer, + bool is_destruct) { DCHECK(buffer); // Releases may not necessarily come in order, so search the submitted @@ -763,7 +766,8 @@ auto result = frame->submitted_buffers.find(surface); if (result != frame->submitted_buffers.end() && result->second->buffer() == buffer) { - if (connection_->UseImplicitSyncInterop()) { + if (!is_destruct && result->second->sync_method() == + WaylandBufferHandle::SyncMethod::kDMAFence) { base::ScopedFD fence = connection_->buffer_manager_host()->ExtractReleaseFence( result->second->id()); @@ -782,7 +786,9 @@ TRACE_EVENT_INSTANT("wayland", "OnWlBufferRelease", "frame_id", frame->frame_id, "buffer_id", result->second->id()); frame->submitted_buffers.erase(result); - break; + if (!is_destruct) { + break; + } } }
diff --git a/ui/ozone/platform/wayland/host/wayland_frame_manager.h b/ui/ozone/platform/wayland/host/wayland_frame_manager.h index 87db62c..d2663ab 100644 --- a/ui/ozone/platform/wayland/host/wayland_frame_manager.h +++ b/ui/ozone/platform/wayland/host/wayland_frame_manager.h
@@ -187,10 +187,13 @@ // presentation feedback info. void ClearProcessedSubmittedFrames(); + // TODO(crbug.com/422765424): These 2 functions can be merged into one. void OnExplicitBufferRelease(WaylandSurface* surface, wl_buffer* wl_buffer, base::ScopedFD fence); - void OnWlBufferRelease(WaylandSurface* surface, wl_buffer* wl_buffer); + void OnWlBufferRelease(WaylandSurface* surface, + wl_buffer* wl_buffer, + bool is_destruct); // wl_callback_listener callbacks: static void OnFrameDone(void* data, wl_callback* callback, uint32_t time);
diff --git a/ui/views/animation/ink_drop_host.h b/ui/views/animation/ink_drop_host.h index 26734958..7a05772f 100644 --- a/ui/views/animation/ink_drop_host.h +++ b/ui/views/animation/ink_drop_host.h
@@ -193,6 +193,7 @@ View* host_view() { return host_view_; } const View* host_view() const { return host_view_; } + bool in_attention_state_for_testing() const { return in_attention_state_; } private: friend class test::InkDropHostTestApi;
diff --git a/ui/views/window/dialog_client_view.cc b/ui/views/window/dialog_client_view.cc index aa8610a..520b888 100644 --- a/ui/views/window/dialog_client_view.cc +++ b/ui/views/window/dialog_client_view.cc
@@ -403,8 +403,10 @@ void DialogClientView::ButtonPressed(ui::mojom::DialogButton type, const ui::Event& event) { DialogDelegate* const delegate = GetDialogDelegate(); - if (!delegate || input_protector_->IsPossiblyUnintendedInteraction( - event, /*allow_key_events=*/true)) { + if (!delegate || + input_protector_->IsPossiblyUnintendedInteraction( + event, /*allow_key_events=*/delegate + ->ShouldAllowKeyEventsDuringInputProtection())) { return; }
diff --git a/ui/views/window/dialog_delegate.cc b/ui/views/window/dialog_delegate.cc index fa171a29..453e164 100644 --- a/ui/views/window/dialog_delegate.cc +++ b/ui/views/window/dialog_delegate.cc
@@ -228,6 +228,10 @@ return false; } +bool DialogDelegate::ShouldAllowKeyEventsDuringInputProtection() const { + return true; +} + bool DialogDelegate::Cancel() { DCHECK(!already_started_close_); if (HasCallback(cancel_callback_)) {
diff --git a/ui/views/window/dialog_delegate.h b/ui/views/window/dialog_delegate.h index df267c8..b41fce35 100644 --- a/ui/views/window/dialog_delegate.h +++ b/ui/views/window/dialog_delegate.h
@@ -353,6 +353,12 @@ View* button, const ui::Event& event) const; + // Returns true if key events should be allowed during input protection. If + // true, calls to + // `InputEventActivationProtector::IsPossiblyUnintendedInteraction` will + // ignore key events. + virtual bool ShouldAllowKeyEventsDuringInputProtection() const; + // For Dialog boxes, if there is a "Cancel" button or no dialog button at all, // this is called when the user presses the "Cancel" button. This function // should return true if the window can be closed after it returns, or false
diff --git a/ui/views/window/dialog_delegate_unittest.cc b/ui/views/window/dialog_delegate_unittest.cc index a5f6363..32af8bee 100644 --- a/ui/views/window/dialog_delegate_unittest.cc +++ b/ui/views/window/dialog_delegate_unittest.cc
@@ -68,6 +68,11 @@ std::u16string GetWindowTitle() const override { return title_; } View* GetInitiallyFocusedView() override { return input_; } + // DialogDelegate overrides: + bool ShouldAllowKeyEventsDuringInputProtection() const override { + return should_allow_key_events_during_input_protection_; + } + void TearDown() { input_ = nullptr; GetWidget()->Close(); @@ -80,6 +85,9 @@ void set_should_handle_escape(bool should_handle_escape) { should_handle_escape_ = should_handle_escape; } + void set_should_allow_key_events_during_input_protection(bool value) { + should_allow_key_events_during_input_protection_ = value; + } views::Textfield* input() { return input_; } @@ -88,6 +96,7 @@ std::u16string title_; bool show_close_button_ = true; bool should_handle_escape_ = false; + bool should_allow_key_events_during_input_protection_ = true; }; namespace { @@ -489,6 +498,14 @@ EXPECT_FALSE(dialog->GetOkButton()->GetEnabled()); } +TEST_F(DialogTest, CanOverrideShouldAllowKeyEventsDuringInputProtection) { + dialog()->set_should_allow_key_events_during_input_protection(true); + EXPECT_TRUE(dialog()->ShouldAllowKeyEventsDuringInputProtection()); + + dialog()->set_should_allow_key_events_during_input_protection(false); + EXPECT_FALSE(dialog()->ShouldAllowKeyEventsDuringInputProtection()); +} + using DialogDelegateCloseTest = ViewsTestBase; TEST_F(DialogDelegateCloseTest, AnyCallbackInhibitsDefaultClose) {
diff --git a/v8 b/v8 index ad9041e..06588c1 160000 --- a/v8 +++ b/v8
@@ -1 +1 @@ -Subproject commit ad9041e4d0f760e0c1c87d79a60b9ff1d2c77f96 +Subproject commit 06588c16dc5fb1d32c50f884015b90e327dd444c