diff --git a/DEPS b/DEPS index 73a0586..5f81bdd8 100644 --- a/DEPS +++ b/DEPS
@@ -310,19 +310,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': 'daac40a8c36b8511e43db0ede65732c6b67d1ad2', + 'src_internal_revision': '79116fa67c8a1a0806af034eb2a9a7a3557607c0', # 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': 'c6413673d2d4d6e3a4837d3cecfe152243042415', + 'skia_revision': '0577d064a86e401ad61ee1ea4203b97ce84cf50c', # 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': '160c55f1d4b89c8a9e249130838d9e729325b528', + 'v8_revision': 'cf3e1f0da09e0b0f79590acafeca0ce554a4b16b', # 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': 'eb0d59973d21f845b5785563f5d56b8ebb617478', + 'angle_revision': 'ecf11ecaea1a4ed9fd08180bc85f6f07dbc0e9b1', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling SwiftShader # and whatever else without interference from each other. @@ -385,11 +385,11 @@ # 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': '693c3fa3c2b617718dbbe1abd2ef0fc0910380b6', + 'catapult_revision': 'c9ccea1a729cb6952cabdb42c192b87a9a08ba3a', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling chromium_variations # and whatever else without interference from each other. - 'chromium_variations_revision': 'c7a1ed20f78b82abdad55681d847beb9b965a3eb', + 'chromium_variations_revision': '6099a9750a5666fa63898f7d004b36783d28e64e', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling CrossBench # and whatever else without interference from each other. @@ -405,7 +405,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': '614e1c8242dfa60a241368d72c31384c14afaba3', + 'devtools_frontend_revision': '257cb6402543b90ddd45043d94242b1824238e48', # 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. @@ -465,7 +465,7 @@ # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libavif # and whatever else without interference from each other. - 'libavif_revision': 'd1c26facaf5a8a97919ceee06814d05d10e25622', + 'libavif_revision': '3669d47e1f9f3ea5ab0e3a923b15fad185ac2209', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling libavif # and whatever else without interference from each other. @@ -477,7 +477,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': '94df1ffc4c00ff142d2f1f7c6c603f80d922bca4', + 'nearby_revision': '8846f8b57e53276687955562f58d2bfdbf63b3a9', # Three lines of non-changing comments so that # the commit queue can handle CLs rolling securemessage # and whatever else without interference from each other. @@ -845,12 +845,12 @@ 'src/clank': { 'url': Var('chrome_git') + '/clank/internal/apps.git' + '@' + - 'e3a3ec407403dece9002c87d4de7130e2ab877e4', + 'ca072aadc88771c0536b5c9b92925967b0dae51c', 'condition': 'checkout_android and checkout_src_internal', }, 'src/docs/website': { - 'url': Var('chromium_git') + '/website.git' + '@' + 'c83dfcabbbce1956edf91dbdc1d863cb062e3fd5', + 'url': Var('chromium_git') + '/website.git' + '@' + 'ca1c5b7a5c17baf0bda343ab5bb4e18c30c87c01', }, 'src/ios/third_party/earl_grey2/src': { @@ -1295,13 +1295,13 @@ }, 'src/third_party/depot_tools': - Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '4dac5d6b4b39a26d72698e701e59c47278d66fec', + Var('chromium_git') + '/chromium/tools/depot_tools.git' + '@' + '50b27a5308a405646b627691b48c55e007eb5418', 'src/third_party/devtools-frontend/src': Var('chromium_git') + '/devtools/devtools-frontend' + '@' + Var('devtools_frontend_revision'), 'src/third_party/devtools-frontend-internal': { - 'url': Var('chrome_git') + '/devtools/devtools-internal.git' + '@' + '616289d464d11fbcc8c8b063af4d2b6c372f5e14', + 'url': Var('chrome_git') + '/devtools/devtools-internal.git' + '@' + '69e043f071f8ff003d40c9fe6ca3f266087119a5', 'condition': 'checkout_src_internal', }, @@ -2098,7 +2098,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/help_app/app', - 'version': 'Hq35AnVhNtu2wY53wL3YoMZ9vU-3MjHraOSG48ylyfcC', + 'version': 'TWnrL5QSAJ6Aeeojdx-f3F9vBA2yMVFecBsZ5UbmYwoC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal', @@ -2109,7 +2109,7 @@ 'packages': [ { 'package': 'chromeos_internal/apps/media_app/app', - 'version': 'WQhQ1yvqxxJCvtF8U_Qzrf3v0JDR3sTnLhSlzgKuuMcC', + 'version': 'KgIp37tDSV_n8owFLmJ1FeRFoEBheU46ACoddkuEARYC', }, ], 'condition': 'checkout_chromeos and checkout_src_internal',
diff --git a/WATCHLISTS b/WATCHLISTS index 0212e47..2c929e75 100644 --- a/WATCHLISTS +++ b/WATCHLISTS
@@ -911,6 +911,10 @@ '|chrome/browser/ash/policy/status_collector/'\ '|components/policy/proto/record', }, + 'crosapi': { + 'filepath': 'chromeos/crosapi/'\ + '|chrome/browser/ash/crosapi/', + }, 'crosapi_mojom': { 'filepath': 'chromeos/crosapi/mojom/crosapi.mojom', }, @@ -2682,6 +2686,7 @@ 'wry+watch-creator@chromium.org',], 'cros_commercial_policy': ['enterprise-policy-review@google.com'], 'cros_reporting': ['cros-reporting-reviews@google.com'], + 'crosapi': ['ffred+watch@chromium.org', 'tluk+watch@chromium.org'], 'crosapi_mojom': ['elkurin+watch@chromium.org'], 'crostini': ['crostini-ui@chromium.org'], 'cups_printing': ['print-reviews+cups@chromium.org',
diff --git a/android_webview/glue/java/src/com/android/webview/chromium/ProfileStore.java b/android_webview/glue/java/src/com/android/webview/chromium/ProfileStore.java index 570043d..b43b3f0 100644 --- a/android_webview/glue/java/src/com/android/webview/chromium/ProfileStore.java +++ b/android_webview/glue/java/src/com/android/webview/chromium/ProfileStore.java
@@ -11,24 +11,40 @@ import org.chromium.android_webview.common.Lifetime; import org.chromium.base.ThreadUtils; +import java.util.HashMap; import java.util.List; +import java.util.Map; @Lifetime.Singleton public class ProfileStore { + private final Map<String, Profile> mProfiles = new HashMap<>(); + + private static ProfileStore sINSTANCE; + + private ProfileStore() {} + + public static ProfileStore getInstance() { + ThreadUtils.checkUiThread(); + if (sINSTANCE == null) { + sINSTANCE = new ProfileStore(); + } + return sINSTANCE; + } + @NonNull public Profile getOrCreateProfile(@NonNull String name) { ThreadUtils.checkUiThread(); - return new Profile(AwBrowserContext.getNamedContext(name, true)); + return mProfiles.computeIfAbsent(name, + profileName -> new Profile(AwBrowserContext.getNamedContext(profileName, true))); } @Nullable public Profile getProfile(@NonNull String name) { ThreadUtils.checkUiThread(); - AwBrowserContext browserContext = AwBrowserContext.getNamedContext(name, false); - if (browserContext != null) { - return new Profile(browserContext); - } - return null; + return mProfiles.computeIfAbsent(name, profileName -> { + AwBrowserContext browserContext = AwBrowserContext.getNamedContext(profileName, false); + return browserContext != null ? new Profile(browserContext) : null; + }); } @NonNull @@ -40,6 +56,12 @@ @NonNull public boolean deleteProfile(@NonNull String name) { ThreadUtils.checkUiThread(); - return AwBrowserContext.deleteNamedContext(name); + boolean deletionResult = AwBrowserContext.deleteNamedContext(name); + if (deletionResult) { + mProfiles.remove(name); + } else { + assert !mProfiles.containsKey(name); + } + return deletionResult; } }
diff --git a/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibProfileStore.java b/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibProfileStore.java index b37ba3f..4ee54c0e 100644 --- a/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibProfileStore.java +++ b/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibProfileStore.java
@@ -58,7 +58,7 @@ @Override @NonNull public boolean deleteProfile(@NonNull String name) { - recordApiCall(ApiCall.DELETE_PROFILE_ASYNC); + recordApiCall(ApiCall.DELETE_PROFILE); return mImpl.deleteProfile(name); } }
diff --git a/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebViewChromiumFactory.java b/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebViewChromiumFactory.java index d56b608..a263f24 100644 --- a/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebViewChromiumFactory.java +++ b/android_webview/support_library/java/src/org/chromium/support_lib_glue/SupportLibWebViewChromiumFactory.java
@@ -186,7 +186,7 @@ ApiCall.GET_OR_CREATE_PROFILE, ApiCall.GET_PROFILE, ApiCall.GET_ALL_PROFILE_NAMES, - ApiCall.DELETE_PROFILE_ASYNC, + ApiCall.DELETE_PROFILE, ApiCall.GET_PROFILE_NAME, ApiCall.GET_PROFILE_COOKIE_MANAGER, ApiCall.GET_PROFILE_WEB_STORAGE, @@ -289,7 +289,7 @@ int GET_OR_CREATE_PROFILE = 84; int GET_PROFILE = 85; int GET_ALL_PROFILE_NAMES = 86; - int DELETE_PROFILE_ASYNC = 87; + int DELETE_PROFILE = 87; int GET_PROFILE_NAME = 88; int GET_PROFILE_COOKIE_MANAGER = 89; int GET_PROFILE_WEB_STORAGE = 90; @@ -491,7 +491,7 @@ synchronized (mAwInit.getLock()) { if (mProfileStore == null) { mProfileStore = BoundaryInterfaceReflectionUtil.createInvocationHandlerFor( - new SupportLibProfileStore(new ProfileStore())); + new SupportLibProfileStore(ProfileStore.getInstance())); } } return mProfileStore;
diff --git a/ash/BUILD.gn b/ash/BUILD.gn index d992345..12de18f 100644 --- a/ash/BUILD.gn +++ b/ash/BUILD.gn
@@ -1020,6 +1020,8 @@ "rounded_display/rounded_display_host.h", "rounded_display/rounded_display_provider.cc", "rounded_display/rounded_display_provider.h", + "scalable_iph/scalable_iph_ash_notification_view.cc", + "scalable_iph/scalable_iph_ash_notification_view.h", "scalable_iph/wallpaper_ash_notification_view.cc", "scalable_iph/wallpaper_ash_notification_view.h", "scoped_animation_disabler.cc", @@ -2845,6 +2847,7 @@ "//chromeos/ash/components/peripheral_notification", "//chromeos/ash/components/phonehub", "//chromeos/ash/components/scalable_iph:buildflags", + "//chromeos/ash/components/scalable_iph:constants", "//chromeos/ash/components/settings", "//chromeos/ash/components/system", "//chromeos/ash/resources:resources_grit", @@ -3317,6 +3320,7 @@ "rounded_display/rounded_display_gutter_unittest.cc", "rounded_display/rounded_display_host_unittest.cc", "rounded_display/rounded_display_provider_unittest.cc", + "scalable_iph/scalable_iph_ash_notification_view_unittest.cc", "scalable_iph/wallpaper_ash_notification_view_unittest.cc", "screen_util_unittest.cc", "sensor_info/sensor_provider_unittest.cc", @@ -3854,6 +3858,7 @@ "//chromeos/ash/components/network:test_support", "//chromeos/ash/components/osauth/public", "//chromeos/ash/components/phonehub:test_support", + "//chromeos/ash/components/scalable_iph:constants", "//chromeos/ash/components/settings", "//chromeos/ash/components/system", "//chromeos/ash/services/assistant:test_support",
diff --git a/ash/capture_mode/capture_label_view.cc b/ash/capture_mode/capture_label_view.cc index e865b72..ecb3e24 100644 --- a/ash/capture_mode/capture_label_view.cc +++ b/ash/capture_mode/capture_label_view.cc
@@ -180,9 +180,7 @@ capture_mode_util::SetHighlightBorder( this, kCaptureLabelRadius, - chromeos::features::IsJellyrollEnabled() - ? views::HighlightBorder::Type::kHighlightBorderNoShadow - : views::HighlightBorder::Type::kHighlightBorder2); + views::HighlightBorder::Type::kHighlightBorderNoShadow); shadow_->SetRoundedCornerRadius(kCaptureLabelRadius); }
diff --git a/ash/capture_mode/capture_mode_bar_view.cc b/ash/capture_mode/capture_mode_bar_view.cc index 308b4ee..f08d38db 100644 --- a/ash/capture_mode/capture_mode_bar_view.cc +++ b/ash/capture_mode/capture_mode_bar_view.cc
@@ -102,9 +102,7 @@ capture_mode_util::SetHighlightBorder( this, border_radius, - chromeos::features::IsJellyrollEnabled() - ? views::HighlightBorder::Type::kHighlightBorderOnShadow - : views::HighlightBorder::Type::kHighlightBorder2); + views::HighlightBorder::Type::kHighlightBorderOnShadow); shadow_->SetRoundedCornerRadius(border_radius); }
diff --git a/ash/capture_mode/capture_mode_settings_view.cc b/ash/capture_mode/capture_mode_settings_view.cc index ffb8128..ca48931b 100644 --- a/ash/capture_mode/capture_mode_settings_view.cc +++ b/ash/capture_mode/capture_mode_settings_view.cc
@@ -248,9 +248,7 @@ capture_mode_util::SetHighlightBorder( this, kCornerRadius, - chromeos::features::IsJellyrollEnabled() - ? views::HighlightBorder::Type::kHighlightBorderOnShadow - : views::HighlightBorder::Type::kHighlightBorder1); + views::HighlightBorder::Type::kHighlightBorderOnShadow); shadow_->SetRoundedCornerRadius(kCornerRadius); }
diff --git a/ash/capture_mode/key_item_view.cc b/ash/capture_mode/key_item_view.cc index 17f369b..291b5f3 100644 --- a/ash/capture_mode/key_item_view.cc +++ b/ash/capture_mode/key_item_view.cc
@@ -55,9 +55,7 @@ capture_mode_util::SetHighlightBorder( this, kKeyItemHeight / 2, - chromeos::features::IsJellyrollEnabled() - ? views::HighlightBorder::Type::kHighlightBorderOnShadow - : views::HighlightBorder::Type::kHighlightBorder1); + views::HighlightBorder::Type::kHighlightBorderOnShadow); shadow_->SetRoundedCornerRadius(kKeyItemHeight / 2); }
diff --git a/ash/capture_mode/recording_type_menu_view.cc b/ash/capture_mode/recording_type_menu_view.cc index 1674208..f1dee10 100644 --- a/ash/capture_mode/recording_type_menu_view.cc +++ b/ash/capture_mode/recording_type_menu_view.cc
@@ -75,9 +75,7 @@ capture_mode_util::SetHighlightBorder( this, kCornerRadius, - chromeos::features::IsJellyrollEnabled() - ? views::HighlightBorder::Type::kHighlightBorderOnShadow - : views::HighlightBorder::Type::kHighlightBorder1); + views::HighlightBorder::Type::kHighlightBorderOnShadow); shadow_->SetRoundedCornerRadius(kCornerRadius); }
diff --git a/ash/constants/ash_pref_names.h b/ash/constants/ash_pref_names.h index 9d0d382..f0f3c9f6 100644 --- a/ash/constants/ash_pref_names.h +++ b/ash/constants/ash_pref_names.h
@@ -1815,6 +1815,26 @@ inline constexpr char kFocusModeDoNotDisturb[] = "ash.focus_mode.do_not_disturb"; +// An integer pref that holds enum value of current demo mode configuration. +// Values are defined by DemoSession::DemoModeConfig enum. +inline constexpr char kDemoModeConfig[] = "demo_mode.config"; + +// A string pref holding the value of the current country for demo sessions. +inline constexpr char kDemoModeCountry[] = "demo_mode.country"; + +// A string pref holding the value of the retailer name input for demo sessions. +// This is now mostly called "retailer_name" in code other than in this pref and +// in Omaha request attributes +inline constexpr char kDemoModeRetailerId[] = "demo_mode.retailer_id"; + +// A string pref holding the value of the store number input for demo sessions. +// This is now mostly called "store_number" in code other than in this pref and +// in Omaha request attributes +inline constexpr char kDemoModeStoreId[] = "demo_mode.store_id"; + +// A string pref holding the value of the default locale for demo sessions. +inline constexpr char kDemoModeDefaultLocale[] = "demo_mode.default_locale"; + // NOTE: New prefs should start with the "ash." prefix. Existing prefs moved // into this file should not be renamed, since they may be synced.
diff --git a/ash/public/mojom/accelerator_configuration.mojom b/ash/public/mojom/accelerator_configuration.mojom index 68f2a06..353f994b 100644 --- a/ash/public/mojom/accelerator_configuration.mojom +++ b/ash/public/mojom/accelerator_configuration.mojom
@@ -39,4 +39,6 @@ // but it's not necessarily an error. This state warns users of the downsides // of using a non-search accelerator. kNonSearchAcceleratorWarning = 11, + // Error - search + function key is not allowed. + kSearchWithFunctionKeyNotAllowed = 12, }; \ No newline at end of file
diff --git a/ash/quick_pair/fast_pair_handshake/fast_pair_gatt_service_client_impl.cc b/ash/quick_pair/fast_pair_handshake/fast_pair_gatt_service_client_impl.cc index 15d34c3..5199785 100644 --- a/ash/quick_pair/fast_pair_handshake/fast_pair_gatt_service_client_impl.cc +++ b/ash/quick_pair/fast_pair_handshake/fast_pair_gatt_service_client_impl.cc
@@ -524,7 +524,7 @@ if (pair_failure.has_value()) { NotifyInitializedError(pair_failure.value()); - } else { + } else if (on_initialized_callback_) { is_initialized_ = true; RecordGattInitializationStep( FastPairGattConnectionSteps::kConnectionEstablished);
diff --git a/ash/quick_pair/fast_pair_handshake/fast_pair_gatt_service_client_impl_unittest.cc b/ash/quick_pair/fast_pair_handshake/fast_pair_gatt_service_client_impl_unittest.cc index 1436d39..66750eb7 100644 --- a/ash/quick_pair/fast_pair_handshake/fast_pair_gatt_service_client_impl_unittest.cc +++ b/ash/quick_pair/fast_pair_handshake/fast_pair_gatt_service_client_impl_unittest.cc
@@ -1291,5 +1291,15 @@ WritePersonalizedName(empty); } +// Regression test for b/300596153 +TEST_F(FastPairGattServiceClientTest, + NoCrashWhenGattDiscoveryCompleteForServiceCalledTwice) { + SuccessfulGattConnectionSetUp(); + NotifyGattDiscoveryCompleteForService( + ash::quick_pair::kFastPairBluetoothUuid); + NotifyGattDiscoveryCompleteForService( + ash::quick_pair::kFastPairBluetoothUuid); +} + } // namespace quick_pair } // namespace ash
diff --git a/ash/scalable_iph/DEPS b/ash/scalable_iph/DEPS index ccf2762..1fb1129f3 100644 --- a/ash/scalable_iph/DEPS +++ b/ash/scalable_iph/DEPS
@@ -1,4 +1,5 @@ include_rules = [ "+chromeos/ash/components/scalable_iph/buildflags.h", + "+chromeos/ash/components/scalable_iph/scalable_iph_constants.h", "+chromeos/ash/grit/ash_resources.h", ]
diff --git a/ash/scalable_iph/scalable_iph_ash_notification_view.cc b/ash/scalable_iph/scalable_iph_ash_notification_view.cc new file mode 100644 index 0000000..77cf9e00 --- /dev/null +++ b/ash/scalable_iph/scalable_iph_ash_notification_view.cc
@@ -0,0 +1,49 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/scalable_iph/scalable_iph_ash_notification_view.h" + +#include "base/check.h" +#include "chromeos/ash/components/scalable_iph/scalable_iph_constants.h" +#include "ui/base/metadata/metadata_impl_macros.h" +#include "ui/message_center/views/notification_header_view.h" + +namespace ash { + +ScalableIphAshNotificationView::ScalableIphAshNotificationView( + const message_center::Notification& notification, + bool shown_in_popup) + : AshNotificationView(notification, shown_in_popup) { + UpdateWithNotification(notification); +} + +ScalableIphAshNotificationView::~ScalableIphAshNotificationView() = default; + +// static +std::unique_ptr<message_center::MessageView> +ScalableIphAshNotificationView::CreateView( + const message_center::Notification& notification, + bool shown_in_popup) { + return std::make_unique<ScalableIphAshNotificationView>(notification, + shown_in_popup); +} + +void ScalableIphAshNotificationView::UpdateWithNotification( + const message_center::Notification& notification) { + NotificationViewBase::UpdateWithNotification(notification); + + auto* header = header_row(); + CHECK(header); + header->SetSummaryText(scalable_iph::kNotificationSummaryText); +} + +message_center::NotificationHeaderView* +ScalableIphAshNotificationView::GetHeaderRowForTesting() { + return header_row(); +} + +BEGIN_METADATA(ScalableIphAshNotificationView, AshNotificationView) +END_METADATA + +} // namespace ash
diff --git a/ash/scalable_iph/scalable_iph_ash_notification_view.h b/ash/scalable_iph/scalable_iph_ash_notification_view.h new file mode 100644 index 0000000..e7a32bd --- /dev/null +++ b/ash/scalable_iph/scalable_iph_ash_notification_view.h
@@ -0,0 +1,50 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef ASH_SCALABLE_IPH_SCALABLE_IPH_ASH_NOTIFICATION_VIEW_H_ +#define ASH_SCALABLE_IPH_SCALABLE_IPH_ASH_NOTIFICATION_VIEW_H_ + +#include "ash/ash_export.h" +#include "ash/system/message_center/ash_notification_view.h" + +namespace message_center { +class MessageView; +class Notification; +class NotificationHeaderView; +} // namespace message_center + +namespace ash { + +// A customized notification view for scalable IPH that adds the summary text. +class ASH_EXPORT ScalableIphAshNotificationView : public AshNotificationView { + public: + METADATA_HEADER(ScalableIphAshNotificationView); + + ScalableIphAshNotificationView( + const message_center::Notification& notification, + bool shown_in_popup); + ScalableIphAshNotificationView(const ScalableIphAshNotificationView&) = + delete; + ScalableIphAshNotificationView& operator=( + const ScalableIphAshNotificationView&) = delete; + ~ScalableIphAshNotificationView() override; + + // Creates a notification with a custom summary text. + static std::unique_ptr<message_center::MessageView> CreateView( + const message_center::Notification& notification, + bool shown_in_popup); + + // AshNotificationView: + void UpdateWithNotification( + const message_center::Notification& notification) override; + + message_center::NotificationHeaderView* GetHeaderRowForTesting(); + + private: + friend class ScalableIphAshNotificationViewTest; +}; + +} // namespace ash + +#endif // ASH_SCALABLE_IPH_SCALABLE_IPH_ASH_NOTIFICATION_VIEW_H_
diff --git a/ash/scalable_iph/scalable_iph_ash_notification_view_unittest.cc b/ash/scalable_iph/scalable_iph_ash_notification_view_unittest.cc new file mode 100644 index 0000000..3ce005b8 --- /dev/null +++ b/ash/scalable_iph/scalable_iph_ash_notification_view_unittest.cc
@@ -0,0 +1,52 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "ash/scalable_iph/scalable_iph_ash_notification_view.h" + +#include "ash/constants/notifier_catalogs.h" +#include "ash/system/message_center/ash_notification_view.h" +#include "ash/test/ash_test_base.h" +#include "chromeos/ash/components/scalable_iph/scalable_iph_constants.h" +#include "ui/message_center/public/cpp/notification.h" +#include "ui/message_center/public/cpp/notification_types.h" +#include "ui/message_center/public/cpp/notifier_id.h" +#include "ui/message_center/views/notification_header_view.h" +#include "ui/views/controls/label.h" + +namespace ash { + +class ScalableIphAshNotificationViewTest : public AshTestBase { + public: + ScalableIphAshNotificationViewTest() + : AshTestBase(base::test::TaskEnvironment::TimeSource::MOCK_TIME) {} + ~ScalableIphAshNotificationViewTest() override = default; + + protected: + message_center::Notification CreateNotification() { + message_center::RichNotificationData rich_notification_data; + return message_center::Notification( + message_center::NOTIFICATION_TYPE_SIMPLE, "notification_id", + u"test_title", u"test message", ui::ImageModel(), + /*display_source=*/std::u16string(), GURL(), + message_center::NotifierId( + message_center::NotifierType::SYSTEM_COMPONENT, "notifier_id", + NotificationCatalogName::kScalableIphNotification), + rich_notification_data, new message_center::NotificationDelegate()); + } +}; + +TEST_F(ScalableIphAshNotificationViewTest, NotificationHasSummaryText) { + auto notification = CreateNotification(); + auto message_view = + ScalableIphAshNotificationView::CreateView(notification, + /*shown_in_popup=*/true); + auto* notification_view = + static_cast<ScalableIphAshNotificationView*>(message_view.get()); + auto* header_row = notification_view->GetHeaderRowForTesting(); + // Notification should have the expected summary text. + EXPECT_EQ(scalable_iph::kNotificationSummaryText, + header_row->summary_text_for_testing()->GetText()); +} + +} // namespace ash
diff --git a/ash/scalable_iph/wallpaper_ash_notification_view.cc b/ash/scalable_iph/wallpaper_ash_notification_view.cc index 456145f..4d94b670 100644 --- a/ash/scalable_iph/wallpaper_ash_notification_view.cc +++ b/ash/scalable_iph/wallpaper_ash_notification_view.cc
@@ -5,6 +5,7 @@ #include "ash/scalable_iph/wallpaper_ash_notification_view.h" #include "ash/public/cpp/rounded_image_view.h" +#include "ash/scalable_iph/scalable_iph_ash_notification_view.h" #include "base/check.h" #include "base/notreached.h" #include "build/buildflag.h" @@ -62,7 +63,7 @@ WallpaperAshNotificationView::WallpaperAshNotificationView( const message_center::Notification& notification, bool shown_in_popup) - : AshNotificationView(notification, shown_in_popup) { + : ScalableIphAshNotificationView(notification, shown_in_popup) { UpdateWithNotification(notification); } @@ -81,7 +82,7 @@ const message_center::Notification& notification) { preview_ = nullptr; - NotificationViewBase::UpdateWithNotification(notification); + ScalableIphAshNotificationView::UpdateWithNotification(notification); CreatePreview(); } @@ -101,7 +102,7 @@ } } -BEGIN_METADATA(WallpaperAshNotificationView, AshNotificationView) +BEGIN_METADATA(WallpaperAshNotificationView, ScalableIphAshNotificationView) END_METADATA } // namespace ash
diff --git a/ash/scalable_iph/wallpaper_ash_notification_view.h b/ash/scalable_iph/wallpaper_ash_notification_view.h index 2890c79..22451597 100644 --- a/ash/scalable_iph/wallpaper_ash_notification_view.h +++ b/ash/scalable_iph/wallpaper_ash_notification_view.h
@@ -6,7 +6,7 @@ #define ASH_SCALABLE_IPH_WALLPAPER_ASH_NOTIFICATION_VIEW_H_ #include "ash/ash_export.h" -#include "ash/system/message_center/ash_notification_view.h" +#include "ash/scalable_iph/scalable_iph_ash_notification_view.h" #include "base/memory/raw_ptr.h" namespace message_center { @@ -24,7 +24,8 @@ // A customized notification view for scalable IPH that adjusts the notification // by showing four preview images for wallpaper. -class ASH_EXPORT WallpaperAshNotificationView : public AshNotificationView { +class ASH_EXPORT WallpaperAshNotificationView + : public ScalableIphAshNotificationView { public: METADATA_HEADER(WallpaperAshNotificationView);
diff --git a/ash/system/power/battery_notification.cc b/ash/system/power/battery_notification.cc index 6241751..b5390036 100644 --- a/ash/system/power/battery_notification.cc +++ b/ash/system/power/battery_notification.cc
@@ -219,6 +219,10 @@ ->battery_saver_controller() ->ShowBatterySaverModeEnabledToast(); } + + // Dismiss notification from Message Center. + message_center::MessageCenter::Get()->RemoveNotification( + BatteryNotification::kNotificationId, false); break; } default:
diff --git a/ash/system/power/battery_notification_unittest.cc b/ash/system/power/battery_notification_unittest.cc index 93219f7..e07f20d 100644 --- a/ash/system/power/battery_notification_unittest.cc +++ b/ash/system/power/battery_notification_unittest.cc
@@ -93,7 +93,6 @@ } void TestBatterySaverNotification( - const PowerStatus& status, const ExpectedNotificationValues& expected_values, PowerNotificationController::NotificationState notification_state, bool expected_bsm_state_after_click) { @@ -122,6 +121,9 @@ // NotificationState. notification->delegate()->Click(0, absl::nullopt); + // Test that notification is dismissed after button is pressed. + EXPECT_EQ(GetBatteryNotification(), nullptr); + // Test Enable Toast on Button Click in Opt-In Branch. if (notification_state == PowerNotificationController::NOTIFICATION_BSM_THRESHOLD_OPT_IN) { @@ -281,7 +283,7 @@ // Battery Saver should turn off when the button is clicked. TestBatterySaverNotification( - *PowerStatus::Get(), expected_values, + expected_values, PowerNotificationController::NOTIFICATION_BSM_ENABLING_AT_THRESHOLD, /*expected_bsm_state_after_click=*/false); } @@ -303,7 +305,7 @@ // Battery Saver should turn off when the button is clicked. TestBatterySaverNotification( - *PowerStatus::Get(), expected_values, + expected_values, PowerNotificationController::NOTIFICATION_BSM_ENABLING_AT_THRESHOLD, /*expected_bsm_state_after_click=*/false); } @@ -324,7 +326,7 @@ // Battery Saver should turn on when the button is clicked. TestBatterySaverNotification( - *PowerStatus::Get(), expected_values, + expected_values, PowerNotificationController::NOTIFICATION_BSM_THRESHOLD_OPT_IN, /*expected_bsm_state_after_click=*/true); } @@ -347,7 +349,7 @@ // Battery Saver should turn on when the button is clicked. TestBatterySaverNotification( - *PowerStatus::Get(), expected_values, + expected_values, PowerNotificationController::NOTIFICATION_BSM_THRESHOLD_OPT_IN, /*expected_bsm_state_after_click=*/true); }
diff --git a/ash/system/power/battery_saver_controller.cc b/ash/system/power/battery_saver_controller.cc index 1b8d00fa..e0cc2c1 100644 --- a/ash/system/power/battery_saver_controller.cc +++ b/ash/system/power/battery_saver_controller.cc
@@ -266,11 +266,18 @@ PowerStatus::Get()->GetRoundedBatteryPercent() <= GetPowerNotificationController()->GetLowPowerPercentage(); - // Only update the user_opt_status_ when we are at or below the threshold. - // This way, auto-enable kicks in from threshold+1% -> threshold% even if - // the user has BSM disabled (either manually or via restored local pref) - // beforehand. - if (reason == UpdateReason::kSettings && crossed_threshold) { + // For auto-enabled, only update the user_opt_status_ when we are at or + // below the threshold.This way, auto-enable kicks in from threshold+1% -> + // threshold% even if the user has BSM disabled (either manually or via + // restored local pref) beforehand. + // If we are in the opt-in branch, we should capture user intent at any + // threshold. + const bool should_capture_user_intent = + (crossed_threshold || + features::kBatterySaverNotificationBehavior.Get() == + features::kBSMOptIn); + + if (reason == UpdateReason::kSettings && should_capture_user_intent) { // Whether user_opt_status_ is true or false when active is true or false // depends on the experiment arm we are in. SetUserOptStatus(features::kBatterySaverNotificationBehavior.Get() ==
diff --git a/ash/system/power/power_notification_controller.cc b/ash/system/power/power_notification_controller.cc index da80f5c..ebbc38fb 100644 --- a/ash/system/power/power_notification_controller.cc +++ b/ash/system/power/power_notification_controller.cc
@@ -297,12 +297,6 @@ } } - // If the user manually turned on battery saver mode before we got to - // the threshold, then set the user's intention as wanting it enabled. - if (was_active) { - SetUserOptStatus(true); - } - // Send Opt-In Notification at // `battery_saver_activation_charge_percent_` battery percentage or // update the notification state if we're on USB power.
diff --git a/ash/webui/scanning/resources/BUILD.gn b/ash/webui/scanning/resources/BUILD.gn index d0cba3a..05a57f70 100644 --- a/ash/webui/scanning/resources/BUILD.gn +++ b/ash/webui/scanning/resources/BUILD.gn
@@ -32,8 +32,8 @@ web_component_files = [ "action_toolbar.ts", - "color_mode_select.js", - "file_type_select.js", + "color_mode_select.ts", + "file_type_select.ts", "loading_page.ts", "multi_page_checkbox.js", "multi_page_scan.js",
diff --git a/ash/webui/scanning/resources/color_mode_select.html b/ash/webui/scanning/resources/color_mode_select.html index f5000d8..6252f0e 100644 --- a/ash/webui/scanning/resources/color_mode_select.html +++ b/ash/webui/scanning/resources/color_mode_select.html
@@ -10,7 +10,7 @@ <template is="dom-repeat" items="[[options]]" as="colorMode"> <option value="[[colorMode]]" selected$="[[isDefaultOption(colorMode)]]"> - [[getColorModeString_(colorMode)]] + [[getColorModeAsString(colorMode)]] </option> </template> </select>
diff --git a/ash/webui/scanning/resources/color_mode_select.js b/ash/webui/scanning/resources/color_mode_select.ts similarity index 71% rename from ash/webui/scanning/resources/color_mode_select.js rename to ash/webui/scanning/resources/color_mode_select.ts index ce2b2b5c..e8a26ba 100644 --- a/ash/webui/scanning/resources/color_mode_select.js +++ b/ash/webui/scanning/resources/color_mode_select.ts
@@ -6,7 +6,7 @@ import './strings.m.js'; import {assert} from 'chrome://resources/ash/common/assert.js'; -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; +import {I18nBehavior} from 'chrome://resources/ash/common/i18n_behavior.js'; import {mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; import {getTemplate} from './color_mode_select.html.js'; @@ -22,41 +22,28 @@ * 'color-mode-select' displays the available scanner color modes in a dropdown. */ -/** - * @constructor - * @extends {PolymerElement} - * @implements {I18nBehaviorInterface} - * @implements {SelectBehaviorInterface} - */ +// TODO(b/300484132): Replace mixinBehavior with mixin implementation once a +// Mixin version of SelectBehavior is available. const ColorModeSelectElementBase = - mixinBehaviors([I18nBehavior, SelectBehavior], PolymerElement); + mixinBehaviors([I18nBehavior, SelectBehavior], PolymerElement) as + {new (): PolymerElement & I18nBehavior & SelectBehaviorInterface}; -/** @polymer */ class ColorModeSelectElement extends ColorModeSelectElementBase { static get is() { - return 'color-mode-select'; + return 'color-mode-select' as const; } static get template() { return getTemplate(); } - /** - * @param {number} index - * @return {string} - */ - getOptionAtIndex(index) { + getOptionAtIndex(index: number): string { assert(index < this.options.length); return this.options[index].toString(); } - /** - * @param {!ColorMode} mojoColorMode - * @return {string} - * @private - */ - getColorModeString_(mojoColorMode) { + getColorModeAsString(mojoColorMode: ColorMode): string { return getColorModeString(mojoColorMode); } @@ -66,13 +53,15 @@ }); } - /** - * @param {!ColorMode} option - * @return {boolean} - */ - isDefaultOption(option) { + isDefaultOption(option: ColorMode): boolean { return option === DEFAULT_COLOR_MODE; } } +declare global { + interface HTMLElementTagNameMap { + [ColorModeSelectElement.is]: ColorModeSelectElement; + } +} + customElements.define(ColorModeSelectElement.is, ColorModeSelectElement);
diff --git a/ash/webui/scanning/resources/file_type_select.js b/ash/webui/scanning/resources/file_type_select.js deleted file mode 100644 index db3f530..0000000 --- a/ash/webui/scanning/resources/file_type_select.js +++ /dev/null
@@ -1,50 +0,0 @@ -// Copyright 2020 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import './scan_settings_section.js'; -import './strings.m.js'; - -import {I18nBehavior, I18nBehaviorInterface} from 'chrome://resources/ash/common/i18n_behavior.js'; -import {mixinBehaviors, PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; - -import {getTemplate} from './file_type_select.html.js'; - -/** - * @fileoverview - * 'file-type-select' displays the available file types in a dropdown. - */ - -/** - * @constructor - * @extends {PolymerElement} - * @implements {I18nBehaviorInterface} - */ -const FileTypeSelectElementBase = - mixinBehaviors([I18nBehavior], PolymerElement); - -/** @polymer */ -class FileTypeSelectElement extends FileTypeSelectElementBase { - static get is() { - return 'file-type-select'; - } - - static get template() { - return getTemplate(); - } - - static get properties() { - return { - /** @type {boolean} */ - disabled: Boolean, - - /** @type {string} */ - selectedFileType: { - type: String, - notify: true, - }, - }; - } -} - -customElements.define(FileTypeSelectElement.is, FileTypeSelectElement);
diff --git a/ash/webui/scanning/resources/file_type_select.ts b/ash/webui/scanning/resources/file_type_select.ts new file mode 100644 index 0000000..44dcbe7 --- /dev/null +++ b/ash/webui/scanning/resources/file_type_select.ts
@@ -0,0 +1,50 @@ +// Copyright 2020 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import './scan_settings_section.js'; +import './strings.m.js'; + +import {I18nMixin} from 'chrome://resources/cr_elements/i18n_mixin.js'; +import {PolymerElement} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; + +import {getTemplate} from './file_type_select.html.js'; + +/** + * @fileoverview + * 'file-type-select' displays the available file types in a dropdown. + */ + +const FileTypeSelectElementBase = I18nMixin(PolymerElement); + +class FileTypeSelectElement extends FileTypeSelectElementBase { + static get is() { + return 'file-type-select' as const; + } + + static get template() { + return getTemplate(); + } + + static get properties() { + return { + disabled: Boolean, + + selectedFileType: { + type: String, + notify: true, + }, + }; + } + + disabled: boolean; + selectedFileType: string; +} + +declare global { + interface HTMLElementTagNameMap { + [FileTypeSelectElement.is]: FileTypeSelectElement; + } +} + +customElements.define(FileTypeSelectElement.is, FileTypeSelectElement);
diff --git a/ash/webui/shortcut_customization_ui/backend/accelerator_configuration_provider.cc b/ash/webui/shortcut_customization_ui/backend/accelerator_configuration_provider.cc index 8f7fd8b5..45f3432 100644 --- a/ash/webui/shortcut_customization_ui/backend/accelerator_configuration_provider.cc +++ b/ash/webui/shortcut_customization_ui/backend/accelerator_configuration_provider.cc
@@ -472,6 +472,16 @@ return AcceleratorConfigResult::kShiftOnlyNotAllowed; } + // Case: A function key accelerator cannot have the meta key modifier. + if ((modifiers & ui::EF_COMMAND_DOWN) != 0 && + ui::KeyboardCapability::IsFunctionKey(accelerator.key_code())) { + VLOG(1) << "Failed to validate accelerator: " + << accelerator.GetShortcutText() << " with error: " + << static_cast<int>(AcceleratorConfigResult::kKeyNotAllowed) + << ". Accelerator has meta key with Function key."; + return AcceleratorConfigResult::kSearchWithFunctionKeyNotAllowed; + } + // No errors with the accelerator. return absl::nullopt; }
diff --git a/ash/webui/shortcut_customization_ui/backend/accelerator_configuration_provider_unittest.cc b/ash/webui/shortcut_customization_ui/backend/accelerator_configuration_provider_unittest.cc index 0b3103e..b2625f2 100644 --- a/ash/webui/shortcut_customization_ui/backend/accelerator_configuration_provider_unittest.cc +++ b/ash/webui/shortcut_customization_ui/backend/accelerator_configuration_provider_unittest.cc
@@ -1571,6 +1571,17 @@ AcceleratorAction::kToggleMirrorMode, top_row_accelerator, &result); EXPECT_EQ(mojom::AcceleratorConfigResult::kKeyNotAllowed, result->result); + + // Search with Function key is not allowed. + const ui::Accelerator search_function_accelerator(ui::VKEY_F1, + ui::EF_COMMAND_DOWN); + ash::shortcut_customization::mojom:: + AcceleratorConfigurationProviderAsyncWaiter(provider_.get()) + .AddAccelerator(mojom::AcceleratorSource::kAsh, + AcceleratorAction::kToggleMirrorMode, + search_function_accelerator, &result); + EXPECT_EQ(mojom::AcceleratorConfigResult::kSearchWithFunctionKeyNotAllowed, + result->result); } TEST_F(AcceleratorConfigurationProviderTest, AddAcceleratorExceedsMaximum) {
diff --git a/ash/webui/shortcut_customization_ui/backend/accelerator_layout_table.cc b/ash/webui/shortcut_customization_ui/backend/accelerator_layout_table.cc index d81d070..b4c0d45 100644 --- a/ash/webui/shortcut_customization_ui/backend/accelerator_layout_table.cc +++ b/ash/webui/shortcut_customization_ui/backend/accelerator_layout_table.cc
@@ -415,8 +415,8 @@ NonConfigurableAcceleratorDetails( {ui::Accelerator(ui::VKEY_OEM_PERIOD, ui::EF_CONTROL_DOWN)})}, {NonConfigurableActions::kAmbientCaretBrowsing, - NonConfigurableAcceleratorDetails({ui::Accelerator( - ui::VKEY_7, ui::EF_CONTROL_DOWN | ui::EF_COMMAND_DOWN)})}, + NonConfigurableAcceleratorDetails( + {ui::Accelerator(ui::VKEY_F7, ui::EF_CONTROL_DOWN)})}, {NonConfigurableActions::kBrowserAutoComplete, NonConfigurableAcceleratorDetails( {ui::Accelerator(ui::VKEY_RETURN, ui::EF_CONTROL_DOWN)})},
diff --git a/ash/webui/shortcut_customization_ui/resources/js/accelerator_view.ts b/ash/webui/shortcut_customization_ui/resources/js/accelerator_view.ts index 4cb3445..69ea9e2 100644 --- a/ash/webui/shortcut_customization_ui/resources/js/accelerator_view.ts +++ b/ash/webui/shortcut_customization_ui/resources/js/accelerator_view.ts
@@ -385,6 +385,14 @@ this.hasError = true; return; } + // Search with function keys are not allowed. + // TODO(b/286268215): localize string. + case AcceleratorConfigResult.kSearchWithFunctionKeyNotAllowed: { + this.statusMessage = + this.i18n('searchWithFunctionKeyNotAllowedStatusMessage'); + this.hasError = true; + return; + } // Conflict with a locked accelerator. case AcceleratorConfigResult.kConflict: case AcceleratorConfigResult.kActionLocked: {
diff --git a/ash/webui/shortcut_customization_ui/shortcut_customization_app_ui.cc b/ash/webui/shortcut_customization_ui/shortcut_customization_app_ui.cc index 65b1145..3f37638 100644 --- a/ash/webui/shortcut_customization_ui/shortcut_customization_app_ui.cc +++ b/ash/webui/shortcut_customization_ui/shortcut_customization_app_ui.cc
@@ -84,6 +84,8 @@ IDS_SHORTCUT_CUSTOMIZATION_MISSING_MODIFIER_STATUS_MESSAGE}, {"keyNotAllowedStatusMessage", IDS_SHORTCUT_CUSTOMIZATION_KEY_NOT_ALLOWED_STATUS_MESSAGE}, + {"searchWithFunctionKeyNotAllowedStatusMessage", + IDS_SHORTCUT_CUSTOMIZATION_SEACH_WITH_FUNCTION_KEY_NOT_ALLOWED_STATUS_MESSAGE}, {"warningSearchNotIncluded", IDS_SHORTCUT_CUSTOMIZATION_NON_SEARCH_SHORTCUT_WARNING}, {"searchNoResults", IDS_SHORTCUT_CUSTOMIZATION_SEARCH_NO_RESULTS},
diff --git a/ash/wm/desks/desks_controller.cc b/ash/wm/desks/desks_controller.cc index 64c6ef6c..e58d37e 100644 --- a/ash/wm/desks/desks_controller.cc +++ b/ash/wm/desks/desks_controller.cc
@@ -595,6 +595,12 @@ available_container_ids_.pop(); Desk* new_desk = desks_.back().get(); + // We should notify observers that the desk is added before possibly + // notifying observers that the name is set. + for (auto& observer : observers_) { + observer.OnDeskAdded(new_desk, /*from_undo=*/false); + } + // The new desk should have an empty name when the user creates a desk with // a button. This is done to encourage them to rename their desks. const bool empty_name = @@ -620,9 +626,6 @@ base::NumberToString16(desks_.size()))); } - for (auto& observer : observers_) - observer.OnDeskAdded(new_desk, /*from_undo=*/false); - if (!is_first_ever_desk) { if (features::IsDeskButtonEnabled()) { PrefService* prefs =
diff --git a/ash/wm_mode/wm_mode_controller.cc b/ash/wm_mode/wm_mode_controller.cc index f69a94a..1f952cd 100644 --- a/ash/wm_mode/wm_mode_controller.cc +++ b/ash/wm_mode/wm_mode_controller.cc
@@ -219,11 +219,7 @@ void WmModeController::OnDeskNameChanged(const Desk* desk, const std::u16string& new_name) { auto* desks_controller = DesksController::Get(); - if (!pie_menu_view_ || - pie_menu_view_->GetOrAddSubMenuForButton(kMoveToDeskButtonId) - ->button_count() != desks_controller->desks().size()) { - // Sometimes we received the desk-name change notification before the desk- - // addition notification. This has been reported in b/298726506. + if (!pie_menu_view_) { return; } const int index = desks_controller->GetDeskIndex(desk);
diff --git a/base/debug/dwarf_line_no.cc b/base/debug/dwarf_line_no.cc index 2f12ea4..513b132f 100644 --- a/base/debug/dwarf_line_no.cc +++ b/base/debug/dwarf_line_no.cc
@@ -1267,7 +1267,7 @@ } // namespace -bool GetDwarfSourceLineNumber(void* pc, +bool GetDwarfSourceLineNumber(const void* pc, uintptr_t cu_offset, char* out, size_t out_size) { @@ -1291,7 +1291,7 @@ return true; } -void GetDwarfCompileUnitOffsets(void* const* trace, +void GetDwarfCompileUnitOffsets(const void* const* trace, uint64_t* cu_offsets, size_t num_frames) { // Ensure `cu_offsets` always has a known state.
diff --git a/base/debug/dwarf_line_no.h b/base/debug/dwarf_line_no.h index 2a51aa8..dde7fbe 100644 --- a/base/debug/dwarf_line_no.h +++ b/base/debug/dwarf_line_no.h
@@ -15,7 +15,7 @@ // // Expects `trace` and `cu_offsets` to be `num_frames` in size. If a frame // cannot be found, the corresponding value stored in `cu_offsets` is 0. -void GetDwarfCompileUnitOffsets(void* const* trace, +void GetDwarfCompileUnitOffsets(const void* const* trace, uint64_t* cu_offsets, size_t num_frames); @@ -29,7 +29,7 @@ // ../../base/debug/stack_trace_unittest.cc:120,16 // // This means `pc` was from line 120, column 16, of stack_trace_unittest.cc. -bool GetDwarfSourceLineNumber(void* pc, +bool GetDwarfSourceLineNumber(const void* pc, uint64_t cu_offsets, char* out, size_t out_size);
diff --git a/base/debug/stack_trace.h b/base/debug/stack_trace.h index ef208def..a16c959 100644 --- a/base/debug/stack_trace.h +++ b/base/debug/stack_trace.h
@@ -134,7 +134,7 @@ void InitTrace(const _CONTEXT* context_record); #endif - void* trace_[kMaxTraces]; + const void* trace_[kMaxTraces]; // The number of valid frames in |trace_|. size_t count_; @@ -145,7 +145,7 @@ // Record a stack trace with up to |count| frames into |trace|. Returns the // number of frames read. -BASE_EXPORT size_t CollectStackTrace(void** trace, size_t count); +BASE_EXPORT size_t CollectStackTrace(const void** trace, size_t count); #if BUILDFLAG(CAN_UNWIND_WITH_FRAME_POINTERS)
diff --git a/base/debug/stack_trace_android.cc b/base/debug/stack_trace_android.cc index 7e98002..3911830 100644 --- a/base/debug/stack_trace_android.cc +++ b/base/debug/stack_trace_android.cc
@@ -75,7 +75,7 @@ return (sigaction(SIGPIPE, &action, NULL) == 0); } -size_t CollectStackTrace(void** trace, size_t count) { +size_t CollectStackTrace(const void** trace, size_t count) { StackCrawlState state(reinterpret_cast<uintptr_t*>(trace), count); _Unwind_Backtrace(&TraceStackFrame, &state); return state.frame_count;
diff --git a/base/debug/stack_trace_fuchsia.cc b/base/debug/stack_trace_fuchsia.cc index 1c55e93..543e475b 100644 --- a/base/debug/stack_trace_fuchsia.cc +++ b/base/debug/stack_trace_fuchsia.cc
@@ -29,7 +29,7 @@ namespace { struct BacktraceData { - void** trace_array; + const void** trace_array; size_t* count; size_t max; }; @@ -203,7 +203,7 @@ // Returns true if |address| is contained by any of the memory regions // mapped for |module_entry|. -bool ModuleContainsFrameAddress(void* address, +bool ModuleContainsFrameAddress(const void* address, const SymbolMap::Module& module_entry) { for (size_t i = 0; i < module_entry.segment_count; ++i) { const SymbolMap::Segment& segment = module_entry.segments[i]; @@ -229,7 +229,7 @@ return true; } -size_t CollectStackTrace(void** trace, size_t count) { +size_t CollectStackTrace(const void** trace, size_t count) { size_t frame_count = 0; BacktraceData data = {trace, &frame_count, count}; _Unwind_Backtrace(&UnwindStore, &data);
diff --git a/base/debug/stack_trace_posix.cc b/base/debug/stack_trace_posix.cc index d46701a..5fec90b3 100644 --- a/base/debug/stack_trace_posix.cc +++ b/base/debug/stack_trace_posix.cc
@@ -163,7 +163,7 @@ }; #if defined(HAVE_BACKTRACE) -void OutputPointer(void* pointer, BacktraceOutputHandler* handler) { +void OutputPointer(const void* pointer, BacktraceOutputHandler* handler) { // This should be more than enough to store a 64-bit number in hex: // 16 hex digits + 1 for null-terminator. char buf[17] = { '\0' }; @@ -191,7 +191,7 @@ } #endif // defined(USE_SYMBOLIZE) -void ProcessBacktrace(void* const* trace, +void ProcessBacktrace(const void* const* trace, size_t size, const char* prefix_string, BacktraceOutputHandler* handler) { @@ -218,8 +218,8 @@ // Subtract by one as return address of function may be in the next // function when a function is annotated as noreturn. - void* address = static_cast<char*>(trace[i]) - 1; - if (google::Symbolize(address, buf, sizeof(buf))) { + const void* address = static_cast<const char*>(trace[i]) - 1; + if (google::Symbolize(const_cast<void*>(address), buf, sizeof(buf))) { handler->HandleOutput(buf); #if BUILDFLAG(ENABLE_STACK_TRACE_LINE_NUMBERS) // Only output the source line number if the offset was found. Otherwise, @@ -268,8 +268,8 @@ } printed = true; #else // defined(HAVE_DLADDR) - std::unique_ptr<char*, FreeDeleter> trace_symbols( - backtrace_symbols(trace, static_cast<int>(size))); + std::unique_ptr<char*, FreeDeleter> trace_symbols(backtrace_symbols( + const_cast<void* const*>(trace), static_cast<int>(size))); if (trace_symbols.get()) { for (size_t i = 0; i < size; ++i) { std::string trace_symbol = trace_symbols.get()[i]; @@ -1026,19 +1026,18 @@ } #endif -size_t CollectStackTrace(void** trace, size_t count) { +size_t CollectStackTrace(const void** trace, size_t count) { // NOTE: This code MUST be async-signal safe (it's used by in-process // stack dumping signal handler). NO malloc or stdio is allowed here. #if defined(NO_UNWIND_TABLES) && BUILDFLAG(CAN_UNWIND_WITH_FRAME_POINTERS) // If we do not have unwind tables, then try tracing using frame pointers. - return base::debug::TraceStackFramePointers(const_cast<const void**>(trace), - count, 0); + return base::debug::TraceStackFramePointers(trace, count, 0); #elif defined(HAVE_BACKTRACE) // Though the backtrace API man page does not list any possible negative // return values, we take no chance. return base::saturated_cast<size_t>( - backtrace(trace, base::saturated_cast<int>(count))); + backtrace(const_cast<void**>(trace), base::saturated_cast<int>(count))); #else return 0; #endif
diff --git a/base/debug/stack_trace_win.cc b/base/debug/stack_trace_win.cc index e7328d6..75bd006 100644 --- a/base/debug/stack_trace_win.cc +++ b/base/debug/stack_trace_win.cc
@@ -324,9 +324,9 @@ return InitializeSymbols(); } -NOINLINE size_t CollectStackTrace(void** trace, size_t count) { +NOINLINE size_t CollectStackTrace(const void** trace, size_t count) { // When walking our own stack, use CaptureStackBackTrace(). - return CaptureStackBackTrace(0, count, trace, NULL); + return CaptureStackBackTrace(0, count, const_cast<void**>(trace), NULL); } StackTrace::StackTrace(EXCEPTION_POINTERS* exception_pointers) {
diff --git a/base/sampling_heap_profiler/sampling_heap_profiler.cc b/base/sampling_heap_profiler/sampling_heap_profiler.cc index f7b7be7..0e7d658 100644 --- a/base/sampling_heap_profiler/sampling_heap_profiler.cc +++ b/base/sampling_heap_profiler/sampling_heap_profiler.cc
@@ -92,9 +92,8 @@ // Checks whether unwinding from this function works. [[maybe_unused]] StackUnwinder CheckForDefaultUnwindTables() { - void* stack[kMaxStackEntries]; - size_t frame_count = base::debug::CollectStackTrace(const_cast<void**>(stack), - kMaxStackEntries); + const void* stack[kMaxStackEntries]; + size_t frame_count = base::debug::CollectStackTrace(stack, kMaxStackEntries); // First frame is the current function and can be found without unwind tables. return frame_count > 1 ? StackUnwinder::kDefault : StackUnwinder::kUnavailable; @@ -186,9 +185,9 @@ return UpdateAndGetThreadName(nullptr); } -void** SamplingHeapProfiler::CaptureStackTrace(void** frames, - size_t max_entries, - size_t* count) { +const void** SamplingHeapProfiler::CaptureStackTrace(const void** frames, + size_t max_entries, + size_t* count) { // Skip top frames as they correspond to the profiler itself. size_t skip_frames = 3; size_t frame_count = 0; @@ -250,10 +249,10 @@ void SamplingHeapProfiler::CaptureNativeStack(const char* context, Sample* sample) { - void* stack[kMaxStackEntries]; + const void* stack[kMaxStackEntries]; size_t frame_count; // One frame is reserved for the thread name. - void** first_frame = + const void** first_frame = CaptureStackTrace(stack, kMaxStackEntries - 1, &frame_count); DCHECK_LT(frame_count, kMaxStackEntries); sample->stack.assign(first_frame, first_frame + frame_count);
diff --git a/base/sampling_heap_profiler/sampling_heap_profiler.h b/base/sampling_heap_profiler/sampling_heap_profiler.h index d0931a0a..e273a017 100644 --- a/base/sampling_heap_profiler/sampling_heap_profiler.h +++ b/base/sampling_heap_profiler/sampling_heap_profiler.h
@@ -47,7 +47,7 @@ // Name of the thread that made the sampled allocation. const char* thread_name = nullptr; // Call stack of PC addresses responsible for the allocation. - std::vector<void*> stack; + std::vector<const void*> stack; // Public for testing. Sample(size_t size, size_t total, uint32_t ordinal); @@ -100,7 +100,9 @@ // Captures up to |max_entries| stack frames using the buffer pointed by // |frames|. Puts the number of captured frames into the |count| output // parameters. Returns the pointer to the topmost frame. - void** CaptureStackTrace(void** frames, size_t max_entries, size_t* count); + const void** CaptureStackTrace(const void** frames, + size_t max_entries, + size_t* count); static void Init(); static SamplingHeapProfiler* Get();
diff --git a/build/config/compiler/BUILD.gn b/build/config/compiler/BUILD.gn index 9e7463e1..e125b56e 100644 --- a/build/config/compiler/BUILD.gn +++ b/build/config/compiler/BUILD.gn
@@ -370,10 +370,6 @@ } else if ((is_posix && !is_chromeos && !is_nacl) || is_fuchsia) { # TODO(phajdan.jr): Use -fstack-protector-strong when our gcc supports it. # See also https://crbug.com/533294 - if (current_os != "zos") { - cflags += [ "--param=ssp-buffer-size=4" ] - } - # The x86 toolchain currently has problems with stack-protector. if (is_android && current_cpu == "x86") { cflags += [ "-fno-stack-protector" ]
diff --git a/build/fuchsia/test/ffx_emulator.py b/build/fuchsia/test/ffx_emulator.py index 4ec1616f..b9feb1d 100644 --- a/build/fuchsia/test/ffx_emulator.py +++ b/build/fuchsia/test/ffx_emulator.py
@@ -46,6 +46,7 @@ else: self._node_name = 'fuchsia-emulator-' + str(random.randint( 1, 9999)) + self._device_spec = args.device_spec def _everlasting(self) -> bool: return self._node_name == 'fuchsia-everlasting-emulator' @@ -73,6 +74,8 @@ emu_command.extend(['--net', 'user']) if self._everlasting(): emu_command.extend(['--reuse-with-check']) + if self._device_spec: + emu_command.extend(['--device', self._device_spec]) # TODO(https://fxbug.dev/99321): remove when ffx has native support # for starting emulator on arm64 host.
diff --git a/build/fuchsia/test/ffx_emulator_unittests.py b/build/fuchsia/test/ffx_emulator_unittests.py index cc385b8..3c641ee6 100755 --- a/build/fuchsia/test/ffx_emulator_unittests.py +++ b/build/fuchsia/test/ffx_emulator_unittests.py
@@ -6,6 +6,7 @@ import argparse import unittest +import unittest.mock as mock from ffx_emulator import FfxEmulator @@ -25,7 +26,8 @@ 'hardware_gpu': False, 'logs_dir': '.', 'with_network': False, - 'everlasting': True + 'everlasting': True, + 'device_spec': '' }))._node_name, 'fuchsia-everlasting-emulator') def test_use_random_node_name(self) -> None: @@ -41,9 +43,63 @@ 'hardware_gpu': False, 'logs_dir': '.', 'with_network': False, - 'everlasting': False + 'everlasting': False, + 'device_spec': '' }))._node_name, 'fuchsia-everlasting-emulator') + @mock.patch('ffx_emulator.run_ffx_command') + def test_use_none_device_spec(self, mock_ffx) -> None: + """FfxEmulator should use the default device spec if spec is None.""" + FfxEmulator( + argparse.Namespace( + **{ + 'product': None, + 'enable_graphics': False, + 'hardware_gpu': False, + 'logs_dir': '.', + 'with_network': False, + 'everlasting': False, + 'device_spec': None + })).__enter__() + self.assertIn(' '.join(['--net', 'user']), + ' '.join(mock_ffx.call_args.kwargs['cmd'])) + self.assertNotIn('--device', mock_ffx.call_args.kwargs['cmd']) + + @mock.patch('ffx_emulator.run_ffx_command') + def test_use_empty_device_spec(self, mock_ffx) -> None: + """FfxEmulator should use the default device spec if spec is empty.""" + FfxEmulator( + argparse.Namespace( + **{ + 'product': None, + 'enable_graphics': False, + 'hardware_gpu': False, + 'logs_dir': '.', + 'with_network': False, + 'everlasting': False, + 'device_spec': '' + })).__enter__() + self.assertIn(' '.join(['--net', 'user']), + ' '.join(mock_ffx.call_args.kwargs['cmd'])) + self.assertNotIn('--device', mock_ffx.call_args.kwargs['cmd']) + + @mock.patch('ffx_emulator.run_ffx_command') + def test_use_large_device_spec(self, mock_ffx) -> None: + """FfxEmulator should use large device spec.""" + FfxEmulator( + argparse.Namespace( + **{ + 'product': None, + 'enable_graphics': False, + 'hardware_gpu': False, + 'logs_dir': '.', + 'with_network': False, + 'everlasting': False, + 'device_spec': 'large' + })).__enter__() + self.assertIn(' '.join(['--device', 'large']), + ' '.join(mock_ffx.call_args.kwargs['cmd'])) + if __name__ == '__main__': unittest.main()
diff --git a/build/fuchsia/test/start_emulator.py b/build/fuchsia/test/start_emulator.py index 03c86d3..a0adf47 100755 --- a/build/fuchsia/test/start_emulator.py +++ b/build/fuchsia/test/start_emulator.py
@@ -46,6 +46,12 @@ femu_args.add_argument('--everlasting', action='store_true', help='If the emulator should be long-living.') + femu_args.add_argument( + '--device-spec', + help='Configure the virtual device to use. They are usually defined in ' + 'the product-bundle/virtual_devices/manifest.json. If this flag is not ' + 'provided or is an empty string, ffx emu will decide the recommended ' + 'spec.') def create_emulator_from_args(
diff --git a/cc/scheduler/scheduler.cc b/cc/scheduler/scheduler.cc index d0d99f8..6f341ed 100644 --- a/cc/scheduler/scheduler.cc +++ b/cc/scheduler/scheduler.cc
@@ -840,10 +840,6 @@ TRACE_EVENT1("cc", "Scheduler::SetPauseRendering", "pause_rendering", pause_rendering); state_machine_.SetPauseRendering(pause_rendering); - if (!pause_rendering && begin_frame_source_) { - // This is needed for BackToBackBeginFrameSource to resume pumping frames. - begin_frame_source_->DidFinishFrame(this); - } } ProcessScheduledActions(); }
diff --git a/cc/scheduler/scheduler_settings.h b/cc/scheduler/scheduler_settings.h index 0fb7766..edb7455a 100644 --- a/cc/scheduler/scheduler_settings.h +++ b/cc/scheduler/scheduler_settings.h
@@ -53,9 +53,6 @@ // they would be under the default settings. bool disable_frame_rate_limit = false; - // True if we are running a web test using threaded compositing. - bool is_threaded_web_test = false; - std::unique_ptr<base::trace_event::ConvertableToTraceFormat> AsValue() const; };
diff --git a/cc/scheduler/scheduler_state_machine.cc b/cc/scheduler/scheduler_state_machine.cc index 9ce733a..406cf4dd 100644 --- a/cc/scheduler/scheduler_state_machine.cc +++ b/cc/scheduler/scheduler_state_machine.cc
@@ -1362,12 +1362,6 @@ if (active_tree_needs_first_draw_) return true; - // When running web tests with threaded compositing, we service main frames at - // the maximum possible frame rate. - if (settings_.is_threaded_web_test && needs_begin_main_frame_) { - return true; - } - if (!needs_redraw_) return false;
diff --git a/cc/trees/layer_tree_settings.cc b/cc/trees/layer_tree_settings.cc index b0a0064..c0043ef2 100644 --- a/cc/trees/layer_tree_settings.cc +++ b/cc/trees/layer_tree_settings.cc
@@ -29,7 +29,6 @@ scheduler_settings.wait_for_all_pipeline_stages_before_draw = wait_for_all_pipeline_stages_before_draw; scheduler_settings.disable_frame_rate_limit = disable_frame_rate_limit; - scheduler_settings.is_threaded_web_test = is_threaded_web_test; return scheduler_settings; }
diff --git a/cc/trees/layer_tree_settings.h b/cc/trees/layer_tree_settings.h index a47fbc8..e0732eb 100644 --- a/cc/trees/layer_tree_settings.h +++ b/cc/trees/layer_tree_settings.h
@@ -223,9 +223,6 @@ // TODO(crbug.com/1378251): not ready to be used by renderer cc instance yet. bool enable_shared_image_cache_for_gpu = false; - // True if we are running a web test using threaded compositing. - bool is_threaded_web_test = false; - // Maximum size for buffers allocated for rendering when GPU compositing is // disabled. This size is equivalent to the max texture size in GPU mode. // This is an arbitrary limit here similar to what hardware might have.
diff --git a/chrome/android/BUILD.gn b/chrome/android/BUILD.gn index f6faaf0..775207a 100644 --- a/chrome/android/BUILD.gn +++ b/chrome/android/BUILD.gn
@@ -1542,6 +1542,7 @@ "//chrome/browser/android/browserservices/intents:java", "//chrome/browser/android/browserservices/verification:java", "//chrome/browser/android/browserservices/verification:javatests", + "//chrome/browser/android/common:java", "//chrome/browser/android/crypto:java", "//chrome/browser/android/customtabs/branding:java", "//chrome/browser/android/httpclient:javatests",
diff --git a/chrome/android/expectations/ccflags.expected b/chrome/android/expectations/ccflags.expected index ba9c6ef..aea1633 100644 --- a/chrome/android/expectations/ccflags.expected +++ b/chrome/android/expectations/ccflags.expected
@@ -1,4 +1,4 @@ ---param=ssp-buffer-size=4 +--param=ssp-buffer-size=8 --target=arm-linux-androideabi21 -DANDROID -DDYNAMIC_ANNOTATIONS_ENABLED=0
diff --git a/chrome/android/features/start_surface/java/res/layout/single_tab_module_layout.xml b/chrome/android/features/start_surface/java/res/layout/single_tab_module_layout.xml index 15c71c3..b3901d6 100644 --- a/chrome/android/features/start_surface/java/res/layout/single_tab_module_layout.xml +++ b/chrome/android/features/start_surface/java/res/layout/single_tab_module_layout.xml
@@ -104,7 +104,7 @@ android:layout_toEndOf="@+id/tab_images" android:gravity="start" android:singleLine="true" - android:textAppearance="@style/TextAppearance.TextSmall" /> + android:textAppearance="@style/TextAppearance.TextSmall.Secondary"/> </RelativeLayout> </org.chromium.chrome.features.tasks.SingleTabView>
diff --git a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTest.java b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTest.java index 4bb8c3c..eadb1fa 100644 --- a/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTest.java +++ b/chrome/android/features/start_surface/javatests/src/org/chromium/chrome/features/start_surface/InstantStartTest.java
@@ -21,7 +21,6 @@ import android.content.pm.ActivityInfo; import android.graphics.Bitmap; -import android.text.TextUtils; import android.util.Size; import android.view.View; @@ -281,7 +280,7 @@ // clang-format on StartSurfaceTestUtils.startMainActivityFromLauncher(mActivityTestRule); Assert.assertTrue(StartSurfaceConfiguration.isStartSurfaceFlagEnabled()); - Assert.assertFalse(TextUtils.isEmpty(HomepageManager.getHomepageUri())); + Assert.assertFalse(HomepageManager.getHomepageGurl().isEmpty()); TestThreadUtils.runOnUiThreadBlocking( (Runnable) () @@ -332,7 +331,7 @@ if (!BuildConfig.ENABLE_ASSERTS) return; StartSurfaceTestUtils.startMainActivityFromLauncher(mActivityTestRule); collector.checkThat(StartSurfaceConfiguration.isStartSurfaceFlagEnabled(), is(true)); - collector.checkThat(TextUtils.isEmpty(HomepageManager.getHomepageUri()), is(false)); + collector.checkThat(HomepageManager.getHomepageGurl().isEmpty(), is(false)); Assert.assertFalse( NativeLibraryLoadedStatus.getProviderForTesting().areNativeMethodsReady()); ReturnToChromeUtil.shouldShowStartSurfaceAsTheHomePage(mActivityTestRule.getActivity());
diff --git a/chrome/android/features/start_surface/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinatorUnitTestRule.java b/chrome/android/features/start_surface/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinatorUnitTestRule.java index ef425c0..98cb688 100644 --- a/chrome/android/features/start_surface/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinatorUnitTestRule.java +++ b/chrome/android/features/start_surface/junit/src/org/chromium/chrome/features/start_surface/StartSurfaceCoordinatorUnitTestRule.java
@@ -40,7 +40,6 @@ import org.chromium.chrome.browser.feed.FeedSurfaceMediator; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.fullscreen.BrowserControlsManager; -import org.chromium.chrome.browser.homepage.HomepageManager; import org.chromium.chrome.browser.incognito.reauth.IncognitoReauthController; import org.chromium.chrome.browser.init.ActivityLifecycleDispatcherImpl; import org.chromium.chrome.browser.init.ChromeActivityNativeDelegate; @@ -77,15 +76,11 @@ import org.chromium.components.feature_engagement.Tracker; import org.chromium.components.prefs.PrefService; import org.chromium.components.search_engines.TemplateUrlService; -import org.chromium.components.url_formatter.UrlFormatter; -import org.chromium.components.url_formatter.UrlFormatterJni; import org.chromium.components.user_prefs.UserPrefs; import org.chromium.components.user_prefs.UserPrefsJni; import org.chromium.ui.base.WindowAndroid; import org.chromium.ui.modaldialog.ModalDialogManager.ModalDialogType; import org.chromium.ui.test.util.modaldialog.FakeModalDialogManager; -import org.chromium.url.GURL; -import org.chromium.url.JUnitTestGURLs; import java.util.ArrayList; import java.util.Collections; @@ -201,13 +196,6 @@ .thenReturn(Mockito.mock(SigninManager.class)); mJniMocker.mock(IdentityServicesProviderJni.TEST_HOOKS, identityServicesProviderJniMock); - // Set home page url. - GURL homePageGURL = JUnitTestGURLs.NTP_URL; - UrlFormatter.Natives urlFormatterJniMock = Mockito.mock(UrlFormatter.Natives.class); - when(urlFormatterJniMock.fixupUrl(HomepageManager.getHomepageUri())) - .thenReturn(homePageGURL); - mJniMocker.mock(UrlFormatterJni.TEST_HOOKS, urlFormatterJniMock); - mJniMocker.mock(FaviconHelperJni.TEST_HOOKS, Mockito.mock(FaviconHelper.Natives.class)); mJniMocker.mock( FeedServiceBridgeJni.TEST_HOOKS, Mockito.mock(FeedServiceBridge.Natives.class));
diff --git a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceMediator.java b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceMediator.java index 911181a14a..67ee552 100644 --- a/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceMediator.java +++ b/chrome/android/feed/core/java/src/org/chromium/chrome/browser/feed/FeedSurfaceMediator.java
@@ -827,9 +827,8 @@ mSectionHeaderModel.set(SectionHeaderListProperties.IS_LOGO_KEY, !isGoogleSearchEngine && isSignedIn && suggestionsVisible); ViewVisibility indicatorState; - if (!isTabMode || ChromeFeatureList.sSurfacePolish.isEnabled() && isGoogleSearchEngine) { - // Gone when the following/for you tab switcher header is not shown or if feature flag - // surface polish is enabled and the DSE is Google. + if (!isTabMode) { + // Gone when the following/for you tab switcher header is not shown indicatorState = ViewVisibility.GONE; } else if (!isGoogleSearchEngine) { // Visible when Google is not the search engine (show logo).
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java index 68b76fa..c184da7d 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ChromeTabbedActivity.java
@@ -222,6 +222,7 @@ import org.chromium.ui.base.DeviceFormFactor; import org.chromium.ui.base.PageTransition; import org.chromium.ui.widget.Toast; +import org.chromium.url.GURL; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -1441,14 +1442,16 @@ long createInitialTabStartTime = SystemClock.elapsedRealtime(); boolean shouldShowOverviewPageOnStart = shouldShowOverviewPageOnStart(); if (!shouldShowOverviewPageOnStart) { - url = HomepageManager.getHomepageUri(); - if (TextUtils.isEmpty(url)) { + GURL homepageGurl = HomepageManager.getHomepageGurl(); + if (homepageGurl.isEmpty()) { url = UrlConstants.NTP_URL; } else { // Migrate legacy NTP URLs (chrome://newtab) to the newer format // (chrome-native://newtab) - if (UrlUtilities.isNTPUrl(url)) { + if (UrlUtilities.isNTPUrl(homepageGurl)) { url = UrlConstants.NTP_URL; + } else { + url = homepageGurl.getSpec(); } } getTabCreator(false).launchUrl(url, TabLaunchType.FROM_STARTUP);
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java index de87164..afd3a2ec 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChrome.java
@@ -8,6 +8,7 @@ import android.view.MotionEvent; import android.view.ViewGroup; +import androidx.annotation.NonNull; import androidx.annotation.Nullable; import androidx.annotation.VisibleForTesting; @@ -130,17 +131,21 @@ Context context = host.getContext(); if (ReturnToChromeUtil.isStartSurfaceRefactorEnabled(context)) { if (startSurfaceSupplier.hasValue() || tabSwitcherSupplier.hasValue()) { - createOverviewLayout(startSurfaceSupplier.get(), tabSwitcherSupplier.get(), - browserControlsStateProvider, scrimCoordinator, tabSwitcherScrimAnchor); + createLayoutsForStartSurfaceAndTabSwitcher(startSurfaceSupplier.get(), + tabSwitcherSupplier.get(), browserControlsStateProvider, scrimCoordinator, + tabSwitcherScrimAnchor); } } else if (startSurfaceSupplier.hasValue()) { - createOverviewLayout(startSurfaceSupplier.get(), /*tabSwitcher=*/null, - browserControlsStateProvider, scrimCoordinator, tabSwitcherScrimAnchor); + createLayoutsForStartSurfaceAndTabSwitcher(startSurfaceSupplier.get(), + /*tabSwitcher=*/null, browserControlsStateProvider, scrimCoordinator, + tabSwitcherScrimAnchor); } } /** - * Creates @{@link org.chromium.chrome.features.start_surface.TabSwitcherAndStartSurfaceLayout} + * Creates {@link org.chromium.chrome.features.start_surface.TabSwitcherAndStartSurfaceLayout} + * or ({@link org.chromium.chrome.features.start_surface.StartSurfaceHomeLayout} AND + * {@link org.chromium.chrome.features.tasks.tab_management.TabSwitcherLayout}). * @param startSurface An interface to talk to the Grid Tab Switcher when Start surface refactor * is disabled. * @param tabSwitcher An interface to talk to the Grid Tab Switcher when Start surface refactor @@ -150,7 +155,7 @@ * @param scrimCoordinator scrim coordinator for GTS * @param tabSwitcherScrimAnchor scrim anchor view for GTS */ - protected void createOverviewLayout(@Nullable StartSurface startSurface, + protected void createLayoutsForStartSurfaceAndTabSwitcher(@Nullable StartSurface startSurface, @Nullable TabSwitcher tabSwitcher, BrowserControlsStateProvider browserControlsStateProvider, ScrimCoordinator scrimCoordinator, ViewGroup tabSwitcherScrimAnchor) { @@ -159,40 +164,128 @@ boolean isRefactorEnabled = ReturnToChromeUtil.isStartSurfaceRefactorEnabled(mHost.getContext()); - Context context = mHost.getContext(); - LayoutRenderHost renderHost = mHost.getLayoutRenderHost(); - if (isRefactorEnabled) { assert tabSwitcher != null; - TabManagementDelegate tabManagementDelegate = - TabManagementDelegateProvider.getDelegate(); - assert tabManagementDelegate != null; - - mTabSwitcherLayout = tabManagementDelegate.createTabSwitcherLayout(context, this, this, - renderHost, browserControlsStateProvider, tabSwitcher, tabSwitcherScrimAnchor, - scrimCoordinator); + createTabSwitcherLayout(tabSwitcher, browserControlsStateProvider, scrimCoordinator, + tabSwitcherScrimAnchor); if (startSurface != null) { - mStartSurfaceHomeLayout = StartSurfaceDelegate.createStartSurfaceHomeLayout( - context, this, renderHost, startSurface); + createStartSurfaceHomeLayout(startSurface); } } else { assert startSurface != null; - mOverviewLayout = StartSurfaceDelegate.createTabSwitcherAndStartSurfaceLayout(context, - this, renderHost, browserControlsStateProvider, startSurface, - tabSwitcherScrimAnchor, scrimCoordinator); + createTabSwitcherAndStartSurfaceLayout(startSurface, browserControlsStateProvider, + scrimCoordinator, tabSwitcherScrimAnchor); } + } + + /** + * Creates {@link org.chromium.chrome.features.tasks.tab_management.TabSwitcherLayout} + * @param tabSwitcher An interface to talk to the Grid Tab Switcher. + * @param browserControlsStateProvider The {@link BrowserControlsStateProvider} for top + * controls. + * @param scrimCoordinator scrim coordinator for GTS + * @param tabSwitcherScrimAnchor scrim anchor view for GTS + */ + protected void createTabSwitcherLayout(@NonNull TabSwitcher tabSwitcher, + BrowserControlsStateProvider browserControlsStateProvider, + ScrimCoordinator scrimCoordinator, ViewGroup tabSwitcherScrimAnchor) { + assert mTabSwitcherLayout == null; + boolean isRefactorEnabled = + ReturnToChromeUtil.isStartSurfaceRefactorEnabled(mHost.getContext()); + assert isRefactorEnabled; + + Context context = mHost.getContext(); + LayoutRenderHost renderHost = mHost.getLayoutRenderHost(); + + TabManagementDelegate tabManagementDelegate = TabManagementDelegateProvider.getDelegate(); + + mTabSwitcherLayout = tabManagementDelegate.createTabSwitcherLayout(context, this, this, + renderHost, browserControlsStateProvider, tabSwitcher, tabSwitcherScrimAnchor, + scrimCoordinator); if (DeviceFormFactor.isNonMultiDisplayContextOnTablet(mHost.getContext())) { mTabSwitcherFocusLayoutStateObserver = new LayoutStateObserver() { @Override public void onFinishedShowing(int layoutType) { if (layoutType == LayoutType.TAB_SWITCHER) { - if (isRefactorEnabled) { - tabSwitcher.getTabListDelegate().requestFocusOnCurrentTab(); - } else { - startSurface.getGridTabListDelegate().requestFocusOnCurrentTab(); - } + tabSwitcher.getTabListDelegate().requestFocusOnCurrentTab(); + } + } + }; + addObserver(mTabSwitcherFocusLayoutStateObserver); + } + if (mTabContentManagerSupplier.hasValue()) { + mTabSwitcherLayout.setTabContentManager(mTabContentManagerSupplier.get()); + } + if (getTabModelSelector() != null) { + mTabSwitcherLayout.setTabModelSelector( + getTabModelSelector(), mTabContentManagerSupplier.get()); + } + if (mFinishNativeInitialization) { + mTabSwitcherLayout.onFinishNativeInitialization(); + } + } + + /** + * Creates {@link org.chromium.chrome.features.start_surface.StartSurfaceHomeLayout}. + * @param startSurface An interface to talk to the Grid Tab Switcher when Start surface refactor + * is disabled. + */ + protected void createStartSurfaceHomeLayout(@NonNull StartSurface startSurface) { + assert mStartSurfaceHomeLayout == null; + boolean isRefactorEnabled = + ReturnToChromeUtil.isStartSurfaceRefactorEnabled(mHost.getContext()); + assert isRefactorEnabled; + + Context context = mHost.getContext(); + LayoutRenderHost renderHost = mHost.getLayoutRenderHost(); + + mStartSurfaceHomeLayout = StartSurfaceDelegate.createStartSurfaceHomeLayout( + context, this, renderHost, startSurface); + + if (mTabContentManagerSupplier.hasValue()) { + mStartSurfaceHomeLayout.setTabContentManager(mTabContentManagerSupplier.get()); + } + if (getTabModelSelector() != null) { + mStartSurfaceHomeLayout.setTabModelSelector( + getTabModelSelector(), mTabContentManagerSupplier.get()); + } + if (mFinishNativeInitialization) { + mStartSurfaceHomeLayout.onFinishNativeInitialization(); + } + } + + /** + * Creates {@link org.chromium.chrome.features.start_surface.TabSwitcherAndStartSurfaceLayout} + * @param startSurface An interface to talk to the Grid Tab Switcher when Start surface refactor + * is disabled. + * @param browserControlsStateProvider The {@link BrowserControlsStateProvider} for top + * controls. + * @param scrimCoordinator scrim coordinator for GTS + * @param tabSwitcherScrimAnchor scrim anchor view for GTS + */ + protected void createTabSwitcherAndStartSurfaceLayout(@NonNull StartSurface startSurface, + BrowserControlsStateProvider browserControlsStateProvider, + ScrimCoordinator scrimCoordinator, ViewGroup tabSwitcherScrimAnchor) { + assert mOverviewLayout == null; + boolean isRefactorEnabled = + ReturnToChromeUtil.isStartSurfaceRefactorEnabled(mHost.getContext()); + assert !isRefactorEnabled; + + Context context = mHost.getContext(); + LayoutRenderHost renderHost = mHost.getLayoutRenderHost(); + + mOverviewLayout = StartSurfaceDelegate.createTabSwitcherAndStartSurfaceLayout(context, this, + renderHost, browserControlsStateProvider, startSurface, tabSwitcherScrimAnchor, + scrimCoordinator); + + if (DeviceFormFactor.isNonMultiDisplayContextOnTablet(mHost.getContext())) { + mTabSwitcherFocusLayoutStateObserver = new LayoutStateObserver() { + @Override + public void onFinishedShowing(int layoutType) { + if (layoutType == LayoutType.TAB_SWITCHER) { + startSurface.getGridTabListDelegate().requestFocusOnCurrentTab(); } } }; @@ -200,37 +293,15 @@ } if (mTabContentManagerSupplier.hasValue()) { - if (mOverviewLayout != null) { - mOverviewLayout.setTabContentManager(mTabContentManagerSupplier.get()); - } - if (mTabSwitcherLayout != null) { - mTabSwitcherLayout.setTabContentManager(mTabContentManagerSupplier.get()); - } - if (mStartSurfaceHomeLayout != null) { - mStartSurfaceHomeLayout.setTabContentManager(mTabContentManagerSupplier.get()); - } + mOverviewLayout.setTabContentManager(mTabContentManagerSupplier.get()); } if (getTabModelSelector() != null) { - if (mOverviewLayout != null) { - mOverviewLayout.setTabModelSelector( - getTabModelSelector(), mTabContentManagerSupplier.get()); - } - if (mTabSwitcherLayout != null) { - mTabSwitcherLayout.setTabModelSelector( - getTabModelSelector(), mTabContentManagerSupplier.get()); - } - if (mStartSurfaceHomeLayout != null) { - mStartSurfaceHomeLayout.setTabModelSelector( - getTabModelSelector(), mTabContentManagerSupplier.get()); - } + mOverviewLayout.setTabModelSelector( + getTabModelSelector(), mTabContentManagerSupplier.get()); } if (mFinishNativeInitialization) { - if (mOverviewLayout != null) mOverviewLayout.onFinishNativeInitialization(); - if (mTabSwitcherLayout != null) mTabSwitcherLayout.onFinishNativeInitialization(); - if (mStartSurfaceHomeLayout != null) { - mStartSurfaceHomeLayout.onFinishNativeInitialization(); - } + mOverviewLayout.onFinishNativeInitialization(); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChromeTablet.java b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChromeTablet.java index 568ef23..638260e 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChromeTablet.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/compositor/layouts/LayoutManagerChromeTablet.java
@@ -183,8 +183,9 @@ try { if (!mStartSurfaceSupplier.hasValue() && !mTabSwitcherSupplier.hasValue()) { final ViewGroup containerView = mCreateStartSurfaceCallable.call(); - createOverviewLayout(mStartSurfaceSupplier.get(), mTabSwitcherSupplier.get(), - mHost.getBrowserControlsManager(), mScrimCoordinator, containerView); + createLayoutsForStartSurfaceAndTabSwitcher(mStartSurfaceSupplier.get(), + mTabSwitcherSupplier.get(), mHost.getBrowserControlsManager(), + mScrimCoordinator, containerView); mThemeColorObserver = (color, shouldAnimate) -> containerView.setBackgroundColor(color); mTopUiThemeColorProvider = getTopUiThemeColorProvider().get();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadBroadcastManagerImpl.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadBroadcastManagerImpl.java index e04c79ad..8ace138 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadBroadcastManagerImpl.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadBroadcastManagerImpl.java
@@ -14,7 +14,6 @@ import static org.chromium.chrome.browser.download.DownloadNotificationService.EXTRA_DOWNLOAD_CONTENTID_NAMESPACE; import static org.chromium.chrome.browser.download.DownloadNotificationService.EXTRA_IS_AUTO_RESUMPTION; import static org.chromium.chrome.browser.download.DownloadNotificationService.EXTRA_IS_OFF_THE_RECORD; -import static org.chromium.chrome.browser.download.DownloadNotificationService.clearResumptionAttemptLeft; import static org.chromium.chrome.browser.notifications.NotificationConstants.EXTRA_NOTIFICATION_ID; import android.app.DownloadManager; @@ -33,7 +32,6 @@ import org.chromium.base.ContextUtils; import org.chromium.base.IntentUtils; import org.chromium.chrome.browser.download.items.OfflineContentAggregatorNotificationBridgeUiFactory; -import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.init.BrowserParts; import org.chromium.chrome.browser.init.ChromeBrowserInitializer; import org.chromium.chrome.browser.init.EmptyBrowserParts; @@ -101,9 +99,6 @@ // Remove delayed stop of service until after native library is loaded. mHandler.removeCallbacks(mStopSelfRunnable); - // Since there is a user interaction, resumption is not needed, so clear any queued. - cancelQueuedResumptions(); - // Update notification appearance immediately in case it takes a while for native to load. updateNotification(intent); @@ -112,14 +107,6 @@ } /** - * Cancel any download resumption tasks and reset the number of resumption attempts available. - */ - void cancelQueuedResumptions() { - // Reset number of attempts left if the action is triggered by user. - clearResumptionAttemptLeft(); - } - - /** * Immediately update notification appearance without changing stored notification state. * @param intent with information about the notification. */ @@ -188,8 +175,6 @@ */ @VisibleForTesting void loadNativeAndPropagateInteraction(final Intent intent) { - final boolean browserStarted = - BrowserStartupController.getInstance().isFullBrowserStarted(); final ContentId id = getContentIdFromIntent(intent); final BrowserParts parts = new EmptyBrowserParts() { @Override @@ -326,11 +311,6 @@ * @return delegate for interactions with the entry */ static DownloadServiceDelegate getServiceDelegate(ContentId id) { - if (LegacyHelpers.isLegacyDownload(id) - && !ChromeFeatureList.isEnabled( - ChromeFeatureList.DOWNLOAD_OFFLINE_CONTENT_PROVIDER)) { - return DownloadManagerService.getDownloadManagerService(); - } return OfflineContentAggregatorNotificationBridgeUiFactory.instance(); }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java index 739a738..6d53fbf 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadManagerService.java
@@ -341,8 +341,6 @@ if (!mActivityLaunched) { mMessageUiController = DownloadMessageUiControllerFactory.create(delegate); - DownloadNotificationService.clearResumptionAttemptLeft(); - DownloadManagerService.getDownloadManagerService().checkForExternallyRemovedDownloads( ProfileKey.getLastUsedRegularProfileKey()); @@ -592,7 +590,6 @@ && isSupportedMimeType(downloadItem.getDownloadInfo().getMimeType()); String id = downloadItem.getId(); DownloadProgress progress = mDownloadProgressMap.get(id); - long bytesReceived = downloadItem.getDownloadInfo().getBytesReceived(); if (progress == null) { if (!downloadItem.getDownloadInfo().isPaused()) { long startTime = System.currentTimeMillis();
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationFactory.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationFactory.java index 58005cc..d88d2e0 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationFactory.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationFactory.java
@@ -5,7 +5,6 @@ package org.chromium.chrome.browser.download; import static android.app.DownloadManager.ACTION_NOTIFICATION_CLICKED; -import static android.app.DownloadManager.EXTRA_NOTIFICATION_CLICK_DOWNLOAD_IDS; import static org.chromium.chrome.browser.download.DownloadNotificationService.ACTION_DOWNLOAD_CANCEL; import static org.chromium.chrome.browser.download.DownloadNotificationService.ACTION_DOWNLOAD_OPEN; @@ -13,9 +12,7 @@ import static org.chromium.chrome.browser.download.DownloadNotificationService.ACTION_DOWNLOAD_RESUME; import static org.chromium.chrome.browser.download.DownloadNotificationService.EXTRA_DOWNLOAD_CONTENTID_ID; import static org.chromium.chrome.browser.download.DownloadNotificationService.EXTRA_DOWNLOAD_CONTENTID_NAMESPACE; -import static org.chromium.chrome.browser.download.DownloadNotificationService.EXTRA_DOWNLOAD_FILE_PATH; import static org.chromium.chrome.browser.download.DownloadNotificationService.EXTRA_IS_OFF_THE_RECORD; -import static org.chromium.chrome.browser.download.DownloadNotificationService.EXTRA_IS_SUPPORTED_MIME_TYPE; import static org.chromium.chrome.browser.download.DownloadNotificationService.EXTRA_NOTIFICATION_BUNDLE_ICON_ID; import static org.chromium.chrome.browser.download.DownloadNotificationService.EXTRA_OTR_PROFILE_ID; @@ -30,10 +27,7 @@ import androidx.core.app.NotificationCompat; -import org.chromium.base.ContentUriUtils; import org.chromium.chrome.R; -import org.chromium.chrome.browser.flags.ChromeFeatureList; -import org.chromium.chrome.browser.media.MediaViewerUtils; import org.chromium.chrome.browser.notifications.NotificationConstants; import org.chromium.chrome.browser.notifications.NotificationUmaTracker; import org.chromium.chrome.browser.notifications.NotificationWrapperBuilderFactory; @@ -252,37 +246,8 @@ builder.setContentIntent(PendingIntentProvider.getActivity( context, 0, intent, PendingIntent.FLAG_UPDATE_CURRENT)); } else if (downloadUpdate.getIsOpenable()) { - Intent intent; - if (LegacyHelpers.isLegacyDownload(downloadUpdate.getContentId()) - && !ChromeFeatureList.isEnabled( - ChromeFeatureList.DOWNLOAD_OFFLINE_CONTENT_PROVIDER)) { - checkNotNull(downloadUpdate.getContentId()); - checkArgument(downloadUpdate.getSystemDownloadId() != -1 - || ContentUriUtils.isContentUri(downloadUpdate.getFilePath())); - - intent = new Intent(ACTION_NOTIFICATION_CLICKED); - long[] idArray = {downloadUpdate.getSystemDownloadId()}; - intent.putExtra(EXTRA_NOTIFICATION_CLICK_DOWNLOAD_IDS, idArray); - intent.putExtra(EXTRA_DOWNLOAD_FILE_PATH, downloadUpdate.getFilePath()); - intent.putExtra(EXTRA_IS_SUPPORTED_MIME_TYPE, - downloadUpdate.getIsSupportedMimeType()); - intent.putExtra( - EXTRA_IS_OFF_THE_RECORD, downloadUpdate.getIsOffTheRecord()); - intent.putExtra(EXTRA_OTR_PROFILE_ID, - OTRProfileID.serialize(downloadUpdate.getOTRProfileID())); - intent.putExtra( - EXTRA_DOWNLOAD_CONTENTID_ID, downloadUpdate.getContentId().id); - intent.putExtra(EXTRA_DOWNLOAD_CONTENTID_NAMESPACE, - downloadUpdate.getContentId().namespace); - intent.putExtra(NotificationConstants.EXTRA_NOTIFICATION_ID, - downloadUpdate.getNotificationId()); - MediaViewerUtils.setOriginalUrlAndReferralExtraToIntent(intent, - downloadUpdate.getOriginalUrl().getSpec(), - downloadUpdate.getReferrer().getSpec()); - } else { - intent = buildActionIntent( - context, ACTION_DOWNLOAD_OPEN, downloadUpdate.getContentId(), null); - } + Intent intent = buildActionIntent( + context, ACTION_DOWNLOAD_OPEN, downloadUpdate.getContentId(), null); ComponentName component = new ComponentName( context.getPackageName(), DownloadBroadcastManager.class.getName());
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java index b7312f2..385fccc 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/download/DownloadNotificationService.java
@@ -94,9 +94,6 @@ private static DownloadNotificationService sInstanceForTesting; - @VisibleForTesting - final List<ContentId> mDownloadsInProgress = new ArrayList<ContentId>(); - private NotificationManagerProxy mNotificationManager; private Bitmap mDownloadSuccessLargeIcon; private DownloadSharedPreferenceHelper mDownloadSharedPreferenceHelper; @@ -134,36 +131,6 @@ } /** - * @return Whether or not there are any current resumable downloads being tracked. These - * tracked downloads may not currently be showing notifications. - */ - static boolean isTrackingResumableDownloads(Context context) { - List<DownloadSharedPreferenceEntry> entries = - DownloadSharedPreferenceHelper.getInstance().getEntries(); - for (DownloadSharedPreferenceEntry entry : entries) { - if (canResumeDownload(context, entry)) return true; - } - return false; - } - - /** - * Track in-progress downloads here. - * @param id The {@link ContentId} of the download that has been started and should be tracked. - */ - private void startTrackingInProgressDownload(ContentId id) { - if (!mDownloadsInProgress.contains(id)) mDownloadsInProgress.add(id); - } - - /** - * Stop tracking the download represented by {@code id}. - * @param id The {@link ContentId} of the download that has been paused or - * canceled and shouldn't be tracked. - */ - private void stopTrackingInProgressDownload(ContentId id) { - mDownloadsInProgress.remove(id); - } - - /** * Adds or updates an in-progress download notification. * @param id The {@link ContentId} of the download. * @param fileName File name of the download. @@ -259,8 +226,6 @@ canDownloadWhileMetered, fileName, true, isTransient)); mDownloadForegroundServiceManager.updateDownloadStatus( context, DownloadStatus.IN_PROGRESS, notificationId, notification); - - startTrackingInProgressDownload(id); } private void cancelNotification(int notificationId) { @@ -279,8 +244,6 @@ public void cancelNotification(int notificationId, ContentId id) { cancelNotification(notificationId); mDownloadSharedPreferenceHelper.removeSharedPreferenceEntry(id); - - stopTrackingInProgressDownload(id); } /** @@ -346,7 +309,6 @@ if (isAutoResumable || pendingState != PendingState.NOT_PENDING) { notifyDownloadPending(id, fileName, otrProfileID, canDownloadWhileMetered, isTransient, icon, originalUrl, shouldPromoteOrigin, hasUserGesture, pendingState); - stopTrackingInProgressDownload(id); return; } int notificationId = entry == null ? getNotificationId(id) : entry.notificationId; @@ -371,8 +333,6 @@ mDownloadForegroundServiceManager.updateDownloadStatus( context, DownloadStatus.PAUSED, notificationId, notification); - - stopTrackingInProgressDownload(id); } /** @@ -427,7 +387,6 @@ updateNotification(notificationId, notification, id, null); mDownloadForegroundServiceManager.updateDownloadStatus( context, DownloadStatus.COMPLETED, notificationId, notification); - stopTrackingInProgressDownload(id); return notificationId; } @@ -471,8 +430,6 @@ updateNotification(notificationId, notification, id, null); mDownloadForegroundServiceManager.updateDownloadStatus( context, DownloadStatus.FAILED, notificationId, notification); - - stopTrackingInProgressDownload(id); } private Bitmap getLargeNotificationIcon(Bitmap bitmap) { @@ -593,30 +550,6 @@ return newNotificationId; } - /** - * Helper method to update the remaining number of background resumption attempts left. - * - * @param numAutoResumptionAttemptLeft the number of auto resumption attempts left. - */ - private static void updateResumptionAttemptLeft(int numAutoResumptionAttemptLeft) { - SharedPreferencesManager.getInstance().writeInt( - ChromePreferenceKeys.DOWNLOAD_AUTO_RESUMPTION_ATTEMPT_LEFT, - numAutoResumptionAttemptLeft); - } - - /** Helper method to get the remaining number of background resumption attempts left. */ - private static int getResumptionAttemptLeft() { - return SharedPreferencesManager.getInstance().readInt( - ChromePreferenceKeys.DOWNLOAD_AUTO_RESUMPTION_ATTEMPT_LEFT, - MAX_RESUMPTION_ATTEMPT_LEFT); - } - - /** Helper method to clear the remaining number of background resumption attempts left. */ - static void clearResumptionAttemptLeft() { - SharedPreferencesManager.getInstance().removeKey( - ChromePreferenceKeys.DOWNLOAD_AUTO_RESUMPTION_ATTEMPT_LEFT); - } - void onForegroundServiceTaskRemoved() { // If we've lost all Activities, cancel the off the record downloads. if (ApplicationStatus.isEveryActivityDestroyed()) {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/homepage/HomepageManager.java b/chrome/android/java/src/org/chromium/chrome/browser/homepage/HomepageManager.java index 1e0ce823..8c65cb9c1 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/homepage/HomepageManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/homepage/HomepageManager.java
@@ -5,7 +5,6 @@ package org.chromium.chrome.browser.homepage; import android.content.Context; -import android.text.TextUtils; import androidx.annotation.NonNull; import androidx.annotation.Nullable; @@ -125,50 +124,50 @@ */ public static boolean shouldCloseAppWithZeroTabs() { return HomepageManager.isHomepageEnabled() - && !UrlUtilities.isNTPUrl(HomepageManager.getHomepageUri()); + && !UrlUtilities.isNTPUrl(HomepageManager.getHomepageGurl()); } /** - * Get the current homepage URI string. If the homepage is disabled, return null; otherwise it - * will always return a non-empty string. In cases when the homepage is specifically set as - * empty, this function will fallback to return {@link UrlConstants.NTP_URL}. If the default - * search engine (DSE) isn't Google, may fallback to the DSE's new Tab URL. + * Get the current homepage URI. If the homepage is disabled, return an empty GURL; otherwise it + * will always return a non-empty GURL. In cases when the homepage is specifically set as + * empty, this function will fallback to return {@link ChromeUrlConstants.nativeNtpGurl()}. + * If the default search engine (DSE) isn't Google, may fallback to the DSE's new Tab URL. * * This function needs to be called on UI thread since Profile.getLastUsedRegularProfile() is * called. * - * This function checks different source to get the current homepage, which listed below + * This function checks different sources to get the current homepage, which is listed below * according to their priority: * - * <b>isManagedByPolicy > useChromeNTP > useDefaultUri > useCustomUri</b> + * <b>isManagedByPolicy > useChromeNTP > useDefaultGurl > useCustomGurl</b> * - * @return A non-empty homepage URI string, if homepage is enabled. Null otherwise. + * @return A non-empty GURL, if homepage is enabled. An empty GURL otherwise. * * @see HomepagePolicyManager#isHomepageManagedByPolicy() * @see #getPrefHomepageUseChromeNTP() * @see #getPrefHomepageUseDefaultUri() */ - public static @Nullable String getHomepageUri() { - if (!isHomepageEnabled()) return null; + public static @Nullable GURL getHomepageGurl() { + if (!isHomepageEnabled()) return GURL.emptyGURL(); - String homepageUri = getInstance().getHomepageUriIgnoringEnabledState().getSpec(); - if (TextUtils.isEmpty(homepageUri)) { - homepageUri = UrlConstants.NTP_URL; + GURL homepageGurl = getInstance().getHomepageGurlIgnoringEnabledState(); + if (homepageGurl.isEmpty()) { + homepageGurl = ChromeUrlConstants.nativeNtpGurl(); } // We have to use Profile.getLastUsedRegularProfile() to get the last used regular Profile // before HomepageManager supports multiple Profiles. Thus, if DSE isn't Google, pressing // the home button may redirect to the DSE's new Tab URL, rather than showing an incognito // NTP. - return DseNewTabUrlManager.maybeGetOverrideUrl(homepageUri, + return DseNewTabUrlManager.maybeGetOverrideUrl(homepageGurl, ProfileManager.isInitialized() ? Profile.getLastUsedRegularProfile() : null); } /** - * @return The default homepage URI if the homepage is partner provided or the new tab page - * if the homepage button is force enabled via flag. + * @return A GURL for the default homepage URI if the homepage is partner provided, or the new + * tab page if the homepage button is force enabled via flag. */ - public static GURL getDefaultHomepageUri() { + public static GURL getDefaultHomepageGurl() { if (PartnerBrowserCustomizations.getInstance().isHomepageProviderAvailableAndEnabled()) { return PartnerBrowserCustomizations.getInstance().getHomePageUrl(); } @@ -204,28 +203,15 @@ * @return Whether the current homepage is something other than the NTP. */ public static boolean isHomepageNonNtp() { - String currentHomepage = getHomepageUri(); - return !TextUtils.isEmpty(currentHomepage) && !UrlUtilities.isNTPUrl(currentHomepage); - } - - /** - * Determines whether the homepage is set to something other than the NTP or empty/null. This is - * the same as {@link #isHomepageNonNtp()}, but uses {@link UrlUtilities#isCanonicalizedNTPUrl} - * instead of {@link UrlUtilities#isNTPUrl} to make it possible to use before native is loaded. - * Prefer {@link #isHomepageNonNtp()} if possible. - * @return Whether the current homepage is something other than the NTP. - */ - public static boolean isHomepageNonNtpPreNative() { - String currentHomepage = getHomepageUri(); - return !TextUtils.isEmpty(currentHomepage) - && !UrlUtilities.isCanonicalizedNTPUrl(currentHomepage); + GURL currentHomepage = getHomepageGurl(); + return !currentHomepage.isEmpty() && !UrlUtilities.isNTPUrl(currentHomepage); } /** * Get homepage URI without checking if the homepage is enabled. - * @return Homepage URI based on policy and shared preference settings. + * @return Homepage GURL based on policy and shared preference settings. */ - private @NonNull GURL getHomepageUriIgnoringEnabledState() { + private @NonNull GURL getHomepageGurlIgnoringEnabledState() { if (HomepagePolicyManager.isHomepageManagedByPolicy()) { return HomepagePolicyManager.getHomepageUrl(); } @@ -233,9 +219,9 @@ return ChromeUrlConstants.nativeNtpGurl(); } if (getPrefHomepageUseDefaultUri()) { - return getDefaultHomepageUri(); + return getDefaultHomepageGurl(); } - return getPrefHomepageCustomUri(); + return getPrefHomepageCustomGurl(); } /** @@ -257,9 +243,9 @@ } /** - * @return User specified homepage custom URI string. + * @return User specified homepage custom GURL. */ - public GURL getPrefHomepageCustomUri() { + public GURL getPrefHomepageCustomGurl() { String homepageCustomGurlSerialized = mSharedPreferencesManager.readString(ChromePreferenceKeys.HOMEPAGE_CUSTOM_GURL, ""); if (!homepageCustomGurlSerialized.equals("")) { @@ -303,22 +289,22 @@ * These shared preference values will reflect what homepage we are using. * * The priority of the input pref values during value checking: - * useChromeNTP > useDefaultUri > customUri + * useChromeNTP > useDefaultGurl > customGurl * * @param useChromeNtp True if homepage is set as Chrome's New tab page. - * @param useDefaultUri True if homepage is using default URI. - * @param customUri String value for user customized homepage URI. + * @param useDefaultGurl True if homepage is using default URI. + * @param customGurl A GURL for the user customized homepage URI. * - * @see #getHomepageUri() + * @see #getHomepageGurl() */ public void setHomepagePreferences( - boolean useChromeNtp, boolean useDefaultUri, GURL customUri) { + boolean useChromeNtp, boolean useDefaultGurl, GURL customGurl) { boolean wasUseChromeNTP = getPrefHomepageUseChromeNTP(); boolean wasUseDefaultUri = getPrefHomepageUseDefaultUri(); - GURL oldCustomUri = getPrefHomepageCustomUri(); + GURL oldCustomGurl = getPrefHomepageCustomGurl(); - if (useChromeNtp == wasUseChromeNTP && useDefaultUri == wasUseDefaultUri - && oldCustomUri.equals(customUri)) { + if (useChromeNtp == wasUseChromeNTP && useDefaultGurl == wasUseDefaultUri + && oldCustomGurl.equals(customGurl)) { return; } @@ -327,14 +313,14 @@ ChromePreferenceKeys.HOMEPAGE_USE_CHROME_NTP, useChromeNtp); } - if (wasUseDefaultUri != useDefaultUri) { + if (wasUseDefaultUri != useDefaultGurl) { mSharedPreferencesManager.writeBoolean( - ChromePreferenceKeys.HOMEPAGE_USE_DEFAULT_URI, useDefaultUri); + ChromePreferenceKeys.HOMEPAGE_USE_DEFAULT_URI, useDefaultGurl); } - if (!oldCustomUri.equals(customUri)) { + if (!oldCustomGurl.equals(customGurl)) { mSharedPreferencesManager.writeString( - ChromePreferenceKeys.HOMEPAGE_CUSTOM_GURL, customUri.serialize()); + ChromePreferenceKeys.HOMEPAGE_CUSTOM_GURL, customGurl.serialize()); } RecordUserAction.record("Settings.Homepage.LocationChanged_V2"); @@ -377,7 +363,7 @@ : HomepageLocationType.PARTNER_PROVIDED_OTHER; } // If user type NTP URI as their customized homepage, we'll record user is using NTP - return UrlUtilities.isNTPUrl(getPrefHomepageCustomUri()) + return UrlUtilities.isNTPUrl(getPrefHomepageCustomGurl()) ? HomepageLocationType.USER_CUSTOMIZED_NTP : HomepageLocationType.USER_CUSTOMIZED_OTHER; }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/homepage/settings/HomepageSettings.java b/chrome/android/java/src/org/chromium/chrome/browser/homepage/settings/HomepageSettings.java index b11c9d2..d6d7f0c2 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/homepage/settings/HomepageSettings.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/homepage/settings/HomepageSettings.java
@@ -111,7 +111,7 @@ if (!newHomepage.isValid()) { newHomepage = GURL.emptyGURL(); } - boolean useDefaultUri = HomepageManager.getDefaultHomepageUri().equals(newHomepage); + boolean useDefaultUri = HomepageManager.getDefaultHomepageGurl().equals(newHomepage); mHomepageManager.setHomepagePreferences(setToUseNTP, useDefaultUri, newHomepage); } @@ -124,17 +124,17 @@ return HomepagePolicyManager.getHomepageUrl(); } - GURL defaultUrl = HomepageManager.getDefaultHomepageUri(); - GURL customUrl = mHomepageManager.getPrefHomepageCustomUri(); + GURL defaultGurl = HomepageManager.getDefaultHomepageGurl(); + GURL customGurl = mHomepageManager.getPrefHomepageCustomGurl(); if (mHomepageManager.getPrefHomepageUseDefaultUri()) { - return UrlUtilities.isNTPUrl(defaultUrl) ? GURL.emptyGURL() : defaultUrl; + return UrlUtilities.isNTPUrl(defaultGurl) ? GURL.emptyGURL() : defaultGurl; } - if (customUrl.isEmpty() && !UrlUtilities.isNTPUrl(defaultUrl)) { - return defaultUrl; + if (customGurl.isEmpty() && !UrlUtilities.isNTPUrl(defaultGurl)) { + return defaultGurl; } - return customUrl; + return customGurl; } private PreferenceValues createPreferenceValuesForRadioGroup() { @@ -149,7 +149,7 @@ } else { shouldCheckNTP = mHomepageManager.getPrefHomepageUseChromeNTP() || (mHomepageManager.getPrefHomepageUseDefaultUri() - && UrlUtilities.isNTPUrl(HomepageManager.getDefaultHomepageUri())); + && UrlUtilities.isNTPUrl(HomepageManager.getDefaultHomepageGurl())); } @HomepageOption
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java index f6fdc2d..1b5fd972 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/init/ProcessInitializationHandler.java
@@ -115,6 +115,7 @@ import org.chromium.ui.base.PhotoPickerListener; import org.chromium.ui.base.SelectFileDialog; import org.chromium.ui.base.WindowAndroid; +import org.chromium.url.GURL; import java.io.File; import java.nio.charset.StandardCharsets; @@ -176,8 +177,6 @@ * Performs the shared class initialization. */ protected void handlePreNativeInitialization() { - Context application = ContextUtils.getApplicationContext(); - // Initialize the AccountManagerFacade with the correct AccountManagerDelegate. Must be done // only once and before AccountManagerFacadeProvider.getInstance() is invoked. AccountManagerFacadeProvider.setInstance( @@ -337,10 +336,10 @@ new Runnable() { @Override public void run() { - String homepageUrl = HomepageManager.getHomepageUri(); + GURL homepageGurl = HomepageManager.getHomepageGurl(); LaunchMetrics.recordHomePageLaunchMetrics( HomepageManager.isHomepageEnabled(), - UrlUtilities.isNTPUrl(homepageUrl), homepageUrl); + UrlUtilities.isNTPUrl(homepageGurl), homepageGurl); } });
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/metrics/LaunchMetrics.java b/chrome/android/java/src/org/chromium/chrome/browser/metrics/LaunchMetrics.java index 40f30858..d420163 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/metrics/LaunchMetrics.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/metrics/LaunchMetrics.java
@@ -14,6 +14,7 @@ import org.chromium.chrome.browser.webapps.WebappRegistry; import org.chromium.components.webapps.ShortcutSource; import org.chromium.content_public.browser.WebContents; +import org.chromium.url.GURL; import java.util.ArrayList; import java.util.List; @@ -97,16 +98,15 @@ * Records metrics about the state of the homepage on launch. * @param showHomeButton Whether the home button is shown. * @param homepageIsNtp Whether the homepage is set to the NTP. - * @param homepageUrl The value of the homepage URL. + * @param homepageUrl The homepage GURL. */ public static void recordHomePageLaunchMetrics( - boolean showHomeButton, boolean homepageIsNtp, String homepageUrl) { - if (homepageUrl == null) { - homepageUrl = ""; - assert !showHomeButton : "Homepage should be disabled for a null URL"; + boolean showHomeButton, boolean homepageIsNtp, GURL homepageGurl) { + if (homepageGurl.isEmpty()) { + assert !showHomeButton : "Homepage should be disabled for an empty GURL"; } LaunchMetricsJni.get().recordHomePageLaunchMetrics( - showHomeButton, homepageIsNtp, homepageUrl); + showHomeButton, homepageIsNtp, homepageGurl); } /** @@ -134,6 +134,6 @@ void recordLaunch(boolean isShortcut, String url, int source, @DisplayMode.EnumType int displayMode, WebContents webContents); void recordHomePageLaunchMetrics( - boolean showHomeButton, boolean homepageIsNtp, String homepageUrl); + boolean showHomeButton, boolean homepageIsNtp, GURL homepageGurl); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/modaldialog/TabModalLifetimeHandler.java b/chrome/android/java/src/org/chromium/chrome/browser/modaldialog/TabModalLifetimeHandler.java index 937f538d..ab52076a 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/modaldialog/TabModalLifetimeHandler.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/modaldialog/TabModalLifetimeHandler.java
@@ -198,7 +198,8 @@ } private boolean shouldInterceptBackPress() { - return mPresenter != null && mPresenter.getDialogModel() != null; + return mPresenter != null && mPresenter.getDialogModel() != null + && mTabModalSuspendedToken == TokenHolder.INVALID_TOKEN; } private void handleTabChanged(Tab tab) { @@ -244,5 +245,6 @@ } else if (mTabModalSuspendedToken == TokenHolder.INVALID_TOKEN) { mTabModalSuspendedToken = mManager.suspendType(ModalDialogType.TAB); } + mHandleBackPressChangedSupplier.set(shouldInterceptBackPress()); } }
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/new_tab_url/DseNewTabUrlManager.java b/chrome/android/java/src/org/chromium/chrome/browser/new_tab_url/DseNewTabUrlManager.java index 69096472..711ac59 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/new_tab_url/DseNewTabUrlManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/new_tab_url/DseNewTabUrlManager.java
@@ -76,17 +76,17 @@ * @param url The URL to check. * @param profile The instance of the current {@link Profile}. */ - public static String maybeGetOverrideUrl(String url, Profile profile) { + public static GURL maybeGetOverrideUrl(GURL gurl, Profile profile) { if ((profile != null && profile.isOffTheRecord()) || !isNewTabSearchEngineUrlAndroidEnabled() || isDefaultSearchEngineGoogle() - || !UrlUtilities.isNTPUrl(url)) { - return url; + || !UrlUtilities.isNTPUrl(gurl)) { + return gurl; } TemplateUrlService templateUrlService = profile != null ? TemplateUrlServiceFactory.getForProfile(profile) : null; String newTabUrl = getDSENewTabUrl(templateUrlService); - return newTabUrl != null ? newTabUrl : url; + return newTabUrl != null ? new GURL(newTabUrl) : gurl; } /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/tasks/ReturnToChromeUtil.java b/chrome/android/java/src/org/chromium/chrome/browser/tasks/ReturnToChromeUtil.java index a3f2b59..ddce672c 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/tasks/ReturnToChromeUtil.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/tasks/ReturnToChromeUtil.java
@@ -82,6 +82,7 @@ import org.chromium.content_public.common.ResourceRequestBody; import org.chromium.ui.base.DeviceFormFactor; import org.chromium.ui.base.PageTransition; +import org.chromium.url.GURL; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; @@ -488,12 +489,11 @@ */ @VisibleForTesting public static boolean useChromeHomepage() { - String homePageUrl = HomepageManager.getHomepageUri(); + GURL homePageGurl = HomepageManager.getHomepageGurl(); return HomepageManager.isHomepageEnabled() && ((HomepagePolicyManager.isInitializedWithNative() || sSkipInitializationCheckForTesting) - && (TextUtils.isEmpty(homePageUrl) - || UrlUtilities.isCanonicalizedNTPUrl(homePageUrl))); + && (homePageGurl.isEmpty() || UrlUtilities.isNTPUrl(homePageGurl))); } /**
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java index bb41ce5..5fe91f1 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/toolbar/ToolbarManager.java
@@ -12,7 +12,6 @@ import android.graphics.Rect; import android.graphics.drawable.Drawable; import android.os.Handler; -import android.text.TextUtils; import android.view.MotionEvent; import android.view.View; import android.view.View.OnAttachStateChangeListener; @@ -1744,9 +1743,12 @@ @VisibleForTesting static String homepageUrl() { - String homePageUrl = HomepageManager.getHomepageUri(); - if (TextUtils.isEmpty(homePageUrl)) homePageUrl = UrlConstants.NTP_URL; - return homePageUrl; + GURL homepageGurl = HomepageManager.getHomepageGurl(); + if (homepageGurl.isEmpty()) { + return UrlConstants.NTP_URL; + } else { + return homepageGurl.getSpec(); + } } private void registerTemplateUrlObserver() {
diff --git a/chrome/android/java/src/org/chromium/chrome/browser/ui/AppLaunchDrawBlocker.java b/chrome/android/java/src/org/chromium/chrome/browser/ui/AppLaunchDrawBlocker.java index 721f6da..17894122 100644 --- a/chrome/android/java/src/org/chromium/chrome/browser/ui/AppLaunchDrawBlocker.java +++ b/chrome/android/java/src/org/chromium/chrome/browser/ui/AppLaunchDrawBlocker.java
@@ -201,7 +201,7 @@ boolean isNtpUrl = UrlUtilities.isCanonicalizedNTPUrl(url); boolean shouldBlockWithoutIntent = shouldBlockDrawForNtpOnColdStartWithoutIntent( - tabState, HomepageManager.isHomepageNonNtpPreNative(), singleUrlBarMode); + tabState, HomepageManager.isHomepageNonNtp(), singleUrlBarMode); if (shouldBlockDrawForNtpOnColdStartWithIntent(hasValidIntentUrl, isNtpUrl, IncognitoTabLauncher.didCreateIntent(mIntentSupplier.get()),
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadNotificationServiceTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadNotificationServiceTest.java index 400784d..dd81e62e 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadNotificationServiceTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/download/DownloadNotificationServiceTest.java
@@ -104,7 +104,6 @@ Features.getInstance().disable(ChromeFeatureList.OFFLINE_PAGES_DESCRIPTIVE_FAIL_STATUS); } TestThreadUtils.runOnUiThreadBlocking(() -> { - DownloadNotificationService.clearResumptionAttemptLeft(); mDownloadNotificationService = new MockDownloadNotificationService(); mDownloadForegroundServiceManager = new DownloadForegroundServiceManagerTest.MockDownloadForegroundServiceManager(); @@ -116,7 +115,6 @@ @After public void tearDown() { - DownloadNotificationService.clearResumptionAttemptLeft(); SharedPreferencesManager.getInstance().removeKey( ChromePreferenceKeys.DOWNLOAD_PENDING_DOWNLOAD_NOTIFICATIONS); } @@ -136,7 +134,6 @@ int notificationId1 = mDownloadNotificationService.getLastNotificationId(); assertTrue(mDownloadForegroundServiceManager.mDownloadUpdateQueue.containsKey( notificationId1)); - assertTrue(mDownloadNotificationService.mDownloadsInProgress.contains(ID1)); // Download is paused. mDownloadNotificationService.notifyDownloadPaused(ID1, "test", true /* isResumable*/, @@ -146,7 +143,6 @@ assertEquals(1, mDownloadNotificationService.getNotificationIds().size()); assertFalse(mDownloadForegroundServiceManager.mDownloadUpdateQueue.containsKey( notificationId1)); - assertFalse(mDownloadNotificationService.mDownloadsInProgress.contains(ID1)); // Download is again in-progress. mDownloadNotificationService.notifyDownloadProgress(ID1, "test", @@ -157,7 +153,6 @@ assertEquals(1, mDownloadNotificationService.getNotificationIds().size()); assertTrue(mDownloadForegroundServiceManager.mDownloadUpdateQueue.containsKey( notificationId1)); - assertTrue(mDownloadNotificationService.mDownloadsInProgress.contains(ID1)); // Download is successful. mDownloadNotificationService.notifyDownloadSuccessful(ID1, "", "test", 1L, @@ -166,7 +161,6 @@ assertEquals(1, mDownloadNotificationService.getNotificationIds().size()); assertFalse(mDownloadForegroundServiceManager.mDownloadUpdateQueue.containsKey( notificationId1)); - assertFalse(mDownloadNotificationService.mDownloadsInProgress.contains(ID1)); } @Test @@ -184,7 +178,6 @@ int notificationId1 = mDownloadNotificationService.getLastNotificationId(); assertTrue(mDownloadForegroundServiceManager.mDownloadUpdateQueue.containsKey( notificationId1)); - assertTrue(mDownloadNotificationService.mDownloadsInProgress.contains(ID1)); // Download is interrupted and now is pending. mDownloadNotificationService.notifyDownloadPaused(ID1, "test", true /* isResumable */, @@ -193,7 +186,6 @@ assertEquals(1, mDownloadNotificationService.getNotificationIds().size()); assertTrue(mDownloadForegroundServiceManager.mDownloadUpdateQueue.containsKey( notificationId1)); - assertFalse(mDownloadNotificationService.mDownloadsInProgress.contains(ID1)); // Download is cancelled. mDownloadNotificationService.notifyDownloadCanceled(ID1, false); @@ -201,7 +193,6 @@ assertEquals(0, mDownloadNotificationService.getNotificationIds().size()); assertFalse(mDownloadForegroundServiceManager.mDownloadUpdateQueue.containsKey( notificationId1)); - assertFalse(mDownloadNotificationService.mDownloadsInProgress.contains(ID1)); } @Test @@ -219,7 +210,6 @@ int notificationId1 = mDownloadNotificationService.getLastNotificationId(); assertTrue(mDownloadForegroundServiceManager.mDownloadUpdateQueue.containsKey( notificationId1)); - assertTrue(mDownloadNotificationService.mDownloadsInProgress.contains(ID1)); // Download is interrupted but because it is not resumable, fails. mDownloadNotificationService.notifyDownloadPaused(ID1, "test", false /* isResumable*/, @@ -228,6 +218,5 @@ assertEquals(1, mDownloadNotificationService.getNotificationIds().size()); assertFalse(mDownloadForegroundServiceManager.mDownloadUpdateQueue.containsKey( notificationId1)); - assertFalse(mDownloadNotificationService.mDownloadsInProgress.contains(ID1)); } }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/homepage/HomepagePolicyIntegrationTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/homepage/HomepagePolicyIntegrationTest.java index c7eae3c..5348f234 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/homepage/HomepagePolicyIntegrationTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/homepage/HomepagePolicyIntegrationTest.java
@@ -187,7 +187,8 @@ private String getHomepageUrlOnUiThread() { AtomicReference<String> res = new AtomicReference<>(); - TestThreadUtils.runOnUiThreadBlocking(() -> { res.set(HomepageManager.getHomepageUri()); }); + TestThreadUtils.runOnUiThreadBlocking( + () -> { res.set(HomepageManager.getHomepageGurl().getSpec()); }); return res.get(); } }
diff --git a/chrome/android/javatests/src/org/chromium/chrome/browser/partnercustomizations/PartnerHomepageUnitTest.java b/chrome/android/javatests/src/org/chromium/chrome/browser/partnercustomizations/PartnerHomepageUnitTest.java index 18c7828d..512c9f9 100644 --- a/chrome/android/javatests/src/org/chromium/chrome/browser/partnercustomizations/PartnerHomepageUnitTest.java +++ b/chrome/android/javatests/src/org/chromium/chrome/browser/partnercustomizations/PartnerHomepageUnitTest.java
@@ -22,16 +22,15 @@ import org.chromium.base.test.util.DisabledTest; import org.chromium.base.test.util.DoNotBatch; import org.chromium.base.test.util.Feature; +import org.chromium.chrome.browser.common.ChromeUrlConstants; import org.chromium.chrome.browser.homepage.HomepageManager; import org.chromium.chrome.browser.homepage.HomepageTestRule; import org.chromium.chrome.test.ChromeJUnit4ClassRunner; import org.chromium.chrome.test.partnercustomizations.TestPartnerBrowserCustomizationsDelayedProvider; import org.chromium.chrome.test.partnercustomizations.TestPartnerBrowserCustomizationsProvider; import org.chromium.chrome.test.util.browser.Features; -import org.chromium.components.embedder_support.util.UrlConstants; import org.chromium.content_public.browser.test.util.TestThreadUtils; import org.chromium.url.GURL; -import org.chromium.url.JUnitTestGURLs; /** * Unit test suite for partner homepage. @@ -51,7 +50,7 @@ public static final String TAG = "PartnerHomepageUnitTest"; - private static final GURL TEST_CUSTOM_HOMEPAGE_GURL = JUnitTestGURLs.EXAMPLE_URL; + private static final GURL TEST_CUSTOM_HOMEPAGE_GURL = new GURL("http://chrome.com"); private HomepageManager mHomepageManager; private PartnerBrowserCustomizations mPartnerBrowserCustomizations; @@ -174,7 +173,7 @@ Assert.assertEquals(TestPartnerBrowserCustomizationsProvider.HOMEPAGE_URI, mPartnerBrowserCustomizations.getHomePageUrl().getSpec()); Assert.assertFalse(HomepageManager.isHomepageEnabled()); - Assert.assertNull(HomepageManager.getHomepageUri()); + Assert.assertTrue(HomepageManager.getHomepageGurl().isEmpty()); } /** @@ -206,7 +205,7 @@ Assert.assertEquals(TestPartnerBrowserCustomizationsProvider.HOMEPAGE_URI, mPartnerBrowserCustomizations.getHomePageUrl().getSpec()); Assert.assertTrue(HomepageManager.isHomepageEnabled()); - Assert.assertEquals(TEST_CUSTOM_HOMEPAGE_GURL.getSpec(), HomepageManager.getHomepageUri()); + Assert.assertEquals(TEST_CUSTOM_HOMEPAGE_GURL, HomepageManager.getHomepageGurl()); } /** @@ -236,7 +235,7 @@ Assert.assertFalse(mPartnerBrowserCustomizations.isHomepageProviderAvailableAndEnabled()); Assert.assertNull(mPartnerBrowserCustomizations.getHomePageUrl()); Assert.assertFalse(HomepageManager.isHomepageEnabled()); - Assert.assertNull(HomepageManager.getHomepageUri()); + Assert.assertTrue(HomepageManager.getHomepageGurl().isEmpty()); mPartnerBrowserCustomizations.setOnInitializeAsyncFinished(mTestRule.getCallback(), 2000); @@ -279,7 +278,7 @@ Assert.assertFalse(mPartnerBrowserCustomizations.isHomepageProviderAvailableAndEnabled()); Assert.assertNull(mPartnerBrowserCustomizations.getHomePageUrl()); Assert.assertFalse(HomepageManager.isHomepageEnabled()); - Assert.assertNull(HomepageManager.getHomepageUri()); + Assert.assertTrue(HomepageManager.getHomepageGurl().isEmpty()); mPartnerBrowserCustomizations.setOnInitializeAsyncFinished(mTestRule.getCallback(), 3000); @@ -291,7 +290,7 @@ mPartnerBrowserCustomizations.getHomePageUrl().getSpec()); Assert.assertTrue(HomepageManager.isHomepageEnabled()); Assert.assertEquals(TestPartnerBrowserCustomizationsDelayedProvider.HOMEPAGE_URI, - HomepageManager.getHomepageUri()); + HomepageManager.getHomepageGurl().getSpec()); } /** @@ -324,12 +323,12 @@ mPartnerBrowserCustomizations.getHomePageUrl().getSpec()); Assert.assertTrue(HomepageManager.isHomepageEnabled()); Assert.assertEquals(TestPartnerBrowserCustomizationsProvider.HOMEPAGE_URI, - HomepageManager.getHomepageUri()); + HomepageManager.getHomepageGurl().getSpec()); } private void assertHomePageIsNtp() { // The home page should default to the NTP Assert.assertTrue(HomepageManager.isHomepageEnabled()); - Assert.assertEquals(UrlConstants.NTP_URL, HomepageManager.getHomepageUri()); + Assert.assertEquals(ChromeUrlConstants.nativeNtpGurl(), HomepageManager.getHomepageGurl()); } }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/homepage/HomepageManagerTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/homepage/HomepageManagerTest.java index 7eae328..73cdb5f 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/homepage/HomepageManagerTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/homepage/HomepageManagerTest.java
@@ -6,8 +6,6 @@ import static org.mockito.Mockito.doReturn; -import androidx.test.filters.SmallTest; - import org.junit.After; import org.junit.Assert; import org.junit.Before; @@ -35,7 +33,6 @@ import org.chromium.chrome.browser.search_engines.TemplateUrlServiceFactory; import org.chromium.chrome.test.util.browser.Features; import org.chromium.chrome.test.util.browser.Features.EnableFeatures; -import org.chromium.components.embedder_support.util.UrlConstants; import org.chromium.components.embedder_support.util.UrlUtilities; import org.chromium.components.search_engines.TemplateUrl; import org.chromium.components.search_engines.TemplateUrlService; @@ -129,7 +126,7 @@ } @Test - public void testGetDefaultHomepageUriPreferenceKeysMigration() { + public void testGetDefaultHomepageGurlPreferenceKeysMigration() { Mockito.doNothing() .when(mPartnerBrowserCustomizations) .setPartnerHomepageListener(ArgumentMatchers.any()); @@ -142,7 +139,7 @@ SharedPreferencesManager.getInstance().writeString( ChromePreferenceKeys.HOMEPAGE_PARTNER_CUSTOMIZED_DEFAULT_GURL, null); Assert.assertEquals( - ChromeUrlConstants.nativeNtpGurl(), HomepageManager.getDefaultHomepageUri()); + ChromeUrlConstants.nativeNtpGurl(), HomepageManager.getDefaultHomepageGurl()); final GURL blueUrl = JUnitTestGURLs.BLUE_1; SharedPreferencesManager.getInstance().writeString( @@ -150,7 +147,7 @@ blueUrl.getSpec()); SharedPreferencesManager.getInstance().writeString( ChromePreferenceKeys.HOMEPAGE_PARTNER_CUSTOMIZED_DEFAULT_GURL, null); - Assert.assertEquals(blueUrl, HomepageManager.getDefaultHomepageUri()); + Assert.assertEquals(blueUrl, HomepageManager.getDefaultHomepageGurl()); final GURL redUrl = JUnitTestGURLs.RED_1; final String serializedRedGurl = redUrl.serialize(); @@ -158,7 +155,7 @@ ChromePreferenceKeys.DEPRECATED_HOMEPAGE_PARTNER_CUSTOMIZED_DEFAULT_URI, null); SharedPreferencesManager.getInstance().writeString( ChromePreferenceKeys.HOMEPAGE_PARTNER_CUSTOMIZED_DEFAULT_GURL, serializedRedGurl); - Assert.assertEquals(redUrl, HomepageManager.getDefaultHomepageUri()); + Assert.assertEquals(redUrl, HomepageManager.getDefaultHomepageGurl()); final GURL url1 = JUnitTestGURLs.URL_1; final GURL url2 = JUnitTestGURLs.URL_2; @@ -168,57 +165,55 @@ url1.getSpec()); SharedPreferencesManager.getInstance().writeString( ChromePreferenceKeys.HOMEPAGE_PARTNER_CUSTOMIZED_DEFAULT_GURL, serializedGurl2); - Assert.assertEquals(url2, HomepageManager.getDefaultHomepageUri()); + Assert.assertEquals(url2, HomepageManager.getDefaultHomepageGurl()); } @Test - public void testGetPrefHomepageCustomUriPreferenceKeysMigration() { + public void testGetPrefHomepageCustomGurlPreferenceKeysMigration() { HomepageManager homepageManager = HomepageManager.getInstance(); SharedPreferencesManager.getInstance().writeString( ChromePreferenceKeys.DEPRECATED_HOMEPAGE_CUSTOM_URI, null); SharedPreferencesManager.getInstance().writeString( ChromePreferenceKeys.HOMEPAGE_CUSTOM_GURL, null); - Assert.assertTrue(homepageManager.getPrefHomepageCustomUri().isEmpty()); + Assert.assertTrue(homepageManager.getPrefHomepageCustomGurl().isEmpty()); final GURL blueUrl = JUnitTestGURLs.BLUE_1; SharedPreferencesManager.getInstance().writeString( ChromePreferenceKeys.DEPRECATED_HOMEPAGE_CUSTOM_URI, blueUrl.getSpec()); SharedPreferencesManager.getInstance().writeString( ChromePreferenceKeys.HOMEPAGE_CUSTOM_GURL, null); - Assert.assertEquals(blueUrl, homepageManager.getPrefHomepageCustomUri()); + Assert.assertEquals(blueUrl, homepageManager.getPrefHomepageCustomGurl()); final GURL redUrl = JUnitTestGURLs.RED_1; SharedPreferencesManager.getInstance().writeString( ChromePreferenceKeys.DEPRECATED_HOMEPAGE_CUSTOM_URI, null); SharedPreferencesManager.getInstance().writeString( ChromePreferenceKeys.HOMEPAGE_CUSTOM_GURL, redUrl.serialize()); - Assert.assertEquals(redUrl, homepageManager.getPrefHomepageCustomUri()); + Assert.assertEquals(redUrl, homepageManager.getPrefHomepageCustomGurl()); final GURL url1 = JUnitTestGURLs.URL_1; SharedPreferencesManager.getInstance().writeString( ChromePreferenceKeys.DEPRECATED_HOMEPAGE_CUSTOM_URI, redUrl.serialize()); SharedPreferencesManager.getInstance().writeString( ChromePreferenceKeys.HOMEPAGE_CUSTOM_GURL, url1.serialize()); - Assert.assertEquals(url1, homepageManager.getPrefHomepageCustomUri()); + Assert.assertEquals(url1, homepageManager.getPrefHomepageCustomGurl()); } @Test - @SmallTest @EnableFeatures({ChromeFeatureList.NEW_TAB_SEARCH_ENGINE_URL_ANDROID}) public void testOverrideNtpHomepage() { ShadowHomepagePolicyManager.sHomepageUrl = GURL.emptyGURL(); Assert.assertNull(DseNewTabUrlManager.getDSENewTabUrl(null)); - Assert.assertEquals(UrlConstants.NTP_URL, HomepageManager.getHomepageUri()); + Assert.assertEquals(ChromeUrlConstants.nativeNtpGurl(), HomepageManager.getHomepageGurl()); TemplateUrlService templateUrlService = Mockito.mock(TemplateUrlService.class); initializeProfile(false, templateUrlService); - HomepageManager.getHomepageUri(); Assert.assertEquals(JUnitTestGURLs.SEARCH_URL.getSpec(), DseNewTabUrlManager.getDSENewTabUrl(templateUrlService)); - Assert.assertEquals(JUnitTestGURLs.SEARCH_URL.getSpec(), HomepageManager.getHomepageUri()); + Assert.assertEquals(JUnitTestGURLs.SEARCH_URL, HomepageManager.getHomepageGurl()); ProfileManager.resetForTesting(); }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/homepage/settings/HomepageSettingsUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/homepage/settings/HomepageSettingsUnitTest.java index f141ae7..93586e30 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/homepage/settings/HomepageSettingsUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/homepage/settings/HomepageSettingsUnitTest.java
@@ -77,7 +77,7 @@ private static final String ASSERT_MESSAGE_EDIT_TEXT = "EditText does not contains the expected homepage in test settings."; private static final String ASSERT_HOMEPAGE_MANAGER_SETTINGS = - "HomepageManager#getHomepageUri is different than test homepage settings."; + "HomepageManager#getHomepageGurl is different than test homepage settings."; private static final String ASSERT_HOMEPAGE_LOCATION_TYPE_MISMATCH = "HomepageLocationType is different than test settings."; @@ -376,7 +376,8 @@ Assert.assertEquals(ASSERT_MESSAGE_EDIT_TEXT, TEST_URL_BAR, mCustomUriRadioButton.getPrimaryText().toString()); - Assert.assertNull(ASSERT_HOMEPAGE_MANAGER_SETTINGS, HomepageManager.getHomepageUri()); + Assert.assertTrue( + ASSERT_HOMEPAGE_MANAGER_SETTINGS, HomepageManager.getHomepageGurl().isEmpty()); } /** @@ -458,8 +459,8 @@ ASSERT_MESSAGE_RADIO_BUTTON_CUSTOMIZED_CHECK, mCustomUriRadioButton.isChecked()); Assert.assertEquals(ASSERT_MESSAGE_EDIT_TEXT, TEST_URL_FOO, mCustomUriRadioButton.getPrimaryText().toString()); - Assert.assertEquals( - ASSERT_HOMEPAGE_MANAGER_SETTINGS, TEST_URL_FOO, HomepageManager.getHomepageUri()); + Assert.assertEquals(ASSERT_HOMEPAGE_MANAGER_SETTINGS, TEST_URL_FOO, + HomepageManager.getHomepageGurl().getSpec()); assertUserActionRecorded(false); // Check radio button to select NTP as homepage. Homepage is not changed yet at this time. @@ -482,8 +483,8 @@ // End the activity. The homepage should be the customized url, and the location counter // should stay at 0 as nothing is changed. finishSettingsActivity(); - Assert.assertEquals( - ASSERT_HOMEPAGE_MANAGER_SETTINGS, TEST_URL_FOO, HomepageManager.getHomepageUri()); + Assert.assertEquals(ASSERT_HOMEPAGE_MANAGER_SETTINGS, TEST_URL_FOO, + HomepageManager.getHomepageGurl().getSpec()); assertUserActionRecorded(false); } @@ -505,7 +506,7 @@ Assert.assertEquals( ASSERT_MESSAGE_EDIT_TEXT, "", mCustomUriRadioButton.getPrimaryText().toString()); Assert.assertTrue(ASSERT_HOMEPAGE_MANAGER_SETTINGS, - UrlUtilities.isNTPUrl(HomepageManager.getHomepageUri())); + UrlUtilities.isNTPUrl(HomepageManager.getHomepageGurl())); assertUserActionRecorded(false); // Update the text box. To do this, request focus for customized radio button so that the @@ -525,8 +526,8 @@ mCustomUriRadioButton.setPrimaryText(TEST_URL_BAR); finishSettingsActivity(); - Assert.assertEquals( - ASSERT_HOMEPAGE_MANAGER_SETTINGS, TEST_URL_BAR, HomepageManager.getHomepageUri()); + Assert.assertEquals(ASSERT_HOMEPAGE_MANAGER_SETTINGS, TEST_URL_BAR, + HomepageManager.getHomepageGurl().getSpec()); assertUserActionRecorded(true); }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/tasks/ReturnToChromeUtilUnitTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/tasks/ReturnToChromeUtilUnitTest.java index 1ddf81d..b3d957b 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/tasks/ReturnToChromeUtilUnitTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/tasks/ReturnToChromeUtilUnitTest.java
@@ -85,6 +85,7 @@ import org.chromium.components.url_formatter.UrlFormatter; import org.chromium.components.url_formatter.UrlFormatterJni; import org.chromium.ui.base.DeviceFormFactor; +import org.chromium.url.GURL; import org.chromium.url.JUnitTestGURLs; /** Unit tests for {@link ReturnToChromeUtil} class. */ @@ -97,7 +98,7 @@ /** Shadow for {@link HomepageManager}. */ @Implements(HomepageManager.class) static class ShadowHomepageManager { - static String sHomepageUrl; + static GURL sHomepageGurl; static boolean sIsHomepageEnabled; @Implementation @@ -106,8 +107,8 @@ } @Implementation - public static String getHomepageUri() { - return sHomepageUrl; + public static GURL getHomepageGurl() { + return sHomepageGurl; } } @@ -166,9 +167,9 @@ ChromeFeatureList.sStartSurfaceAndroid.setForTesting(true); // HomepageManager: - ShadowHomepageManager.sHomepageUrl = UrlConstants.NTP_NON_NATIVE_URL; + ShadowHomepageManager.sHomepageGurl = UrlConstants.ntpGurl(); ShadowHomepageManager.sIsHomepageEnabled = true; - Assert.assertEquals(UrlConstants.NTP_NON_NATIVE_URL, HomepageManager.getHomepageUri()); + Assert.assertEquals(UrlConstants.ntpGurl(), HomepageManager.getHomepageGurl()); Assert.assertTrue(HomepageManager.isHomepageEnabled()); ShadowHomepagePolicyManager.sIsInitialized = true; @@ -460,7 +461,7 @@ Assert.assertTrue(ReturnToChromeUtil.isStartSurfaceEnabled(mContext)); // Sets a customized homepage: - ShadowHomepageManager.sHomepageUrl = "foo.com"; + ShadowHomepageManager.sHomepageGurl = new GURL("http://foo.com"); Assert.assertFalse(ReturnToChromeUtil.useChromeHomepage()); // Sets main intent from launcher: @@ -483,7 +484,7 @@ Assert.assertTrue(ReturnToChromeUtil.shouldShowOverviewPageOnStart( mContext, intent, mTabModelSelector, mInactivityTracker, false /* isTablet */)); - ShadowHomepageManager.sHomepageUrl = UrlConstants.NTP_NON_NATIVE_URL; + ShadowHomepageManager.sHomepageGurl = UrlConstants.ntpGurl(); SharedPreferencesManager.getInstance().removeKey( ChromePreferenceKeys.TABBED_ACTIVITY_LAST_BACKGROUNDED_TIME_MS_PREF); }
diff --git a/chrome/android/junit/src/org/chromium/chrome/browser/toolbar/ToolbarTabControllerImplTest.java b/chrome/android/junit/src/org/chromium/chrome/browser/toolbar/ToolbarTabControllerImplTest.java index 6388475..6e698c7 100644 --- a/chrome/android/junit/src/org/chromium/chrome/browser/toolbar/ToolbarTabControllerImplTest.java +++ b/chrome/android/junit/src/org/chromium/chrome/browser/toolbar/ToolbarTabControllerImplTest.java
@@ -13,8 +13,6 @@ import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; -import android.text.TextUtils; - import org.junit.Assert; import org.junit.Before; import org.junit.Rule; @@ -30,6 +28,7 @@ import org.chromium.base.supplier.Supplier; import org.chromium.base.test.BaseRobolectricTestRunner; import org.chromium.base.test.util.JniMocker; +import org.chromium.chrome.browser.common.ChromeUrlConstants; import org.chromium.chrome.browser.feature_engagement.TrackerFactory; import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.homepage.HomepageManager; @@ -41,11 +40,11 @@ import org.chromium.chrome.test.util.browser.Features; import org.chromium.chrome.test.util.browser.Features.DisableFeatures; import org.chromium.chrome.test.util.browser.Features.EnableFeatures; -import org.chromium.components.embedder_support.util.UrlConstants; import org.chromium.components.feature_engagement.EventConstants; import org.chromium.components.feature_engagement.Tracker; import org.chromium.content_public.browser.LoadUrlParams; import org.chromium.ui.base.PageTransition; +import org.chromium.url.GURL; /** Unit tests for ToolbarTabControllerImpl. */ @RunWith(BaseRobolectricTestRunner.class) @@ -191,12 +190,12 @@ @Test public void openHomepage_loadsHomePage() { mToolbarTabController.openHomepage(); - String homePageUrl = HomepageManager.getHomepageUri(); - if (TextUtils.isEmpty(homePageUrl)) { - homePageUrl = UrlConstants.NTP_URL; + GURL homePageGurl = HomepageManager.getHomepageGurl(); + if (homePageGurl.isEmpty()) { + homePageGurl = ChromeUrlConstants.nativeNtpGurl(); } verify(mTab).loadUrl(argThat(new LoadUrlParamsMatcher( - new LoadUrlParams(homePageUrl, PageTransition.HOME_PAGE)))); + new LoadUrlParams(homePageGurl, PageTransition.HOME_PAGE)))); } @Test
diff --git a/chrome/android/modules/readaloud/public/java/src/org/chromium/chrome/modules/readaloud/PlaybackArgs.java b/chrome/android/modules/readaloud/public/java/src/org/chromium/chrome/modules/readaloud/PlaybackArgs.java index a0d46b3..c5e469d 100644 --- a/chrome/android/modules/readaloud/public/java/src/org/chromium/chrome/modules/readaloud/PlaybackArgs.java +++ b/chrome/android/modules/readaloud/public/java/src/org/chromium/chrome/modules/readaloud/PlaybackArgs.java
@@ -29,7 +29,7 @@ * Description is only relevant for the UI, language and voiceId are required * for the server request. */ - class PlaybackVoice { + static class PlaybackVoice { private final String mLanguage; private final String mVoiceId; @Nullable
diff --git a/chrome/android/trichrome.gni b/chrome/android/trichrome.gni index 087f1080..8e74334b 100644 --- a/chrome/android/trichrome.gni +++ b/chrome/android/trichrome.gni
@@ -186,6 +186,9 @@ # files. This is used to support SuperSize on Trichrome. template("write_ssargs_trichrome") { _extra_args = " --abi-filter ${invoker.abi_filter}" + if (defined(invoker.symbols_dir)) { + _extra_args += " --symbols-dir ${invoker.symbols_dir}" + } # Base names (i.e., no full path) are used because .ssargs files specifies # files using paths relative to itself. It is expected for |ssargs_path| to
diff --git a/chrome/browser/about_flags.cc b/chrome/browser/about_flags.cc index 43c6027..e2807df 100644 --- a/chrome/browser/about_flags.cc +++ b/chrome/browser/about_flags.cc
@@ -5091,6 +5091,16 @@ {"mac-syscall-sandbox", flag_descriptions::kMacSyscallSandboxName, flag_descriptions::kMacSyscallSandboxDescription, kOsMac, FEATURE_VALUE_TYPE(features::kMacSyscallSandbox)}, + + {"mac-loopback-audio-for-cast", + flag_descriptions::kMacLoopbackAudioForCastName, + flag_descriptions::kMacLoopbackAudioForCastDescription, kOsMac, + FEATURE_VALUE_TYPE(media::kMacLoopbackAudioForCast)}, + + {"mac-loopback-audio-for-screen-share", + flag_descriptions::kMacLoopbackAudioForScreenShareName, + flag_descriptions::kMacLoopbackAudioForScreenShareDescription, kOsMac, + FEATURE_VALUE_TYPE(media::kMacLoopbackAudioForScreenShare)}, #endif // BUILDFLAG(IS_MAC) #if BUILDFLAG(IS_CHROMEOS) || BUILDFLAG(IS_WIN) || BUILDFLAG(IS_MAC) {"web-share", flag_descriptions::kWebShareName,
diff --git a/chrome/browser/android/metrics/launch_metrics.cc b/chrome/browser/android/metrics/launch_metrics.cc index c9805171..87bff148 100644 --- a/chrome/browser/android/metrics/launch_metrics.cc +++ b/chrome/browser/android/metrics/launch_metrics.cc
@@ -14,6 +14,7 @@ #include "components/webapps/browser/banners/app_banner_settings_helper.h" #include "content/public/browser/web_contents.h" #include "third_party/blink/public/mojom/manifest/display_mode.mojom.h" +#include "url/android/gurl_android.h" #include "url/gurl.h" using base::android::JavaParamRef; @@ -86,12 +87,11 @@ JNIEnv* env, jboolean show_home_button, jboolean homepage_is_ntp, - const JavaParamRef<jstring>& jhomepage_url) { - GURL homepage_url(base::android::ConvertJavaStringToUTF8(env, jhomepage_url)); + const JavaParamRef<jobject>& jhomepage_gurl) { + std::unique_ptr<GURL> homepage_gurl = + url::GURLAndroid::ToNativeGURL(env, jhomepage_gurl); PrefMetricsService::RecordHomePageLaunchMetrics( - show_home_button, - homepage_is_ntp, - homepage_url); + show_home_button, homepage_is_ntp, *homepage_gurl); } } // namespace metrics
diff --git a/chrome/browser/android/webapk/fake_webapk_database_factory.cc b/chrome/browser/android/webapk/fake_webapk_database_factory.cc index 7c4a5034..4573436 100644 --- a/chrome/browser/android/webapk/fake_webapk_database_factory.cc +++ b/chrome/browser/android/webapk/fake_webapk_database_factory.cc
@@ -58,13 +58,13 @@ } void FakeWebApkDatabaseFactory::WriteProtos( - const std::vector<std::unique_ptr<WebApkProto>>& protos) { + const std::vector<const WebApkProto*>& protos) { base::RunLoop run_loop; std::unique_ptr<syncer::ModelTypeStore::WriteBatch> write_batch = GetStore()->CreateWriteBatch(); - for (const std::unique_ptr<WebApkProto>& proto : protos) { + for (const WebApkProto* proto : protos) { GURL manifest_id(proto->sync_data().manifest_id()); DCHECK(!manifest_id.is_empty()); DCHECK(manifest_id.is_valid()); @@ -85,10 +85,10 @@ } void FakeWebApkDatabaseFactory::WriteRegistry(const Registry& registry) { - std::vector<std::unique_ptr<WebApkProto>> protos; + std::vector<const WebApkProto*> protos; for (const Registry::value_type& kv : registry) { - auto webapk = std::unique_ptr<WebApkProto>(kv.second.get()); - protos.push_back(std::move(webapk)); + const WebApkProto* webapk = kv.second.get(); + protos.push_back(webapk); } WriteProtos(protos);
diff --git a/chrome/browser/android/webapk/fake_webapk_database_factory.h b/chrome/browser/android/webapk/fake_webapk_database_factory.h index 8019502..2574867 100644 --- a/chrome/browser/android/webapk/fake_webapk_database_factory.h +++ b/chrome/browser/android/webapk/fake_webapk_database_factory.h
@@ -30,7 +30,7 @@ Registry ReadRegistry(); - void WriteProtos(const std::vector<std::unique_ptr<WebApkProto>>& protos); + void WriteProtos(const std::vector<const WebApkProto*>& protos); void WriteRegistry(const Registry& registry); private:
diff --git a/chrome/browser/android/webapk/webapk_sync_bridge.cc b/chrome/browser/android/webapk/webapk_sync_bridge.cc index 09244c4..1ba1b3e 100644 --- a/chrome/browser/android/webapk/webapk_sync_bridge.cc +++ b/chrome/browser/android/webapk/webapk_sync_bridge.cc
@@ -4,12 +4,24 @@ #include "chrome/browser/android/webapk/webapk_sync_bridge.h" +#include <memory> +#include <vector> + #include "base/logging.h" +#include "chrome/browser/android/webapk/webapk_database.h" +#include "chrome/browser/android/webapk/webapk_database_factory.h" #include "chrome/browser/android/webapk/webapk_helpers.h" +#include "chrome/browser/web_applications/web_app_id.h" #include "chrome/common/channel_info.h" #include "components/sync/base/model_type.h" #include "components/sync/base/report_unrecoverable_error.h" #include "components/sync/model/client_tag_based_model_type_processor.h" +#include "components/sync/model/metadata_batch.h" +#include "components/sync/model/metadata_change_list.h" +#include "components/sync/model/model_type_store.h" +#include "components/sync/model/mutable_data_batch.h" +#include "components/sync/protocol/web_app_specifics.pb.h" +#include "third_party/abseil-cpp/absl/types/optional.h" #include "url/gurl.h" namespace webapk { @@ -26,19 +38,69 @@ return entity_data; } -WebApkSyncBridge::WebApkSyncBridge() +namespace { + +const WebApkProto* GetAppById(const Registry& registry, + const web_app::AppId& app_id) { + auto it = registry.find(app_id); + if (it != registry.end()) { + return it->second.get(); + } + + return nullptr; +} + +} // anonymous namespace + +WebApkSyncBridge::WebApkSyncBridge( + AbstractWebApkDatabaseFactory* database_factory, + base::OnceClosure on_initialized) : WebApkSyncBridge( + database_factory, + std::move(on_initialized), std::make_unique<syncer::ClientTagBasedModelTypeProcessor>( syncer::WEB_APPS, base::BindRepeating(&syncer::ReportUnrecoverableError, chrome::GetChannel()))) {} WebApkSyncBridge::WebApkSyncBridge( + AbstractWebApkDatabaseFactory* database_factory, + base::OnceClosure on_initialized, std::unique_ptr<syncer::ModelTypeChangeProcessor> change_processor) - : syncer::ModelTypeSyncBridge(std::move(change_processor)) {} + : syncer::ModelTypeSyncBridge(std::move(change_processor)) { + CHECK(database_factory); + database_ = std::make_unique<WebApkDatabase>( + database_factory, + base::BindRepeating(&WebApkSyncBridge::ReportErrorToChangeProcessor, + base::Unretained(this))); + + // TODO(hartmanng): we may need to query installed WebAPKs on the device here + // too. + database_->OpenDatabase(base::BindOnce(&WebApkSyncBridge::OnDatabaseOpened, + weak_ptr_factory_.GetWeakPtr(), + std::move(on_initialized))); +} WebApkSyncBridge::~WebApkSyncBridge() = default; +void WebApkSyncBridge::ReportErrorToChangeProcessor( + const syncer::ModelError& error) { + change_processor()->ReportError(error); +} + +void WebApkSyncBridge::OnDatabaseOpened( + base::OnceClosure callback, + Registry registry, + std::unique_ptr<syncer::MetadataBatch> metadata_batch) { + DCHECK(database_->is_opened()); + + // Provide sync metadata to the processor _before_ any local changes occur. + change_processor()->ModelReadyToSync(std::move(metadata_batch)); + + registry_ = std::move(registry); + std::move(callback).Run(); +} + std::unique_ptr<syncer::MetadataChangeList> WebApkSyncBridge::CreateMetadataChangeList() { return syncer::ModelTypeStore::WriteBatch::CreateMetadataChangeList(); @@ -61,11 +123,28 @@ void WebApkSyncBridge::GetData(StorageKeyList storage_keys, DataCallback callback) { - // TODO(hartmanng): implement + auto data_batch = std::make_unique<syncer::MutableDataBatch>(); + + for (const web_app::AppId& app_id : storage_keys) { + const WebApkProto* app = GetAppById(registry_, app_id); + if (app) { + data_batch->Put(app_id, CreateSyncEntityData(*app)); + } + } + + std::move(callback).Run(std::move(data_batch)); } void WebApkSyncBridge::GetAllDataForDebugging(DataCallback callback) { - // TODO(hartmanng): implement + auto data_batch = std::make_unique<syncer::MutableDataBatch>(); + + for (const auto& appListing : registry_) { + const web_app::AppId app_id = appListing.first; + const WebApkProto& app = *appListing.second; + data_batch->Put(app_id, CreateSyncEntityData(app)); + } + + std::move(callback).Run(std::move(data_batch)); } // GetClientTag and GetStorageKey must return the same thing for a given AppId
diff --git a/chrome/browser/android/webapk/webapk_sync_bridge.h b/chrome/browser/android/webapk/webapk_sync_bridge.h index f2a6e91..d9308e0d1 100644 --- a/chrome/browser/android/webapk/webapk_sync_bridge.h +++ b/chrome/browser/android/webapk/webapk_sync_bridge.h
@@ -11,21 +11,19 @@ #include "chrome/browser/android/webapk/webapk_database.h" #include "components/sync/model/entity_change.h" #include "components/sync/model/model_type_sync_bridge.h" - -namespace base {} +#include "third_party/abseil-cpp/absl/types/optional.h" namespace syncer { +struct EntityData; class MetadataChangeList; class ModelError; class ModelTypeChangeProcessor; } // namespace syncer -namespace syncer { -struct EntityData; -} - namespace webapk { +class AbstractWebApkDatabaseFactory; + // A unified sync and storage controller. // // While webapk::Registry is a read-only model, WebApkSyncBridge is a @@ -39,9 +37,12 @@ // ModelTypeChangeProcessor and WebApkDatabase (the storage). class WebApkSyncBridge : public syncer::ModelTypeSyncBridge { public: - WebApkSyncBridge(); + WebApkSyncBridge(AbstractWebApkDatabaseFactory* database_factory, + base::OnceClosure on_initialized); // Tests may inject mocks using this ctor. - explicit WebApkSyncBridge( + WebApkSyncBridge( + AbstractWebApkDatabaseFactory* database_factory, + base::OnceClosure on_initialized, std::unique_ptr<syncer::ModelTypeChangeProcessor> change_processor); WebApkSyncBridge(const WebApkSyncBridge&) = delete; WebApkSyncBridge& operator=(const WebApkSyncBridge&) = delete; @@ -62,7 +63,13 @@ std::string GetStorageKey(const syncer::EntityData& entity_data) override; private: + void OnDatabaseOpened(base::OnceClosure callback, + Registry registry, + std::unique_ptr<syncer::MetadataBatch> metadata_batch); + void ReportErrorToChangeProcessor(const syncer::ModelError& error); + std::unique_ptr<WebApkDatabase> database_; + Registry registry_; base::WeakPtrFactory<WebApkSyncBridge> weak_ptr_factory_{this}; };
diff --git a/chrome/browser/android/webapk/webapk_sync_bridge_unittest.cc b/chrome/browser/android/webapk/webapk_sync_bridge_unittest.cc index 8938bcc..a3f6d3a4 100644 --- a/chrome/browser/android/webapk/webapk_sync_bridge_unittest.cc +++ b/chrome/browser/android/webapk/webapk_sync_bridge_unittest.cc
@@ -4,11 +4,63 @@ #include "chrome/browser/android/webapk/webapk_sync_bridge.h" +#include "base/containers/contains.h" +#include "base/logging.h" +#include "base/run_loop.h" +#include "base/test/bind.h" +#include "base/test/task_environment.h" +#include "chrome/browser/android/webapk/fake_webapk_database_factory.h" +#include "chrome/browser/android/webapk/webapk_database_factory.h" +#include "chrome/browser/android/webapk/webapk_helpers.h" +#include "chrome/browser/web_applications/web_app_id.h" +#include "components/sync/model/data_batch.h" #include "components/sync/test/mock_model_type_change_processor.h" #include "testing/gtest/include/gtest/gtest.h" +#include "url/gurl.h" + +using testing::_; namespace webapk { +bool IsBasicSyncDataEqual(const WebApkProto& expected_app, + const syncer::EntityData& entity_data) { + if (!entity_data.specifics.has_web_apk()) { + return false; + } + + const sync_pb::WebApkSpecifics& expected_app_specifics = + expected_app.sync_data(); + const sync_pb::WebApkSpecifics& entity_specifics = + entity_data.specifics.web_apk(); + + return expected_app_specifics.manifest_id() == + entity_specifics.manifest_id() && + expected_app_specifics.start_url() == entity_specifics.start_url() && + expected_app_specifics.name() == entity_specifics.name(); +} + +bool RegistryContainsSyncDataBatchChanges( + const Registry& registry, + std::unique_ptr<syncer::DataBatch> data_batch) { + if (!data_batch || !data_batch->HasNext()) { + return registry.empty(); + } + + while (data_batch->HasNext()) { + syncer::KeyAndData key_and_data = data_batch->Next(); + auto web_app_iter = registry.find(key_and_data.first); + if (web_app_iter == registry.end()) { + LOG(ERROR) << "App not found in registry: " << key_and_data.first; + return false; + } + + if (!IsBasicSyncDataEqual(*web_app_iter->second, *key_and_data.second)) { + return false; + } + } + return true; +} + std::unique_ptr<WebApkProto> CreateWebApkProto(const std::string& url) { std::unique_ptr<WebApkProto> web_apk = std::make_unique<WebApkProto>(); @@ -20,11 +72,18 @@ return web_apk; } +void InsertAppIntoRegistry(Registry* registry, + std::unique_ptr<WebApkProto> app) { + web_app::AppId app_id = + GenerateAppIdFromManifestId(GURL(app->sync_data().manifest_id())); + ASSERT_FALSE(base::Contains(*registry, app_id)); + registry->emplace(std::move(app_id), std::move(app)); +} + class WebApkSyncBridgeTest : public ::testing::Test { public: void SetUp() override { - sync_bridge_ = std::make_unique<WebApkSyncBridge>( - mock_processor_.CreateForwardingProcessor()); + database_factory_ = std::make_unique<FakeWebApkDatabaseFactory>(); ON_CALL(mock_processor_, IsTrackingMetadata()) .WillByDefault(testing::Return(true)); @@ -32,28 +91,96 @@ void TearDown() override { DestroyManagers(); } + void InitSyncBridge() { + base::RunLoop loop; + sync_bridge_ = std::make_unique<WebApkSyncBridge>( + database_factory_.get(), loop.QuitClosure(), + mock_processor_.CreateForwardingProcessor()); + loop.Run(); + } + protected: void DestroyManagers() { if (sync_bridge_) { sync_bridge_.reset(); } + if (database_factory_) { + database_factory_.reset(); + } } syncer::MockModelTypeChangeProcessor& processor() { return mock_processor_; } + FakeWebApkDatabaseFactory& database_factory() { return *database_factory_; } WebApkSyncBridge& sync_bridge() { return *sync_bridge_; } private: std::unique_ptr<WebApkSyncBridge> sync_bridge_; + std::unique_ptr<FakeWebApkDatabaseFactory> database_factory_; testing::NiceMock<syncer::MockModelTypeChangeProcessor> mock_processor_; }; +// Tests that the WebApkSyncBridge correctly reports data from the +// WebApkDatabase. +TEST_F(WebApkSyncBridgeTest, GetData) { + base::test::SingleThreadTaskEnvironment task_environment; + + Registry registry; + + std::unique_ptr<WebApkProto> synced_app1 = + CreateWebApkProto("https://example.com/app1/"); + InsertAppIntoRegistry(®istry, std::move(synced_app1)); + + std::unique_ptr<WebApkProto> synced_app2 = + CreateWebApkProto("https://example.com/app2/"); + InsertAppIntoRegistry(®istry, std::move(synced_app2)); + + database_factory().WriteRegistry(registry); + + EXPECT_CALL(processor(), ModelReadyToSync(_)).Times(1); + InitSyncBridge(); + + { + WebApkSyncBridge::StorageKeyList storage_keys; + // Add an unknown key to test this is handled gracefully. + storage_keys.push_back("unknown"); + for (const Registry::value_type& id_and_web_app : registry) { + storage_keys.push_back(id_and_web_app.first); + } + + base::RunLoop run_loop; + sync_bridge().GetData( + std::move(storage_keys), + base::BindLambdaForTesting( + [&](std::unique_ptr<syncer::DataBatch> data_batch) { + EXPECT_TRUE(RegistryContainsSyncDataBatchChanges( + registry, std::move(data_batch))); + run_loop.Quit(); + })); + run_loop.Run(); + } + + { + base::RunLoop run_loop; + sync_bridge().GetAllDataForDebugging(base::BindLambdaForTesting( + [&](std::unique_ptr<syncer::DataBatch> data_batch) { + EXPECT_TRUE(RegistryContainsSyncDataBatchChanges( + registry, std::move(data_batch))); + run_loop.Quit(); + })); + run_loop.Run(); + } +} + // Tests that the client & storage tags are correct for entity data. TEST_F(WebApkSyncBridgeTest, Identities) { // Should be kept up to date with // chrome/browser/web_applications/web_app_sync_bridge_unittest.cc's // WebAppSyncBridgeTest.Identities test. + base::test::SingleThreadTaskEnvironment task_environment; + InitSyncBridge(); + std::unique_ptr<WebApkProto> app = CreateWebApkProto("https://example.com/"); std::unique_ptr<syncer::EntityData> entity_data = CreateSyncEntityData(*app);
diff --git a/chrome/browser/ash/arc/screen_capture/arc_screen_capture_bridge.cc b/chrome/browser/ash/arc/screen_capture/arc_screen_capture_bridge.cc index 143842a..5593a3dc 100644 --- a/chrome/browser/ash/arc/screen_capture/arc_screen_capture_bridge.cc +++ b/chrome/browser/ash/arc/screen_capture/arc_screen_capture_bridge.cc
@@ -95,7 +95,8 @@ source_lists.emplace_back( std::make_unique<DesktopMediaListAsh>(DesktopMediaList::Type::kScreen)); const std::u16string display_name16 = base::UTF8ToUTF16(display_name); - DesktopMediaPicker::Params picker_params; + DesktopMediaPicker::Params picker_params{ + DesktopMediaPicker::Params::RequestSource::kArcScreenCapture}; picker_params.context = ash::Shell::GetRootWindowForDisplayId( display::Screen::GetScreen()->GetPrimaryDisplay().id()); picker_params.modality = ui::ModalType::MODAL_TYPE_SYSTEM;
diff --git a/chrome/browser/ash/borealis/borealis_token_hardware_checker.cc b/chrome/browser/ash/borealis/borealis_token_hardware_checker.cc index 1b1c266..8d1ab02 100644 --- a/chrome/browser/ash/borealis/borealis_token_hardware_checker.cc +++ b/chrome/browser/ash/borealis/borealis_token_hardware_checker.cc
@@ -60,7 +60,7 @@ // Helper method that performs different checks based on the user's board. AllowStatus BorealisTokenHardwareChecker::BoardSpecificChecks() const { if (BoardIn({"hatch-borealis", "puff-borealis", "zork-borealis", - "volteer-borealis", "aurora-borealis"})) { + "volteer-borealis"})) { if (HasNamedToken("dogfood", "MXlY+SFZ!2,P_k^02]hK", "FbxB2mxNa/uqskX4X+NqHhAE6ebHeWC0u+Y+UlGEB/4=")) { return AllowStatus::kAllowed; @@ -94,7 +94,7 @@ return AllowStatus::kAllowed; } return AllowStatus::kHardwareChecksFailed; - } else if (BoardIn({"draco", "hades"})) { + } else if (BoardIn({"aurora"})) { return AllowStatus::kAllowed; } else if (BoardIn({"myst"})) { return AllowStatus::kAllowed;
diff --git a/chrome/browser/ash/borealis/borealis_token_hardware_checker_unittest.cc b/chrome/browser/ash/borealis/borealis_token_hardware_checker_unittest.cc index e281419..839242d 100644 --- a/chrome/browser/ash/borealis/borealis_token_hardware_checker_unittest.cc +++ b/chrome/browser/ash/borealis/borealis_token_hardware_checker_unittest.cc
@@ -63,8 +63,8 @@ AllowStatus::kHardwareChecksFailed); } -TEST(BorealisTokenHardwareCheckerTest, Draco) { - EXPECT_EQ(check("draco", "", "", 0, ""), AllowStatus::kAllowed); +TEST(BorealisTokenHardwareCheckerTest, Aurora) { + EXPECT_EQ(check("aurora", "", "", 0, ""), AllowStatus::kAllowed); } TEST(BorealisTokenHardwareCheckerTest, Myst) {
diff --git a/chrome/browser/ash/input_method/editor_event_sink.h b/chrome/browser/ash/input_method/editor_event_sink.h index e6c4ae08..16e01358 100644 --- a/chrome/browser/ash/input_method/editor_event_sink.h +++ b/chrome/browser/ash/input_method/editor_event_sink.h
@@ -19,7 +19,6 @@ virtual void OnFocus(int context_id) = 0; virtual void OnBlur() = 0; virtual void OnActivateIme(std::string_view engine_id) = 0; - virtual void OnConsentActionReceived(ConsentAction consent_action) = 0; virtual void OnSurroundingTextChanged(const std::u16string& text, gfx::Range selection_range) = 0; };
diff --git a/chrome/browser/ash/input_method/editor_mediator.cc b/chrome/browser/ash/input_method/editor_mediator.cc index 5e61c85..b0ea4dc 100644 --- a/chrome/browser/ash/input_method/editor_mediator.cc +++ b/chrome/browser/ash/input_method/editor_mediator.cc
@@ -139,7 +139,7 @@ } } -void EditorMediator::OnConsentActionReceived(ConsentAction consent_action) { +void EditorMediator::ProcessConsentAction(ConsentAction consent_action) { consent_store_->ProcessConsentAction(consent_action); }
diff --git a/chrome/browser/ash/input_method/editor_mediator.h b/chrome/browser/ash/input_method/editor_mediator.h index 7e9156d..a191fad 100644 --- a/chrome/browser/ash/input_method/editor_mediator.h +++ b/chrome/browser/ash/input_method/editor_mediator.h
@@ -72,8 +72,6 @@ void OnSurroundingTextChanged(const std::u16string& text, gfx::Range selection_range) override; - void OnConsentActionReceived(ConsentAction consent_action) override; - // EditorPanelManager::Delegate void OnPromoCardDeclined() override; void HandleTrigger() override; @@ -85,6 +83,7 @@ // EditorTextActuator::Delegate overrides void OnTextInserted() override; + void ProcessConsentAction(ConsentAction consent_action) override; // Checks if the feature should be visible. bool IsAllowedForUse();
diff --git a/chrome/browser/ash/input_method/editor_text_actuator.cc b/chrome/browser/ash/input_method/editor_text_actuator.cc index ff9b994..5751f00 100644 --- a/chrome/browser/ash/input_method/editor_text_actuator.cc +++ b/chrome/browser/ash/input_method/editor_text_actuator.cc
@@ -20,6 +20,14 @@ delegate_->OnTextInserted(); } +void EditorTextActuator::ApproveConsent() { + delegate_->ProcessConsentAction(ConsentAction::kApproved); +} + +void EditorTextActuator::DeclineConsent() { + delegate_->ProcessConsentAction(ConsentAction::kDeclined); +} + void EditorTextActuator::OnFocus(int context_id) { inserter_.OnFocus(context_id); }
diff --git a/chrome/browser/ash/input_method/editor_text_actuator.h b/chrome/browser/ash/input_method/editor_text_actuator.h index c73daec..fab2ee6 100644 --- a/chrome/browser/ash/input_method/editor_text_actuator.h +++ b/chrome/browser/ash/input_method/editor_text_actuator.h
@@ -7,6 +7,7 @@ #include <string> +#include "chrome/browser/ash/input_method/editor_consent_enums.h" #include "chrome/browser/ash/input_method/editor_text_inserter.h" #include "chromeos/ash/services/orca/public/mojom/orca_service.mojom.h" #include "mojo/public/cpp/bindings/associated_receiver.h" @@ -20,6 +21,7 @@ public: virtual ~Delegate() = default; virtual void OnTextInserted() = 0; + virtual void ProcessConsentAction(ConsentAction consent_action) = 0; }; EditorTextActuator( @@ -29,6 +31,8 @@ // orca::mojom::TextActuator overrides void InsertText(const std::string& text) override; + void ApproveConsent() override; + void DeclineConsent() override; void OnFocus(int context_id); void OnBlur();
diff --git a/chrome/browser/ash/login/demo_mode/demo_mode_dimensions.cc b/chrome/browser/ash/login/demo_mode/demo_mode_dimensions.cc index 63701d4..fc81ab7 100644 --- a/chrome/browser/ash/login/demo_mode/demo_mode_dimensions.cc +++ b/chrome/browser/ash/login/demo_mode/demo_mode_dimensions.cc
@@ -4,10 +4,10 @@ #include "chrome/browser/ash/login/demo_mode/demo_mode_dimensions.h" #include "ash/constants/ash_features.h" +#include "ash/constants/ash_pref_names.h" #include "chrome/browser/ash/login/demo_mode/demo_session.h" #include "chrome/browser/ash/login/demo_mode/demo_setup_controller.h" #include "chrome/browser/browser_process.h" -#include "chrome/common/pref_names.h" #include "chromeos/constants/chromeos_features.h" #include "components/prefs/pref_service.h"
diff --git a/chrome/browser/ash/login/demo_mode/demo_mode_dimensions_unittest.cc b/chrome/browser/ash/login/demo_mode/demo_mode_dimensions_unittest.cc index 7ef58e7..c7cf1eb 100644 --- a/chrome/browser/ash/login/demo_mode/demo_mode_dimensions_unittest.cc +++ b/chrome/browser/ash/login/demo_mode/demo_mode_dimensions_unittest.cc
@@ -4,11 +4,11 @@ #include "chrome/browser/ash/login/demo_mode/demo_mode_dimensions.h" #include "ash/constants/ash_features.h" +#include "ash/constants/ash_pref_names.h" #include "base/metrics/field_trial.h" #include "base/test/scoped_feature_list.h" #include "chrome/browser/ash/login/demo_mode/demo_mode_test_utils.h" #include "chrome/browser/ash/login/demo_mode/demo_session.h" -#include "chrome/common/pref_names.h" #include "chrome/test/base/scoped_testing_local_state.h" #include "chrome/test/base/testing_browser_process.h" #include "chromeos/ash/components/install_attributes/stub_install_attributes.h"
diff --git a/chrome/browser/ash/login/demo_mode/demo_session.cc b/chrome/browser/ash/login/demo_mode/demo_session.cc index 8838688..a78721eb 100644 --- a/chrome/browser/ash/login/demo_mode/demo_session.cc +++ b/chrome/browser/ash/login/demo_mode/demo_session.cc
@@ -7,6 +7,7 @@ #include <algorithm> #include <utility> +#include "ash/constants/ash_pref_names.h" #include "ash/constants/ash_switches.h" #include "ash/public/cpp/locale_update_controller.h" #include "ash/public/cpp/wallpaper/wallpaper_controller.h" @@ -45,7 +46,6 @@ #include "chrome/browser/ui/ash/system_tray_client_impl.h" #include "chrome/browser/ui/ash/system_web_apps/system_web_app_ui_utils.h" #include "chrome/common/extensions/extension_constants.h" -#include "chrome/common/pref_names.h" #include "chrome/grit/generated_resources.h" #include "chromeos/ash/components/install_attributes/install_attributes.h" #include "chromeos/ash/components/system/statistics_provider.h"
diff --git a/chrome/browser/ash/login/demo_mode/demo_session_browsertest.cc b/chrome/browser/ash/login/demo_mode/demo_session_browsertest.cc index 94a8c3b..75c8459e0 100644 --- a/chrome/browser/ash/login/demo_mode/demo_session_browsertest.cc +++ b/chrome/browser/ash/login/demo_mode/demo_session_browsertest.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/ash/login/demo_mode/demo_session.h" #include "ash/constants/ash_features.h" +#include "ash/constants/ash_pref_names.h" #include "chrome/browser/ash/login/demo_mode/demo_setup_controller.h" #include "chrome/browser/ash/login/login_manager_test.h" #include "chrome/browser/ash/login/test/device_state_mixin.h" @@ -21,7 +22,6 @@ #include "chrome/browser/ui/browser.h" #include "chrome/browser/ui/browser_list.h" #include "chrome/browser/ui/browser_list_observer.h" -#include "chrome/common/pref_names.h" #include "chrome/test/base/browser_process_platform_part_test_api_chromeos.h" #include "chromeos/constants/chromeos_features.h" #include "chromeos/dbus/power/fake_power_manager_client.h"
diff --git a/chrome/browser/ash/login/demo_mode/demo_session_unittest.cc b/chrome/browser/ash/login/demo_mode/demo_session_unittest.cc index c265e949..0fc5ea3 100644 --- a/chrome/browser/ash/login/demo_mode/demo_session_unittest.cc +++ b/chrome/browser/ash/login/demo_mode/demo_session_unittest.cc
@@ -10,6 +10,7 @@ #include <string> #include <utility> +#include "ash/constants/ash_pref_names.h" #include "base/files/file_path.h" #include "base/functional/bind.h" #include "base/memory/raw_ptr.h" @@ -26,7 +27,6 @@ #include "chrome/browser/ui/apps/chrome_app_delegate.h" #include "chrome/browser/ui/ash/test_wallpaper_controller.h" #include "chrome/browser/ui/ash/wallpaper_controller_client_impl.h" -#include "chrome/common/pref_names.h" #include "chrome/test/base/browser_process_platform_part_test_api_chromeos.h" #include "chrome/test/base/scoped_testing_local_state.h" #include "chrome/test/base/testing_browser_process.h"
diff --git a/chrome/browser/ash/login/demo_mode/demo_setup_browsertest.cc b/chrome/browser/ash/login/demo_mode/demo_setup_browsertest.cc index 585ec9ec..36154d6 100644 --- a/chrome/browser/ash/login/demo_mode/demo_setup_browsertest.cc +++ b/chrome/browser/ash/login/demo_mode/demo_setup_browsertest.cc
@@ -8,6 +8,7 @@ #include "ash/components/arc/arc_util.h" #include "ash/constants/ash_features.h" +#include "ash/constants/ash_pref_names.h" #include "ash/constants/ash_switches.h" #include "ash/public/cpp/login_accelerators.h" #include "base/command_line.h" @@ -51,7 +52,6 @@ #include "chrome/browser/ui/webui/ash/login/gaia_screen_handler.h" #include "chrome/browser/ui/webui/ash/login/network_screen_handler.h" #include "chrome/browser/ui/webui/ash/login/welcome_screen_handler.h" -#include "chrome/common/pref_names.h" #include "chrome/grit/generated_resources.h" #include "chrome/test/base/testing_browser_process.h" #include "chromeos/ash/components/dbus/shill/shill_service_client.h"
diff --git a/chrome/browser/ash/login/demo_mode/demo_setup_controller.cc b/chrome/browser/ash/login/demo_mode/demo_setup_controller.cc index b2579130..fd233cc 100644 --- a/chrome/browser/ash/login/demo_mode/demo_setup_controller.cc +++ b/chrome/browser/ash/login/demo_mode/demo_setup_controller.cc
@@ -7,6 +7,7 @@ #include <utility> #include "ash/components/arc/arc_util.h" +#include "ash/constants/ash_pref_names.h" #include "ash/constants/ash_switches.h" #include "base/barrier_closure.h" #include "base/command_line.h" @@ -28,7 +29,6 @@ #include "chrome/browser/ash/policy/enrollment/enrollment_requisition_manager.h" #include "chrome/browser/ash/policy/enrollment/enrollment_status.h" #include "chrome/browser/browser_process.h" -#include "chrome/common/pref_names.h" #include "chrome/grit/generated_resources.h" #include "chromeos/ash/components/dbus/dbus_thread_manager.h" #include "chromeos/ash/components/install_attributes/install_attributes.h"
diff --git a/chrome/browser/ash/login/demo_mode/demo_setup_controller_unittest.cc b/chrome/browser/ash/login/demo_mode/demo_setup_controller_unittest.cc index fe4889d..ae10840 100644 --- a/chrome/browser/ash/login/demo_mode/demo_setup_controller_unittest.cc +++ b/chrome/browser/ash/login/demo_mode/demo_setup_controller_unittest.cc
@@ -6,6 +6,7 @@ #include <memory> +#include "ash/constants/ash_pref_names.h" #include "ash/constants/ash_switches.h" #include "base/files/file_path.h" #include "base/files/scoped_temp_dir.h" @@ -23,7 +24,6 @@ #include "chrome/browser/ash/settings/device_settings_service.h" #include "chrome/browser/browser_process_platform_part.h" #include "chrome/browser/component_updater/cros_component_installer_chromeos.h" -#include "chrome/common/pref_names.h" #include "chrome/test/base/scoped_testing_local_state.h" #include "chrome/test/base/testing_browser_process.h" #include "chromeos/ash/components/cryptohome/system_salt_getter.h"
diff --git a/chrome/browser/ash/login/screens/demo_preferences_screen.cc b/chrome/browser/ash/login/screens/demo_preferences_screen.cc index afe83d1..303a7a22 100644 --- a/chrome/browser/ash/login/screens/demo_preferences_screen.cc +++ b/chrome/browser/ash/login/screens/demo_preferences_screen.cc
@@ -5,6 +5,7 @@ #include "chrome/browser/ash/login/screens/demo_preferences_screen.h" #include "ash/constants/ash_features.h" +#include "ash/constants/ash_pref_names.h" #include "base/check_op.h" #include "base/memory/weak_ptr.h" #include "base/values.h" @@ -14,7 +15,6 @@ #include "chrome/browser/browser_process.h" #include "chrome/browser/ui/webui/ash/login/demo_preferences_screen_handler.h" #include "chrome/browser/ui/webui/ash/login/welcome_screen_handler.h" -#include "chrome/common/pref_names.h" #include "components/prefs/pref_service.h" namespace ash {
diff --git a/chrome/browser/ash/policy/status_collector/device_status_collector_browsertest.cc b/chrome/browser/ash/policy/status_collector/device_status_collector_browsertest.cc index c70e840b..e5d508e 100644 --- a/chrome/browser/ash/policy/status_collector/device_status_collector_browsertest.cc +++ b/chrome/browser/ash/policy/status_collector/device_status_collector_browsertest.cc
@@ -15,6 +15,7 @@ #include <vector> #include "ash/constants/ash_features.h" +#include "ash/constants/ash_pref_names.h" #include "base/environment.h" #include "base/files/file_path.h" #include "base/files/file_util.h" @@ -3854,9 +3855,10 @@ scoped_stub_install_attributes_.Get()->SetDemoMode(); scoped_feature_list_.InitAndEnableFeature( ash::features::kFeatureManagementFeatureAwareDeviceDemoMode); - scoped_local_state_.Get()->SetString(prefs::kDemoModeCountry, "CA"); - scoped_local_state_.Get()->SetString(prefs::kDemoModeRetailerId, "retailer"); - scoped_local_state_.Get()->SetString(prefs::kDemoModeStoreId, "1234"); + scoped_local_state_.Get()->SetString(ash::prefs::kDemoModeCountry, "CA"); + scoped_local_state_.Get()->SetString(ash::prefs::kDemoModeRetailerId, + "retailer"); + scoped_local_state_.Get()->SetString(ash::prefs::kDemoModeStoreId, "1234"); expected.set_country("CA"); expected.set_retailer_name("retailer");
diff --git a/chrome/browser/ash/printing/automatic_usb_printer_configurer.cc b/chrome/browser/ash/printing/automatic_usb_printer_configurer.cc index 309b905..bd8c665 100644 --- a/chrome/browser/ash/printing/automatic_usb_printer_configurer.cc +++ b/chrome/browser/ash/printing/automatic_usb_printer_configurer.cc
@@ -11,6 +11,7 @@ #include "base/check.h" #include "base/containers/contains.h" #include "base/functional/bind.h" +#include "base/metrics/histogram_functions.h" #include "chrome/browser/ash/printing/printer_installation_manager.h" #include "chrome/browser/ash/printing/usb_printer_notification_controller.h" #include "chromeos/printing/ppd_provider.h" @@ -182,6 +183,25 @@ } auto it_ref = ppd_references_.find(printer.id()); + + // Notify metrics when necessary. + if (printer.ppd_reference().autoconf) { + // This setup attempt was performed via IPP Everywhere. + if (it_ref != ppd_references_.end()) { + // And there is a PPD file for this printer. + base::UmaHistogramEnumeration( + "Printing.CUPS.AutomaticIppSetupResultOfUsbPrinterWithPpd", result); + } + } else { + // This setup attempt was performed with PPD file. + if (printer.supports_ippusb()) { + // And the printer supports IPP-over-USB. + base::UmaHistogramEnumeration( + "Printing.CUPS.AutomaticPpdSetupResultOfUsbPrinterSupportingIpp", + result); + } + } + if (it_ref != ppd_references_.end()) { // We have a PPD for this printer. We can try to use it if IPP Everywhere // setup failed.
diff --git a/chrome/browser/ash/scalable_iph/scalable_iph_delegate_impl.cc b/chrome/browser/ash/scalable_iph/scalable_iph_delegate_impl.cc index 4fa821c6..7917421 100644 --- a/chrome/browser/ash/scalable_iph/scalable_iph_delegate_impl.cc +++ b/chrome/browser/ash/scalable_iph/scalable_iph_delegate_impl.cc
@@ -16,6 +16,7 @@ #include "ash/public/cpp/system/anchored_nudge_data.h" #include "ash/public/cpp/system/anchored_nudge_manager.h" #include "ash/root_window_controller.h" +#include "ash/scalable_iph/scalable_iph_ash_notification_view.h" #include "ash/scalable_iph/wallpaper_ash_notification_view.h" #include "ash/session/session_controller_impl.h" #include "ash/shelf/hotseat_widget.h" @@ -91,6 +92,8 @@ using scalable_iph::ActionType; constexpr char kNotificationSourceName[] = "ChromeOS"; +constexpr char kScalableIphNotificationType[] = + "scalable_iph_notification_type"; constexpr char kWallpaperNotificationType[] = "wallpaper_notification_type"; constexpr char kNotifierId[] = "scalable_iph"; constexpr char kButtonIndex = 0; @@ -157,17 +160,6 @@ return params.image_type == NotificationImageType::kWallpaper; } -message_center::NotificationType GetNotificationType( - const NotificationParams& params) { - switch (params.image_type) { - case NotificationImageType::kWallpaper: - return message_center::NOTIFICATION_TYPE_CUSTOM; - case NotificationImageType::kNoImage: - return message_center::NOTIFICATION_TYPE_SIMPLE; - } - NOTREACHED_NORETURN(); -} - bool IsAppValidForProfile(Profile* profile, const std::string& app_id) { if (app_id == arc::kPlayStoreAppId && !arc::IsArcPlayStoreEnabledForProfile(profile)) { @@ -310,6 +302,10 @@ app_list_controller_observer_.Observe(app_list_controller); MessageViewFactory::SetCustomNotificationViewFactory( + kScalableIphNotificationType, + base::BindRepeating(&ScalableIphAshNotificationView::CreateView)); + + MessageViewFactory::SetCustomNotificationViewFactory( kWallpaperNotificationType, base::BindRepeating(&WallpaperAshNotificationView::CreateWithPreview)); @@ -342,6 +338,8 @@ ScalableIphDelegateImpl::~ScalableIphDelegateImpl() { // Remove the custom notification view factories. MessageViewFactory::ClearCustomNotificationViewFactory( + kScalableIphNotificationType); + MessageViewFactory::ClearCustomNotificationViewFactory( kWallpaperNotificationType); } @@ -442,7 +440,7 @@ std::unique_ptr<message_center::Notification> notification = ash::CreateSystemNotificationPtr( - GetNotificationType(params), params.notification_id, + message_center::NOTIFICATION_TYPE_CUSTOM, params.notification_id, base::UTF8ToUTF16(notification_title), base::UTF8ToUTF16(notification_text), base::UTF8ToUTF16(notification_source_name), GURL(), GetNotifierId(), @@ -454,6 +452,8 @@ message_center::SystemNotificationWarningLevel::NORMAL); if (IsWallpaperNotification(params)) { notification->set_custom_view_type(kWallpaperNotificationType); + } else { + notification->set_custom_view_type(kScalableIphNotificationType); } AddOrReplaceNotification(std::move(notification)); } @@ -785,9 +785,8 @@ << "A bubble gets dismissed. Bubble id: " << bubble_id; if (bubble_id_ != bubble_id) { SCALABLE_IPH_LOG(GetLogger()) - << "Bubble id " << bubble_id << " is an obsolete id."; - DCHECK(false) << "Callback for an obsolete bubble id gets called " - << bubble_id; + << "Bubble id " << bubble_id + << " is an obsolete id. Current active bubble id is " << bubble_id_; return; } bubble_iph_session_.reset();
diff --git a/chrome/browser/autofill/mock_autofill_popup_controller.h b/chrome/browser/autofill/mock_autofill_popup_controller.h index ced4dace..90ccde47 100644 --- a/chrome/browser/autofill/mock_autofill_popup_controller.h +++ b/chrome/browser/autofill/mock_autofill_popup_controller.h
@@ -58,7 +58,6 @@ // AutofillPopupController: MOCK_METHOD(void, OnSuggestionsChanged, (), (override)); MOCK_METHOD(void, AcceptSuggestion, (int, base::TimeTicks), (override)); - MOCK_METHOD(void, AcceptSuggestionWithoutThreshold, (int), (override)); std::vector<Suggestion> GetSuggestions() const override { return suggestions_; }
diff --git a/chrome/browser/bookmarks/android/bookmark_bridge.cc b/chrome/browser/bookmarks/android/bookmark_bridge.cc index e42c584..8130d88 100644 --- a/chrome/browser/bookmarks/android/bookmark_bridge.cc +++ b/chrome/browser/bookmarks/android/bookmark_bridge.cc
@@ -216,7 +216,6 @@ } page_image_service::mojom::Options options; - options.suggest_images = true; options.optimization_guide_images = true; image_service_->FetchImageFor( page_image_service::mojom::ClientId::Bookmarks,
diff --git a/chrome/browser/breadcrumbs/BUILD.gn b/chrome/browser/breadcrumbs/BUILD.gn index 851c275e..820cfe0e 100644 --- a/chrome/browser/breadcrumbs/BUILD.gn +++ b/chrome/browser/breadcrumbs/BUILD.gn
@@ -54,6 +54,7 @@ ":breadcrumbs", "//chrome/test:test_support", "//components/breadcrumbs/core", + "//components/breadcrumbs/core:status", ] sources = [ "breadcrumb_manager_tab_helper_desktop_browsertest.cc" ]
diff --git a/chrome/browser/breadcrumbs/breadcrumb_manager_tab_helper_desktop_browsertest.cc b/chrome/browser/breadcrumbs/breadcrumb_manager_tab_helper_desktop_browsertest.cc index ee43fdc..297f503 100644 --- a/chrome/browser/breadcrumbs/breadcrumb_manager_tab_helper_desktop_browsertest.cc +++ b/chrome/browser/breadcrumbs/breadcrumb_manager_tab_helper_desktop_browsertest.cc
@@ -13,8 +13,8 @@ #include "chrome/test/base/ui_test_utils.h" #include "components/breadcrumbs/core/breadcrumb_manager.h" #include "components/breadcrumbs/core/breadcrumb_manager_tab_helper.h" +#include "components/breadcrumbs/core/breadcrumbs_status.h" #include "content/public/test/browser_test.h" -#include "content/public/test/download_test_observer.h" #include "net/test/embedded_test_server/embedded_test_server.h" namespace { @@ -52,6 +52,9 @@ BreadcrumbManagerTabHelper::CreateForWebContents( browser()->tab_strip_model()->GetActiveWebContents()); } + + private: + breadcrumbs::ScopedEnableBreadcrumbsForTesting enable_breadcrumbs_; }; // Tests download navigation. @@ -106,6 +109,9 @@ } net::EmbeddedTestServer https_server_{net::EmbeddedTestServer::TYPE_HTTPS}; + + private: + breadcrumbs::ScopedEnableBreadcrumbsForTesting enable_breadcrumbs_; }; // Broken authentication.
diff --git a/chrome/browser/chrome_content_browser_client.cc b/chrome/browser/chrome_content_browser_client.cc index bb7be4e6..71051e1c 100644 --- a/chrome/browser/chrome_content_browser_client.cc +++ b/chrome/browser/chrome_content_browser_client.cc
@@ -5299,9 +5299,10 @@ MaybeAddThrottle(MaybeCreateAboutThisSiteThrottleFor(handle), &throttles); #endif - if (profile && profile->GetPrefs() && - profile->GetPrefs()->GetBoolean( - prefs::kPrivacySandboxRelatedWebsiteSetsEnabled) && + auto* privacy_sandbox_settings = + PrivacySandboxSettingsFactory::GetForProfile(profile); + if (privacy_sandbox_settings && + privacy_sandbox_settings->AreRelatedWebsiteSetsEnabled() && base::FeatureList::IsEnabled(features::kFirstPartySets)) { MaybeAddThrottle(first_party_sets::FirstPartySetsNavigationThrottle:: MaybeCreateNavigationThrottle(handle),
diff --git a/chrome/browser/download/bubble/download_display_controller.cc b/chrome/browser/download/bubble/download_display_controller.cc index b74271a9..c4b5b18a 100644 --- a/chrome/browser/download/bubble/download_display_controller.cc +++ b/chrome/browser/download/bubble/download_display_controller.cc
@@ -30,6 +30,10 @@ #include "components/offline_items_collection/core/offline_item.h" #include "components/offline_items_collection/core/offline_item_state.h" +#if BUILDFLAG(IS_MAC) +#include "chrome/browser/ui/fullscreen_util_mac.h" +#endif + namespace { using DownloadIconActive = DownloadDisplay::IconActive; @@ -118,6 +122,18 @@ BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser_); will_show_details = browser_view && browser_view->IsImmersiveModeEnabled(); } + + // At this point, we are possibly in fullscreen. If we're in immersive + // fullscreen on macOS, it's OK to show the details bubble because the + // toolbar is either visible or it can be made visible. However, if we're + // in content/HTML fullscreen, the toolbar is not visible and we should not + // show the bubble. So, check our fullscreen state here and avoid showing + // the bubble if we're in content fullscreen. +#if BUILDFLAG(IS_MAC) + will_show_details = + will_show_details && !fullscreen_utils::IsInContentFullscreen(browser_); +#endif + if (will_show_details) { display_->ShowDetails(); }
diff --git a/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.cc b/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.cc index 4841842a..5d32def 100644 --- a/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.cc +++ b/chrome/browser/extensions/api/desktop_capture/desktop_capture_base.cc
@@ -150,7 +150,8 @@ DesktopMediaPickerController::DoneCallback callback = base::BindOnce( &DesktopCaptureChooseDesktopMediaFunctionBase::OnPickerDialogResults, this, origin, render_frame_host->GetGlobalId()); - DesktopMediaPickerController::Params picker_params; + DesktopMediaPickerController::Params picker_params( + DesktopMediaPickerController::Params::RequestSource::kExtension); picker_params.web_contents = web_contents; picker_params.context = parent_window; picker_params.parent = parent_window;
diff --git a/chrome/browser/extensions/api/management/management_api_browsertest.cc b/chrome/browser/extensions/api/management/management_api_browsertest.cc index e7877539..38698785 100644 --- a/chrome/browser/extensions/api/management/management_api_browsertest.cc +++ b/chrome/browser/extensions/api/management/management_api_browsertest.cc
@@ -264,15 +264,7 @@ #endif // !BUILDFLAG(IS_CHROMEOS_LACROS) -// TODO(crbug.com/1446968): The service worker version is flaky. -using ExtensionManagementApiBackgroundPageTest = - ExtensionManagementApiTestWithBackgroundType; - -INSTANTIATE_TEST_SUITE_P(BackgroundPage, - ExtensionManagementApiBackgroundPageTest, - ::testing::Values(ContextType::kPersistentBackground)); - -IN_PROC_BROWSER_TEST_P(ExtensionManagementApiBackgroundPageTest, +IN_PROC_BROWSER_TEST_P(ExtensionManagementApiTestWithBackgroundType, SelfUninstall) { // Wait for the helper script to finish before loading the primary // extension. This ensures that the onUninstall event listener is @@ -287,8 +279,7 @@ ASSERT_TRUE(listener2.WaitUntilSatisfied()); } -// TODO(crbug.com/1446968): The service worker version is flaky. -IN_PROC_BROWSER_TEST_P(ExtensionManagementApiBackgroundPageTest, +IN_PROC_BROWSER_TEST_P(ExtensionManagementApiTestWithBackgroundType, SelfUninstallNoPermissions) { // Wait for the helper script to finish before loading the primary // extension. This ensures that the onUninstall event listener is
diff --git a/chrome/browser/feed/android/java/res/layout/new_tab_page_multi_feed_header.xml b/chrome/browser/feed/android/java/res/layout/new_tab_page_multi_feed_header.xml index 1a1834a..483e954 100644 --- a/chrome/browser/feed/android/java/res/layout/new_tab_page_multi_feed_header.xml +++ b/chrome/browser/feed/android/java/res/layout/new_tab_page_multi_feed_header.xml
@@ -31,14 +31,13 @@ android:src="@drawable/ic_visibility_off_black" android:scaleType="centerInside" android:visibility="invisible" + android:layout_marginEnd="@dimen/feed_header_icon_margin" app:tint="@color/default_icon_color_disabled" tools:ignore="contentDescription" /> <FrameLayout - android:id="@+id/header_content" android:layout_width="0dp" android:layout_height="wrap_content" - android:layout_marginStart="@dimen/feed_header_icon_margin" android:layout_weight="1"> <com.google.android.material.tabs.TabLayout
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/sections/SectionHeaderView.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/sections/SectionHeaderView.java index 0882c98..95415fc 100644 --- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/sections/SectionHeaderView.java +++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/sections/SectionHeaderView.java
@@ -12,7 +12,6 @@ import android.view.View; import android.view.ViewGroup; import android.view.ViewTreeObserver; -import android.widget.FrameLayout; import android.widget.ImageView; import android.widget.LinearLayout; import android.widget.TextView; @@ -134,7 +133,6 @@ private @Nullable SectionHeaderTabListener mTabListener; private ViewGroup mContent; - private FrameLayout mHeaderContent; private @Nullable View mOptionsPanel; private boolean mTextsEnabled; @@ -197,7 +195,6 @@ mLeadingStatusIndicator = findViewById(R.id.section_status_indicator); mTabLayout = findViewById(R.id.tab_list_view); mContent = findViewById(R.id.main_content); - mHeaderContent = findViewById(R.id.header_content); if (mTabLayout != null) { mTabListener = new SectionHeaderTabListener(); @@ -386,11 +383,6 @@ */ void setTabMode(boolean isTabMode) { if (mTabLayout != null) { - if (!isTabMode) { - MarginLayoutParams marginLayoutParams = - (MarginLayoutParams) mHeaderContent.getLayoutParams(); - marginLayoutParams.setMarginStart(0); - } mTitleView.setVisibility(isTabMode ? GONE : VISIBLE); mTabLayout.setVisibility(isTabMode ? VISIBLE : GONE); }
diff --git a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedSnackbarController.java b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedSnackbarController.java index 1167097..34cd0e9 100644 --- a/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedSnackbarController.java +++ b/chrome/browser/feed/android/java/src/org/chromium/chrome/browser/feed/webfeed/WebFeedSnackbarController.java
@@ -14,6 +14,7 @@ import org.chromium.chrome.browser.feed.R; import org.chromium.chrome.browser.feed.StreamKind; import org.chromium.chrome.browser.feed.v2.FeedUserActionType; +import org.chromium.chrome.browser.flags.ChromeFeatureList; import org.chromium.chrome.browser.profiles.Profile; import org.chromium.chrome.browser.tab.EmptyTabObserver; import org.chromium.chrome.browser.tab.Tab; @@ -138,9 +139,11 @@ */ public void showPostSuccessfulFollowHelp(String title, boolean isActive, @StreamKind int followFromFeed, @Nullable Tab tab, @Nullable GURL url) { + String feature = ChromeFeatureList.isEnabled(ChromeFeatureList.FEED_FOLLOW_UI_UPDATE) + ? FeatureConstants.IPH_WEB_FEED_POST_FOLLOW_DIALOG_FEATURE_WITH_UI_UPDATE + : FeatureConstants.IPH_WEB_FEED_POST_FOLLOW_DIALOG_FEATURE; if (TrackerFactory.getTrackerForProfile(Profile.getLastUsedRegularProfile()) - .shouldTriggerHelpUI( - FeatureConstants.IPH_WEB_FEED_POST_FOLLOW_DIALOG_FEATURE)) { + .shouldTriggerHelpUI(feature)) { if (followFromFeed == StreamKind.FOLLOWING) { Runnable launchSnackbar = null; if (isActive) { @@ -149,7 +152,7 @@ launchSnackbar = () -> { showPostSuccessfulSnackbar(title, followFromFeed, tab, url); }; - }; + } mWebFeedDialogCoordinator.initializeForInFollowingFollow( mContext, launchSnackbar, title, isActive); } else {
diff --git a/chrome/browser/flag-metadata.json b/chrome/browser/flag-metadata.json index 0301b4e5..6d3a09c 100644 --- a/chrome/browser/flag-metadata.json +++ b/chrome/browser/flag-metadata.json
@@ -5416,6 +5416,16 @@ "expiry_milestone": 125 }, { + "name": "mac-loopback-audio-for-cast", + "owners": [ "mfoltz", "olka", "takumif"], + "expiry_milestone": 123 + }, + { + "name": "mac-loopback-audio-for-screen-share", + "owners": [ "mfoltz", "olka", "eladalon"], + "expiry_milestone": 123 + }, + { "name": "mac-syscall-sandbox", "owners": [ "rsesek@google.com" ], "expiry_milestone": 88
diff --git a/chrome/browser/flag_descriptions.cc b/chrome/browser/flag_descriptions.cc index 71e5d62..645f3cf 100644 --- a/chrome/browser/flag_descriptions.cc +++ b/chrome/browser/flag_descriptions.cc
@@ -5186,6 +5186,16 @@ const char kImmersiveFullscreenDescription[] = "Automatically hide and show the toolbar in fullscreen."; +const char kMacLoopbackAudioForCastName[] = + "Mac System Audio Loopback for Cast"; +const char kMacLoopbackAudioForCastDescription[] = + "Enable system audio mirroring when casting a screen on macOS 13.0+."; + +const char kMacLoopbackAudioForScreenShareName[] = + "Mac System Audio Loopback for Screen Sharing"; +const char kMacLoopbackAudioForScreenShareDescription[] = + "Enable system audio sharing when screen sharing on macOS 13.0+."; + const char kMacPWAsNotificationAttributionName[] = "Mac PWA notification attribution"; const char kMacPWAsNotificationAttributionDescription[] =
diff --git a/chrome/browser/flag_descriptions.h b/chrome/browser/flag_descriptions.h index 08119b7b..8fef89b2 100644 --- a/chrome/browser/flag_descriptions.h +++ b/chrome/browser/flag_descriptions.h
@@ -3008,6 +3008,12 @@ extern const char kImmersiveFullscreenName[]; extern const char kImmersiveFullscreenDescription[]; +extern const char kMacLoopbackAudioForCastName[]; +extern const char kMacLoopbackAudioForCastDescription[]; + +extern const char kMacLoopbackAudioForScreenShareName[]; +extern const char kMacLoopbackAudioForScreenShareDescription[]; + extern const char kMacPWAsNotificationAttributionName[]; extern const char kMacPWAsNotificationAttributionDescription[];
diff --git a/chrome/browser/history/history_browsertest.cc b/chrome/browser/history/history_browsertest.cc index 562b993..6dde91f2 100644 --- a/chrome/browser/history/history_browsertest.cc +++ b/chrome/browser/history/history_browsertest.cc
@@ -928,8 +928,15 @@ base::Seconds(0)); } +#if BUILDFLAG(IS_MAC) || BUILDFLAG(IS_CHROMEOS) +#define MAYBE_ObserversCallBothOnURLVisitedForLocalVisits \ + DISABLED_ObserversCallBothOnURLVisitedForLocalVisits +#else +#define MAYBE_ObserversCallBothOnURLVisitedForLocalVisits \ + ObserversCallBothOnURLVisitedForLocalVisits +#endif IN_PROC_BROWSER_TEST_F(HistoryBrowserTest, - ObserversCallBothOnURLVisitedForLocalVisits) { + MAYBE_ObserversCallBothOnURLVisitedForLocalVisits) { history::HistoryService* history_service = HistoryServiceFactory::GetForProfile(browser()->profile(), ServiceAccessType::EXPLICIT_ACCESS);
diff --git a/chrome/browser/media/router/mojo/media_router_desktop.cc b/chrome/browser/media/router/mojo/media_router_desktop.cc index a0645c3..602e57ff 100644 --- a/chrome/browser/media/router/mojo/media_router_desktop.cc +++ b/chrome/browser/media/router/mojo/media_router_desktop.cc
@@ -74,7 +74,8 @@ DCHECK(web_contents); #endif - DesktopMediaPickerController::Params params; + DesktopMediaPickerController::Params params( + DesktopMediaPickerController::Params::RequestSource::kCast); // Value of `web_contents` comes from the UI, and typically corresponds to // the active tab. params.web_contents = web_contents;
diff --git a/chrome/browser/media/webrtc/desktop_capture_access_handler.cc b/chrome/browser/media/webrtc/desktop_capture_access_handler.cc index 5994fbb..adb71f4b 100644 --- a/chrome/browser/media/webrtc/desktop_capture_access_handler.cc +++ b/chrome/browser/media/webrtc/desktop_capture_access_handler.cc
@@ -19,6 +19,7 @@ #include "build/chromeos_buildflags.h" #include "chrome/browser/media/webrtc/capture_policy_utils.h" #include "chrome/browser/media/webrtc/desktop_capture_devices_util.h" +#include "chrome/browser/media/webrtc/desktop_media_picker_controller.h" #include "chrome/browser/media/webrtc/desktop_media_picker_factory_impl.h" #include "chrome/browser/media/webrtc/media_capture_devices_dispatcher.h" #include "chrome/browser/media/webrtc/media_stream_capture_indicator.h" @@ -74,13 +75,6 @@ namespace { -// Currently, loopback audio capture is only supported on Windows and ChromeOS. -#if defined(USE_CRAS) || BUILDFLAG(IS_WIN) -constexpr bool kIsLoopbackAudioSupported = true; -#else -constexpr bool kIsLoopbackAudioSupported = false; -#endif - // Helper to get title of the calling application shown in the screen capture // notification. std::u16string GetApplicationTitle(content::WebContents* web_contents, @@ -165,7 +159,8 @@ // tab/webcontents capture streams. const bool audio_supported = (media_id.type == content::DesktopMediaID::TYPE_SCREEN && - kIsLoopbackAudioSupported) || + DesktopMediaPickerController::IsSystemAudioCaptureSupported( + DesktopMediaPicker::Params::RequestSource::kExtension)) || media_id.type == content::DesktopMediaID::TYPE_WEB_CONTENTS; return audio_permitted && audio_requested && audio_supported; @@ -281,7 +276,8 @@ const bool capture_audio = pending_request->request.audio_type == blink::mojom::MediaStreamType::GUM_DESKTOP_AUDIO_CAPTURE && - kIsLoopbackAudioSupported; + DesktopMediaPickerController::IsSystemAudioCaptureSupported( + DesktopMediaPicker::Params::RequestSource::kExtension); #if BUILDFLAG(IS_CHROMEOS) #if BUILDFLAG(IS_CHROMEOS_ASH) @@ -573,7 +569,8 @@ base::BindOnce(&DesktopCaptureAccessHandler::OnPickerDialogResults, base::Unretained(this), web_contents->GetWeakPtr(), pending_request.application_title); - DesktopMediaPicker::Params picker_params; + DesktopMediaPicker::Params picker_params( + DesktopMediaPicker::Params::RequestSource::kExtension); picker_params.web_contents = web_contents; gfx::NativeWindow parent_window = web_contents->GetTopLevelNativeWindow(); picker_params.context = parent_window;
diff --git a/chrome/browser/media/webrtc/desktop_media_picker.cc b/chrome/browser/media/webrtc/desktop_media_picker.cc index d944f09..800a3e1 100644 --- a/chrome/browser/media/webrtc/desktop_media_picker.cc +++ b/chrome/browser/media/webrtc/desktop_media_picker.cc
@@ -6,7 +6,10 @@ #include "chrome/browser/media/webrtc/desktop_media_picker.h" -DesktopMediaPicker::Params::Params() = default; +DesktopMediaPicker::Params::Params(RequestSource request_source) + : request_source(request_source) {} +DesktopMediaPicker::Params::Params() + : DesktopMediaPicker::Params(RequestSource::kUnknown) {} DesktopMediaPicker::Params::Params(const Params&) = default; DesktopMediaPicker::Params& DesktopMediaPicker::Params::operator=( const Params&) = default;
diff --git a/chrome/browser/media/webrtc/desktop_media_picker.h b/chrome/browser/media/webrtc/desktop_media_picker.h index 7db94cc..e21ef53 100644 --- a/chrome/browser/media/webrtc/desktop_media_picker.h +++ b/chrome/browser/media/webrtc/desktop_media_picker.h
@@ -32,6 +32,17 @@ using DoneCallback = base::OnceCallback<void(content::DesktopMediaID id)>; struct Params { + // Possible sources of the request. + enum class RequestSource { + kUnknown, + kCast, + kExtension, + kGetDisplayMedia, + kScreenshotDataCollector, + kArcScreenCapture, + }; + + explicit Params(RequestSource request_source); Params(); Params(const Params&); Params& operator=(const Params&); @@ -82,11 +93,10 @@ // picker. blink::mojom::PreferredDisplaySurface preferred_display_surface = blink::mojom::PreferredDisplaySurface::NO_PREFERENCE; - // True if the source of the call is getDisplayMedia(), false if it's - // another source, like an extension or ARC. This is useful for UMA that + // Indicates the source of the request. This is useful for UMA that // track the result of the picker, because the behavior with the // Extension API is different, and could therefore lead to mismeasurement. - bool is_get_display_media_call = false; + RequestSource request_source = RequestSource::kUnknown; }; // Creates a picker dialog/confirmation box depending on the value of
diff --git a/chrome/browser/media/webrtc/desktop_media_picker_controller.cc b/chrome/browser/media/webrtc/desktop_media_picker_controller.cc index 88ec1dc..eb6236d6 100644 --- a/chrome/browser/media/webrtc/desktop_media_picker_controller.cc +++ b/chrome/browser/media/webrtc/desktop_media_picker_controller.cc
@@ -30,8 +30,13 @@ #include "desktop_media_picker.h" #include "extensions/common/manifest.h" #include "extensions/common/switches.h" +#include "media/base/media_switches.h" #include "ui/base/l10n/l10n_util.h" +#if BUILDFLAG(IS_MAC) +#include "base/mac/mac_util.h" +#endif + DesktopMediaPickerController::DesktopMediaPickerController( DesktopMediaPickerFactory* picker_factory) : picker_factory_(picker_factory @@ -78,6 +83,25 @@ OnPickerDialogResults(std::string(), content::DesktopMediaID()); } +// static +bool DesktopMediaPickerController::IsSystemAudioCaptureSupported( + Params::RequestSource request_sourcce) { +#if BUILDFLAG(IS_WIN) || defined(USE_CRAS) + return true; +#elif BUILDFLAG(IS_MAC) + // Only supported on macOS 13.0+. + if (base::mac::MacOSVersion() < 13'00'00) { + return false; + } else if (request_sourcce == Params::RequestSource::kCast) { + return base::FeatureList::IsEnabled(media::kMacLoopbackAudioForCast); + } else { + return base::FeatureList::IsEnabled(media::kMacLoopbackAudioForScreenShare); + } +#else + return false; +#endif // BUILDFLAG(IS_WIN) || defined(USE_CRAS) +} + void DesktopMediaPickerController::OnInitialMediaListFound() { DCHECK(params_.select_only_screen); DCHECK(source_lists_.size() == 1); @@ -85,15 +109,11 @@ if (source_list->GetSourceCount() == 1) { // With only one possible source, the picker dialog is being bypassed. Apply // the default value of the "audio checkbox" here for desktop screen share. - // Only two platform configurations support desktop audio capture (i.e., - // system-wide audio loopback) at this time. content::DesktopMediaID media_id = source_list->GetSource(0).id; DCHECK_EQ(media_id.type, content::DesktopMediaID::TYPE_SCREEN); -#if defined(USE_CRAS) || BUILDFLAG(IS_WIN) - media_id.audio_share = params_.request_audio; -#else - media_id.audio_share = false; -#endif + media_id.audio_share = + params_.request_audio && + IsSystemAudioCaptureSupported(params_.request_source); OnPickerDialogResults({}, media_id); return; }
diff --git a/chrome/browser/media/webrtc/desktop_media_picker_controller.h b/chrome/browser/media/webrtc/desktop_media_picker_controller.h index fc9813e..84ab144 100644 --- a/chrome/browser/media/webrtc/desktop_media_picker_controller.h +++ b/chrome/browser/media/webrtc/desktop_media_picker_controller.h
@@ -48,6 +48,10 @@ delete; ~DesktopMediaPickerController() override; + // Checks if system audio capture is supported on the current platform. + static bool IsSystemAudioCaptureSupported( + Params::RequestSource request_source); + // Show the desktop picker dialog using the parameters specified by |params|, // with the possible selections restricted to those included in |sources|. If // an error is detected synchronously, it is reported by returning an error
diff --git a/chrome/browser/media/webrtc/desktop_media_picker_controller_unittest.cc b/chrome/browser/media/webrtc/desktop_media_picker_controller_unittest.cc index ae71c50..3396bc91 100644 --- a/chrome/browser/media/webrtc/desktop_media_picker_controller_unittest.cc +++ b/chrome/browser/media/webrtc/desktop_media_picker_controller_unittest.cc
@@ -91,7 +91,8 @@ } protected: - DesktopMediaPickerController::Params picker_params_; + DesktopMediaPickerController::Params picker_params_{ + DesktopMediaPickerController::Params::RequestSource::kUnknown}; base::MockCallback<DesktopMediaPickerController::DoneCallback> done_; std::vector<DesktopMediaList::Type> source_types_{ DesktopMediaList::Type::kScreen};
diff --git a/chrome/browser/media/webrtc/display_media_access_handler.cc b/chrome/browser/media/webrtc/display_media_access_handler.cc index 4d894d5..a07bb4b 100644 --- a/chrome/browser/media/webrtc/display_media_access_handler.cc +++ b/chrome/browser/media/webrtc/display_media_access_handler.cc
@@ -343,7 +343,8 @@ DesktopMediaPicker::DoneCallback done_callback = base::BindOnce(&DisplayMediaAccessHandler::OnDisplaySurfaceSelected, base::Unretained(this), web_contents->GetWeakPtr()); - DesktopMediaPicker::Params picker_params; + DesktopMediaPicker::Params picker_params( + DesktopMediaPicker::Params::RequestSource::kGetDisplayMedia); picker_params.web_contents = web_contents; gfx::NativeWindow parent_window = web_contents->GetTopLevelNativeWindow(); picker_params.context = parent_window; @@ -361,7 +362,6 @@ (capture_level != AllowedScreenCaptureLevel::kUnrestricted); picker_params.preferred_display_surface = pending_request.request.preferred_display_surface; - picker_params.is_get_display_media_call = true; pending_request.picker->Show(picker_params, std::move(source_lists), std::move(done_callback)); }
diff --git a/chrome/browser/media/webrtc/fake_desktop_media_picker_factory.cc b/chrome/browser/media/webrtc/fake_desktop_media_picker_factory.cc index 4513162..aaa1690 100644 --- a/chrome/browser/media/webrtc/fake_desktop_media_picker_factory.cc +++ b/chrome/browser/media/webrtc/fake_desktop_media_picker_factory.cc
@@ -14,7 +14,8 @@ FakeDesktopMediaPicker::FakeDesktopMediaPicker( FakeDesktopMediaPickerFactory::TestFlags* expectation) - : expectation_(expectation) { + : expectation_(expectation), + picker_params_(Params::RequestSource::kUnknown) { expectation_->picker_created = true; } FakeDesktopMediaPicker::~FakeDesktopMediaPicker() {
diff --git a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/ReadAloudFeatures.java b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/ReadAloudFeatures.java index a1d9e4a..ff70494 100644 --- a/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/ReadAloudFeatures.java +++ b/chrome/browser/readaloud/android/java/src/org/chromium/chrome/browser/readaloud/ReadAloudFeatures.java
@@ -11,6 +11,7 @@ /** Functions for getting the values of ReadAloud feature params. */ public final class ReadAloudFeatures { private static final String API_KEY_OVERRIDE_PARAM_NAME = "api_key_override"; + private static final String VOICES_OVERRIDE_PARAM_NAME = "voices_override"; /** Returns the API key override feature param if present, or null otherwise. */ @Nullable @@ -19,4 +20,14 @@ ChromeFeatureList.READALOUD, API_KEY_OVERRIDE_PARAM_NAME); return apiKeyOverride.isEmpty() ? null : apiKeyOverride; } + + /** + * Returns the voice list override param value in serialized form, or empty + * string if the param is absent. Value is a base64-encoded ListVoicesResponse + * binarypb. + */ + public static String getVoicesParam() { + return ChromeFeatureList.getFieldTrialParamByFeature( + ChromeFeatureList.READALOUD, VOICES_OVERRIDE_PARAM_NAME); + } }
diff --git a/chrome/browser/resources/ash/settings/lazy_load.ts b/chrome/browser/resources/ash/settings/lazy_load.ts index 2e6a91a..8853ef1 100644 --- a/chrome/browser/resources/ash/settings/lazy_load.ts +++ b/chrome/browser/resources/ash/settings/lazy_load.ts
@@ -76,6 +76,7 @@ import './guest_os/guest_os_shared_usb_devices.js'; import './guest_os/guest_os_shared_usb_devices_add_dialog.js'; import './keyboard_shortcut_banner/keyboard_shortcut_banner.js'; +import './nearby_share_page/nearby_share_subpage.js'; import './os_apps_page/app_management_page/app_details_item.js'; import './os_apps_page/app_management_page/app_item.js'; import './os_apps_page/app_management_page/arc_detail_view.js'; @@ -174,6 +175,7 @@ export {SettingsMultideviceTaskContinuationDisabledLinkElement} from './multidevice_page/multidevice_task_continuation_disabled_link.js'; export {SettingsMultideviceTaskContinuationItemElement} from './multidevice_page/multidevice_task_continuation_item.js'; export {SettingsMultideviceWifiSyncDisabledLinkElement} from './multidevice_page/multidevice_wifi_sync_disabled_link.js'; +export {SettingsNearbyShareSubpageElement} from './nearby_share_page/nearby_share_subpage.js'; export {SettingsAudioAndCaptionsPageElement} from './os_a11y_page/audio_and_captions_page.js'; export {BluetoothBrailleDisplayListener, BluetoothBrailleDisplayManager} from './os_a11y_page/bluetooth_braille_display_manager.js'; export {BluetoothBrailleDisplayUiElement} from './os_a11y_page/bluetooth_braille_display_ui.js';
diff --git a/chrome/browser/resources/ash/settings/nearby_share_page/nearby_share_subpage.ts b/chrome/browser/resources/ash/settings/nearby_share_page/nearby_share_subpage.ts index 9678a1e..20eb5b4 100644 --- a/chrome/browser/resources/ash/settings/nearby_share_page/nearby_share_subpage.ts +++ b/chrome/browser/resources/ash/settings/nearby_share_page/nearby_share_subpage.ts
@@ -45,7 +45,7 @@ const SettingsNearbyShareSubpageElementBase = DeepLinkingMixin(PrefsMixin(RouteObserverMixin(I18nMixin(PolymerElement)))); -class SettingsNearbyShareSubpageElement extends +export class SettingsNearbyShareSubpageElement extends SettingsNearbyShareSubpageElementBase { static get is() { return 'settings-nearby-share-subpage' as const;
diff --git a/chrome/browser/resources/ash/settings/os_settings.ts b/chrome/browser/resources/ash/settings/os_settings.ts index aed4aba..735ffa5 100644 --- a/chrome/browser/resources/ash/settings/os_settings.ts +++ b/chrome/browser/resources/ash/settings/os_settings.ts
@@ -49,7 +49,6 @@ import './multidevice_page/multidevice_page.js'; import './nearby_share_page/nearby_share_high_visibility_page.js'; import './nearby_share_page/nearby_share_receive_dialog.js'; -import './nearby_share_page/nearby_share_subpage.js'; import './os_files_page/google_drive_subpage.js'; import './os_apps_page/android_apps_subpage.js'; import './os_apps_page/app_notifications_page/app_notifications_subpage.js'; @@ -87,7 +86,7 @@ export {SettingsSliderElement} from '/shared/settings/controls/settings_slider.js'; export {SettingsToggleButtonElement} from '/shared/settings/controls/settings_toggle_button.js'; export {LifetimeBrowserProxy, LifetimeBrowserProxyImpl} from '/shared/settings/lifetime_browser_proxy.js'; -export {ProfileInfoBrowserProxy, ProfileInfoBrowserProxyImpl} from '/shared/settings/people_page/profile_info_browser_proxy.js'; +export {ProfileInfo, ProfileInfoBrowserProxy, ProfileInfoBrowserProxyImpl} from '/shared/settings/people_page/profile_info_browser_proxy.js'; export {PageStatus, StatusAction, StoredAccount, SyncBrowserProxy, SyncBrowserProxyImpl, SyncPrefs, SyncStatus} from '/shared/settings/people_page/sync_browser_proxy.js'; export {PrivacyPageBrowserProxyImpl, SecureDnsMode, SecureDnsUiManagementMode} from '/shared/settings/privacy_page/privacy_page_browser_proxy.js'; export {AppManagementFileHandlingItemElement} from 'chrome://resources/cr_components/app_management/file_handling_item.js';
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.js index 7e2ab272..c55da62 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/background.js
@@ -10,6 +10,7 @@ import {InstanceChecker} from '../../common/instance_checker.js'; import {LocalStorage} from '../../common/local_storage.js'; import {NavBraille} from '../common/braille/nav_braille.js'; +import {EarconId} from '../common/earcon_id.js'; import {LocaleOutputHelper} from '../common/locale_output_helper.js'; import {Msgs} from '../common/msgs.js'; import {PanelCommand, PanelCommandType} from '../common/panel_command.js'; @@ -82,6 +83,8 @@ /** @private */ init_() { + this.earcons_.playEarcon(EarconId.CHROMEVOX_LOADING); + // Export globals on ChromeVox. ChromeVox.braille = BrailleBackground.instance; // Read-only earcons. @@ -367,6 +370,7 @@ * @private */ onIntroduceChromeVox_() { + this.earcons_.playEarcon(EarconId.CHROMEVOX_LOADED); ChromeVox.tts.speak( Msgs.getMsg('chromevox_intro'), QueueMode.QUEUE, new TtsSpeechProperties({doNotInterrupt: true}));
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/earcon_engine.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/earcon_engine.js index ba450102..dc5ff3d 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/earcon_engine.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/earcon_engine.js
@@ -98,6 +98,9 @@ */ this.buffers_ = {}; + /** @private {!Object<string, AudioBufferSourceNode>} */ + this.loops_ = {}; + /** * The source audio nodes for queued tick / tocks for progress. * Kept around so they can be canceled. @@ -115,9 +118,6 @@ /** @private {?number} The setInterval ID for progress sounds. */ this.progressIntervalID_ = null; - /** @private {boolean} */ - this.persistProgressTicks_ = false; - /** * Maps a earcon name to the last source input audio for that * earcon. @@ -144,10 +144,10 @@ // These earcons are not tracked by the engine via their audio sources. switch (earcon) { case EarconId.CHROMEVOX_LOADED: - this.cancelProgressPersistent(); + this.onChromeVoxLoaded(); return; case EarconId.CHROMEVOX_LOADING: - this.startProgressPersistent(); + this.onChromeVoxLoading(); return; case EarconId.PAGE_FINISH_LOADING: this.cancelProgress(); @@ -198,7 +198,7 @@ this.onTextField(); break; case EarconId.INVALID_KEYPRESS: - this.onWrap(); + this.onInvalidKeypress(); break; case EarconId.LINK: this.onLink(); @@ -336,6 +336,7 @@ * @param {{pitch: (number | undefined), * time: (number | undefined), * gain: (number | undefined), + * loop: (boolean | undefined), * pan: (number | undefined), * reverb: (number | undefined)}=} opt_properties * An object where you can override the default pitch, gain, pan, @@ -346,10 +347,14 @@ play(sound, opt_properties = {}) { const source = this.context_.createBufferSource(); source.buffer = this.buffers_[sound]; + if (opt_properties.loop) { + this.loops_[sound] = source; + } const pitch = opt_properties.pitch ?? this.defaultPitch; // Changes the playback rate of the sample – which also changes the pitch. source.playbackRate.value = this.multiplierFor_(pitch); + source.loop = opt_properties.loop ?? false; const destination = this.createCommonFilters(opt_properties); source.connect(destination); @@ -365,6 +370,19 @@ return source; } + /** + * Stops the loop of the specified sound file, if one exists. + * @param {string} sound The name of the sound file. + */ + stopLoop(sound) { + if (!this.loops_[sound]) { + return; + } + + this.loops_[sound].stop(); + delete this.loops_[sound]; + } + /** Play the static sound. */ onStatic() { this.play(WavSoundFile.STATIC, {gain: this.staticVolume}); @@ -473,6 +491,11 @@ this.play(OggSoundFile.SELECTION_REVERSE); } + /** Play the invalid keypress sound. */ + onInvalidKeypress() { + this.play(OggSoundFile.INVALID_KEYPRESS); + } + onNoPointerAnchor() { this.play(WavSoundFile.STATIC, {gain: this.clickVolume * 0.2}); const freq1 = this.frequencyFor_(Note.A_FLAT4); @@ -574,92 +597,6 @@ envelopeNode.connect(destination); } - /** - * Play a sweep over a bunch of notes in a scale, with an echo, - * for the ChromeVox on or off sounds. - * - * @param {boolean} reverse Whether to play in the reverse direction. - */ - onChromeVoxSweep(reverse) { - const pitches = [ - Note.C2, - Note.D3, - Note.G3, - Note.C3, - Note.D4, - Note.G4, - Note.C4, - Note.D5, - Note.G5, - ]; - - if (reverse) { - pitches.reverse(); - } - - const attack = 0.015; - const dur = pitches.length * this.sweepDelay; - - const destination = this.createCommonFilters({reverb: 2.0}); - for (let k = 0; k < this.sweepEchoCount; k++) { - const envelopeNode = this.context_.createGain(); - const startTime = this.context_.currentTime + this.sweepEchoDelay * k; - const sweepGain = Math.pow(0.3, k); - const overtones = 2; - let overtoneGain = sweepGain; - for (let i = 0; i < overtones; i++) { - const osc = this.context_.createOscillator(); - osc.start(startTime); - osc.stop(startTime + dur); - - const gainNode = this.context_.createGain(); - osc.connect(gainNode); - gainNode.connect(envelopeNode); - - for (let j = 0; j < pitches.length; j++) { - let freqDecay; - if (reverse) { - freqDecay = Math.pow(0.75, pitches.length - j); - } else { - freqDecay = Math.pow(0.75, j); - } - const gain = overtoneGain * freqDecay; - const pitch = pitches[j] + this.sweepPitch; - const freq = (i + 1) * this.frequencyFor_(pitch); - if (j === 0) { - osc.frequency.setValueAtTime(freq, startTime); - gainNode.gain.setValueAtTime(gain, startTime); - } else { - osc.frequency.exponentialRampToValueAtTime( - freq, startTime + j * this.sweepDelay); - gainNode.gain.linearRampToValueAtTime( - gain, startTime + j * this.sweepDelay); - } - osc.frequency.setValueAtTime( - freq, startTime + j * this.sweepDelay + this.sweepDelay - attack); - } - - overtoneGain *= 0.1 + 0.2 * k; - } - - envelopeNode.gain.setValueAtTime(0, startTime); - envelopeNode.gain.linearRampToValueAtTime(1, startTime + this.sweepDelay); - envelopeNode.gain.setValueAtTime(1, startTime + dur - attack * 2); - envelopeNode.gain.linearRampToValueAtTime(0, startTime + dur); - envelopeNode.connect(destination); - } - } - - /** Play the "ChromeVox On" sound. */ - onChromeVoxOn() { - this.onChromeVoxSweep(false); - } - - /** Play the "ChromeVox Off" sound. */ - onChromeVoxOff() { - this.onChromeVoxSweep(true); - } - /** Play an alert sound. */ onAlert() { const freq1 = this.frequencyFor_(this.alertPitch - 2); @@ -761,10 +698,6 @@ * explicitly canceled. */ startProgress() { - if (this.persistProgressTicks_) { - return; - } - if (this.progressIntervalID_) { this.cancelProgress(); } @@ -779,9 +712,6 @@ /** Stop playing any tick / tock progress sounds. */ cancelProgress() { - if (this.persistProgressTicks_) { - return; - } if (!this.progressIntervalID_) { return; } @@ -795,28 +725,18 @@ this.progressIntervalID_ = null; } - /** - * Similar to the non-persistent variant above, but does not allow for - * cancellation by other calls to startProgress*. - */ - startProgressPersistent() { - if (this.persistProgressTicks_) { - return; - } - this.startProgress(); - this.persistProgressTicks_ = true; + /** Plays sound indicating ChromeVox is loading. */ + onChromeVoxLoading() { + this.play(OggSoundFile.CHROMEVOX_LOADING, {loop: true}); } /** - * Similar to the non-persistent variant above, but does not allow for - * cancellation by other calls to cancelProgress*. + * Plays the sound indicating ChromeVox has loaded, and cancels the ChromeVox + * loading sound. */ - cancelProgressPersistent() { - if (!this.persistProgressTicks_) { - return; - } - this.persistProgressTicks_ = false; - this.cancelProgress(); + onChromeVoxLoaded() { + this.stopLoop(OggSoundFile.CHROMEVOX_LOADING); + this.play(OggSoundFile.CHROMEVOX_LOADED); } /**
diff --git a/chrome/browser/resources/chromeos/accessibility/chromevox/background/keyboard_handler.js b/chrome/browser/resources/chromeos/accessibility/chromevox/background/keyboard_handler.js index 2ddb384..7a90e49 100644 --- a/chrome/browser/resources/chromeos/accessibility/chromevox/background/keyboard_handler.js +++ b/chrome/browser/resources/chromeos/accessibility/chromevox/background/keyboard_handler.js
@@ -6,6 +6,7 @@ * @fileoverview ChromeVox keyboard handler. */ import {KeyCode} from '../../common/key_code.js'; +import {EarconId} from '../common/earcon_id.js'; import {EventSourceType} from '../common/event_source_type.js'; import {ChromeVoxKbHandler} from '../common/keyboard_handler.js'; import {Msgs} from '../common/msgs.js'; @@ -110,6 +111,8 @@ evt.preventDefault(); evt.stopPropagation(); this.eatenKeyDowns_.add(evt.keyCode); + } else { + ChromeVox.earcons.playEarcon(EarconId.INVALID_KEYPRESS); } return false; }
diff --git a/chrome/browser/resources/new_tab_page/modules/history_clusters/module.html b/chrome/browser/resources/new_tab_page/modules/history_clusters/module.html index 8986a10..eff44be9 100644 --- a/chrome/browser/resources/new_tab_page/modules/history_clusters/module.html +++ b/chrome/browser/resources/new_tab_page/modules/history_clusters/module.html
@@ -39,8 +39,8 @@ .layout { display: grid; grid-gap: var(--gap-size) var(--gap-size); - grid-template-columns: repeat(2, 1fr); - grid-template-rows: repeat(2, 1fr); + grid-template-columns: repeat(2, minmax(0, 1fr)); + grid-template-rows: repeat(2, minmax(0, 1fr)); padding: 0 16px 16px; }
diff --git a/chrome/browser/resources/new_tab_page/modules/history_clusters/tile.html b/chrome/browser/resources/new_tab_page/modules/history_clusters/tile.html index 8407454..683a8ae 100644 --- a/chrome/browser/resources/new_tab_page/modules/history_clusters/tile.html +++ b/chrome/browser/resources/new_tab_page/modules/history_clusters/tile.html
@@ -5,6 +5,7 @@ border-radius: var(--ntp-module-item-border-radius); color: var(--color-new-tab-page-primary-foreground); display: inline-block; + min-width: 0; width: 100%; } @@ -200,7 +201,7 @@ } :host([has-discount]) #title{ - margin-bottom: 0px; + margin-bottom: 0; } :host([has-discount][large-format]) #title{
diff --git a/chrome/browser/resources/new_tab_page/realbox/realbox.html b/chrome/browser/resources/new_tab_page/realbox/realbox.html index d0dccb9a..a311440 100644 --- a/chrome/browser/resources/new_tab_page/realbox/realbox.html +++ b/chrome/browser/resources/new_tab_page/realbox/realbox.html
@@ -244,7 +244,7 @@ had-secondary-side="{{hadSecondarySide}}" has-secondary-side="{{hasSecondarySide}}" on-match-focusin="onMatchFocusin_" - on-match-remove="onMatchRemove_" on-header-focusin="onHeaderFocusin_" + on-header-focusin="onHeaderFocusin_" hidden$="[[!dropdownIsVisible]]"> </cr-realbox-dropdown> </div>
diff --git a/chrome/browser/resources/new_tab_page/realbox/realbox.ts b/chrome/browser/resources/new_tab_page/realbox/realbox.ts index 2ef4137..9fb6d263 100644 --- a/chrome/browser/resources/new_tab_page/realbox/realbox.ts +++ b/chrome/browser/resources/new_tab_page/realbox/realbox.ts
@@ -635,16 +635,6 @@ }); } - /** - * @param e Event containing index of the match that was removed. - */ - private onMatchRemove_(e: CustomEvent<number>) { - const index = e.detail; - const match = this.result_!.matches[index]; - assert(match); - this.pageHandler_.deleteAutocompleteMatch(index, match.destinationUrl); - } - private onVoiceSearchClick_() { this.dispatchEvent(new Event('open-voice-search')); }
diff --git a/chrome/browser/resources/omnibox/omnibox_output.ts b/chrome/browser/resources/omnibox/omnibox_output.ts index e89a3e2f..debc99f 100644 --- a/chrome/browser/resources/omnibox/omnibox_output.ts +++ b/chrome/browser/resources/omnibox/omnibox_output.ts
@@ -4,7 +4,7 @@ import {assert} from 'chrome://resources/js/assert_ts.js'; -import {ACMatchClassification, AutocompleteAdditionalInfo, AutocompleteMatch, OmniboxResponse} from './omnibox.mojom-webui.js'; +import {ACMatchClassification, AutocompleteMatch, DictionaryEntry, OmniboxResponse} from './omnibox.mojom-webui.js'; import {OmniboxElement} from './omnibox_element.js'; import {DisplayInputs, OmniboxInput} from './omnibox_input.js'; // @ts-ignore:next-line @@ -622,8 +622,8 @@ } } -class OutputAdditionalInfoProperty extends OutputProperty { - constructor(value: AutocompleteAdditionalInfo[]) { +class OutputDictionaryProperty extends OutputProperty { + constructor(value: DictionaryEntry[]) { super(value.map(({key, value}) => `${key}: ${value}`).join('\n')); const container = document.createElement('div'); @@ -639,7 +639,7 @@ const link = document.createElement('a'); link.download = 'AdditionalInfo.json'; - link.href = OutputAdditionalInfoProperty.createDownloadLink(value); + link.href = OutputDictionaryProperty.createDownloadLink(value); container.appendChild(link); this.appendChild(container); @@ -647,8 +647,7 @@ return this; } - private static createDownloadLink(value: AutocompleteAdditionalInfo[]): - string { + private static createDownloadLink(value: DictionaryEntry[]): string { const obj = value.reduce((obj: Record<string, string>, {key, value}) => { obj[key] = value; return obj; @@ -875,9 +874,13 @@ 'pedal-id', false, 'Pedal ID\nThe ID of attached Pedal, or zero if none.', match => new OutputTextProperty(String(match.pedalId))), new Column( + ['Scoring Signals'], '', 'scoring-signals', false, + 'Scoring Signals\nSignals used by the ML Model to score suggestions.', + match => new OutputDictionaryProperty(match.scoringSignals)), + new Column( ['Additional Info'], '', 'additional-info', true, 'Additional Info\nProvider-specific information about the result.', - match => new OutputAdditionalInfoProperty(match.additionalInfo)), + match => new OutputDictionaryProperty(match.additionalInfo)), ]; customElements.define('omnibox-output', OmniboxOutput); @@ -899,7 +902,7 @@ customElements.define( 'output-json-property', OutputJsonProperty, {extends: 'td'}); customElements.define( - 'output-additional-info-property', OutputAdditionalInfoProperty, + 'output-additional-info-property', OutputDictionaryProperty, {extends: 'td'}); customElements.define( 'output-url-property', OutputUrlProperty, {extends: 'td'});
diff --git a/chrome/browser/resources/omnibox/omnibox_output_column_widths.css b/chrome/browser/resources/omnibox/omnibox_output_column_widths.css index 279607f..ce66e914 100644 --- a/chrome/browser/resources/omnibox/omnibox_output_column_widths.css +++ b/chrome/browser/resources/omnibox/omnibox_output_column_widths.css
@@ -34,8 +34,8 @@ width: 120%; } -.header-additional-info, -.header-additional-properties { +.header-scoring-signals, +.header-additional-info { width: 240%; }
diff --git a/chrome/browser/resources/settings/icons.html b/chrome/browser/resources/settings/icons.html index e630a5cd..9364aa4 100644 --- a/chrome/browser/resources/settings/icons.html +++ b/chrome/browser/resources/settings/icons.html
@@ -98,6 +98,11 @@ <path d="M160-160q-33 0-56.5-23.5T80-240v-480q0-33 23.5-56.5T160-800h640q33 0 56.5 23.5T880-720v480q0 33-23.5 56.5T800-160H160Zm0-80h640v-400H160v400Zm278-58L296-440l58-58 84 84 168-168 58 58-226 226Zm-278 58v-480 480Z"></path> </g> + <!-- Forward GM3 icon --> + <g id="forward" viewBox="0 -960 960 960"> + <path d="m640-280-57-56 184-184-184-184 57-56 240 240-240 240ZM80-200v-160q0-83 58.5-141.5T280-560h247L383-704l57-56 240 240-240 240-57-56 144-144H280q-50 0-85 35t-35 85v160H80Z"></path> + </g> + <!-- Cookies Settings SVG --> <g id="block"><path d="M12 2C6.48 2 2 6.48 2 12s4.48 10 10 10 10-4.48 10-10S17.52 2 12 2zM4 12c0-4.42 3.58-8 8-8 1.85 0 3.55.63 4.9 1.69L5.69 16.9C4.63 15.55 4 13.85 4 12zm8 8c-1.85 0-3.55-.63-4.9-1.69L18.31 7.1C19.37 8.45 20 10.15 20 12c0 4.42-3.58 8-8 8z"></path></g>
diff --git a/chrome/browser/resources/settings/privacy_page/do_not_track_toggle.html b/chrome/browser/resources/settings/privacy_page/do_not_track_toggle.html index 5f545c6..a930306 100644 --- a/chrome/browser/resources/settings/privacy_page/do_not_track_toggle.html +++ b/chrome/browser/resources/settings/privacy_page/do_not_track_toggle.html
@@ -16,7 +16,7 @@ pref="{{prefs.enable_do_not_track}}" on-settings-boolean-control-change="onToggleChange_" sub-label="$i18n{trackingProtectionDoNotTrackToggleSubLabel}" - icon="settings:visibility-off" + icon="settings:forward" no-set-pref> </settings-toggle-button> </template>
diff --git a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_service.ts b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_service.ts index 68478ef..a9778d6 100644 --- a/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_service.ts +++ b/chrome/browser/resources/side_panel/bookmarks/power_bookmarks_service.ts
@@ -515,7 +515,7 @@ await PageImageServiceBrowserProxy.getInstance() .handler.getPageImageUrl( PageImageServiceClientId.Bookmarks, url, - {suggestImages: true, optimizationGuideImages: true}); + {suggestImages: false, optimizationGuideImages: true}); this.activeImageServiceRequestCount_--; if (result) {
diff --git a/chrome/browser/segmentation_platform/segmentation_platform_service_factory_unittest.cc b/chrome/browser/segmentation_platform/segmentation_platform_service_factory_unittest.cc index 9e5f6fd..8739b23a 100644 --- a/chrome/browser/segmentation_platform/segmentation_platform_service_factory_unittest.cc +++ b/chrome/browser/segmentation_platform/segmentation_platform_service_factory_unittest.cc
@@ -131,11 +131,9 @@ PredictionStatus expected_status, absl::optional<std::vector<std::string>> expected_labels, const ClassificationResult& actual_result) { - ASSERT_EQ(expected_status, actual_result.status); + EXPECT_EQ(actual_result.status, expected_status); if (expected_labels.has_value()) { - ASSERT_EQ(expected_labels.value().size(), - actual_result.ordered_labels.size()); - ASSERT_EQ(expected_labels.value(), actual_result.ordered_labels); + EXPECT_EQ(actual_result.ordered_labels, expected_labels.value()); } std::move(closure).Run(); } @@ -251,6 +249,18 @@ std::vector<std::string>(1, kLegacyNegativeLabel)); } +TEST_F(SegmentationPlatformServiceFactoryTest, TestResumeHeavyUserModel) { + InitServiceAndCacheResults(kResumeHeavyUserKey); + + PredictionOptions prediction_options; + + ExpectGetClassificationResult( + kResumeHeavyUserKey, prediction_options, nullptr, + /*expected_status=*/PredictionStatus::kSucceeded, + /*expected_labels=*/ + std::vector<std::string>(1, kLegacyNegativeLabel)); +} + TEST_F(SegmentationPlatformServiceFactoryTest, TestDeviceSwitcherModel) { InitService(); @@ -305,6 +315,18 @@ std::vector<std::string>{kLegacyNegativeLabel}); } +TEST_F(SegmentationPlatformServiceFactoryTest, TestIntentionalUserModel) { + InitServiceAndCacheResults(segmentation_platform::kIntentionalUserKey); + + segmentation_platform::PredictionOptions prediction_options; + + ExpectGetClassificationResult( + segmentation_platform::kIntentionalUserKey, prediction_options, nullptr, + /*expected_status=*/segmentation_platform::PredictionStatus::kSucceeded, + /*expected_labels=*/ + std::vector<std::string>(1, kLegacyNegativeLabel)); +} + #endif // BUILDFLAG(IS_ANDROID) } // namespace segmentation_platform
diff --git a/chrome/browser/support_tool/screenshot_data_collector.cc b/chrome/browser/support_tool/screenshot_data_collector.cc index 2fb86ed..5cca5b272 100644 --- a/chrome/browser/support_tool/screenshot_data_collector.cc +++ b/chrome/browser/support_tool/screenshot_data_collector.cc
@@ -155,7 +155,9 @@ DesktopMediaPickerController::DoneCallback callback = base::BindOnce(&ScreenshotDataCollector::OnSourceSelected, weak_ptr_factory_.GetWeakPtr()); - DesktopMediaPickerController::Params picker_params; + DesktopMediaPickerController::Params picker_params( + DesktopMediaPickerController::Params::RequestSource:: + kScreenshotDataCollector); picker_params.web_contents = web_contents; picker_params.context = parent_window; picker_params.parent = parent_window;
diff --git a/chrome/browser/ui/android/autofill/autofill_keyboard_accessory_view.cc b/chrome/browser/ui/android/autofill/autofill_keyboard_accessory_view.cc index ccc805e..1f98a831 100644 --- a/chrome/browser/ui/android/autofill/autofill_keyboard_accessory_view.cc +++ b/chrome/browser/ui/android/autofill/autofill_keyboard_accessory_view.cc
@@ -133,13 +133,8 @@ JNIEnv* env, const JavaParamRef<jobject>& obj, jint list_index) { - if (base::FeatureList::IsEnabled( - features::kAutofillKeyboardAccessoryAcceptanceDelayThreshold)) { controller_->AcceptSuggestion(list_index, base::TimeTicks::Now()); - } else { - controller_->AcceptSuggestionWithoutThreshold(list_index); } -} void AutofillKeyboardAccessoryView::DeletionRequested( JNIEnv* env,
diff --git a/chrome/browser/ui/autofill/autofill_keyboard_accessory_adapter.cc b/chrome/browser/ui/autofill/autofill_keyboard_accessory_adapter.cc index 8362cfe..fba86fb 100644 --- a/chrome/browser/ui/autofill/autofill_keyboard_accessory_adapter.cc +++ b/chrome/browser/ui/autofill/autofill_keyboard_accessory_adapter.cc
@@ -137,13 +137,6 @@ } } -void AutofillKeyboardAccessoryAdapter::AcceptSuggestionWithoutThreshold( - int index) { - if (controller_) { - controller_->AcceptSuggestionWithoutThreshold(OffsetIndexFor(index)); - } -} - int AutofillKeyboardAccessoryAdapter::GetLineCount() const { return controller_ ? controller_->GetLineCount() : 0; }
diff --git a/chrome/browser/ui/autofill/autofill_keyboard_accessory_adapter.h b/chrome/browser/ui/autofill/autofill_keyboard_accessory_adapter.h index 7cd9e4f2..5ef47f3 100644 --- a/chrome/browser/ui/autofill/autofill_keyboard_accessory_adapter.h +++ b/chrome/browser/ui/autofill/autofill_keyboard_accessory_adapter.h
@@ -93,7 +93,6 @@ // AutofillPopupController: // Hidden: void OnSuggestionsChanged() override; void AcceptSuggestion(int index, base::TimeTicks event_time) override; - void AcceptSuggestionWithoutThreshold(int index) override; int GetLineCount() const override; const autofill::Suggestion& GetSuggestionAt(int row) const override; std::u16string GetSuggestionMainTextAt(int row) const override;
diff --git a/chrome/browser/ui/autofill/autofill_popup_controller.h b/chrome/browser/ui/autofill/autofill_popup_controller.h index 2d363f4..9a99ec98 100644 --- a/chrome/browser/ui/autofill/autofill_popup_controller.h +++ b/chrome/browser/ui/autofill/autofill_popup_controller.h
@@ -34,11 +34,6 @@ // (crbug.com/1279268). virtual void AcceptSuggestion(int index, base::TimeTicks event_time) = 0; - // Accepts the suggestion at `index` without requiring a minimum show - // threshold. This should only be used in cases in which user intent is - // certain (e.g. the keyboard accessory). - virtual void AcceptSuggestionWithoutThreshold(int index) = 0; - // Removes the suggestion at the given index. virtual bool RemoveSuggestion(int index) = 0;
diff --git a/chrome/browser/ui/autofill/autofill_popup_controller_impl.cc b/chrome/browser/ui/autofill/autofill_popup_controller_impl.cc index 544ea6a..8f82a9b 100644 --- a/chrome/browser/ui/autofill/autofill_popup_controller_impl.cc +++ b/chrome/browser/ui/autofill/autofill_popup_controller_impl.cc
@@ -372,10 +372,6 @@ return; } - AcceptSuggestionWithoutThreshold(index); -} - -void AutofillPopupControllerImpl::AcceptSuggestionWithoutThreshold(int index) { if (static_cast<size_t>(index) >= suggestions_.size()) { // Prevents crashes from crbug.com/521133. It seems that in rare cases or // races the suggestions_ and the user-selected index may be out of sync.
diff --git a/chrome/browser/ui/autofill/autofill_popup_controller_impl.h b/chrome/browser/ui/autofill/autofill_popup_controller_impl.h index 051242e7..569e2c3 100644 --- a/chrome/browser/ui/autofill/autofill_popup_controller_impl.h +++ b/chrome/browser/ui/autofill/autofill_popup_controller_impl.h
@@ -166,7 +166,6 @@ void OnSuggestionsChanged() override; void SelectSuggestion(absl::optional<size_t> index) override; void AcceptSuggestion(int index, base::TimeTicks event_time) override; - void AcceptSuggestionWithoutThreshold(int index) override; bool RemoveSuggestion(int list_index) override; int GetLineCount() const override; const Suggestion& GetSuggestionAt(int row) const override;
diff --git a/chrome/browser/ui/autofill/autofill_popup_controller_unittest.cc b/chrome/browser/ui/autofill/autofill_popup_controller_unittest.cc index cfc0c23..15cba0e 100644 --- a/chrome/browser/ui/autofill/autofill_popup_controller_unittest.cc +++ b/chrome/browser/ui/autofill/autofill_popup_controller_unittest.cc
@@ -184,7 +184,6 @@ // Making protected functions public for testing using AutofillPopupControllerImpl::AcceptSuggestion; - using AutofillPopupControllerImpl::AcceptSuggestionWithoutThreshold; using AutofillPopupControllerImpl::element_bounds; using AutofillPopupControllerImpl::FireControlsChangedEvent; using AutofillPopupControllerImpl::GetLineCount; @@ -640,9 +639,8 @@ EXPECT_CALL(*delegate(), DidAcceptSuggestion).Times(0); // The following should not crash: - popup_controller() - .AcceptSuggestion( /*index=*/ - 1, base::TimeTicks::Now()); // Out of bounds! + popup_controller().AcceptSuggestion( + /*index=*/1, base::TimeTicks::Now()); // Out of bounds! } TEST_F(AutofillPopupControllerUnitTest, AcceptSuggestionRespectsTimeout) { @@ -663,17 +661,6 @@ "Autofill.Popup.AcceptanceDelayThresholdNotMet", 2); } -TEST_F(AutofillPopupControllerUnitTest, AcceptSuggestionWithoutThreshold) { - base::HistogramTester histogram_tester; - ShowSuggestions({PopupItemId::kAddressEntry}); - - // Calls are accepted immediately. - EXPECT_CALL(*delegate(), DidAcceptSuggestion).Times(1); - popup_controller().AcceptSuggestionWithoutThreshold(0); - histogram_tester.ExpectTotalCount( - "Autofill.Popup.AcceptanceDelayThresholdNotMet", 0); -} - TEST_F(AutofillPopupControllerUnitTest, AcceptSuggestionTimeoutIsUpdatedOnPopupMove) { base::HistogramTester histogram_tester; @@ -731,7 +718,8 @@ Run(_, _, password_manager::metrics_util:: PasswordMigrationWarningTriggers::kKeyboardAcessoryBar)); - popup_controller().AcceptSuggestionWithoutThreshold(0); + popup_controller().AcceptSuggestion( + 0, base::TimeTicks::Now() + base::Milliseconds(500)); } TEST_F(AutofillPopupControllerUnitTest, @@ -744,7 +732,8 @@ // Calls are accepted immediately. EXPECT_CALL(*delegate(), DidAcceptSuggestion).Times(1); EXPECT_CALL(show_pwd_migration_warning_callback_, Run); - popup_controller().AcceptSuggestionWithoutThreshold(0); + popup_controller().AcceptSuggestion( + 0, base::TimeTicks::Now() + base::Milliseconds(500)); } TEST_F(AutofillPopupControllerUnitTest, @@ -758,7 +747,8 @@ // Calls are accepted immediately. EXPECT_CALL(*delegate(), DidAcceptSuggestion).Times(1); EXPECT_CALL(show_pwd_migration_warning_callback_, Run).Times(0); - popup_controller().AcceptSuggestionWithoutThreshold(0); + popup_controller().AcceptSuggestion( + 0, base::TimeTicks::Now() + base::Milliseconds(500)); } TEST_F(AutofillPopupControllerUnitTest, AcceptAddressNoPwdWarningAndroid) { @@ -770,7 +760,8 @@ // Calls are accepted immediately. EXPECT_CALL(*delegate(), DidAcceptSuggestion).Times(1); EXPECT_CALL(show_pwd_migration_warning_callback_, Run).Times(0); - popup_controller().AcceptSuggestionWithoutThreshold(0); + popup_controller().AcceptSuggestion( + 0, base::TimeTicks::Now() + base::Milliseconds(500)); } #endif
diff --git a/chrome/browser/ui/autofill/payments/offer_notification_bubble_controller_impl.cc b/chrome/browser/ui/autofill/payments/offer_notification_bubble_controller_impl.cc index aaf5289..e44caf1 100644 --- a/chrome/browser/ui/autofill/payments/offer_notification_bubble_controller_impl.cc +++ b/chrome/browser/ui/autofill/payments/offer_notification_bubble_controller_impl.cc
@@ -210,11 +210,11 @@ is_user_gesture_ = false; - bool should_show_icon_only = options.notification_has_been_shown; - if (should_show_icon_only) - HideBubbleAndClearTimestamp(/*should_show_icon=*/true); - else + if (options.show_notification_automatically) { Show(); + } else { + HideBubbleAndClearTimestamp(/*should_show_icon=*/true); + } } void OfferNotificationBubbleControllerImpl::ReshowBubble() {
diff --git a/chrome/browser/ui/autofill/payments/offer_notification_bubble_controller_impl_unittest.cc b/chrome/browser/ui/autofill/payments/offer_notification_bubble_controller_impl_unittest.cc index a61b1ae..3944ae40 100644 --- a/chrome/browser/ui/autofill/payments/offer_notification_bubble_controller_impl_unittest.cc +++ b/chrome/browser/ui/autofill/payments/offer_notification_bubble_controller_impl_unittest.cc
@@ -85,7 +85,9 @@ void ShowBubble(const AutofillOfferData* offer, bool expand_notification_icon = false) { controller()->ShowOfferNotificationIfApplicable( - offer, &card_, {.expand_notification_icon = expand_notification_icon}); + offer, &card_, + {.expand_notification_icon = expand_notification_icon, + .show_notification_automatically = true}); } void CloseBubble(PaymentsBubbleClosedReason closed_reason =
diff --git a/chrome/browser/ui/views/autofill/payments/offer_notification_bubble_views_interactive_uitest.cc b/chrome/browser/ui/views/autofill/payments/offer_notification_bubble_views_interactive_uitest.cc index 1890364..1f751ab 100644 --- a/chrome/browser/ui/views/autofill/payments/offer_notification_bubble_views_interactive_uitest.cc +++ b/chrome/browser/ui/views/autofill/payments/offer_notification_bubble_views_interactive_uitest.cc
@@ -746,9 +746,11 @@ const std::string domain_url = "www.merchantsite1.com"; const GURL with_offer_url = GetUrl(domain_url, "/product1"); const GURL without_offer_url = GetUrl(domain_url, "/product2"); + const GURL with_merchant_wide_offer_url = GetUrl(domain_url, "/product3"); const std::string detail = "Discount description detail"; const std::string discount_code = "freelisting-discount-code"; - const int64_t discount_id = 123; + const int64_t non_merchant_wide_discount_id = 123; + const int64_t merchant_wide_discount_id = 456; const double expiry_time_sec = (AutofillClock::Now() + base::Days(2)).ToDoubleT(); @@ -756,22 +758,24 @@ commerce::ShoppingServiceFactory::GetForBrowserContext( browser()->profile())); mock_shopping_service->SetIsDiscountEligibleToShowOnNavigation(true); - // Expect to call this once on every navigation, this test is navigated 3 + // Expect to call this once on every navigation, this test is navigated 4 // times. EXPECT_CALL(*mock_shopping_service, IsDiscountEligibleToShowOnNavigation) - .Times(3); - EXPECT_CALL(*mock_shopping_service, GetDiscountInfoForUrls).Times(3); + .Times(4); + EXPECT_CALL(*mock_shopping_service, GetDiscountInfoForUrls).Times(4); NavigateToAndWaitForForm(GetUrl(domain_url, "/")); EXPECT_FALSE(IsIconVisible()); EXPECT_FALSE(GetOfferNotificationBubbleViews()); - // Simulate FreeListingOffer for a product page on the `domain_url`. + // Simulate non-merchant-wide FreeListingOffer for a product page on the + // `with_offer_url`. mock_shopping_service->SetResponseForGetDiscountInfoForUrls( {{with_offer_url, {commerce::CreateValidDiscountInfo( detail, /*terms_and_conditions=*/"", - /*value_in_text=*/"$10 off", discount_code, discount_id, + /*value_in_text=*/"$10 off", discount_code, + non_merchant_wide_discount_id, /*is_merchant_wide=*/false, expiry_time_sec)}}}); NavigateToAndWaitForForm(with_offer_url); @@ -796,6 +800,20 @@ NavigateToAndWaitForForm(without_offer_url); EXPECT_FALSE(IsIconVisible()); EXPECT_FALSE(GetOfferNotificationBubbleViews()); + + // Simulate merchant-wide FreeListingOffer for a product page on the + // `with_merchant_wide_offer_url`. + mock_shopping_service->SetResponseForGetDiscountInfoForUrls( + {{with_merchant_wide_offer_url, + {commerce::CreateValidDiscountInfo( + detail, /*terms_and_conditions=*/"", + /*value_in_text=*/"$10 off", discount_code, + merchant_wide_discount_id, + /*is_merchant_wide=*/true, expiry_time_sec)}}}); + + NavigateToAndWaitForForm(with_merchant_wide_offer_url); + EXPECT_TRUE(IsIconVisible()); + EXPECT_FALSE(GetOfferNotificationBubbleViews()); } IN_PROC_BROWSER_TEST_P( @@ -874,9 +892,14 @@ IN_PROC_BROWSER_TEST_P( OfferNotificationBubbleViewsWithDiscountOnChromeHistoryClusterTest, ShowShoppingServiceFreeListingOffer_WhenNavigatedFromChromeHistoryCluster) { - const std::string domain_url = "www.merchantsite1.com"; - const GURL with_offer_url = GetUrl( - domain_url, "/first?utm_source=chrome-history-cluster-with-discount"); + const std::string non_merchant_wide_domain_url = "www.merchantsite1.com"; + const std::string merchant_wide_domain_url = "www.merchantsite2.com"; + const GURL with_non_merchant_wide_offer_url = + GetUrl(non_merchant_wide_domain_url, + "/first?utm_source=chrome-history-cluster-with-discount"); + const GURL with_merchant_wide_offer_url = + GetUrl(merchant_wide_domain_url, + "/first?utm_source=chrome-history-cluster-with-discount"); const std::string detail = "Discount description detail"; const std::string discount_code = "freelisting-discount-code"; const int64_t discount_id = 123; @@ -887,22 +910,26 @@ commerce::ShoppingServiceFactory::GetForBrowserContext( browser()->profile())); mock_shopping_service->SetIsDiscountEligibleToShowOnNavigation(true); - // Simulate FreeListingOffer for a product page on the `domain_url`. + // Simulate FreeListingOffer for a product page on the + // `non_merchant_wide_domain_url`. mock_shopping_service->SetResponseForGetDiscountInfoForUrls( - {{with_offer_url, + {{with_non_merchant_wide_offer_url, {commerce::CreateValidDiscountInfo( detail, /*terms_and_conditions=*/"", /*value_in_text=*/"$10 off", discount_code, discount_id, /*is_merchant_wide=*/false, expiry_time_sec)}}}); - EXPECT_CALL(*mock_shopping_service, IsDiscountEligibleToShowOnNavigation); - EXPECT_CALL(*mock_shopping_service, GetDiscountInfoForUrls); + // Expect to call this once on every navigation, this test is navigated 2 + // times. + EXPECT_CALL(*mock_shopping_service, IsDiscountEligibleToShowOnNavigation) + .Times(2); + EXPECT_CALL(*mock_shopping_service, GetDiscountInfoForUrls).Times(2); SetUpGPayPromoCodeOfferDataWithDomains( {GetUrl("www.merchantsite1.com", "/"), GetUrl("www.merchantsite2.com", "/")}); ResetEventWaiterForSequence({DialogEvent::BUBBLE_SHOWN}); - NavigateToAndWaitForForm(with_offer_url); + NavigateToAndWaitForForm(with_non_merchant_wide_offer_url); ASSERT_TRUE(WaitForObservedEvent()); EXPECT_TRUE(IsIconVisible()); EXPECT_TRUE(GetOfferNotificationBubbleViews()); @@ -924,6 +951,19 @@ auto promo_code_styled_label = GetOfferNotificationBubbleViews()->promo_code_label_; EXPECT_FALSE(promo_code_styled_label); + + // Simulate merchant-wide FreeListingOffer for a product page on the + // `merchant_wide_domain_url`. + mock_shopping_service->SetResponseForGetDiscountInfoForUrls( + {{with_merchant_wide_offer_url, + {commerce::CreateValidDiscountInfo( + detail, /*terms_and_conditions=*/"", + /*value_in_text=*/"$10 off", discount_code, discount_id, + /*is_merchant_wide=*/true, expiry_time_sec)}}}); + + NavigateToAndWaitForForm(with_merchant_wide_offer_url); + EXPECT_TRUE(IsIconVisible()); + EXPECT_TRUE(GetOfferNotificationBubbleViews()); } } // namespace autofill
diff --git a/chrome/browser/ui/views/autofill/payments/offer_notification_bubble_views_pixel_browsertest.cc b/chrome/browser/ui/views/autofill/payments/offer_notification_bubble_views_pixel_browsertest.cc index daa8aea..84dd42c 100644 --- a/chrome/browser/ui/views/autofill/payments/offer_notification_bubble_views_pixel_browsertest.cc +++ b/chrome/browser/ui/views/autofill/payments/offer_notification_bubble_views_pixel_browsertest.cc
@@ -80,8 +80,7 @@ views::test::AnyWidgetTestPasskey{}, OfferNotificationBubbleViews::kViewClassName); - autofill_client->UpdateOfferNotification( - &offer, {.notification_has_been_shown = true}); + autofill_client->UpdateOfferNotification(&offer, {}); OfferNotificationBubbleControllerImpl* controller = GetController(); EXPECT_TRUE(controller); // Ensure the window is active before reshowing the bubble.
diff --git a/chrome/browser/ui/views/autofill/popup/popup_view_views_unittest.cc b/chrome/browser/ui/views/autofill/popup/popup_view_views_unittest.cc index e168630..8aede38 100644 --- a/chrome/browser/ui/views/autofill/popup/popup_view_views_unittest.cc +++ b/chrome/browser/ui/views/autofill/popup/popup_view_views_unittest.cc
@@ -269,7 +269,6 @@ TEST_F(PopupViewViewsTest, ShowHideTest) { CreateAndShowView({PopupItemId::kAutocompleteEntry}); EXPECT_CALL(controller(), AcceptSuggestion).Times(0); - EXPECT_CALL(controller(), AcceptSuggestionWithoutThreshold).Times(0); view().Hide(); } @@ -422,7 +421,6 @@ CreateAndShowView(); EXPECT_CALL(controller(), AcceptSuggestion).Times(0); - EXPECT_CALL(controller(), AcceptSuggestionWithoutThreshold).Times(0); gfx::Point inside_point(GetRowViewAt(0).x() + 1, GetRowViewAt(0).y() + 1); ui::MouseEvent click_mouse_event( @@ -639,7 +637,6 @@ TEST_F(PopupViewViewsTestKeyboard, FillOnEnter) { SelectFirstSuggestion(); EXPECT_CALL(controller(), AcceptSuggestion(0, _)); - EXPECT_CALL(controller(), AcceptSuggestionWithoutThreshold).Times(0); SimulateKeyPress(ui::VKEY_RETURN); } @@ -647,7 +644,6 @@ TEST_F(PopupViewViewsTestKeyboard, FillOnTabPressed) { SelectFirstSuggestion(); EXPECT_CALL(controller(), AcceptSuggestion(0, _)); - EXPECT_CALL(controller(), AcceptSuggestionWithoutThreshold).Times(0); SimulateKeyPress(ui::VKEY_TAB); } @@ -656,7 +652,6 @@ TEST_F(PopupViewViewsTestKeyboard, NoFillOnTabPressedWithModifiers) { SelectFirstSuggestion(); EXPECT_CALL(controller(), AcceptSuggestion(0, _)).Times(0); - EXPECT_CALL(controller(), AcceptSuggestionWithoutThreshold).Times(0); SimulateKeyPress(ui::VKEY_TAB, /*shift_modifier_pressed=*/false, /*non_shift_modifier_pressed=*/true); } @@ -676,7 +671,6 @@ // Because the selected line is PopupItemId::kAutofillOptions, we expect that // the tab key does not trigger anything. EXPECT_CALL(controller(), AcceptSuggestion).Times(0); - EXPECT_CALL(controller(), AcceptSuggestionWithoutThreshold).Times(0); SimulateKeyPress(ui::VKEY_TAB); }
diff --git a/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc b/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc index 7188fad0..29190eb8 100644 --- a/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc +++ b/chrome/browser/ui/views/bookmarks/bookmark_bar_view.cc
@@ -2239,21 +2239,12 @@ } bool BookmarkBarView::UpdateOtherAndManagedButtonsVisibility() { - bool update_other; - if (base::FeatureList::IsEnabled(features::kPowerBookmarksSidePanel)) { - update_other = !other_bookmarks_button_->GetVisible(); - if (update_other) { - other_bookmarks_button_->SetVisible(true); - UpdateBookmarksSeparatorVisibility(); - } - } else { - bool has_other_children = - !bookmark_model_->other_node()->children().empty(); - update_other = has_other_children != other_bookmarks_button_->GetVisible(); - if (update_other) { - other_bookmarks_button_->SetVisible(has_other_children); - UpdateBookmarksSeparatorVisibility(); - } + bool has_other_children = !bookmark_model_->other_node()->children().empty(); + bool update_other = + has_other_children != other_bookmarks_button_->GetVisible(); + if (update_other) { + other_bookmarks_button_->SetVisible(has_other_children); + UpdateBookmarksSeparatorVisibility(); } bool show_managed = !managed_->managed_node()->children().empty() &&
diff --git a/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views.cc b/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views.cc index 5e845e5..70446dc 100644 --- a/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views.cc +++ b/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views.cc
@@ -17,6 +17,7 @@ #include "build/chromeos_buildflags.h" #include "chrome/browser/media/webrtc/desktop_capture_devices_util.h" #include "chrome/browser/media/webrtc/desktop_media_list.h" +#include "chrome/browser/media/webrtc/desktop_media_picker_controller.h" #include "chrome/browser/media/webrtc/desktop_media_picker_manager.h" #include "chrome/browser/media/webrtc/desktop_media_picker_utils.h" #include "chrome/browser/ui/browser_finder.h" @@ -64,6 +65,7 @@ #endif using content::DesktopMediaID; +using RequestSource = DesktopMediaPicker::Params::RequestSource; enum class DesktopMediaPickerDialogView::DialogType : int { kStandard = 0, @@ -187,13 +189,13 @@ std::u16string GetLabelForAudioCheckbox(DesktopMediaList::Type type, bool local_audio_suppression, - bool is_get_display_media_call) { + RequestSource request_source) { switch (type) { case DesktopMediaList::Type::kScreen: { bool show_warning = local_audio_suppression && base::FeatureList::IsEnabled( kWarnUserOfSystemWideLocalAudioSuppression); - if (is_get_display_media_call && + if (request_source == RequestSource::kGetDisplayMedia && !base::FeatureList::IsEnabled( ::kSuppressLocalAudioPlaybackForSystemAudio)) { // Suppression blocked by killswitch, so no need to show a warning. @@ -322,7 +324,8 @@ bool DesktopMediaPickerDialogView::AudioSupported(DesktopMediaList::Type type) { switch (type) { case DesktopMediaList::Type::kScreen: - return DesktopMediaPickerViews::kScreenAudioShareSupportedOnPlatform; + return DesktopMediaPickerController::IsSystemAudioCaptureSupported( + request_source_); case DesktopMediaList::Type::kWindow: return false; case DesktopMediaList::Type::kWebContents: @@ -363,7 +366,7 @@ DesktopMediaPickerViews* parent, std::vector<std::unique_ptr<DesktopMediaList>> source_lists) : web_contents_(params.web_contents), - is_get_display_media_call_(params.is_get_display_media_call), + request_source_(params.request_source), app_name_(params.app_name), audio_requested_(params.request_audio), suppress_local_audio_playback_(params.suppress_local_audio_playback), @@ -611,7 +614,7 @@ AddChildView(std::move(panes.front().second)); } - if (is_get_display_media_call_) { + if (request_source_ == RequestSource::kGetDisplayMedia) { description_label_->SetText( l10n_util::GetStringUTF16(IDS_DISPLAY_MEDIA_PICKER_TEXT)); } else { @@ -801,8 +804,7 @@ // If we need the audio checkbox build and add it now. std::unique_ptr<views::Checkbox> audio_share_checkbox = std::make_unique<views::Checkbox>(GetLabelForAudioCheckbox( - category.type, suppress_local_audio_playback_, - is_get_display_media_call_)); + category.type, suppress_local_audio_playback_, request_source_)); audio_share_checkbox->SetVisible(true); audio_share_checkbox->SetChecked(category.audio_checked); audio_share_checkbox->SetMultiLine(true); @@ -835,7 +837,8 @@ const DisplaySurfaceCategory& category) const { if (!category.audio_offered) { return l10n_util::GetStringUTF16( - DesktopMediaPickerViews::kScreenAudioShareSupportedOnPlatform + DesktopMediaPickerController::IsSystemAudioCaptureSupported( + request_source_) ? IDS_DESKTOP_MEDIA_PICKER_AUDIO_SHARE_HINT_TAB_OR_SCREEN : IDS_DESKTOP_MEDIA_PICKER_AUDIO_SHARE_HINT_TAB); } @@ -845,7 +848,7 @@ bool show_warning = suppress_local_audio_playback_ && base::FeatureList::IsEnabled( kWarnUserOfSystemWideLocalAudioSuppression); - if (is_get_display_media_call_ && + if (request_source_ == RequestSource::kGetDisplayMedia && !base::FeatureList::IsEnabled( ::kSuppressLocalAudioPlaybackForSystemAudio)) { // Suppression blocked by killswitch, so no need to show a warning. @@ -983,7 +986,7 @@ } std::u16string DesktopMediaPickerDialogView::GetWindowTitle() const { - if (is_get_display_media_call_) { + if (request_source_ == RequestSource::kGetDisplayMedia) { return l10n_util::GetStringFUTF16(IDS_DISPLAY_MEDIA_PICKER_TITLE, app_name_); } @@ -1032,8 +1035,7 @@ (audio_share_checkbox_ && audio_share_checkbox_->GetVisible() && audio_share_checkbox_->GetChecked()) || IsAudioSharingApprovedByUser(); - - if (is_get_display_media_call_) { + if (request_source_ == RequestSource::kGetDisplayMedia) { RecordUmaSelection(dialog_type_, capturer_global_id_, source, GetSelectedSourceListType(), dialog_open_time_); } @@ -1047,7 +1049,7 @@ } bool DesktopMediaPickerDialogView::Cancel() { - if (is_get_display_media_call_) { + if (request_source_ == RequestSource::kGetDisplayMedia) { RecordUmaCancellation(dialog_type_, dialog_open_time_); } RecordSourceCountsUma(); @@ -1144,13 +1146,11 @@ BEGIN_METADATA(DesktopMediaPickerDialogView, views::DialogDelegateView) END_METADATA -constexpr bool DesktopMediaPickerViews::kScreenAudioShareSupportedOnPlatform; - DesktopMediaPickerViews::DesktopMediaPickerViews() : dialog_(nullptr) {} DesktopMediaPickerViews::~DesktopMediaPickerViews() { if (dialog_) { - if (is_get_display_media_call_) { + if (request_source_ == RequestSource::kGetDisplayMedia) { dialog_->RecordUmaDismissal(); } dialog_->DetachParent(); @@ -1164,7 +1164,7 @@ DoneCallback done_callback) { DesktopMediaPickerManager::Get()->OnShowDialog(); - is_get_display_media_call_ = params.is_get_display_media_call; + request_source_ = params.request_source; callback_ = std::move(done_callback); dialog_ = new DesktopMediaPickerDialogView(params, this, std::move(source_lists));
diff --git a/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views.h b/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views.h index 3421ac0..2fd859ed 100644 --- a/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views.h +++ b/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views.h
@@ -105,7 +105,7 @@ raw_ptr<DesktopMediaPaneView> pane = nullptr; }; - static bool AudioSupported(DesktopMediaList::Type type); + bool AudioSupported(DesktopMediaList::Type type); void ConfigureUIForNewPane(int index); void StoreAudioCheckboxState(); @@ -156,7 +156,7 @@ const raw_ptr<content::WebContents, AcrossTasksDanglingUntriaged> web_contents_; - const bool is_get_display_media_call_; + const DesktopMediaPicker::Params::RequestSource request_source_; const std::u16string app_name_; const bool audio_requested_; const bool suppress_local_audio_playback_; // Effective only if audio shared. @@ -189,12 +189,6 @@ // DesktopMediaPicker. class DesktopMediaPickerViews : public DesktopMediaPicker { public: -#if BUILDFLAG(IS_WIN) || defined(USE_CRAS) - static constexpr bool kScreenAudioShareSupportedOnPlatform = true; -#else - static constexpr bool kScreenAudioShareSupportedOnPlatform = false; -#endif - DesktopMediaPickerViews(); DesktopMediaPickerViews(const DesktopMediaPickerViews&) = delete; DesktopMediaPickerViews& operator=(const DesktopMediaPickerViews&) = delete; @@ -216,7 +210,7 @@ DoneCallback callback_; - bool is_get_display_media_call_ = false; + Params::RequestSource request_source_; // The |dialog_| is owned by the corresponding views::Widget instance. // When DesktopMediaPickerViews is destroyed the |dialog_| is destroyed
diff --git a/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views_browsertest.cc b/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views_browsertest.cc index 9d65c2a..8c9cf35e 100644 --- a/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views_browsertest.cc +++ b/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views_browsertest.cc
@@ -52,7 +52,8 @@ for (const auto& source : sources) source_lists.push_back(static_cast<FakeDesktopMediaList*>(source.get())); - DesktopMediaPicker::Params picker_params; + DesktopMediaPicker::Params picker_params{ + DesktopMediaPicker::Params::RequestSource::kUnknown}; picker_params.web_contents = web_contents; picker_params.context = native_window; picker_params.app_name = u"app_name";
diff --git a/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views_test_api.cc b/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views_test_api.cc index 0ad501f..96ddad2f 100644 --- a/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views_test_api.cc +++ b/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views_test_api.cc
@@ -40,7 +40,7 @@ bool DesktopMediaPickerViewsTestApi::AudioSupported( DesktopMediaList::Type type) const { - return DesktopMediaPickerDialogView::AudioSupported(type); + return picker_->dialog_->AudioSupported(type); } void DesktopMediaPickerViewsTestApi::FocusAudioShareControl() {
diff --git a/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views_unittest.cc b/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views_unittest.cc index 904d872..50cb594 100644 --- a/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views_unittest.cc +++ b/chrome/browser/ui/views/desktop_capture/desktop_media_picker_views_unittest.cc
@@ -16,6 +16,7 @@ #include "base/strings/utf_string_conversions.h" #include "base/task/single_thread_task_runner.h" #include "build/build_config.h" +#include "chrome/browser/media/webrtc/desktop_media_picker_controller.h" #include "chrome/browser/media/webrtc/desktop_media_picker_manager.h" #include "chrome/browser/media/webrtc/fake_desktop_media_list.h" #include "chrome/browser/ui/views/desktop_capture/desktop_media_list_controller.h" @@ -187,7 +188,8 @@ "DesktopMediaPickerDialogView"); const std::u16string kAppName = u"foo"; - DesktopMediaPicker::Params picker_params; + DesktopMediaPicker::Params picker_params{ + DesktopMediaPicker::Params::RequestSource::kUnknown}; picker_params.context = test_helper_.GetContext(); picker_params.app_name = kAppName; picker_params.target_name = kAppName; @@ -402,7 +404,8 @@ // when GetAudioShareCheckbox() returns false. TEST_P(DesktopMediaPickerViewsTest, AudioCheckboxVisibility) { test_api_.SelectTabForSourceType(DesktopMediaList::Type::kScreen); - EXPECT_EQ(DesktopMediaPickerViews::kScreenAudioShareSupportedOnPlatform, + EXPECT_EQ(DesktopMediaPickerController::IsSystemAudioCaptureSupported( + DesktopMediaPicker::Params::RequestSource::kGetDisplayMedia), test_api_.HasAudioShareControl()); test_api_.SelectTabForSourceType(DesktopMediaList::Type::kWindow); @@ -619,7 +622,8 @@ test_api_.SelectTabForSourceType(DesktopMediaList::Type::kScreen); // System audio checkbox shown to the user iff the platform supports it. - EXPECT_EQ(DesktopMediaPickerViews::kScreenAudioShareSupportedOnPlatform, + EXPECT_EQ(DesktopMediaPickerController::IsSystemAudioCaptureSupported( + DesktopMediaPicker::Params::RequestSource::kGetDisplayMedia), test_api_.HasAudioShareControl()); }
diff --git a/chrome/browser/ui/views/desktop_capture/desktop_media_tab_list_unittest.cc b/chrome/browser/ui/views/desktop_capture/desktop_media_tab_list_unittest.cc index a047218..dc983f3 100644 --- a/chrome/browser/ui/views/desktop_capture/desktop_media_tab_list_unittest.cc +++ b/chrome/browser/ui/views/desktop_capture/desktop_media_tab_list_unittest.cc
@@ -41,7 +41,8 @@ picker_views_ = std::make_unique<DesktopMediaPickerViews>(); const std::u16string kAppName = u"foo"; - DesktopMediaPicker::Params picker_params; + DesktopMediaPicker::Params picker_params{ + DesktopMediaPicker::Params::RequestSource::kUnknown}; picker_params.context = test_helper_.GetContext(); picker_params.app_name = kAppName; picker_params.target_name = kAppName;
diff --git a/chrome/browser/ui/views/download/bubble/download_toolbar_button_view.cc b/chrome/browser/ui/views/download/bubble/download_toolbar_button_view.cc index 9bdf0f4..b4901a68 100644 --- a/chrome/browser/ui/views/download/bubble/download_toolbar_button_view.cc +++ b/chrome/browser/ui/views/download/bubble/download_toolbar_button_view.cc
@@ -73,6 +73,10 @@ #include "chromeos/components/kiosk/kiosk_utils.h" #endif +#if BUILDFLAG(IS_MAC) +#include "chrome/browser/ui/fullscreen_util_mac.h" +#endif + namespace { using offline_items_collection::ContentId; @@ -327,6 +331,20 @@ } bool DownloadToolbarButtonView::IsFullscreenWithParentViewHidden() const { +#if BUILDFLAG(IS_MAC) + if (fullscreen_utils::IsInContentFullscreen(browser_)) { + return true; + } +#endif + + // If immersive fullscreen, check if top chrome is visible. + BrowserView* browser_view = BrowserView::GetBrowserViewForBrowser(browser_); + if (browser_view && browser_view->GetLocationBarView() && + browser_view->IsImmersiveModeEnabled()) { + return !browser_view->immersive_mode_controller()->IsRevealed(); + } + + // Handle the remaining fullscreen case. return browser_->window() && browser_->window()->IsFullscreen() && !browser_->window()->IsToolbarVisible(); }
diff --git a/chrome/browser/ui/views/editor_menu/BUILD.gn b/chrome/browser/ui/views/editor_menu/BUILD.gn index 3ce94089..576784c 100644 --- a/chrome/browser/ui/views/editor_menu/BUILD.gn +++ b/chrome/browser/ui/views/editor_menu/BUILD.gn
@@ -19,6 +19,7 @@ deps = [ "//base", + "//chrome/browser/ui/views/editor_menu/vector_icons", "//components/vector_icons", "//ui/aura", "//ui/events",
diff --git a/chrome/browser/ui/views/editor_menu/editor_menu_controller_impl.cc b/chrome/browser/ui/views/editor_menu/editor_menu_controller_impl.cc index a4803eb..d4782ce 100644 --- a/chrome/browser/ui/views/editor_menu/editor_menu_controller_impl.cc +++ b/chrome/browser/ui/views/editor_menu/editor_menu_controller_impl.cc
@@ -45,10 +45,12 @@ PresetTextQueries GetPresetTextQueries( const std::vector<EditorPanelPresetTextQueryPtr>& preset_text_queries) { + // TODO(b/295059934): Use EditorPanelPresetTextQueryPtrs to get the actual + // query categories. PresetTextQueries queries; for (const auto& query : preset_text_queries) { queries.emplace_back(query->text_query_id, base::UTF8ToUTF16(query->name), - PresetQueryCategory(query->category)); + PresetQueryCategory::kUnknown); } return queries; }
diff --git a/chrome/browser/ui/views/editor_menu/editor_menu_textfield_view.cc b/chrome/browser/ui/views/editor_menu/editor_menu_textfield_view.cc index aec9d1b..d9d2df75 100644 --- a/chrome/browser/ui/views/editor_menu/editor_menu_textfield_view.cc +++ b/chrome/browser/ui/views/editor_menu/editor_menu_textfield_view.cc
@@ -11,6 +11,7 @@ #include "base/memory/raw_ptr.h" #include "chrome/browser/ui/views/editor_menu/editor_menu_view_delegate.h" #include "components/vector_icons/vector_icons.h" +#include "ui/base/metadata/metadata_header_macros.h" #include "ui/base/metadata/metadata_impl_macros.h" #include "ui/base/models/image_model.h" #include "ui/chromeos/styles/cros_tokens_color_mappings.h" @@ -21,11 +22,14 @@ #include "ui/views/background.h" #include "ui/views/border.h" #include "ui/views/controls/button/image_button.h" +#include "ui/views/controls/focus_ring.h" +#include "ui/views/controls/highlight_path_generator.h" #include "ui/views/controls/textfield/textfield.h" #include "ui/views/layout/box_layout.h" #include "ui/views/layout/flex_layout_view.h" #include "ui/views/view.h" #include "ui/views/view_class_properties.h" +#include "ui/views/view_utils.h" #include "ui/views/widget/widget.h" namespace chromeos::editor_menu { @@ -41,12 +45,61 @@ constexpr int kButtonSizeDip = 32; constexpr int kBorderThicknessDip = 1; +class EditorMenuTextfield : public views::Textfield { + public: + METADATA_HEADER(EditorMenuTextfield); + EditorMenuTextfield() : views::Textfield() { + // TODO(b/300857651): Add a custom hover effect which covers the whole + // textfield container view. For now, just disable the default hover effect + // since it looks strange to only partially cover the textfield container. + RemoveHoverEffect(); + } + EditorMenuTextfield(const EditorMenuTextfield&) = delete; + EditorMenuTextfield& operator=(const EditorMenuTextfield&) = delete; + ~EditorMenuTextfield() override = default; + + void OnFocus() override { + views::Textfield::OnFocus(); + NotifyTextfieldFocusChanged(); + } + + void OnBlur() override { + views::Textfield::OnBlur(); + NotifyTextfieldFocusChanged(); + } + + private: + void NotifyTextfieldFocusChanged() { + auto* textfield_container = + views::AsViewClass<EditorMenuTextfieldView>(parent()); + CHECK(textfield_container); + textfield_container->OnTextfieldFocusChanged(); + } +}; + +BEGIN_METADATA(EditorMenuTextfield, views::Textfield) +END_METADATA + } // namespace EditorMenuTextfieldView::EditorMenuTextfieldView( EditorMenuViewDelegate* delegate) : delegate_(delegate) { CHECK(delegate_); + + // Install a focus ring to show when `textfield_` is focused. This focus ring + // is installed on the EditorMenuTextfieldView so that it surrounds the + // overall textfield container. + views::FocusRing::Install(this); + views::FocusRing::Get(this)->SetHasFocusPredicate( + base::BindRepeating([](const View* view) { + const auto* v = views::AsViewClass<EditorMenuTextfieldView>(view); + CHECK(v); + return v->textfield_ && v->textfield_->HasFocus(); + })); + views::FocusRing::Get(this)->SetOutsetFocusRingDisabled(true); + views::InstallRoundRectHighlightPathGenerator(this, gfx::Insets(), + kBackgroundRadiusDip); } EditorMenuTextfieldView::~EditorMenuTextfieldView() = default; @@ -82,6 +135,14 @@ return true; } +void EditorMenuTextfieldView::OnTextfieldFocusChanged() { + // The focus ring should be shown when the underlying `textfield_` is focused. + // Schedule a repaint to update its visibility if needed. + if (views::FocusRing::Get(this)) { + views::FocusRing::Get(this)->SchedulePaint(); + } +} + void EditorMenuTextfieldView::InitLayout() { SetBackground(views::CreateThemedRoundedRectBackground( static_cast<ui::ColorId>(cros_tokens::kCrosSysSystemBaseElevated), @@ -95,7 +156,7 @@ layout->set_cross_axis_alignment( views::BoxLayout::CrossAxisAlignment::kCenter); - textfield_ = AddChildView(std::make_unique<views::Textfield>()); + textfield_ = AddChildView(std::make_unique<EditorMenuTextfield>()); textfield_->SetAccessibleName(kContainerTitle); textfield_->set_controller(this); textfield_->SetBorder(views::NullBorder());
diff --git a/chrome/browser/ui/views/editor_menu/editor_menu_textfield_view.h b/chrome/browser/ui/views/editor_menu/editor_menu_textfield_view.h index e4b28e1..654df69 100644 --- a/chrome/browser/ui/views/editor_menu/editor_menu_textfield_view.h +++ b/chrome/browser/ui/views/editor_menu/editor_menu_textfield_view.h
@@ -53,6 +53,8 @@ bool HandleKeyEvent(views::Textfield* sender, const ui::KeyEvent& key_event) override; + void OnTextfieldFocusChanged(); + private: void InitLayout(); void OnTextfieldArrowButtonPressed();
diff --git a/chrome/browser/ui/views/editor_menu/utils/preset_text_query.cc b/chrome/browser/ui/views/editor_menu/utils/preset_text_query.cc index fbd4eb1b6..fb03a5f 100644 --- a/chrome/browser/ui/views/editor_menu/utils/preset_text_query.cc +++ b/chrome/browser/ui/views/editor_menu/utils/preset_text_query.cc
@@ -6,6 +6,7 @@ #include <string_view> +#include "chrome/browser/ui/views/editor_menu/vector_icons/vector_icons.h" #include "components/vector_icons/vector_icons.h" #include "ui/gfx/vector_icon_types.h" @@ -21,10 +22,16 @@ switch (category) { case PresetQueryCategory::kUnknown: return vector_icons::kKeyboardIcon; - case PresetQueryCategory::kPlaceholder: - return vector_icons::kContentCopyIcon; - case PresetQueryCategory::kAnotherPlaceholder: - return vector_icons::kContentPasteIcon; + case PresetQueryCategory::kShorten: + return kEditorMenuShortenIcon; + case PresetQueryCategory::kElaborate: + return kEditorMenuElaborateIcon; + case PresetQueryCategory::kRephrase: + return kEditorMenuRephraseIcon; + case PresetQueryCategory::kFormalize: + return kEditorMenuFormalizeIcon; + case PresetQueryCategory::kEmojify: + return kEditorMenuEmojifyIcon; } }
diff --git a/chrome/browser/ui/views/editor_menu/utils/preset_text_query.h b/chrome/browser/ui/views/editor_menu/utils/preset_text_query.h index 243e9684..039c58f9 100644 --- a/chrome/browser/ui/views/editor_menu/utils/preset_text_query.h +++ b/chrome/browser/ui/views/editor_menu/utils/preset_text_query.h
@@ -17,8 +17,11 @@ // Categories of preset text prompts to be shown on editor menu chips. enum class PresetQueryCategory { kUnknown = 0, - kPlaceholder, - kAnotherPlaceholder, + kShorten, + kElaborate, + kRephrase, + kFormalize, + kEmojify, }; struct PresetTextQuery {
diff --git a/chrome/browser/ui/views/editor_menu/vector_icons/BUILD.gn b/chrome/browser/ui/views/editor_menu/vector_icons/BUILD.gn new file mode 100644 index 0000000..68f0bd5 --- /dev/null +++ b/chrome/browser/ui/views/editor_menu/vector_icons/BUILD.gn
@@ -0,0 +1,28 @@ +# Copyright 2023 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. + +import("//components/vector_icons/vector_icons.gni") + +aggregate_vector_icons("editor_menu_vector_icons") { + icon_directory = "." + + sources = [ + "editor_menu_elaborate.icon", + "editor_menu_emojify.icon", + "editor_menu_formalize.icon", + "editor_menu_rephrase.icon", + "editor_menu_shorten.icon", + ] +} + +source_set("vector_icons") { + sources = get_target_outputs(":editor_menu_vector_icons") + + deps = [ + ":editor_menu_vector_icons", + "//base", + "//skia", + "//ui/gfx", + ] +}
diff --git a/chrome/browser/ui/views/editor_menu/vector_icons/editor_menu_elaborate.icon b/chrome/browser/ui/views/editor_menu/vector_icons/editor_menu_elaborate.icon new file mode 100644 index 0000000..3f39c5d --- /dev/null +++ b/chrome/browser/ui/views/editor_menu/vector_icons/editor_menu_elaborate.icon
@@ -0,0 +1,32 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +CANVAS_DIMENSIONS, 20, +MOVE_TO, 3.89f, 18.31f, +R_V_LINE_TO, -1.73f, +R_H_LINE_TO, 12.23f, +R_V_LINE_TO, 1.73f, +CLOSE, +MOVE_TO, 10, 15.08f, +R_LINE_TO, -3.13f, -3.13f, +R_LINE_TO, 1.17f, -1.17f, +R_LINE_TO, 1.14f, 1.15f, +V_LINE_TO, 8.08f, +LINE_TO, 8.04f, 9.22f, +LINE_TO, 6.87f, 8.06f, +LINE_TO, 10, 4.93f, +R_LINE_TO, 3.13f, 3.13f, +R_LINE_TO, -1.17f, 1.17f, +R_LINE_TO, -1.14f, -1.14f, +R_V_LINE_TO, 3.84f, +R_LINE_TO, 1.14f, -1.14f, +R_LINE_TO, 1.17f, 1.17f, +CLOSE, +MOVE_TO, 3.89f, 3.42f, +R_V_LINE_TO, -1.73f, +R_H_LINE_TO, 12.23f, +R_V_LINE_TO, 1.73f, +CLOSE, +R_MOVE_TO, 0, 0, +CLOSE
diff --git a/chrome/browser/ui/views/editor_menu/vector_icons/editor_menu_emojify.icon b/chrome/browser/ui/views/editor_menu/vector_icons/editor_menu_emojify.icon new file mode 100644 index 0000000..41563e2 --- /dev/null +++ b/chrome/browser/ui/views/editor_menu/vector_icons/editor_menu_emojify.icon
@@ -0,0 +1,64 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +CANVAS_DIMENSIONS, 20, +MOVE_TO, 12.71f, 9.29f, +R_CUBIC_TO, 0.36f, 0, 0.67f, -0.13f, 0.92f, -0.38f, +CUBIC_TO_SHORTHAND, 14, 8.36f, 14, 8, +R_CUBIC_TO, 0, -0.36f, -0.12f, -0.66f, -0.37f, -0.91f, +R_ARC_TO, 1.24f, 1.24f, 0, 0, 0, -0.91f, -0.37f, +R_CUBIC_TO, -0.36f, 0, -0.66f, 0.13f, -0.91f, 0.38f, +R_CUBIC_TO, -0.25f, 0.25f, -0.37f, 0.56f, -0.37f, 0.91f, +R_CUBIC_TO, 0, 0.36f, 0.13f, 0.66f, 0.38f, 0.91f, +R_CUBIC_TO, 0.25f, 0.25f, 0.55f, 0.38f, 0.91f, 0.38f, +CLOSE, +R_MOVE_TO, -5.42f, 0, +R_CUBIC_TO, 0.36f, 0, 0.66f, -0.13f, 0.91f, -0.38f, +R_CUBIC_TO, 0.25f, -0.25f, 0.37f, -0.56f, 0.37f, -0.91f, +R_CUBIC_TO, 0, -0.35f, -0.12f, -0.66f, -0.37f, -0.91f, +R_CUBIC_TO, -0.25f, -0.25f, -0.55f, -0.37f, -0.91f, -0.37f, +R_CUBIC_TO, -0.36f, 0, -0.66f, 0.13f, -0.91f, 0.38f, +CUBIC_TO_SHORTHAND, 6, 7.64f, 6, 8, +R_CUBIC_TO, 0, 0.36f, 0.13f, 0.66f, 0.38f, 0.91f, +R_CUBIC_TO, 0.25f, 0.25f, 0.56f, 0.38f, 0.91f, 0.38f, +CLOSE, +MOVE_TO, 10, 14, +R_CUBIC_TO, 0.85f, 0, 1.63f, -0.22f, 2.33f, -0.66f, +R_ARC_TO, 4.61f, 4.61f, 0, 0, 0, 1.66f, -1.79f, +H_LINE_TO, 6.02f, +R_CUBIC_TO, 0.4f, 0.75f, 0.95f, 1.35f, 1.66f, 1.79f, +R_CUBIC_TO, 0.7f, 0.44f, 1.48f, 0.66f, 2.33f, 0.66f, +CLOSE, +R_MOVE_TO, 0, 4.17f, +R_ARC_TO, 7.96f, 7.96f, 0, 0, 1, -3.17f, -0.64f, +R_ARC_TO, 8.25f, 8.25f, 0, 0, 1, -2.61f, -1.75f, +R_ARC_TO, 8.25f, 8.25f, 0, 0, 1, -1.75f, -2.61f, +R_ARC_TO, 7.97f, 7.97f, 0, 0, 1, -0.64f, -3.18f, +R_CUBIC_TO, 0, -1.12f, 0.21f, -2.18f, 0.64f, -3.17f, +R_ARC_TO, 8.29f, 8.29f, 0, 0, 1, 1.75f, -2.6f, +R_ARC_TO, 8.25f, 8.25f, 0, 0, 1, 2.61f, -1.75f, +R_ARC_TO, 7.97f, 7.97f, 0, 0, 1, 3.18f, -0.64f, +R_CUBIC_TO, 1.13f, 0, 2.18f, 0.21f, 3.17f, 0.64f, +R_ARC_TO, 8.29f, 8.29f, 0, 0, 1, 2.6f, 1.75f, +R_ARC_TO, 8.26f, 8.26f, 0, 0, 1, 1.75f, 2.6f, +R_CUBIC_TO, 0.43f, 0.99f, 0.64f, 2.05f, 0.64f, 3.17f, +R_ARC_TO, 7.96f, 7.96f, 0, 0, 1, -0.64f, 3.17f, +R_ARC_TO, 8.25f, 8.25f, 0, 0, 1, -1.75f, 2.61f, +R_ARC_TO, 8.26f, 8.26f, 0, 0, 1, -2.6f, 1.75f, +R_ARC_TO, 7.93f, 7.93f, 0, 0, 1, -3.17f, 0.64f, +CLOSE, +MOVE_TO, 10, 10, +CLOSE, +R_MOVE_TO, 0, 6.44f, +R_CUBIC_TO, 1.79f, 0, 3.31f, -0.63f, 4.56f, -1.88f, +CUBIC_TO_SHORTHAND, 16.44f, 11.79f, 16.44f, 10, +R_CUBIC_TO, 0, -1.78f, -0.63f, -3.3f, -1.88f, -4.56f, +CUBIC_TO, 13.31f, 4.19f, 11.79f, 3.56f, 10, 3.56f, +R_CUBIC_TO, -1.78f, 0, -3.3f, 0.63f, -4.56f, 1.88f, +CUBIC_TO, 4.19f, 6.7f, 3.56f, 8.22f, 3.56f, 10, +R_CUBIC_TO, 0, 1.79f, 0.63f, 3.31f, 1.88f, 4.56f, +CUBIC_TO_SHORTHAND, 8.22f, 16.44f, 10, 16.44f, +CLOSE, +R_MOVE_TO, 0, 0, +CLOSE
diff --git a/chrome/browser/ui/views/editor_menu/vector_icons/editor_menu_formalize.icon b/chrome/browser/ui/views/editor_menu/vector_icons/editor_menu_formalize.icon new file mode 100644 index 0000000..e6b6631c --- /dev/null +++ b/chrome/browser/ui/views/editor_menu/vector_icons/editor_menu_formalize.icon
@@ -0,0 +1,41 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +CANVAS_DIMENSIONS, 20, +MOVE_TO, 3.56f, 17.18f, +R_CUBIC_TO, -0.48f, 0, -0.89f, -0.17f, -1.22f, -0.5f, +R_ARC_TO, 1.67f, 1.67f, 0, 0, 1, -0.5f, -1.22f, +V_LINE_TO, 6.57f, +R_CUBIC_TO, 0, -0.48f, 0.17f, -0.89f, 0.5f, -1.22f, +R_ARC_TO, 1.67f, 1.67f, 0, 0, 1, 1.22f, -0.51f, +R_H_LINE_TO, 3.29f, +V_LINE_TO, 3.42f, +R_CUBIC_TO, 0, -0.48f, 0.17f, -0.89f, 0.51f, -1.22f, +R_ARC_TO, 1.67f, 1.67f, 0, 0, 1, 1.23f, -0.5f, +R_H_LINE_TO, 2.85f, +R_CUBIC_TO, 0.48f, 0, 0.89f, 0.17f, 1.22f, 0.51f, +R_CUBIC_TO, 0.34f, 0.34f, 0.5f, 0.74f, 0.5f, 1.22f, +R_V_LINE_TO, 1.42f, +R_H_LINE_TO, 3.29f, +R_CUBIC_TO, 0.48f, 0, 0.89f, 0.17f, 1.22f, 0.51f, +R_CUBIC_TO, 0.34f, 0.34f, 0.5f, 0.75f, 0.5f, 1.22f, +R_V_LINE_TO, 8.88f, +R_CUBIC_TO, 0, 0.48f, -0.17f, 0.89f, -0.5f, 1.22f, +R_ARC_TO, 1.67f, 1.67f, 0, 0, 1, -1.22f, 0.5f, +CLOSE, +R_MOVE_TO, 0, -1.73f, +H_LINE_TO, 16.44f, +V_LINE_TO, 6.57f, +H_LINE_TO, 3.56f, +CLOSE, +MOVE_TO, 8.57f, 4.84f, +R_H_LINE_TO, 2.85f, +V_LINE_TO, 3.43f, +H_LINE_TO, 8.57f, +CLOSE, +MOVE_TO, 3.56f, 15.46f, +V_LINE_TO, 6.57f, +CLOSE, +R_MOVE_TO, 0, 0, +CLOSE
diff --git a/chrome/browser/ui/views/editor_menu/vector_icons/editor_menu_rephrase.icon b/chrome/browser/ui/views/editor_menu/vector_icons/editor_menu_rephrase.icon new file mode 100644 index 0000000..1095b39 --- /dev/null +++ b/chrome/browser/ui/views/editor_menu/vector_icons/editor_menu_rephrase.icon
@@ -0,0 +1,54 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +CANVAS_DIMENSIONS, 20, +MOVE_TO, 7.5f, 5.16f, +LINE_TO, 5.84f, 3.5f, +R_LINE_TO, 1.66f, -1.66f, +LINE_TO, 9.16f, 3.5f, +LINE_TO, 7.5f, 5.16f, +CLOSE, +R_MOVE_TO, 9, 9.5f, +LINE_TO, 14.84f, 13, +R_LINE_TO, 1.66f, -1.66f, +LINE_TO, 18.17f, 13, +R_LINE_TO, -1.66f, 1.67f, +CLOSE, +MOVE_TO, 4.44f, 18.05f, +R_LINE_TO, -2.48f, -2.5f, +R_ARC_TO, 0.82f, 0.82f, 0, 0, 1, -0.26f, -0.6f, +R_CUBIC_TO, 0, -0.23f, 0.09f, -0.43f, 0.27f, -0.61f, +R_LINE_TO, 7.06f, -7.06f, +R_ARC_TO, 2.52f, 2.52f, 0, 0, 1, 1.85f, -0.77f, +R_CUBIC_TO, 0.73f, 0, 1.35f, 0.26f, 1.86f, 0.77f, +R_CUBIC_TO, 0.51f, 0.51f, 0.77f, 1.13f, 0.77f, 1.86f, +R_ARC_TO, 2.52f, 2.52f, 0, 0, 1, -0.77f, 1.86f, +R_LINE_TO, -7.06f, 7.06f, +R_ARC_TO, 0.86f, 0.86f, 0, 0, 1, -0.62f, 0.27f, +R_ARC_TO, 0.84f, 0.84f, 0, 0, 1, -0.61f, -0.26f, +CLOSE, +R_MOVE_TO, 11.08f, -9.99f, +R_ARC_TO, 3.44f, 3.44f, 0, 0, 0, -1.04f, -2.52f, +R_ARC_TO, 3.44f, 3.44f, 0, 0, 0, -2.52f, -1.04f, +R_CUBIC_TO, 0.99f, 0, 1.83f, -0.35f, 2.53f, -1.04f, +R_CUBIC_TO, 0.7f, -0.69f, 1.05f, -1.54f, 1.05f, -2.53f, +R_CUBIC_TO, 0, 0.99f, 0.35f, 1.84f, 1.04f, 2.53f, +R_CUBIC_TO, 0.7f, 0.7f, 1.54f, 1.04f, 2.53f, 1.04f, +R_CUBIC_TO, -0.99f, 0, -1.84f, 0.35f, -2.53f, 1.05f, +R_ARC_TO, 3.44f, 3.44f, 0, 0, 0, -1.04f, 2.53f, +CLOSE, +R_MOVE_TO, -5.56f, 3.26f, +R_LINE_TO, -0.32f, -0.32f, +R_LINE_TO, -0.32f, -0.32f, +R_LINE_TO, -0.32f, -0.32f, +R_LINE_TO, -0.32f, -0.32f, +R_LINE_TO, 0.64f, 0.64f, +R_LINE_TO, 0.63f, 0.64f, +CLOSE, +R_MOVE_TO, -4.9f, 4.9f, +R_LINE_TO, 4.9f, -4.9f, +R_LINE_TO, -1.27f, -1.28f, +R_LINE_TO, -4.9f, 4.9f, +R_LINE_TO, 1.28f, 1.27f, +CLOSE
diff --git a/chrome/browser/ui/views/editor_menu/vector_icons/editor_menu_shorten.icon b/chrome/browser/ui/views/editor_menu/vector_icons/editor_menu_shorten.icon new file mode 100644 index 0000000..be97b2e --- /dev/null +++ b/chrome/browser/ui/views/editor_menu/vector_icons/editor_menu_shorten.icon
@@ -0,0 +1,37 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +CANVAS_DIMENSIONS, 20, +MOVE_TO, 9.18f, 18.16f, +V_LINE_TO, 16.06f, +LINE_TO, 7.99f, 17.25f, +R_LINE_TO, -1.17f, -1.18f, +LINE_TO, 10, 12.89f, +R_LINE_TO, 3.18f, 3.18f, +R_LINE_TO, -1.17f, 1.18f, +R_LINE_TO, -1.19f, -1.2f, +R_V_LINE_TO, 2.11f, +CLOSE, +MOVE_TO, 4, 11.93f, +R_V_LINE_TO, -1.5f, +R_H_LINE_TO, 12, +R_V_LINE_TO, 1.5f, +CLOSE, +R_MOVE_TO, 0, -2.5f, +R_V_LINE_TO, -1.5f, +R_H_LINE_TO, 12, +R_V_LINE_TO, 1.5f, +CLOSE, +R_MOVE_TO, 6, -2.47f, +LINE_TO, 6.82f, 3.77f, +R_LINE_TO, 1.17f, -1.18f, +R_LINE_TO, 1.19f, 1.21f, +V_LINE_TO, 1.7f, +R_H_LINE_TO, 1.65f, +R_V_LINE_TO, 2.11f, +R_LINE_TO, 1.19f, -1.21f, +R_LINE_TO, 1.17f, 1.18f, +CLOSE, +R_MOVE_TO, 0, 0, +CLOSE
diff --git a/chrome/browser/ui/views/editor_menu/vector_icons/vector_icons.cc.template b/chrome/browser/ui/views/editor_menu/vector_icons/vector_icons.cc.template new file mode 100644 index 0000000..4c33981 --- /dev/null +++ b/chrome/browser/ui/views/editor_menu/vector_icons/vector_icons.cc.template
@@ -0,0 +1,17 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// vector_icons.cc.template is used to generate vector_icons.cc. Edit the former +// rather than the latter. + +#include "chrome/browser/ui/views/editor_menu/vector_icons/vector_icons.h" + +#include "components/vector_icons/cc_macros.h" +#include "ui/gfx/animation/tween.h" +#include "ui/gfx/vector_icon_types.h" + +#define DECLARE_VECTOR_COMMAND(x) using gfx::x; +DECLARE_VECTOR_COMMANDS + +TEMPLATE_PLACEHOLDER
diff --git a/chrome/browser/ui/views/editor_menu/vector_icons/vector_icons.h.template b/chrome/browser/ui/views/editor_menu/vector_icons/vector_icons.h.template new file mode 100644 index 0000000..b6010ec7 --- /dev/null +++ b/chrome/browser/ui/views/editor_menu/vector_icons/vector_icons.h.template
@@ -0,0 +1,22 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// vector_icons.h.template is used to generate vector_icons.h. Edit the former +// rather than the latter. + +#ifndef CHROME_BROWSER_UI_VIEWS_EDITOR_MENU_VECTOR_ICONS_VECTOR_ICONS_H_ +#define CHROME_BROWSER_UI_VIEWS_EDITOR_MENU_VECTOR_ICONS_VECTOR_ICONS_H_ + +namespace gfx { +struct VectorIcon; +} + +#define VECTOR_ICON_TEMPLATE_H(icon_name) \ +extern const gfx::VectorIcon icon_name; + +TEMPLATE_PLACEHOLDER + +#undef VECTOR_ICON_TEMPLATE_H + +#endif // CHROME_BROWSER_UI_VIEWS_EDITOR_MENU_VECTOR_ICONS_VECTOR_ICONS_H_
diff --git a/chrome/browser/ui/webauthn/sheet_models.cc b/chrome/browser/ui/webauthn/sheet_models.cc index e72087c2..905c02b7 100644 --- a/chrome/browser/ui/webauthn/sheet_models.cc +++ b/chrome/browser/ui/webauthn/sheet_models.cc
@@ -1527,7 +1527,7 @@ } const absl::optional<std::u16string>& phone_name = - dialog_model->GetPrioritySyncedPhoneName(); + dialog_model->GetPriorityPhoneName(); if (phone_name) { primary_passkeys_label_ = l10n_util::GetStringFUTF16(IDS_WEBAUTHN_FROM_PHONE_LABEL, *phone_name);
diff --git a/chrome/browser/ui/webauthn/sheet_models_unittest.cc b/chrome/browser/ui/webauthn/sheet_models_unittest.cc index e399c107..07842e7 100644 --- a/chrome/browser/ui/webauthn/sheet_models_unittest.cc +++ b/chrome/browser/ui/webauthn/sheet_models_unittest.cc
@@ -28,9 +28,9 @@ MOCK_METHOD(base::span<const Mechanism>, mechanisms, (), (const)); MOCK_METHOD(absl::optional<std::u16string>, - GetPrioritySyncedPhoneName, + GetPriorityPhoneName, (), - (const)); + (const override)); }; class TestAuthenticatorSheetModel : public AuthenticatorSheetModelBase { @@ -114,7 +114,7 @@ TEST_F(AuthenticatorMultiSourcePickerSheetModelTest, GPMPasskeysOnly) { MockDialogModel dialog_model; std::vector<Mechanism> mechanisms; - EXPECT_CALL(dialog_model, GetPrioritySyncedPhoneName) + EXPECT_CALL(dialog_model, GetPriorityPhoneName) .WillRepeatedly(testing::Return(kPhoneName)); mechanisms.emplace_back( Mechanism::Credential({device::AuthenticatorType::kPhone, {0}}), @@ -139,7 +139,7 @@ TEST_F(AuthenticatorMultiSourcePickerSheetModelTest, GPMAndLocalPasskeys) { MockDialogModel dialog_model; std::vector<Mechanism> mechanisms; - EXPECT_CALL(dialog_model, GetPrioritySyncedPhoneName) + EXPECT_CALL(dialog_model, GetPriorityPhoneName) .WillRepeatedly(testing::Return(kPhoneName)); mechanisms.emplace_back( Mechanism::Credential({device::AuthenticatorType::kPhone, {0}}),
diff --git a/chrome/browser/ui/webui/omnibox/omnibox.mojom b/chrome/browser/ui/webui/omnibox/omnibox.mojom index cb07fbb..cb9e3f8 100644 --- a/chrome/browser/ui/webui/omnibox/omnibox.mojom +++ b/chrome/browser/ui/webui/omnibox/omnibox.mojom
@@ -11,7 +11,7 @@ int32 style; }; -struct AutocompleteAdditionalInfo { +struct DictionaryEntry { string key; string value; }; @@ -44,7 +44,8 @@ int32 duplicates; bool from_previous; int32 pedal_id; - array<AutocompleteAdditionalInfo> additional_info; + array<DictionaryEntry> scoring_signals; + array<DictionaryEntry> additional_info; }; struct AutocompleteResultsForProvider {
diff --git a/chrome/browser/ui/webui/omnibox/omnibox_page_handler.cc b/chrome/browser/ui/webui/omnibox/omnibox_page_handler.cc index f8bb799..77b1ae89e 100644 --- a/chrome/browser/ui/webui/omnibox/omnibox_page_handler.cc +++ b/chrome/browser/ui/webui/omnibox/omnibox_page_handler.cc
@@ -26,6 +26,7 @@ #include "chrome/browser/profiles/profile.h" #include "chrome/browser/search/search.h" #include "chrome/browser/search_engines/template_url_service_factory.h" +#include "chrome/browser/ui/webui/omnibox/omnibox.mojom-forward.h" #include "components/bookmarks/browser/bookmark_model.h" #include "components/history/core/browser/history_service.h" #include "components/history/core/browser/url_database.h" @@ -110,15 +111,160 @@ }; template <> -struct TypeConverter<std::vector<mojom::AutocompleteAdditionalInfoPtr>, +struct TypeConverter<std::vector<mojom::DictionaryEntryPtr>, + AutocompleteMatch::ScoringSignals> { + static std::vector<mojom::DictionaryEntryPtr> Convert( + const AutocompleteMatch::ScoringSignals input) { + std::vector<mojom::DictionaryEntryPtr> array; + + if (input.has_typed_count()) { + auto item = mojom::DictionaryEntry::New( + "typed count", base::NumberToString(input.typed_count())); + array.push_back(std::move(item)); + } + if (input.has_visit_count()) { + auto item = mojom::DictionaryEntry::New( + "visit count", base::NumberToString(input.visit_count())); + array.push_back(std::move(item)); + } + if (input.has_elapsed_time_last_visit_secs()) { + auto item = mojom::DictionaryEntry::New( + "elapsed time since last visit (s)", + base::NumberToString(input.elapsed_time_last_visit_secs())); + array.push_back(std::move(item)); + } + if (input.has_shortcut_visit_count()) { + auto item = mojom::DictionaryEntry::New( + "shortcut visit count", + base::NumberToString(input.shortcut_visit_count())); + array.push_back(std::move(item)); + } + if (input.has_shortest_shortcut_len()) { + auto item = mojom::DictionaryEntry::New( + "shortest shortcut length", + base::NumberToString(input.shortest_shortcut_len())); + array.push_back(std::move(item)); + } + if (input.has_elapsed_time_last_shortcut_visit_sec()) { + auto item = mojom::DictionaryEntry::New( + "elapsed time since last shortcut visit (s)", + base::NumberToString(input.elapsed_time_last_shortcut_visit_sec())); + array.push_back(std::move(item)); + } + if (input.has_num_bookmarks_of_url()) { + auto item = mojom::DictionaryEntry::New( + "num bookmarks of url", + base::NumberToString(input.num_bookmarks_of_url())); + array.push_back(std::move(item)); + } + if (input.has_first_bookmark_title_match_position()) { + auto item = mojom::DictionaryEntry::New( + "first bookmark title match position", + base::NumberToString(input.first_bookmark_title_match_position())); + array.push_back(std::move(item)); + } + if (input.has_total_bookmark_title_match_length()) { + auto item = mojom::DictionaryEntry::New( + "total bookmark title match length", + base::NumberToString(input.total_bookmark_title_match_length())); + array.push_back(std::move(item)); + } + if (input.has_num_input_terms_matched_by_bookmark_title()) { + auto item = mojom::DictionaryEntry::New( + "num input terms matched by bookmark title", + base::NumberToString( + input.num_input_terms_matched_by_bookmark_title())); + array.push_back(std::move(item)); + } + if (input.has_first_url_match_position()) { + auto item = mojom::DictionaryEntry::New( + "first url match position", + base::NumberToString(input.first_url_match_position())); + array.push_back(std::move(item)); + } + if (input.has_total_url_match_length()) { + auto item = mojom::DictionaryEntry::New( + "total url match length", + base::NumberToString(input.total_url_match_length())); + array.push_back(std::move(item)); + } + if (input.has_host_match_at_word_boundary()) { + auto item = mojom::DictionaryEntry::New( + "host match at word boundary", + base::NumberToString(input.host_match_at_word_boundary())); + array.push_back(std::move(item)); + } + if (input.has_total_host_match_length()) { + auto item = mojom::DictionaryEntry::New( + "total host match length", + base::NumberToString(input.total_host_match_length())); + array.push_back(std::move(item)); + } + if (input.has_total_path_match_length()) { + auto item = mojom::DictionaryEntry::New( + "total path match length", + base::NumberToString(input.total_path_match_length())); + array.push_back(std::move(item)); + } + if (input.has_total_query_or_ref_match_length()) { + auto item = mojom::DictionaryEntry::New( + "total query or ref match length", + base::NumberToString(input.total_query_or_ref_match_length())); + array.push_back(std::move(item)); + } + if (input.has_total_title_match_length()) { + auto item = mojom::DictionaryEntry::New( + "total title match length", + base::NumberToString(input.total_title_match_length())); + array.push_back(std::move(item)); + } + if (input.has_has_non_scheme_www_match()) { + auto item = mojom::DictionaryEntry::New( + "has non-scheme www match", + base::NumberToString(input.has_non_scheme_www_match())); + array.push_back(std::move(item)); + } + if (input.has_num_input_terms_matched_by_title()) { + auto item = mojom::DictionaryEntry::New( + "num input terms matched by title", + base::NumberToString(input.num_input_terms_matched_by_title())); + array.push_back(std::move(item)); + } + if (input.has_num_input_terms_matched_by_url()) { + auto item = mojom::DictionaryEntry::New( + "num input terms matched by url", + base::NumberToString(input.num_input_terms_matched_by_url())); + array.push_back(std::move(item)); + } + if (input.has_length_of_url()) { + auto item = mojom::DictionaryEntry::New( + "length of url", base::NumberToString(input.length_of_url())); + array.push_back(std::move(item)); + } + if (input.has_site_engagement()) { + auto item = mojom::DictionaryEntry::New( + "site engagement", base::NumberToString(input.site_engagement())); + array.push_back(std::move(item)); + } + if (input.has_allowed_to_be_default_match()) { + auto item = mojom::DictionaryEntry::New( + "allowed to be default", + base::NumberToString(input.allowed_to_be_default_match())); + array.push_back(std::move(item)); + } + return array; + } +}; + +template <> +struct TypeConverter<std::vector<mojom::DictionaryEntryPtr>, AutocompleteMatch::AdditionalInfo> { - static std::vector<mojom::AutocompleteAdditionalInfoPtr> Convert( + static std::vector<mojom::DictionaryEntryPtr> Convert( const AutocompleteMatch::AdditionalInfo& input) { - std::vector<mojom::AutocompleteAdditionalInfoPtr> array(input.size()); + std::vector<mojom::DictionaryEntryPtr> array(input.size()); size_t index = 0; for (auto i = input.begin(); i != input.end(); ++i, index++) { - mojom::AutocompleteAdditionalInfoPtr item( - mojom::AutocompleteAdditionalInfo::New()); + mojom::DictionaryEntryPtr item(mojom::DictionaryEntry::New()); item->key = i->first; item->value = i->second; array[index] = std::move(item); @@ -184,8 +330,13 @@ const auto* pedal = OmniboxPedal::FromAction(input.GetActionAt(0u)); result->pedal_id = pedal == nullptr ? 0 : static_cast<int32_t>(pedal->PedalId()); + if (input.scoring_signals.has_value()) { + result->scoring_signals = + mojo::ConvertTo<std::vector<mojom::DictionaryEntryPtr>>( + input.scoring_signals.value()); + } result->additional_info = - mojo::ConvertTo<std::vector<mojom::AutocompleteAdditionalInfoPtr>>( + mojo::ConvertTo<std::vector<mojom::DictionaryEntryPtr>>( input.additional_info); return result; }
diff --git a/chrome/browser/ui/webui/settings/ash/device_section.cc b/chrome/browser/ui/webui/settings/ash/device_section.cc index 9a6e659..398e0551 100644 --- a/chrome/browser/ui/webui/settings/ash/device_section.cc +++ b/chrome/browser/ui/webui/settings/ash/device_section.cc
@@ -968,17 +968,32 @@ CupsPrintersManager* printers_manager, PrefService* pref_service) : OsSettingsSection(profile, search_tag_registry), - power_subsection_(profile, search_tag_registry, pref_service), + power_subsection_( + !ash::features::IsOsSettingsRevampWayfindingEnabled() + ? absl::make_optional<PowerSection>(profile, + search_tag_registry, + pref_service) + : absl::nullopt), printing_subsection_( ash::features::IsOsSettingsRevampWayfindingEnabled() ? absl::make_optional<PrintingSection>(profile, search_tag_registry, printers_manager) : absl::nullopt), - storage_subsection_(profile, search_tag_registry) { + storage_subsection_( + !ash::features::IsOsSettingsRevampWayfindingEnabled() + ? absl::make_optional<StorageSection>(profile, + search_tag_registry) + : absl::nullopt) { CHECK(profile); CHECK(search_tag_registry); CHECK(pref_service); + if (ash::features::IsOsSettingsRevampWayfindingEnabled()) { + CHECK(printing_subsection_); + } else { + CHECK(power_subsection_); + CHECK(storage_subsection_); + } SearchTagRegistry::ScopedTagUpdater updater = registry()->StartUpdate(); updater.AddSearchTags(GetDeviceSearchConcepts()); @@ -1074,11 +1089,10 @@ AddDeviceAudioStrings(html_source); if (ash::features::IsOsSettingsRevampWayfindingEnabled()) { - CHECK(printing_subsection_); printing_subsection_->AddLoadTimeData(html_source); } else { - power_subsection_.AddLoadTimeData(html_source); - storage_subsection_.AddLoadTimeData(html_source); + power_subsection_->AddLoadTimeData(html_source); + storage_subsection_->AddLoadTimeData(html_source); } } @@ -1089,11 +1103,10 @@ web_ui->AddMessageHandler(std::make_unique<StylusHandler>()); if (ash::features::IsOsSettingsRevampWayfindingEnabled()) { - CHECK(printing_subsection_); printing_subsection_->AddHandlers(web_ui); } else { - power_subsection_.AddHandlers(web_ui); - storage_subsection_.AddHandlers(web_ui); + power_subsection_->AddHandlers(web_ui); + storage_subsection_->AddHandlers(web_ui); } } @@ -1306,14 +1319,13 @@ if (ash::features::IsOsSettingsRevampWayfindingEnabled()) { // Printing. - CHECK(printing_subsection_); printing_subsection_->RegisterHierarchy(generator); } else { // Power. - power_subsection_.RegisterHierarchy(generator); + power_subsection_->RegisterHierarchy(generator); // Storage. - storage_subsection_.RegisterHierarchy(generator); + storage_subsection_->RegisterHierarchy(generator); } // Audio.
diff --git a/chrome/browser/ui/webui/settings/ash/device_section.h b/chrome/browser/ui/webui/settings/ash/device_section.h index e0ae389..da79c77b 100644 --- a/chrome/browser/ui/webui/settings/ash/device_section.h +++ b/chrome/browser/ui/webui/settings/ash/device_section.h
@@ -88,9 +88,9 @@ system::PointerDeviceObserver pointer_device_observer_; mojo::Remote<crosapi::mojom::CrosDisplayConfigController> cros_display_config_; - PowerSection power_subsection_; + absl::optional<PowerSection> power_subsection_; absl::optional<PrintingSection> printing_subsection_; - StorageSection storage_subsection_; + absl::optional<StorageSection> storage_subsection_; mojo::AssociatedReceiver<crosapi::mojom::CrosDisplayConfigObserver> cros_display_config_observer_receiver_{this}; };
diff --git a/chrome/browser/ui/webui/side_panel/read_anything/read_anything_untrusted_page_handler.cc b/chrome/browser/ui/webui/side_panel/read_anything/read_anything_untrusted_page_handler.cc index 624a278..55103b3d 100644 --- a/chrome/browser/ui/webui/side_panel/read_anything/read_anything_untrusted_page_handler.cc +++ b/chrome/browser/ui/webui/side_panel/read_anything/read_anything_untrusted_page_handler.cc
@@ -379,9 +379,13 @@ base::UmaHistogramExactLinear(string_constants::kFontScaleHistogramName, GetNormalizedFontScale(font_scale), maximum_font_scale_logging + 1); - ReadAnythingFont font = - font_map_.at(prefs->GetString(prefs::kAccessibilityReadAnythingFontName)); - base::UmaHistogramEnumeration(string_constants::kFontNameHistogramName, font); + std::string font_name = + prefs->GetString(prefs::kAccessibilityReadAnythingFontName); + if (font_map_.find(font_name) != font_map_.end()) { + ReadAnythingFont font = font_map_.at(font_name); + base::UmaHistogramEnumeration(string_constants::kFontNameHistogramName, + font); + } read_anything::mojom::Colors color = static_cast<read_anything::mojom::Colors>( prefs->GetInteger(prefs::kAccessibilityReadAnythingColorInfo));
diff --git a/chrome/browser/webauthn/authenticator_request_dialog_model.cc b/chrome/browser/webauthn/authenticator_request_dialog_model.cc index 416b3d277..ff2568d 100644 --- a/chrome/browser/webauthn/authenticator_request_dialog_model.cc +++ b/chrome/browser/webauthn/authenticator_request_dialog_model.cc
@@ -42,6 +42,7 @@ #include "device/fido/features.h" #include "device/fido/fido_authenticator.h" #include "device/fido/fido_constants.h" +#include "device/fido/fido_request_handler_base.h" #include "device/fido/fido_transport_protocol.h" #include "device/fido/fido_types.h" #include "device/fido/pin.h" @@ -489,6 +490,21 @@ } return; } + if (transport_availability_.has_platform_authenticator_credential == + device::FidoRequestHandlerBase::RecognizedCredential:: + kNoRecognizedCredential) { + // If there are no local matches but there are phone passkeys, jump to + // the phone from sync. + for (auto& mechanism : mechanisms_) { + const auto& type = mechanism.type; + if (absl::holds_alternative<Mechanism::Credential>(type) && + absl::get<Mechanism::Credential>(type)->source == + device::AuthenticatorType::kPhone) { + SetCurrentStep(Step::kPhoneConfirmationSheet); + return; + } + } + } } // If a request only includes mechanisms that can be serviced by the Windows // API and local credentials, there is no point showing Chrome UI as an @@ -1050,7 +1066,7 @@ : AuthenticatorTransport::kInternal})); ephemeral_state_.creds_.clear(); if (source == device::AuthenticatorType::kPhone) { - ContactPrioritySyncedPhone(); + ContactPriorityPhone(); } else { HideDialogAndDispatchToPlatformAuthenticator(source); } @@ -1074,13 +1090,7 @@ } void AuthenticatorRequestDialogModel::ContactPriorityPhone() { - for (auto& mechanism : mechanisms_) { - if (absl::holds_alternative<Mechanism::Phone>(mechanism.type)) { - mechanism.callback.Run(); - return; - } - } - NOTREACHED(); + ContactPhone(paired_phones_[*priority_phone_index_]->name); } void AuthenticatorRequestDialogModel::ContactPhoneForTesting( @@ -1092,12 +1102,11 @@ } absl::optional<std::u16string> -AuthenticatorRequestDialogModel::GetPrioritySyncedPhoneName() const { - absl::optional<int> phone_index = GetPrioritySyncedPhoneIndex(); - if (!phone_index) { +AuthenticatorRequestDialogModel::GetPriorityPhoneName() const { + if (!priority_phone_index_) { return absl::nullopt; } - return base::UTF8ToUTF16(paired_phones_[*phone_index]->name); + return base::UTF8ToUTF16(paired_phones_[*priority_phone_index_]->name); } void AuthenticatorRequestDialogModel::StartTransportFlowForTesting( @@ -1462,12 +1471,6 @@ device::AuthenticatorType::kICloudKeychain); } -void AuthenticatorRequestDialogModel::ContactPrioritySyncedPhone() { - // TODO(crbug.com/1453259): Dispatch to Windows instead if it handles - // hybrid. - ContactPhone(paired_phones_[*GetPrioritySyncedPhoneIndex()]->name); -} - void AuthenticatorRequestDialogModel::ContactPhone(const std::string& name) { #if BUILDFLAG(IS_MAC) if (transport_availability()->ble_access_denied) { @@ -1524,11 +1527,16 @@ auto* web_contents = GetWebContents(); if (web_contents && render_frame_host) { std::vector<password_manager::PasskeyCredential> credentials; - absl::optional<std::u16string> priority_phone = - GetPrioritySyncedPhoneName(); + absl::optional<size_t> priority_phone_index = + GetIndexOfMostRecentlyUsedPhoneFromSync(); + absl::optional<std::u16string> priority_phone_name; + if (priority_phone_index) { + priority_phone_name = + base::UTF8ToUTF16(paired_phones_[*priority_phone_index]->name); + } for (const auto& credential : ephemeral_state_.creds_) { if (credential.source == device::AuthenticatorType::kPhone && - !priority_phone) { + !priority_phone_index) { continue; } password_manager::PasskeyCredential& passkey = credentials.emplace_back( @@ -1542,7 +1550,7 @@ credential.user.display_name.value_or(""))); if (credential.source == device::AuthenticatorType::kPhone) { passkey.set_authenticator_label(l10n_util::GetStringFUTF16( - IDS_PASSWORD_MANAGER_PASSKEY_FROM_PHONE, *priority_phone)); + IDS_PASSWORD_MANAGER_PASSKEY_FROM_PHONE, *priority_phone_name)); } } bool offer_passkey_from_another_device; @@ -1616,7 +1624,8 @@ } absl::optional<size_t> -AuthenticatorRequestDialogModel::GetPrioritySyncedPhoneIndex() const { +AuthenticatorRequestDialogModel::GetIndexOfMostRecentlyUsedPhoneFromSync() + const { // Try finding the most recently used phone from sync. absl::optional<std::vector<uint8_t>> last_used_pairing = RetrieveLastUsedPairing(content::RenderFrameHost::FromID(frame_host_id_)); @@ -1680,14 +1689,10 @@ const bool is_new_get_assertion_ui = is_get_assertion && base::FeatureList::IsEnabled(device::kWebAuthnNewPasskeyUI); - absl::optional<std::u16string> priority_phone_name; - absl::optional<size_t> priority_phone_index = GetPrioritySyncedPhoneIndex(); - if (priority_phone_index) { - priority_phone_name = - base::UTF8ToUTF16(paired_phones_[*priority_phone_index]->name); - } + priority_phone_index_ = GetIndexOfMostRecentlyUsedPhoneFromSync(); + absl::optional<std::u16string> priority_phone_name = GetPriorityPhoneName(); bool list_phone_passkeys = - is_new_get_assertion_ui && priority_phone_index && + is_new_get_assertion_ui && priority_phone_index_ && base::FeatureList::IsEnabled(device::kWebAuthnListSyncedPasskeys); bool specific_phones_listed = false; if (is_new_get_assertion_ui && !use_conditional_mediation_) { @@ -1833,6 +1838,7 @@ paired_phones_.size() == 1 && !use_conditional_mediation_ && transport_availability_.is_only_hybrid_or_internal; if (skip_to_phone_confirmation) { + priority_phone_index_ = 0; pending_step_ = Step::kPhoneConfirmationSheet; } } @@ -1952,8 +1958,6 @@ } } - // TODO(crbug.com/1459273): implement skipping to the relevant authenticator - // for certain Windows requests. // For all other cases, go to the multi source passkey picker. return absl::nullopt; }
diff --git a/chrome/browser/webauthn/authenticator_request_dialog_model.h b/chrome/browser/webauthn/authenticator_request_dialog_model.h index ea740af18..9a7eb33 100644 --- a/chrome/browser/webauthn/authenticator_request_dialog_model.h +++ b/chrome/browser/webauthn/authenticator_request_dialog_model.h
@@ -538,8 +538,10 @@ return ephemeral_state_.priority_mechanism_index_; } - // Contacts the "priority" paired phone. This is only valid to call when there - // is a single phone paired. + // Contacts the "priority" paired phone. This is the phone from sync if there + // are a priori discovered GPM passkeys, or the first phone on the list + // otherwise. + // Only valid to call if |GetPriorityPhoneName()| returns a value. void ContactPriorityPhone(); // ContactPhoneForTesting triggers a contact for a phone with the given name. @@ -547,10 +549,10 @@ // user-visible mechanisms and use the callbacks therein. void ContactPhoneForTesting(const std::string& name); - // Returns the name of the phone from sync that will be dispatched to when a - // user selects a Mechanism::Credential corresponding to a phone credential, - // or absl::nullopt if there isn't one. - virtual absl::optional<std::u16string> GetPrioritySyncedPhoneName() const; + // Returns the name of the "priority" paired phone. This is the phone from + // sync if there are a priori discovered GPM passkeys, or the first phone on + // the list otherwise. + virtual absl::optional<std::u16string> GetPriorityPhoneName() const; // StartTransportFlowForTesting moves the UI to focus on the given transport. // UI should use |mechanisms()| to enumerate the user-visible mechanisms and @@ -730,10 +732,6 @@ void StartICloudKeychain(); - // Contacts the "priority" paired phone from sync. At least one sync phone - // must be available to call this. - void ContactPrioritySyncedPhone(); - // Contacts a paired phone. The phone is specified by name. void ContactPhone(const std::string& name); void ContactPhoneAfterOffTheRecordInterstitial(std::string name); @@ -747,7 +745,7 @@ // Returns the index (into `paired_phones_`) of a phone that has been paired // through Chrome Sync, or absl::nullopt if there isn't one. - absl::optional<size_t> GetPrioritySyncedPhoneIndex() const; + absl::optional<size_t> GetIndexOfMostRecentlyUsedPhoneFromSync() const; // SortRecognizedCredentials sorts // `transport_availability_.recognized_credentials` into username order. @@ -852,6 +850,10 @@ // QR-based pairing. The entries are sorted by name. std::vector<std::unique_ptr<device::cablev2::Pairing>> paired_phones_; + // priority_phone_index_ contains an index in `paired_phones_` for the phone + // that should be dispatched to by default, if any. + absl::optional<size_t> priority_phone_index_; + // paired_phones_contacted_ is the same length as |paired_phones_| and // contains true whenever the corresponding phone as already been contacted. std::vector<bool> paired_phones_contacted_;
diff --git a/chrome/browser/webauthn/authenticator_request_dialog_model_unittest.cc b/chrome/browser/webauthn/authenticator_request_dialog_model_unittest.cc index 34d84035..e8da782 100644 --- a/chrome/browser/webauthn/authenticator_request_dialog_model_unittest.cc +++ b/chrome/browser/webauthn/authenticator_request_dialog_model_unittest.cc
@@ -939,7 +939,7 @@ {L, ga, {usb, cable, internal}, - {one_phone_cred, two_cred}, + {one_phone_cred, two_cred, has_plat, empty_al}, {psync("a")}, {c(cred1), c(cred2), c(phonecred1), add}, mss}, @@ -947,7 +947,7 @@ {L, ga, {usb, cable, internal}, - {two_cred}, + {two_cred, has_plat, empty_al}, {psync("a")}, {c(cred1), c(cred2), add}, mss}, @@ -959,7 +959,7 @@ {L, ga, {usb, internal}, - {two_cred}, + {two_cred, has_plat, empty_al}, {psync("a")}, {c(cred1), c(cred2), t(usb)}, mss}, @@ -967,11 +967,20 @@ {L, ga, {usb, cable, internal}, - {two_phone_cred}, + {two_phone_cred, empty_al}, {psync("a")}, {c(phonecred1), c(phonecred2), add}, mss}, - // Single internal credential. + // Single internal credential with empty allow list. + {L, + ga, + {usb, cable, internal}, + {one_cred, has_plat, empty_al}, + {psync("a")}, + {c(cred1), add}, + hero, + }, + // Single internal credential with non-empty allow list. {L, ga, {usb, cable, internal}, @@ -992,6 +1001,14 @@ {psync("a")}, {c(phonecred1), add}, hero}, + // Single phone credential with non-empty allow list. + {L, + ga, + {usb, cable, internal}, + {one_phone_cred}, + {psync("a")}, + {c(phonecred1), add}, + pconf}, #if BUILDFLAG(IS_MAC) // Even with iCloud Keychain present, we shouldn't jump to it without @@ -1019,41 +1036,42 @@ Test kListSyncedPasskeysTests_Windows_NoWinHybrid[]{ // Mix of phone and internal credentials, but no USB/NFC. - // This should not offer dispatching directly to the Windows API. + // This should jump to Windows, as there is a match with the local + // authenticator. {L, ga, {cable}, - {one_phone_cred, two_cred, has_winapi, only_hybrid_or_internal}, + {one_phone_cred, two_cred, has_winapi, only_hybrid_or_internal, + has_plat}, {psync("a")}, {c(wincred1), c(wincred2), c(phonecred1), add}, - mss}, - // Mix of phone, internal credentials, and USB/NFC. + plat_ui}, + // Mix of phone, internal credentials, and USB/NFC (empty allow list). // This should offer dispatching to the Windows API for USB/NFC. {L, ga, {cable}, - {one_phone_cred, two_cred, has_winapi}, + {one_phone_cred, two_cred, has_winapi, empty_al, has_plat}, {psync("a")}, {c(wincred1), c(wincred2), c(phonecred1), add, winapi}, mss}, - // Phone credentials and unknown Windows Hello credential status. - // This should offer dispatching to the Windows API for Windows Hello. + // Phone credentials and unknown Windows Hello credential status. This + // should offer dispatching to the Windows API for Windows Hello. {L, ga, {cable}, - {two_phone_cred, has_winapi, maybe_plat, only_hybrid_or_internal}, + {two_phone_cred, has_winapi, maybe_plat, empty_al}, {psync("a")}, {c(phonecred1), c(phonecred2), winapi, add}, mss}, }; Test kListSyncedPasskeysTests_Windows_WinHybrid[]{ - // Mix of phone and internal credentials, no USB/NFC. - // This should offer dispatching directly to the Windows API for hybrid. + // Mix of phone and internal credentials (empty allow list). {L, ga, {cable}, - {one_phone_cred, two_cred, has_winapi, only_hybrid_or_internal}, + {one_phone_cred, two_cred, has_winapi, empty_al, has_plat}, {psync("a")}, {c(wincred1), c(wincred2), c(phonecred1), winapi}, mss}, @@ -1062,7 +1080,7 @@ {L, ga, {}, - {two_cred, has_winapi, only_internal}, + {two_cred, has_winapi, only_internal, has_plat}, {}, {c(wincred1), c(wincred2)}, plat_ui}, @@ -2135,7 +2153,11 @@ } #endif // BUILDFLAG(IS_WIN) -TEST_F(AuthenticatorRequestDialogModelTest, ContactPriorityPhone) { +// Tests that if the user does not have a phone from sync, Chrome offers a phone +// confirmation screen for an allow-list request when there is a single +// previously paired phone, no local matches, and only hybrid or internal +// credentials in the allow-list. +TEST_F(AuthenticatorRequestDialogModelTest, ContactPriorityPhone_NoSync) { AuthenticatorRequestDialogModel model(main_rfh()); std::vector<std::unique_ptr<device::cablev2::Pairing>> phones; phones.emplace_back(GetPairingFromQR()); @@ -2146,13 +2168,54 @@ transports_info.is_ble_powered = true; transports_info.request_type = device::FidoRequestType::kGetAssertion; transports_info.available_transports = {AuthenticatorTransport::kHybrid}; + transports_info.is_only_hybrid_or_internal = true; + transports_info.has_platform_authenticator_credential = device:: + FidoRequestHandlerBase::RecognizedCredential::kNoRecognizedCredential; + transports_info.has_icloud_keychain_credential = device:: + FidoRequestHandlerBase::RecognizedCredential::kNoRecognizedCredential; model.StartFlow(std::move(transports_info), /*is_conditional_mediation=*/false); + EXPECT_EQ(model.current_step(), Step::kPhoneConfirmationSheet); + EXPECT_EQ(model.GetPriorityPhoneName(), u"Phone from QR"); model.ContactPriorityPhone(); EXPECT_EQ(model.current_step(), Step::kCableActivate); EXPECT_EQ(model.selected_phone_name(), "Phone from QR"); } +// Tests that if the user has a phone from sync, Chrome offers a phone +// confirmation screen for an allow-list request when there is a phone passkey +// match and no local matches. +TEST_F(AuthenticatorRequestDialogModelTest, ContactPriorityPhone_WithSync) { + base::test::ScopedFeatureList scoped_feature_list; + scoped_feature_list.InitWithFeatures( + {device::kWebAuthnNewPasskeyUI, device::kWebAuthnListSyncedPasskeys}, + /*disabled_features=*/{}); + AuthenticatorRequestDialogModel model(main_rfh()); + std::vector<std::unique_ptr<device::cablev2::Pairing>> phones; + phones.emplace_back(GetPairingFromQR()); + phones.emplace_back(GetPairingFromSync()); + model.set_cable_transport_info(/*extension_is_v2=*/absl::nullopt, + std::move(phones), base::DoNothing(), + absl::nullopt); + TransportAvailabilityInfo transports_info; + transports_info.recognized_credentials = {kPhoneCred1, kPhoneCred2}; + transports_info.is_ble_powered = true; + transports_info.request_type = device::FidoRequestType::kGetAssertion; + transports_info.available_transports = {AuthenticatorTransport::kHybrid}; + transports_info.is_only_hybrid_or_internal = true; + transports_info.has_platform_authenticator_credential = device:: + FidoRequestHandlerBase::RecognizedCredential::kNoRecognizedCredential; + transports_info.has_icloud_keychain_credential = device:: + FidoRequestHandlerBase::RecognizedCredential::kNoRecognizedCredential; + model.StartFlow(std::move(transports_info), + /*is_conditional_mediation=*/false); + EXPECT_EQ(model.current_step(), Step::kPhoneConfirmationSheet); + EXPECT_EQ(model.GetPriorityPhoneName(), u"Phone from sync"); + model.ContactPriorityPhone(); + EXPECT_EQ(model.current_step(), Step::kCableActivate); + EXPECT_EQ(model.selected_phone_name(), "Phone from sync"); +} + #if BUILDFLAG(IS_MAC) TEST_F(AuthenticatorRequestDialogModelTest, BluetoothPermissionPrompt) { // When BLE permission is denied on macOS, we should jump to the sheet that
diff --git a/chrome/browser/webauthn/chrome_webauthn_autofill_interactive_uitest.cc b/chrome/browser/webauthn/chrome_webauthn_autofill_interactive_uitest.cc index 35711a76..d51ea37 100644 --- a/chrome/browser/webauthn/chrome_webauthn_autofill_interactive_uitest.cc +++ b/chrome/browser/webauthn/chrome_webauthn_autofill_interactive_uitest.cc
@@ -281,7 +281,8 @@ EXPECT_EQ(webauthn_entry.icon, "globeIcon"); // Click the credential. - popup_controller->AcceptSuggestionWithoutThreshold(suggestion_index); + popup_controller->AcceptSuggestion( + suggestion_index, base::TimeTicks::Now() + base::Milliseconds(500)); std::string result; ASSERT_TRUE(message_queue.WaitForMessage(&result)); EXPECT_EQ(result, "\"webauthn: OK\""); @@ -483,7 +484,8 @@ EXPECT_EQ(webauthn_entry.icon, "globeIcon"); // Click the credential. - popup_controller->AcceptSuggestionWithoutThreshold(suggestion_index); + popup_controller->AcceptSuggestion( + suggestion_index, base::TimeTicks::Now() + base::Milliseconds(500)); std::string result; ASSERT_TRUE(message_queue.WaitForMessage(&result)); EXPECT_EQ(result, "\"webauthn: OK\"");
diff --git a/chrome/browser/webauthn/chrome_webauthn_autofill_mac_interactive_uitest.mm b/chrome/browser/webauthn/chrome_webauthn_autofill_mac_interactive_uitest.mm index 86a30d2..59b884a 100644 --- a/chrome/browser/webauthn/chrome_webauthn_autofill_mac_interactive_uitest.mm +++ b/chrome/browser/webauthn/chrome_webauthn_autofill_mac_interactive_uitest.mm
@@ -6,6 +6,7 @@ #include <vector> #include "base/test/bind.h" +#include "base/time/time.h" #include "build/build_config.h" #include "chrome/browser/password_manager/chrome_webauthn_credentials_delegate.h" #include "chrome/browser/ssl/cert_verifier_browser_test.h" @@ -138,7 +139,8 @@ EXPECT_EQ(webauthn_entry.icon, "globeIcon"); // Click the credential. - popup_controller->AcceptSuggestionWithoutThreshold(suggestion_index); + popup_controller->AcceptSuggestion( + suggestion_index, base::TimeTicks::Now() + base::Milliseconds(500)); std::string result; ASSERT_TRUE(message_queue.WaitForMessage(&result)); EXPECT_EQ(result, "\"webauthn: OK\"");
diff --git a/chrome/build/linux.pgo.txt b/chrome/build/linux.pgo.txt index 66b32dc6..61273e53 100644 --- a/chrome/build/linux.pgo.txt +++ b/chrome/build/linux.pgo.txt
@@ -1 +1 @@ -chrome-linux-main-1695124764-b8bc62d1a1bb8493e3b1226eac028dd53544bee5.profdata +chrome-linux-main-1695146254-1453778f23e8cc61f2e2ff3cd53a003631108ac8.profdata
diff --git a/chrome/build/mac-arm.pgo.txt b/chrome/build/mac-arm.pgo.txt index d6393a958..60c147c 100644 --- a/chrome/build/mac-arm.pgo.txt +++ b/chrome/build/mac-arm.pgo.txt
@@ -1 +1 @@ -chrome-mac-arm-main-1695138714-010c65f556150f89111aac92b04bb49fd13aac22.profdata +chrome-mac-arm-main-1695160752-511354aba562e9cb20f3d69dd7fba2279f49aa4f.profdata
diff --git a/chrome/build/mac.pgo.txt b/chrome/build/mac.pgo.txt index 8127995..840ebd8 100644 --- a/chrome/build/mac.pgo.txt +++ b/chrome/build/mac.pgo.txt
@@ -1 +1 @@ -chrome-mac-main-1695124764-9b65fc72248c57df170dda400002b4d48f919755.profdata +chrome-mac-main-1695146254-6639f0b7ece6a6279924caf2cc9252a61d157731.profdata
diff --git a/chrome/build/win-arm64.pgo.txt b/chrome/build/win-arm64.pgo.txt index aa40ad1..bd2df8b4 100644 --- a/chrome/build/win-arm64.pgo.txt +++ b/chrome/build/win-arm64.pgo.txt
@@ -1 +1 @@ -chrome-win-arm64-main-1695124764-b95a52aa7b2b5eebaf22b04b73361d20e05341ac.profdata +chrome-win-arm64-main-1695146254-95ed5d34cf7ae5e23400128949cb020cfdb3299c.profdata
diff --git a/chrome/build/win32.pgo.txt b/chrome/build/win32.pgo.txt index 34a8f15..569c31d 100644 --- a/chrome/build/win32.pgo.txt +++ b/chrome/build/win32.pgo.txt
@@ -1 +1 @@ -chrome-win32-main-1695135599-944e76e4ffa4a7df551c1a8bf403d2c5653e0589.profdata +chrome-win32-main-1695146254-3f7c6b213f23487ba5cd35c1aa9e814f0e9719e3.profdata
diff --git a/chrome/build/win64.pgo.txt b/chrome/build/win64.pgo.txt index 998fc92..8a7a523 100644 --- a/chrome/build/win64.pgo.txt +++ b/chrome/build/win64.pgo.txt
@@ -1 +1 @@ -chrome-win64-main-1695135599-7a94a50c1a04035a10c4c1cde51c962534613870.profdata +chrome-win64-main-1695146254-6a8dc60b962db46e7c112c0e0078935059786f1e.profdata
diff --git a/chrome/common/pref_names.h b/chrome/common/pref_names.h index 8c20de9..09a619c2 100644 --- a/chrome/common/pref_names.h +++ b/chrome/common/pref_names.h
@@ -2645,26 +2645,6 @@ "hardware.same_origin_tab_capture_allowed_by_origins"; #if BUILDFLAG(IS_CHROMEOS_ASH) -// An integer pref that holds enum value of current demo mode configuration. -// Values are defined by DemoSession::DemoModeConfig enum. -inline constexpr char kDemoModeConfig[] = "demo_mode.config"; - -// A string pref holding the value of the current country for demo sessions. -inline constexpr char kDemoModeCountry[] = "demo_mode.country"; - -// A string pref holding the value of the retailer name input for demo sessions. -// This is now mostly called "retailer_name" in code other than in this pref and -// in Omaha request attributes -inline constexpr char kDemoModeRetailerId[] = "demo_mode.retailer_id"; - -// A string pref holding the value of the store number input for demo sessions. -// This is now mostly called "store_number" in code other than in this pref and -// in Omaha request attributes -inline constexpr char kDemoModeStoreId[] = "demo_mode.store_id"; - -// A string pref holding the value of the default locale for demo sessions. -inline constexpr char kDemoModeDefaultLocale[] = "demo_mode.default_locale"; - // Dictionary for transient storage of settings that should go into device // settings storage before owner has been assigned. inline constexpr char kDeviceSettingsCache[] = "signed_settings_cache";
diff --git a/chrome/services/sharing/nearby/quick_start_decoder/quick_start_decoder.cc b/chrome/services/sharing/nearby/quick_start_decoder/quick_start_decoder.cc index 3d1f1c8..13a5a18 100644 --- a/chrome/services/sharing/nearby/quick_start_decoder/quick_start_decoder.cc +++ b/chrome/services/sharing/nearby/quick_start_decoder/quick_start_decoder.cc
@@ -86,6 +86,7 @@ } return std::make_pair(kCborDecoderNoError, std::move(cbor)); } + } // namespace QuickStartDecoder::QuickStartDecoder( @@ -97,33 +98,240 @@ QuickStartDecoder::~QuickStartDecoder() = default; -void QuickStartDecoder::DoDecodeGetAssertionResponse( +void QuickStartDecoder::DecodeBootstrapConfigurations( + const absl::optional<std::vector<uint8_t>>& data, + DecodeBootstrapConfigurationsCallback callback) { + if (!data.has_value()) { + std::move(callback).Run(nullptr, + mojom::QuickStartDecoderError::kEmptyMessage); + return; + } + auto result = DoDecodeQuickStartMessage(data.value()); + if (!result.has_value()) { + std::move(callback).Run(nullptr, result.error()); + return; + } + if (!result.value()->is_bootstrap_configurations()) { + std::move(callback).Run( + nullptr, mojom::QuickStartDecoderError::kUnexpectedMessageType); + return; + } + + std::move(callback).Run( + result.value()->get_bootstrap_configurations().Clone(), absl::nullopt); +} + +void QuickStartDecoder::DecodeWifiCredentialsResponse( + const absl::optional<std::vector<uint8_t>>& data, + DecodeWifiCredentialsResponseCallback callback) { + if (!data.has_value()) { + quick_start_metrics::RecordWifiTransferResult( + /*succeeded=*/false, /*failure_reason=*/quick_start_metrics:: + WifiTransferResultFailureReason::kEmptyResponseBytes); + std::move(callback).Run(nullptr, + mojom::QuickStartDecoderError::kEmptyMessage); + return; + } + auto result = DoDecodeQuickStartMessage(data.value()); + if (!result.has_value()) { + if (result.error() == mojom::QuickStartDecoderError::kUnableToReadAsJSON) { + quick_start_metrics::RecordWifiTransferResult( + /*succeeded=*/false, /*failure_reason=*/quick_start_metrics:: + WifiTransferResultFailureReason::kUnableToReadAsJSON); + } + if (result.error() == mojom::QuickStartDecoderError::kUnknownPayload) { + quick_start_metrics::RecordWifiTransferResult( + /*succeeded=*/false, /*failure_reason=*/quick_start_metrics:: + WifiTransferResultFailureReason::kWifiNetworkInformationNotFound); + } + std::move(callback).Run(nullptr, result.error()); + return; + } + if (!result.value()->is_wifi_credentials()) { + std::move(callback).Run( + nullptr, mojom::QuickStartDecoderError::kUnexpectedMessageType); + return; + } + + std::move(callback).Run(result.value()->get_wifi_credentials().Clone(), + absl::nullopt); +} + +void QuickStartDecoder::DecodeUserVerificationRequested( + const absl::optional<std::vector<uint8_t>>& data, + DecodeUserVerificationRequestedCallback callback) { + if (!data.has_value()) { + std::move(callback).Run(nullptr, + mojom::QuickStartDecoderError::kEmptyMessage); + return; + } + auto result = DoDecodeQuickStartMessage(data.value()); + if (!result.has_value()) { + std::move(callback).Run(nullptr, result.error()); + return; + } + if (!result.value()->is_user_verification_requested()) { + std::move(callback).Run( + nullptr, mojom::QuickStartDecoderError::kUnexpectedMessageType); + return; + } + + std::move(callback).Run( + result.value()->get_user_verification_requested().Clone(), absl::nullopt); +} + +void QuickStartDecoder::DecodeUserVerificationResult( + const absl::optional<std::vector<uint8_t>>& data, + DecodeUserVerificationResultCallback callback) { + if (!data.has_value()) { + std::move(callback).Run(nullptr, + mojom::QuickStartDecoderError::kEmptyMessage); + return; + } + auto result = DoDecodeQuickStartMessage(data.value()); + if (!result.has_value()) { + std::move(callback).Run(nullptr, result.error()); + return; + } + if (!result.value()->is_user_verification_response()) { + std::move(callback).Run( + nullptr, mojom::QuickStartDecoderError::kUnexpectedMessageType); + return; + } + + std::move(callback).Run( + result.value()->get_user_verification_response().Clone(), absl::nullopt); +} + +void QuickStartDecoder::DecodeGetAssertionResponse( const absl::optional<std::vector<uint8_t>>& data, DecodeGetAssertionResponseCallback callback) { if (!data.has_value()) { + std::move(callback).Run(nullptr, + mojom::QuickStartDecoderError::kEmptyMessage); + return; + } + auto result = DoDecodeQuickStartMessage(data.value()); + if (!result.has_value()) { + std::move(callback).Run(nullptr, result.error()); + return; + } + if (!result.value()->is_fido_assertion_response()) { + std::move(callback).Run( + nullptr, mojom::QuickStartDecoderError::kUnexpectedMessageType); + return; + } + + std::move(callback).Run(result.value()->get_fido_assertion_response().Clone(), + absl::nullopt); +} + +void QuickStartDecoder::DecodeNotifySourceOfUpdateResponse( + const absl::optional<std::vector<uint8_t>>& data, + DecodeNotifySourceOfUpdateResponseCallback callback) { + if (!data.has_value()) { + std::move(callback).Run(nullptr, + mojom::QuickStartDecoderError::kEmptyMessage); + return; + } + auto result = DoDecodeQuickStartMessage(data.value()); + if (!result.has_value()) { + std::move(callback).Run(nullptr, result.error()); + return; + } + if (!result.value()->is_notify_source_of_update_response()) { + std::move(callback).Run( + nullptr, mojom::QuickStartDecoderError::kUnexpectedMessageType); + return; + } + + std::move(callback).Run( + result.value()->get_notify_source_of_update_response().Clone(), + absl::nullopt); +} + +void QuickStartDecoder::DecodeQuickStartMessage( + const absl::optional<std::vector<uint8_t>>& data, + DecodeQuickStartMessageCallback callback) { + if (!data.has_value()) { LOG(ERROR) << "No response bytes received."; std::move(callback).Run(nullptr, mojom::QuickStartDecoderError::kEmptyMessage); return; } - absl::optional<std::vector<uint8_t>> parsed_response_bytes = - ExtractFidoDataFromJsonResponse(data.value()); - if (!parsed_response_bytes.has_value()) { - LOG(ERROR) << "Failed to extract Fido data from JSON response."; - std::move(callback).Run(nullptr, - mojom::QuickStartDecoderError::kUnableToReadAsJSON); - return; + auto result = DoDecodeQuickStartMessage(data.value()); + if (result.has_value()) { + std::move(callback).Run(std::move(result.value()), absl::nullopt); + } else { + std::move(callback).Run(nullptr, result.error()); + } +} + +base::expected<mojom::QuickStartMessagePtr, mojom::QuickStartDecoderError> +QuickStartDecoder::DoDecodeQuickStartMessage(const std::vector<uint8_t>& data) { + QuickStartMessage::ReadResult read_result = + QuickStartMessage::ReadMessage(data); + if (!read_result.has_value()) { + switch (read_result.error()) { + case QuickStartMessage::ReadError::INVALID_JSON: + return base::unexpected( + mojom::QuickStartDecoderError::kUnableToReadAsJSON); + case QuickStartMessage::ReadError::MISSING_MESSAGE_PAYLOAD: + return base::unexpected(mojom::QuickStartDecoderError::kUnknownPayload); + case QuickStartMessage::ReadError::BASE64_DESERIALIZATION_FAILURE: + return base::unexpected( + mojom::QuickStartDecoderError::kUnableToReadAsBase64); + case QuickStartMessage::ReadError::UNEXPECTED_MESSAGE_TYPE: + return base::unexpected( + mojom::QuickStartDecoderError::kUnexpectedMessageType); + } } - std::vector<unsigned char>& response_bytes = parsed_response_bytes.value(); + base::Value::Dict* payload = read_result.value()->GetPayload(); + QuickStartMessageType type = read_result.value()->get_type(); + switch (type) { + case QuickStartMessageType::kSecondDeviceAuthPayload: + return DecodeSecondDeviceAuthPayload(*payload); + case QuickStartMessageType::kBootstrapOptions: + NOTIMPLEMENTED(); + break; + case QuickStartMessageType::kBootstrapConfigurations: + return DecodeBootstrapConfigurations(*payload); + case QuickStartMessageType::kQuickStartPayload: + return DecodeQuickStartPayload(*payload); + } + return base::unexpected(mojom::QuickStartDecoderError::kEmptyMessage); +} + +base::expected<mojom::QuickStartMessagePtr, mojom::QuickStartDecoderError> +QuickStartDecoder::DecodeSecondDeviceAuthPayload( + const base::Value::Dict& payload) { + const std::string* fido_message = payload.FindString(kFidoMessageKey); + if (!fido_message) { + LOG(ERROR) << "fidoMessage cannot be found within secondDeviceAuthPayload."; + return base::unexpected( + mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema); + } + + std::string base64_decoded_fido_message; + + if (!base::Base64Decode(*fido_message, &base64_decoded_fido_message, + base::Base64DecodePolicy::kForgiving)) { + LOG(ERROR) << "Failed to decode fidoMessage as a Base64 String"; + return base::unexpected( + mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema); + } + + auto response_bytes = std::vector<unsigned char>( + base64_decoded_fido_message.begin(), base64_decoded_fido_message.end()); + if (response_bytes.size() < kExpectedResponseSize) { LOG(ERROR) << "GetAssertionResponse requires a status code byte and " "response bytes. Data in size: " << response_bytes.size(); - std::move(callback).Run( - nullptr, mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema); - return; + return base::unexpected( + mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema); } uint8_t ctap_status = response_bytes[0]; base::span<const uint8_t> cbor_bytes(response_bytes); @@ -131,23 +339,20 @@ if (ctap_status != kCtapDeviceResponseSuccess) { LOG(ERROR) << "Ctap Device Response Status Code is not Success(0x00). Got: " << ctap_status; - std::move(callback).Run( - nullptr, mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema); - return; + return base::unexpected( + mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema); } std::pair<int, absl::optional<cbor::Value>> decoded_values = CborDecodeGetAssertionResponse(cbor_bytes); if (decoded_values.first != kCborDecoderNoError) { - std::move(callback).Run( - nullptr, mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema); - return; + return base::unexpected( + mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema); } if (!decoded_values.second || !decoded_values.second->is_map()) { LOG(ERROR) << "The CBOR decoded response values needs to be a valid CBOR " "Value Map."; - std::move(callback).Run( - nullptr, mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema); - return; + return base::unexpected( + mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema); } const cbor::Value::MapValue& response_map = decoded_values.second->GetMap(); @@ -167,9 +372,8 @@ if (credential_id.empty()) { LOG(ERROR) << "credential_id is empty in FIDO Message"; - std::move(callback).Run( - nullptr, mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema); - return; + return base::unexpected( + mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema); } // According to FIDO CTAP2 GetAssertionResponse, authData is stored at CBOR @@ -183,9 +387,8 @@ if (auth_data.empty()) { LOG(ERROR) << "auth_data is empty in FIDO Message"; - std::move(callback).Run( - nullptr, mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema); - return; + return base::unexpected( + mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema); } // According to FIDO CTAP2 GetAssertionResponse, signature is stored at CBOR @@ -199,9 +402,8 @@ if (signature.empty()) { LOG(ERROR) << "signature is empty in FIDO Message"; - std::move(callback).Run( - nullptr, mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema); - return; + return base::unexpected( + mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema); } // According to FIDO CTAP2 GetAssertionResponse, user is stored at CBOR index @@ -219,230 +421,104 @@ if (email.empty()) { LOG(ERROR) << "email is empty in FIDO Message"; - std::move(callback).Run( - nullptr, mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema); - return; + return base::unexpected( + mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema); } - std::move(callback).Run(mojom::FidoAssertionResponse::New( - email, credential_id, auth_data, signature), - absl::nullopt); + return mojom::QuickStartMessage::NewFidoAssertionResponse( + mojom::FidoAssertionResponse::New(email, credential_id, auth_data, + signature)); } -void QuickStartDecoder::DoDecodeBootstrapConfigurations( - const absl::optional<std::vector<uint8_t>>& data, - DecodeBootstrapConfigurationsCallback callback) { - if (!data.has_value()) { - LOG(ERROR) << "No response bytes received."; - std::move(callback).Run(nullptr, - mojom::QuickStartDecoderError::kEmptyMessage); - return; +base::expected<mojom::QuickStartMessagePtr, mojom::QuickStartDecoderError> +QuickStartDecoder::DecodeQuickStartPayload(const base::Value::Dict& payload) { + // user verification requested + absl::optional<bool> is_awaiting_user_verification; + if ((is_awaiting_user_verification = + payload.FindBool(kAwaitingUserVerificationKey))) { + return mojom::QuickStartMessage::NewUserVerificationRequested( + mojom::UserVerificationRequested::New( + is_awaiting_user_verification.value())); + } + // user verification response + absl::optional<int> user_verification_result_code; + if ((user_verification_result_code = + payload.FindInt(kUserVerificationResultKey))) { + mojom::UserVerificationResult user_verification_result = + static_cast<mojom::UserVerificationResult>( + user_verification_result_code.value()); + + if (!mojom::IsKnownEnumValue(user_verification_result)) { + LOG(ERROR) << "User Verification Result is an unknown status code"; + return base::unexpected( + mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema); + } + + absl::optional<bool> is_first_user_verification = + payload.FindBool(kIsFirstUserVerificationKey); + if (!is_first_user_verification.has_value()) { + LOG(ERROR) << "Message does not contain key is_first_user_verification"; + return base::unexpected( + mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema); + } + return mojom::QuickStartMessage::NewUserVerificationResponse( + mojom::UserVerificationResponse::New( + user_verification_result, is_first_user_verification.value())); } - QuickStartMessage::ReadResult read_result = QuickStartMessage::ReadMessage( - data.value(), QuickStartMessageType::kBootstrapConfigurations); - - if (!read_result.has_value()) { - LOG(ERROR) << "Bootstrap Configurations decoder failed"; - std::move(callback).Run( - nullptr, mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema); + // wifi credentials + const base::Value::Dict* wifi_network_information = nullptr; + if ((wifi_network_information = + payload.FindDict(kWifiNetworkInformationKey))) { + return DecodeWifiCredentials(*wifi_network_information); } - base::Value::Dict* device_details = - read_result.value()->GetPayload()->FindDict(kDeviceDetailsKey); - if (!device_details) { - LOG(ERROR) - << "DeviceDetails cannot be found within BootstrapConfigurations."; - std::move(callback).Run( - nullptr, mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema); - return; + // notify source of update response + absl::optional<bool> notify_source_of_update_ack_received; + if ((notify_source_of_update_ack_received = + payload.FindBool(kNotifySourceOfUpdateAckKey))) { + return mojom::QuickStartMessage::NewNotifySourceOfUpdateResponse( + mojom::NotifySourceOfUpdateResponse::New( + notify_source_of_update_ack_received.value())); } - std::string* cryptauth_device_id_ptr = - device_details->FindString(kCryptauthDeviceIdKey); - if (!cryptauth_device_id_ptr) { - LOG(WARNING) - << "CryptauthDeviceId for the Android Device could not be found."; - std::move(callback).Run( - mojom::BootstrapConfigurations::New(/*cryptauth_device_id=*/""), - absl::nullopt); - return; - } - std::move(callback).Run( - mojom::BootstrapConfigurations::New(*cryptauth_device_id_ptr), - absl::nullopt); + + LOG(ERROR) << "Unknown QuickStartPayload"; + return base::unexpected(mojom::QuickStartDecoderError::kUnknownPayload); } -void QuickStartDecoder::DecodeBootstrapConfigurations( - const absl::optional<std::vector<uint8_t>>& data, - DecodeBootstrapConfigurationsCallback callback) { - DoDecodeBootstrapConfigurations(data, std::move(callback)); -} - -void QuickStartDecoder::DecodeWifiCredentialsResponse( - const absl::optional<std::vector<uint8_t>>& data, - DecodeWifiCredentialsResponseCallback callback) { - DoDecodeWifiCredentialsResponse(data, std::move(callback)); -} - -void QuickStartDecoder::DecodeUserVerificationRequested( - const absl::optional<std::vector<uint8_t>>& data, - DecodeUserVerificationRequestedCallback callback) { - if (!data.has_value()) { - LOG(ERROR) << "No response bytes received."; - std::move(callback).Run(nullptr, - mojom::QuickStartDecoderError::kEmptyMessage); - return; - } - - QuickStartMessage::ReadResult read_result = QuickStartMessage::ReadMessage( - data.value(), QuickStartMessageType::kQuickStartPayload); - if (!read_result.has_value()) { - LOG(ERROR) - << "Failed to read UserVerificationRequested as QuickStartMessage"; - std::move(callback).Run(nullptr, - mojom::QuickStartDecoderError::kUnableToReadAsJSON); - return; - } - - absl::optional<bool> is_awaiting_user_verification = - read_result.value()->GetPayload()->FindBool(kAwaitingUserVerificationKey); - if (!is_awaiting_user_verification.has_value()) { - LOG(ERROR) << "UserVerificationRequested message does not include " - "await_user_verification"; - std::move(callback).Run( - nullptr, mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema); - return; - } - - std::move(callback).Run(mojom::UserVerificationRequested::New( - is_awaiting_user_verification.value()), - absl::nullopt); -} - -void QuickStartDecoder::DecodeUserVerificationResult( - const absl::optional<std::vector<uint8_t>>& data, - DecodeUserVerificationResultCallback callback) { - if (!data.has_value()) { - LOG(ERROR) << "No response bytes received."; - std::move(callback).Run(nullptr, - mojom::QuickStartDecoderError::kEmptyMessage); - return; - } - - QuickStartMessage::ReadResult read_result = QuickStartMessage::ReadMessage( - data.value(), QuickStartMessageType::kQuickStartPayload); - - if (!read_result.has_value()) { - LOG(ERROR) << "Failed to read UserVerificationResult as QuickStartMessage"; - std::move(callback).Run(nullptr, - mojom::QuickStartDecoderError::kUnableToReadAsJSON); - return; - } - - absl::optional<int> user_verification_result_code = - read_result.value()->GetPayload()->FindInt(kUserVerificationResultKey); - - if (!user_verification_result_code.has_value()) { - LOG(ERROR) << "User Verification Result was not include in verification " - "result message"; - std::move(callback).Run( - nullptr, mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema); - return; - } - - mojom::UserVerificationResult user_verification_result = - static_cast<mojom::UserVerificationResult>( - user_verification_result_code.value()); - - if (!mojom::IsKnownEnumValue(user_verification_result)) { - LOG(ERROR) << "User Verification Result is an unknown status code"; - std::move(callback).Run( - nullptr, mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema); - return; - } - - absl::optional<bool> is_first_user_verification = - read_result.value()->GetPayload()->FindBool(kIsFirstUserVerificationKey); - if (!is_first_user_verification.has_value()) { - LOG(ERROR) << "Message does not contain key is_first_user_verification"; - std::move(callback).Run( - nullptr, mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema); - return; - } - - std::move(callback).Run( - mojom::UserVerificationResponse::New(user_verification_result, - is_first_user_verification.value()), - absl::nullopt); -} - -void QuickStartDecoder::DoDecodeWifiCredentialsResponse( - const absl::optional<std::vector<uint8_t>>& data, - DecodeWifiCredentialsResponseCallback callback) { - if (!data.has_value()) { - LOG(ERROR) << "No response bytes received."; - std::move(callback).Run(nullptr, - mojom::QuickStartDecoderError::kEmptyMessage); - return; - } - - QuickStartMessage::ReadResult read_result = QuickStartMessage::ReadMessage( - data.value(), QuickStartMessageType::kQuickStartPayload); - - if (!read_result.has_value()) { - LOG(ERROR) << "Message cannot be parsed as a JSON Dictionary."; - std::move(callback).Run(nullptr, - mojom::QuickStartDecoderError::kUnableToReadAsJSON); - quick_start_metrics::RecordWifiTransferResult( - /*succeeded=*/false, /*failure_reason=*/quick_start_metrics:: - WifiTransferResultFailureReason::kUnableToReadAsJSON); - return; - } - - base::Value::Dict* wifi_network_information = - read_result.value()->GetPayload()->FindDict(kWifiNetworkInformationKey); - if (!wifi_network_information) { - LOG(ERROR) << "Wifi Network information not present in payload"; - std::move(callback).Run( - nullptr, mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema); - quick_start_metrics::RecordWifiTransferResult( - /*succeeded=*/false, /*failure_reason=*/quick_start_metrics:: - WifiTransferResultFailureReason::kWifiNetworkInformationNotFound); - return; - } - - std::string* ssid = wifi_network_information->FindString(kWifiNetworkSsidKey); +base::expected<mojom::QuickStartMessagePtr, mojom::QuickStartDecoderError> +QuickStartDecoder::DecodeWifiCredentials( + const base::Value::Dict& wifi_network_information) { + const std::string* ssid = + wifi_network_information.FindString(kWifiNetworkSsidKey); if (!ssid) { LOG(ERROR) << "SSID cannot be found within WifiCredentialsResponse."; - std::move(callback).Run( - nullptr, mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema); quick_start_metrics::RecordWifiTransferResult( /*succeeded=*/false, /*failure_reason=*/quick_start_metrics:: WifiTransferResultFailureReason::kSsidNotFound); - return; + return base::unexpected( + mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema); } if (ssid->length() == 0) { LOG(ERROR) << "SSID has a length of 0."; - std::move(callback).Run( - nullptr, mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema); quick_start_metrics::RecordWifiTransferResult( /*succeeded=*/false, /*failure_reason=*/quick_start_metrics:: WifiTransferResultFailureReason::kEmptySsid); - return; + return base::unexpected( + mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema); } - std::string* security_type_string = - wifi_network_information->FindString(kWifiNetworkSecurityTypeKey); + const std::string* security_type_string = + wifi_network_information.FindString(kWifiNetworkSecurityTypeKey); if (!security_type_string) { LOG(ERROR) << "Security Type cannot be found within WifiCredentialsResponse"; - std::move(callback).Run( - nullptr, mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema); quick_start_metrics::RecordWifiTransferResult( /*succeeded=*/false, /*failure_reason=*/quick_start_metrics:: WifiTransferResultFailureReason::kSecurityTypeNotFound); - return; + return base::unexpected( + mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema); } absl::optional<mojom::WifiSecurityType> maybe_security_type = @@ -450,42 +526,39 @@ if (!maybe_security_type.has_value()) { LOG(ERROR) << "Security type was not a valid value."; - std::move(callback).Run( - nullptr, mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema); quick_start_metrics::RecordWifiTransferResult( /*succeeded=*/false, /*failure_reason=*/quick_start_metrics:: WifiTransferResultFailureReason::kInvalidSecurityType); - return; + return base::unexpected( + mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema); } mojom::WifiSecurityType security_type = maybe_security_type.value(); // Password may not be included in payload for passwordless, open networks. absl::optional<std::string> password = absl::nullopt; - std::string* password_ptr = - wifi_network_information->FindString(kWifiNetworkPasswordKey); + const std::string* password_ptr = + wifi_network_information.FindString(kWifiNetworkPasswordKey); if (password_ptr && security_type == mojom::WifiSecurityType::kOpen) { LOG(ERROR) << "Password is found but network security type is open."; - std::move(callback).Run( - nullptr, mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema); quick_start_metrics::RecordWifiTransferResult( /*succeeded=*/false, /*failure_reason=*/quick_start_metrics:: WifiTransferResultFailureReason::kPasswordFoundAndOpenNetwork); - return; + return base::unexpected( + mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema); } if (!password_ptr && security_type != mojom::WifiSecurityType::kOpen) { LOG(ERROR) << "Password cannot be found within WifiCredentialsResponse but " "network is not open. wifi_security_type: " << security_type; - std::move(callback).Run( - nullptr, mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema); quick_start_metrics::RecordWifiTransferResult( /*succeeded=*/false, /*failure_reason=*/quick_start_metrics:: WifiTransferResultFailureReason:: kPasswordNotFoundAndNotOpenNetwork); - return; + return base::unexpected( + mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema); } if (password_ptr) { @@ -493,106 +566,42 @@ } absl::optional<bool> is_hidden = - wifi_network_information->FindBool(kWifiNetworkIsHiddenKey); + wifi_network_information.FindBool(kWifiNetworkIsHiddenKey); if (!is_hidden.has_value()) { LOG(ERROR) << "Wifi Hide Status cannot be found within WifiCredentialsResponse"; - std::move(callback).Run( - nullptr, mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema); quick_start_metrics::RecordWifiTransferResult( /*succeeded=*/false, /*failure_reason=*/quick_start_metrics:: WifiTransferResultFailureReason::kWifiHideStatusNotFound); - return; + return base::unexpected( + mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema); } - std::move(callback).Run( + return mojom::QuickStartMessage::NewWifiCredentials( mojom::WifiCredentials::New(*ssid, security_type, is_hidden.value(), - password), - absl::nullopt); + password)); } -void QuickStartDecoder::DecodeGetAssertionResponse( - const absl::optional<std::vector<uint8_t>>& data, - DecodeGetAssertionResponseCallback callback) { - DoDecodeGetAssertionResponse(std::move(data), std::move(callback)); -} - -absl::optional<std::vector<uint8_t>> -QuickStartDecoder::ExtractFidoDataFromJsonResponse( - const std::vector<uint8_t>& data) { - QuickStartMessage::ReadResult read_result = - ash::quick_start::QuickStartMessage::ReadMessage( - data, QuickStartMessageType::kSecondDeviceAuthPayload); - - if (!read_result.has_value()) { - LOG(ERROR) << "MessagePayload cannot be parsed as a JSON Dictionary."; - return absl::nullopt; +base::expected<mojom::QuickStartMessagePtr, mojom::QuickStartDecoderError> +QuickStartDecoder::DecodeBootstrapConfigurations( + const base::Value::Dict& payload) { + const base::Value::Dict* device_details = payload.FindDict(kDeviceDetailsKey); + if (!device_details) { + LOG(ERROR) + << "DeviceDetails cannot be found within BootstrapConfigurations."; + return base::unexpected( + mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema); } - - base::Value::Dict* second_device_auth_payload = - read_result.value()->GetPayload(); - if (!second_device_auth_payload) { - LOG(ERROR) << "secondDeviceAuthPayload cannot be found within Message."; - return absl::nullopt; + const std::string* cryptauth_device_id_ptr = + device_details->FindString(kCryptauthDeviceIdKey); + if (!cryptauth_device_id_ptr) { + LOG(WARNING) + << "CryptauthDeviceId for the Android Device could not be found."; + return mojom::QuickStartMessage::NewBootstrapConfigurations( + mojom::BootstrapConfigurations::New(/*cryptauth_device_id=*/"")); } - - std::string* fido_message = - second_device_auth_payload->FindString(kFidoMessageKey); - if (!fido_message) { - LOG(ERROR) << "fidoMessage cannot be found within secondDeviceAuthPayload."; - return absl::nullopt; - } - - std::string base64_decoded_fido_message; - - if (!base::Base64Decode(*fido_message, &base64_decoded_fido_message, - base::Base64DecodePolicy::kForgiving)) { - LOG(ERROR) << "Failed to decode fidoMessage as a Base64 String"; - return absl::nullopt; - } - - return std::vector<uint8_t>(base64_decoded_fido_message.begin(), - base64_decoded_fido_message.end()); -} - -void QuickStartDecoder::DecodeNotifySourceOfUpdateResponse( - const absl::optional<std::vector<uint8_t>>& data, - DecodeNotifySourceOfUpdateResponseCallback callback) { - DoDecodeNotifySourceOfUpdateResponse(data, std::move(callback)); -} - -void QuickStartDecoder::DoDecodeNotifySourceOfUpdateResponse( - const absl::optional<std::vector<uint8_t>>& data, - DecodeNotifySourceOfUpdateResponseCallback callback) { - if (!data.has_value()) { - LOG(ERROR) << "No response bytes received."; - std::move(callback).Run(nullptr, - mojom::QuickStartDecoderError::kEmptyMessage); - return; - } - - QuickStartMessage::ReadResult read_result = QuickStartMessage::ReadMessage( - data.value(), QuickStartMessageType::kQuickStartPayload); - - if (!read_result.has_value()) { - LOG(ERROR) << "Notify Source of Update message cannot be parsed as a JSON " - "Dictionary."; - std::move(callback).Run(nullptr, - mojom::QuickStartDecoderError::kUnableToReadAsJSON); - return; - } - - absl::optional<bool> ack_received = - read_result.value()->GetPayload()->FindBool(kNotifySourceOfUpdateAckKey); - if (!ack_received.has_value()) { - std::move(callback).Run( - nullptr, mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema); - return; - } - - std::move(callback).Run( - mojom::NotifySourceOfUpdateResponse::New(ack_received.value()), - absl::nullopt); + return mojom::QuickStartMessage::NewBootstrapConfigurations( + mojom::BootstrapConfigurations::New(*cryptauth_device_id_ptr)); } } // namespace ash::quick_start
diff --git a/chrome/services/sharing/nearby/quick_start_decoder/quick_start_decoder.h b/chrome/services/sharing/nearby/quick_start_decoder/quick_start_decoder.h index 455675e..50368ea0 100644 --- a/chrome/services/sharing/nearby/quick_start_decoder/quick_start_decoder.h +++ b/chrome/services/sharing/nearby/quick_start_decoder/quick_start_decoder.h
@@ -7,6 +7,8 @@ #include <vector> +#include "base/types/expected.h" +#include "base/values.h" #include "chromeos/ash/services/nearby/public/mojom/quick_start_decoder.mojom.h" #include "chromeos/ash/services/nearby/public/mojom/quick_start_decoder_types.mojom-forward.h" #include "chromeos/ash/services/nearby/public/mojom/quick_start_decoder_types.mojom.h" @@ -53,6 +55,10 @@ void DecodeUserVerificationRequested( const absl::optional<std::vector<uint8_t>>& data, DecodeUserVerificationRequestedCallback callback) override; + + void DecodeQuickStartMessage( + const absl::optional<std::vector<uint8_t>>& data, + DecodeQuickStartMessageCallback callback) override; // mojom::QuickStartDecoder: private: @@ -66,11 +72,18 @@ void DoDecodeWifiCredentialsResponse( const absl::optional<std::vector<uint8_t>>& data, DecodeWifiCredentialsResponseCallback callback); - absl::optional<std::vector<uint8_t>> ExtractFidoDataFromJsonResponse( - const std::vector<uint8_t>& data); - void DoDecodeNotifySourceOfUpdateResponse( - const absl::optional<std::vector<uint8_t>>& data, - DecodeNotifySourceOfUpdateResponseCallback callback); + + base::expected<mojom::QuickStartMessagePtr, mojom::QuickStartDecoderError> + DoDecodeQuickStartMessage(const std::vector<uint8_t>& data); + base::expected<mojom::QuickStartMessagePtr, mojom::QuickStartDecoderError> + DecodeSecondDeviceAuthPayload(const base::Value::Dict& payload); + base::expected<mojom::QuickStartMessagePtr, mojom::QuickStartDecoderError> + DecodeBootstrapConfigurations(const base::Value::Dict& payload); + base::expected<mojom::QuickStartMessagePtr, mojom::QuickStartDecoderError> + DecodeQuickStartPayload(const base::Value::Dict& payload); + base::expected<mojom::QuickStartMessagePtr, mojom::QuickStartDecoderError> + DecodeWifiCredentials(const base::Value::Dict& wifi_network_information); + mojo::Receiver<mojom::QuickStartDecoder> receiver_; };
diff --git a/chrome/services/sharing/nearby/quick_start_decoder/quick_start_decoder_unittest.cc b/chrome/services/sharing/nearby/quick_start_decoder/quick_start_decoder_unittest.cc index b7faf94..ff51409 100644 --- a/chrome/services/sharing/nearby/quick_start_decoder/quick_start_decoder_unittest.cc +++ b/chrome/services/sharing/nearby/quick_start_decoder/quick_start_decoder_unittest.cc
@@ -112,22 +112,21 @@ } void DoDecodeGetAssertionResponse( - const std::vector<uint8_t>& data, + const absl::optional<std::vector<uint8_t>>& data, QuickStartDecoder::DecodeGetAssertionResponseCallback callback) { - return decoder_->DoDecodeGetAssertionResponse(data, std::move(callback)); + decoder_->DecodeGetAssertionResponse(data, std::move(callback)); } void DoDecodeBootstrapConfigurations( - const std::vector<uint8_t>& data, + const absl::optional<std::vector<uint8_t>>& data, QuickStartDecoder::DecodeBootstrapConfigurationsCallback callback) { - return decoder_->DoDecodeBootstrapConfigurations(data, std::move(callback)); + decoder_->DecodeBootstrapConfigurations(data, std::move(callback)); } void DoDecodeWifiCredentialsResponse( - QuickStartMessage* message, + const absl::optional<std::vector<uint8_t>>& data, QuickStartDecoder::DecodeWifiCredentialsResponseCallback callback) { - return decoder_->DoDecodeWifiCredentialsResponse( - ConvertMessageToBytes(message), std::move(callback)); + decoder_->DecodeWifiCredentialsResponse(data, std::move(callback)); } void DoDecodeNotifySourceOfUpdateResponse( @@ -137,11 +136,6 @@ std::move(callback)); } - absl::optional<std::vector<uint8_t>> ExtractFidoDataFromJsonResponse( - const std::vector<uint8_t>& data) { - return decoder_->ExtractFidoDataFromJsonResponse(data); - } - QuickStartDecoder* decoder() const { return decoder_.get(); } protected: @@ -242,6 +236,34 @@ mojom::QuickStartDecoderError::kUnableToReadAsJSON); } +TEST_F(QuickStartDecoderTest, DecodeGetAssertionResponse_NullData) { + base::test::TestFuture< + ::ash::quick_start::mojom::FidoAssertionResponsePtr, + absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>> + future; + + DoDecodeGetAssertionResponse(absl::nullopt, future.GetCallback()); + EXPECT_TRUE(future.Get<0>().is_null()); + EXPECT_EQ(future.Get<1>(), mojom::QuickStartDecoderError::kEmptyMessage); +} + +TEST_F(QuickStartDecoderTest, + DecodeGetAssertionResponse_UnexpectedMessageType) { + QuickStartMessage message(QuickStartMessageType::kQuickStartPayload); + message.GetPayload()->Set(kAwaitingUserVerificationKey, true); + + base::test::TestFuture< + ::ash::quick_start::mojom::FidoAssertionResponsePtr, + absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>> + future; + + DoDecodeGetAssertionResponse(ConvertMessageToBytes(&message), + future.GetCallback()); + EXPECT_TRUE(future.Get<0>().is_null()); + EXPECT_EQ(future.Get<1>(), + mojom::QuickStartDecoderError::kUnexpectedMessageType); +} + TEST_F(QuickStartDecoderTest, DecodeGetAssertionResponse_EmptyResponse) { std::vector<uint8_t> data{}; std::vector<uint8_t> message = BuildSecondDeviceAuthPayload(data); @@ -315,6 +337,18 @@ mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema); } +TEST_F(QuickStartDecoderTest, DecodeBootstrapConfigurations_NullPayload) { + base::test::TestFuture< + ::ash::quick_start::mojom::BootstrapConfigurationsPtr, + absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>> + future; + + DoDecodeBootstrapConfigurations(absl::nullopt, future.GetCallback()); + + EXPECT_TRUE(future.Get<0>().is_null()); + EXPECT_EQ(future.Get<1>(), mojom::QuickStartDecoderError::kEmptyMessage); +} + TEST_F(QuickStartDecoderTest, DecodeBootstrapConfigurations_EmptyMessagePayload) { QuickStartMessage message(QuickStartMessageType::kBootstrapConfigurations); @@ -333,6 +367,30 @@ } TEST_F(QuickStartDecoderTest, + DecodeBootstrapConfigurations_UnexpectedMessageType) { + // Build a valid SecondDeviceAuthPayload + std::string expected_credential_id(kValidCredentialId.begin(), + kValidCredentialId.end()); + std::string email = "testcase@google.com"; + std::vector<uint8_t> user_id(email.begin(), email.end()); + std::vector<uint8_t> data = BuildEncodedResponseData( + kValidCredentialId, kValidAuthData, kValidSignature, user_id, kSuccess); + + std::vector<uint8_t> payload = BuildSecondDeviceAuthPayload(data); + + base::test::TestFuture< + ::ash::quick_start::mojom::BootstrapConfigurationsPtr, + absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>> + future; + + // Try to parse the SecondDeviceAuthPayload as a BootstrapConfigurations. + DoDecodeBootstrapConfigurations(std::move(payload), future.GetCallback()); + EXPECT_TRUE(future.Get<0>().is_null()); + EXPECT_EQ(future.Get<1>(), + mojom::QuickStartDecoderError::kUnexpectedMessageType); +} + +TEST_F(QuickStartDecoderTest, DecodeBootstrapConfigurations_EmptyBootstrapConfigurations) { QuickStartMessage message(QuickStartMessageType::kBootstrapConfigurations); @@ -422,19 +480,33 @@ std::vector<uint8_t> payload = BuildSecondDeviceAuthPayload(data); - absl::optional<std::vector<uint8_t>> result = - ExtractFidoDataFromJsonResponse(payload); - ASSERT_TRUE(result.has_value()); - EXPECT_EQ(result.value(), data); + base::test::TestFuture< + ::ash::quick_start::mojom::FidoAssertionResponsePtr, + absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>> + future; + + DoDecodeGetAssertionResponse(payload, future.GetCallback()); + EXPECT_TRUE(future.Get<0>()); + EXPECT_FALSE(future.Get<1>().has_value()); } TEST_F(QuickStartDecoderTest, ExtractFidoDataFromJsonResponseFailsIfFidoDataMissingFromPayload) { QuickStartMessage message(QuickStartMessageType::kSecondDeviceAuthPayload); - absl::optional<std::vector<uint8_t>> result = - ExtractFidoDataFromJsonResponse(ConvertMessageToBytes(&message)); - EXPECT_FALSE(result.has_value()); + std::string json_serialized_payload; + base::JSONWriter::Write(*message.GetPayload(), &json_serialized_payload); + std::vector<uint8_t> response_bytes(json_serialized_payload.begin(), + json_serialized_payload.end()); + + base::test::TestFuture< + ::ash::quick_start::mojom::FidoAssertionResponsePtr, + absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>> + future; + + DoDecodeGetAssertionResponse(response_bytes, future.GetCallback()); + EXPECT_FALSE(future.Get<0>()); + EXPECT_TRUE(future.Get<1>().has_value()); } TEST_F(QuickStartDecoderTest, @@ -446,9 +518,14 @@ std::vector<uint8_t> response_bytes(json_serialized_payload.begin(), json_serialized_payload.end()); - absl::optional<std::vector<uint8_t>> result = - ExtractFidoDataFromJsonResponse(response_bytes); - EXPECT_FALSE(result.has_value()); + base::test::TestFuture< + ::ash::quick_start::mojom::FidoAssertionResponsePtr, + absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>> + future; + + DoDecodeGetAssertionResponse(response_bytes, future.GetCallback()); + EXPECT_FALSE(future.Get<0>()); + EXPECT_TRUE(future.Get<1>().has_value()); } TEST_F(QuickStartDecoderTest, @@ -460,9 +537,14 @@ std::vector<uint8_t> response_bytes(json_serialized_payload.begin(), json_serialized_payload.end()); - absl::optional<std::vector<uint8_t>> result = - ExtractFidoDataFromJsonResponse(response_bytes); - EXPECT_FALSE(result.has_value()); + base::test::TestFuture< + ::ash::quick_start::mojom::FidoAssertionResponsePtr, + absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>> + future; + + DoDecodeGetAssertionResponse(response_bytes, future.GetCallback()); + EXPECT_FALSE(future.Get<0>()); + EXPECT_TRUE(future.Get<1>().has_value()); } TEST_F(QuickStartDecoderTest, @@ -470,9 +552,60 @@ // This is just a random payload that is not a valid JSON. std::vector<uint8_t> random_payload = {0x01, 0x02, 0x03}; - absl::optional<std::vector<uint8_t>> result = - ExtractFidoDataFromJsonResponse(random_payload); - EXPECT_FALSE(result.has_value()); + base::test::TestFuture< + ::ash::quick_start::mojom::FidoAssertionResponsePtr, + absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>> + future; + + DoDecodeGetAssertionResponse(random_payload, future.GetCallback()); + EXPECT_FALSE(future.Get<0>()); + EXPECT_TRUE(future.Get<1>().has_value()); +} + +TEST_F(QuickStartDecoderTest, DecodeWifiCredentialsResponse_NullData) { + base::test::TestFuture< + ::ash::quick_start::mojom::WifiCredentialsPtr, + absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>> + future; + + DoDecodeWifiCredentialsResponse(absl::nullopt, future.GetCallback()); + + ASSERT_TRUE(future.Get<0>().is_null()); + EXPECT_EQ(future.Get<1>(), + ash::quick_start::mojom::QuickStartDecoderError::kEmptyMessage); +} + +TEST_F(QuickStartDecoderTest, DecodeWifiCredentialsResponse_BadJson) { + base::test::TestFuture< + ::ash::quick_start::mojom::WifiCredentialsPtr, + absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>> + future; + + DoDecodeWifiCredentialsResponse(std::vector<uint8_t>{0x01, 0x02, 0x03}, + future.GetCallback()); + + ASSERT_TRUE(future.Get<0>().is_null()); + EXPECT_EQ( + future.Get<1>(), + ash::quick_start::mojom::QuickStartDecoderError::kUnableToReadAsJSON); +} + +TEST_F(QuickStartDecoderTest, + DecodeWifiCredentialsResponse_UnexpectedMessageType) { + QuickStartMessage message(QuickStartMessageType::kQuickStartPayload); + message.GetPayload()->Set(kAwaitingUserVerificationKey, true); + + base::test::TestFuture< + ::ash::quick_start::mojom::WifiCredentialsPtr, + absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>> + future; + + DoDecodeWifiCredentialsResponse(ConvertMessageToBytes(&message), + future.GetCallback()); + + ASSERT_TRUE(future.Get<0>().is_null()); + EXPECT_EQ(future.Get<1>(), + mojom::QuickStartDecoderError::kUnexpectedMessageType); } TEST_F(QuickStartDecoderTest, ExtractWifiInformationPassesOnValidResponse) { @@ -491,7 +624,8 @@ absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>> future; - DoDecodeWifiCredentialsResponse(&message, future.GetCallback()); + DoDecodeWifiCredentialsResponse(ConvertMessageToBytes(&message), + future.GetCallback()); ASSERT_FALSE(future.Get<0>().is_null()); EXPECT_EQ(future.Get<0>()->ssid, "ssid"); @@ -517,7 +651,8 @@ absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>> future; - DoDecodeWifiCredentialsResponse(&message, future.GetCallback()); + DoDecodeWifiCredentialsResponse(ConvertMessageToBytes(&message), + future.GetCallback()); ASSERT_FALSE(future.Get<0>().is_null()); EXPECT_EQ(future.Get<0>()->password, absl::nullopt); @@ -540,7 +675,8 @@ absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>> future; - DoDecodeWifiCredentialsResponse(&message, future.GetCallback()); + DoDecodeWifiCredentialsResponse(ConvertMessageToBytes(&message), + future.GetCallback()); EXPECT_TRUE(future.Get<0>().is_null()); EXPECT_EQ(future.Get<1>(), @@ -570,7 +706,8 @@ absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>> future; - DoDecodeWifiCredentialsResponse(&message, future.GetCallback()); + DoDecodeWifiCredentialsResponse(ConvertMessageToBytes(&message), + future.GetCallback()); EXPECT_TRUE(future.Get<0>().is_null()); EXPECT_EQ(future.Get<1>(), @@ -600,7 +737,8 @@ absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>> future; - DoDecodeWifiCredentialsResponse(&message, future.GetCallback()); + DoDecodeWifiCredentialsResponse(ConvertMessageToBytes(&message), + future.GetCallback()); EXPECT_TRUE(future.Get<0>().is_null()); EXPECT_EQ(future.Get<1>(), @@ -630,7 +768,8 @@ absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>> future; - DoDecodeWifiCredentialsResponse(&message, future.GetCallback()); + DoDecodeWifiCredentialsResponse(ConvertMessageToBytes(&message), + future.GetCallback()); EXPECT_TRUE(future.Get<0>().is_null()); EXPECT_EQ(future.Get<1>(), @@ -660,7 +799,8 @@ absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>> future; - DoDecodeWifiCredentialsResponse(&message, future.GetCallback()); + DoDecodeWifiCredentialsResponse(ConvertMessageToBytes(&message), + future.GetCallback()); EXPECT_TRUE(future.Get<0>().is_null()); EXPECT_EQ(future.Get<1>(), @@ -690,7 +830,8 @@ absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>> future; - DoDecodeWifiCredentialsResponse(&message, future.GetCallback()); + DoDecodeWifiCredentialsResponse(ConvertMessageToBytes(&message), + future.GetCallback()); EXPECT_TRUE(future.Get<0>().is_null()); EXPECT_EQ(future.Get<1>(), @@ -720,7 +861,8 @@ absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>> future; - DoDecodeWifiCredentialsResponse(&message, future.GetCallback()); + DoDecodeWifiCredentialsResponse(ConvertMessageToBytes(&message), + future.GetCallback()); EXPECT_TRUE(future.Get<0>().is_null()); EXPECT_EQ(future.Get<1>(), @@ -747,7 +889,8 @@ absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>> future; - DoDecodeWifiCredentialsResponse(&message, future.GetCallback()); + DoDecodeWifiCredentialsResponse(ConvertMessageToBytes(&message), + future.GetCallback()); EXPECT_TRUE(future.Get<0>().is_null()); EXPECT_EQ(future.Get<1>(), @@ -775,7 +918,8 @@ absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>> future; - DoDecodeWifiCredentialsResponse(&message, future.GetCallback()); + DoDecodeWifiCredentialsResponse(ConvertMessageToBytes(&message), + future.GetCallback()); EXPECT_TRUE(future.Get<0>().is_null()); EXPECT_EQ(future.Get<1>(), @@ -806,7 +950,8 @@ absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>> future; - DoDecodeWifiCredentialsResponse(&message, future.GetCallback()); + DoDecodeWifiCredentialsResponse(ConvertMessageToBytes(&message), + future.GetCallback()); EXPECT_TRUE(future.Get<0>().is_null()); EXPECT_EQ(future.Get<1>(), @@ -836,7 +981,8 @@ absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>> future; - DoDecodeWifiCredentialsResponse(&message, future.GetCallback()); + DoDecodeWifiCredentialsResponse(ConvertMessageToBytes(&message), + future.GetCallback()); EXPECT_TRUE(future.Get<0>().is_null()); EXPECT_EQ(future.Get<1>(), @@ -859,11 +1005,11 @@ absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>> future; - DoDecodeWifiCredentialsResponse(&message, future.GetCallback()); + DoDecodeWifiCredentialsResponse(ConvertMessageToBytes(&message), + future.GetCallback()); EXPECT_TRUE(future.Get<0>().is_null()); - EXPECT_EQ(future.Get<1>(), - mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema); + EXPECT_EQ(future.Get<1>(), mojom::QuickStartDecoderError::kUnknownPayload); histogram_tester_.ExpectBucketCount( kWifiTransferResultFailureReasonHistogramName, quick_start_metrics::WifiTransferResultFailureReason:: @@ -925,7 +1071,6 @@ decoder()->DecodeUserVerificationResult(ConvertMessageToBytes(&message), future.GetCallback()); - EXPECT_TRUE(future.IsReady()); ASSERT_FALSE(future.Get<0>().is_null()); EXPECT_EQ(future.Get<0>().get()->result, mojom::UserVerificationResult::kUserVerified); @@ -933,6 +1078,36 @@ EXPECT_EQ(future.Get<1>(), absl::nullopt); } +TEST_F(QuickStartDecoderTest, DecodeUserVerificationResult_NullData) { + base::test::TestFuture< + ::ash::quick_start::mojom::UserVerificationResponsePtr, + absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>> + future; + + decoder()->DecodeUserVerificationResult(absl::nullopt, future.GetCallback()); + + EXPECT_TRUE(future.Get<0>().is_null()); + EXPECT_EQ(future.Get<1>(), mojom::QuickStartDecoderError::kEmptyMessage); +} + +TEST_F(QuickStartDecoderTest, + DecodeUserVerificationResult_UnexpectedMessageType) { + QuickStartMessage message(QuickStartMessageType::kQuickStartPayload); + message.GetPayload()->Set(kNotifySourceOfUpdateAckKey, true); + + base::test::TestFuture< + ::ash::quick_start::mojom::UserVerificationResponsePtr, + absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>> + future; + + decoder()->DecodeUserVerificationResult(ConvertMessageToBytes(&message), + future.GetCallback()); + + EXPECT_TRUE(future.Get<0>().is_null()); + EXPECT_EQ(future.Get<1>(), + mojom::QuickStartDecoderError::kUnexpectedMessageType); +} + TEST_F(QuickStartDecoderTest, DecodeUserVerificationResultFailsIfMessageIsNotJson) { std::vector<uint8_t> message; @@ -943,7 +1118,6 @@ decoder()->DecodeUserVerificationResult(message, future.GetCallback()); - EXPECT_TRUE(future.IsReady()); EXPECT_TRUE(future.Get<0>().is_null()); EXPECT_EQ(future.Get<1>(), mojom::QuickStartDecoderError::kUnableToReadAsJSON); @@ -962,10 +1136,8 @@ decoder()->DecodeUserVerificationResult(ConvertMessageToBytes(&message), future.GetCallback()); - EXPECT_TRUE(future.IsReady()); EXPECT_TRUE(future.Get<0>().is_null()); - EXPECT_EQ(future.Get<1>(), - mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema); + EXPECT_EQ(future.Get<1>(), mojom::QuickStartDecoderError::kUnknownPayload); } TEST_F(QuickStartDecoderTest, @@ -982,7 +1154,6 @@ decoder()->DecodeUserVerificationResult(ConvertMessageToBytes(&message), future.GetCallback()); - EXPECT_TRUE(future.IsReady()); EXPECT_TRUE(future.Get<0>().is_null()); EXPECT_EQ(future.Get<1>(), mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema); @@ -1001,7 +1172,6 @@ decoder()->DecodeUserVerificationResult(ConvertMessageToBytes(&message), future.GetCallback()); - EXPECT_TRUE(future.IsReady()); EXPECT_TRUE(future.Get<0>().is_null()); EXPECT_EQ(future.Get<1>(), mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema); @@ -1019,12 +1189,42 @@ decoder()->DecodeUserVerificationRequested(ConvertMessageToBytes(&message), future.GetCallback()); - EXPECT_TRUE(future.IsReady()); ASSERT_FALSE(future.Get<0>().is_null()); EXPECT_TRUE(future.Get<0>().get()->is_awaiting_user_verification); EXPECT_EQ(future.Get<1>(), absl::nullopt); } +TEST_F(QuickStartDecoderTest, DecodeUserVerificationRequested_NullData) { + base::test::TestFuture< + ::ash::quick_start::mojom::UserVerificationRequestedPtr, + absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>> + future; + + decoder()->DecodeUserVerificationRequested(absl::nullopt, + future.GetCallback()); + + EXPECT_TRUE(future.Get<0>().is_null()); + EXPECT_EQ(future.Get<1>(), mojom::QuickStartDecoderError::kEmptyMessage); +} + +TEST_F(QuickStartDecoderTest, + DecodeUserVerificationRequested_UnexpectedMessageType) { + QuickStartMessage message(QuickStartMessageType::kQuickStartPayload); + message.GetPayload()->Set(kNotifySourceOfUpdateAckKey, true); + + base::test::TestFuture< + ::ash::quick_start::mojom::UserVerificationRequestedPtr, + absl::optional<::ash::quick_start::mojom::QuickStartDecoderError>> + future; + + decoder()->DecodeUserVerificationRequested(ConvertMessageToBytes(&message), + future.GetCallback()); + + EXPECT_TRUE(future.Get<0>().is_null()); + EXPECT_EQ(future.Get<1>(), + mojom::QuickStartDecoderError::kUnexpectedMessageType); +} + TEST_F(QuickStartDecoderTest, DecodeUserVerificationRequestFailsIfKeyMissing) { QuickStartMessage message(QuickStartMessageType::kQuickStartPayload); @@ -1036,10 +1236,8 @@ decoder()->DecodeUserVerificationRequested(ConvertMessageToBytes(&message), future.GetCallback()); - EXPECT_TRUE(future.IsReady()); EXPECT_TRUE(future.Get<0>().is_null()); - EXPECT_EQ(future.Get<1>(), - mojom::QuickStartDecoderError::kMessageDoesNotMatchSchema); + EXPECT_EQ(future.Get<1>(), mojom::QuickStartDecoderError::kUnknownPayload); } } // namespace ash::quick_start
diff --git a/chrome/test/data/web_apps/borderless_isolated_app/manifest.webmanifest b/chrome/test/data/web_apps/borderless_isolated_app/manifest.webmanifest index c9c9df6..13214a7 100644 --- a/chrome/test/data/web_apps/borderless_isolated_app/manifest.webmanifest +++ b/chrome/test/data/web_apps/borderless_isolated_app/manifest.webmanifest
@@ -7,7 +7,7 @@ "display": "standalone", "display_override": ["borderless"], "permissions_policy": { - "window-placement": [ "*" ] + "window-management": [ "*" ] }, "icons": [ {
diff --git a/chrome/test/data/webui/cr_components/omnibox/realbox_match_test.ts b/chrome/test/data/webui/cr_components/omnibox/realbox_match_test.ts index 983bdf4..4e76a94 100644 --- a/chrome/test/data/webui/cr_components/omnibox/realbox_match_test.ts +++ b/chrome/test/data/webui/cr_components/omnibox/realbox_match_test.ts
@@ -93,4 +93,38 @@ assertDeepEquals(destinationUrl, middleClickArgs[1]); assertEquals(1, middleClickArgs[3]); }); + + test('RemovesMatch', async () => { + const matchIndex = 1; + const destinationUrl = {url: 'http://google.com'}; + matchEl.matchIndex = matchIndex; + matchEl.match.destinationUrl = destinationUrl; + + // By pressing 'Enter' on the button. + const keydownEvent = (new KeyboardEvent('keydown', { + bubbles: true, + cancelable: true, + composed: true, + key: 'Enter', + })); + matchEl.$.remove.dispatchEvent(keydownEvent); + assertTrue(keydownEvent.defaultPrevented); + const keydownArgs = + await testProxy.handler.whenCalled('deleteAutocompleteMatch'); + assertEquals(matchIndex, keydownArgs[0]); + assertEquals(destinationUrl, keydownArgs[1]); + assertEquals(1, testProxy.handler.getCallCount('deleteAutocompleteMatch')); + // Pressing 'Enter' the button doesn't accidentally trigger navigation. + assertEquals(0, testProxy.handler.getCallCount('openAutocompleteMatch')); + testProxy.handler.reset(); + + matchEl.$.remove.click(); + const clickArgs = + await testProxy.handler.whenCalled('deleteAutocompleteMatch'); + assertEquals(matchIndex, clickArgs[0]); + assertEquals(destinationUrl, clickArgs[1]); + assertEquals(1, testProxy.handler.getCallCount('deleteAutocompleteMatch')); + // Clicking the button doesn't accidentally trigger navigation. + assertEquals(0, testProxy.handler.getCallCount('openAutocompleteMatch')); + }); });
diff --git a/chrome/test/data/webui/new_tab_page/realbox/realbox_test.ts b/chrome/test/data/webui/new_tab_page/realbox/realbox_test.ts index 8add2e2..2402e40 100644 --- a/chrome/test/data/webui/new_tab_page/realbox/realbox_test.ts +++ b/chrome/test/data/webui/new_tab_page/realbox/realbox_test.ts
@@ -1287,65 +1287,6 @@ window.getComputedStyle(matchEls[1]!.$.remove).display, 'none'); }); - test('Can remove match using the remove button', async () => { - realbox.$.input.value = 'hello'; - realbox.$.input.dispatchEvent(new InputEvent('input')); - - const matches = - [createSearchMatch(), createUrlMatch({supportsDeletion: true})]; - testProxy.callbackRouterRemote.autocompleteResultChanged({ - input: mojoString16(realbox.$.input.value.trimStart()), - matches, - suggestionGroupsMap: {}, - }); - await testProxy.callbackRouterRemote.$.flushForTesting(); - assertTrue(areMatchesShowing()); - - const matchEls = - realbox.$.matches.shadowRoot!.querySelectorAll('cr-realbox-match'); - assertEquals(2, matchEls.length); - - // Select the second match. - const arrowUpEvent = new KeyboardEvent('keydown', { - bubbles: true, - cancelable: true, - composed: true, // So it propagates across shadow DOM boundary. - key: 'ArrowUp', - }); - realbox.$.input.dispatchEvent(arrowUpEvent); - assertTrue(arrowUpEvent.defaultPrevented); - assertTrue(matchEls[1]!.hasAttribute(Attributes.SELECTED)); - - // By pressing 'Enter' on the button. - const enter = new KeyboardEvent('keydown', { - bubbles: true, - cancelable: true, - composed: true, // So it propagates across shadow DOM boundary. - key: 'Enter', - }); - matchEls[1]!.$.remove.dispatchEvent(enter); - assertTrue(enter.defaultPrevented); - await testProxy.handler.whenCalled('deleteAutocompleteMatch') - .then((args) => { - assertEquals(1, args.line); - }); - assertEquals(1, testProxy.handler.getCallCount('deleteAutocompleteMatch')); - // Pressing 'Enter' on the button doesn't accidentally trigger navigation. - assertEquals(0, testProxy.handler.getCallCount('openAutocompleteMatch')); - - testProxy.handler.reset(); - - // By clicking the button. - matchEls[1]!.$.remove.click(); - await testProxy.handler.whenCalled('deleteAutocompleteMatch') - .then((args) => { - assertEquals(1, args.line); - }); - assertEquals(1, testProxy.handler.getCallCount('deleteAutocompleteMatch')); - // Clicking the button doesn't accidentally trigger navigation. - assertEquals(0, testProxy.handler.getCallCount('openAutocompleteMatch')); - }); - test('Can remove selected match using keyboard shortcut', async () => { realbox.$.input.value = 'hello'; realbox.$.input.dispatchEvent(new InputEvent('input')); @@ -1414,50 +1355,6 @@ assertEquals(1, testProxy.handler.getCallCount('deleteAutocompleteMatch')); }); - test('Can remove match using the remove button', async () => { - realbox.$.input.value = 'hello'; - realbox.$.input.dispatchEvent(new InputEvent('input')); - - const matches = - [createSearchMatch(), createUrlMatch({supportsDeletion: true})]; - testProxy.callbackRouterRemote.autocompleteResultChanged({ - input: mojoString16(realbox.$.input.value.trimStart()), - matches, - suggestionGroupsMap: {}, - }); - await testProxy.callbackRouterRemote.$.flushForTesting(); - assertTrue(areMatchesShowing()); - - const matchEls = - realbox.$.matches.shadowRoot!.querySelectorAll('cr-realbox-match'); - assertEquals(2, matchEls.length); - - // By pressing 'Enter' on the button. - const enter = new KeyboardEvent('keydown', { - bubbles: true, - cancelable: true, - composed: true, // So it propagates across shadow DOM boundary. - key: 'Enter', - }); - matchEls[1]!.$.remove.dispatchEvent(enter); - assertTrue(enter.defaultPrevented); - await testProxy.handler.whenCalled('deleteAutocompleteMatch') - .then((args) => { - assertEquals(1, args.line); - }); - assertEquals(1, testProxy.handler.getCallCount('deleteAutocompleteMatch')); - - testProxy.handler.reset(); - - // By clicking the button. - matchEls[1]!.$.remove.click(); - await testProxy.handler.whenCalled('deleteAutocompleteMatch') - .then((args) => { - assertEquals(1, args.line); - }); - assertEquals(1, testProxy.handler.getCallCount('deleteAutocompleteMatch')); - }); - test('Selection is restored after selected match is removed', async () => { realbox.$.input.value = 'hello'; realbox.$.input.dispatchEvent(new InputEvent('input'));
diff --git a/chrome/test/data/webui/print_preview/button_strip_test.ts b/chrome/test/data/webui/print_preview/button_strip_test.ts index 56eeb02..8dca964 100644 --- a/chrome/test/data/webui/print_preview/button_strip_test.ts +++ b/chrome/test/data/webui/print_preview/button_strip_test.ts
@@ -6,21 +6,7 @@ import {assertEquals, assertFalse, assertTrue} from 'chrome://webui-test/chai_assert.js'; import {eventToPromise} from 'chrome://webui-test/test_util.js'; -const button_strip_test = { - suiteName: 'ButtonStripTest', - TestNames: { - ButtonStripChangesForState: 'button strip changes for state', - ButtonOrder: 'button order', - ButtonStripFiresEvents: 'button strip fires events', - // <if expr="is_chromeos"> - InvalidPinDisablesPrint: 'invalid pin disables print', - // </if> - }, -}; - -Object.assign(window, {button_strip_test: button_strip_test}); - -suite(button_strip_test.suiteName, function() { +suite('ButtonStripTest', function() { let buttonStrip: PrintPreviewButtonStripElement; setup(function() { @@ -42,7 +28,7 @@ // Tests that the correct message is shown for non-READY states, and that // the print button is disabled appropriately. test( - button_strip_test.TestNames.ButtonStripChangesForState, function() { + 'ButtonStripChangesForState', function() { const printButton = buttonStrip.shadowRoot!.querySelector<CrButtonElement>( '.action-button')!; @@ -63,7 +49,7 @@ // Tests that the buttons are in the correct order for different platforms. // See https://crbug.com/880562. - test(button_strip_test.TestNames.ButtonOrder, function() { + test('ButtonOrder', function() { // Verify that there are only 2 buttons. assertEquals( 2, buttonStrip.shadowRoot!.querySelectorAll('cr-button').length); @@ -90,7 +76,7 @@ // Tests that the button strip fires print-requested and cancel-requested // events. - test(button_strip_test.TestNames.ButtonStripFiresEvents, function() { + test('ButtonStripFiresEvents', function() { const printButton = buttonStrip.shadowRoot!.querySelector<HTMLElement>( 'cr-button.action-button')!; const cancelButton = buttonStrip.shadowRoot!.querySelector<HTMLElement>( @@ -108,7 +94,7 @@ // <if expr="is_chromeos"> // Tests having an invalid pin disable the print button - test(button_strip_test.TestNames.InvalidPinDisablesPrint, function() { + test('InvalidPinDisablesPrint', function() { const printButton = buttonStrip.shadowRoot!.querySelector<CrButtonElement>( '.action-button')!; assertFalse(printButton.disabled);
diff --git a/chrome/test/data/webui/print_preview/custom_margins_test.ts b/chrome/test/data/webui/print_preview/custom_margins_test.ts index c4195e1..ec86271 100644 --- a/chrome/test/data/webui/print_preview/custom_margins_test.ts +++ b/chrome/test/data/webui/print_preview/custom_margins_test.ts
@@ -9,27 +9,7 @@ import {fakeDataBind} from 'chrome://webui-test/polymer_test_util.js'; import {eventToPromise} from 'chrome://webui-test/test_util.js'; -const custom_margins_test = { - suiteName: 'CustomMarginsTest', - TestNames: { - ControlsCheck: 'controls check', - SetFromStickySettings: 'set from sticky settings', - DragControls: 'drag controls', - SetControlsWithTextbox: 'set controls with textbox', - SetControlsWithTextboxMetric: 'set controls with textbox metric', - RestoreStickyMarginsAfterDefault: 'restore sticky margins after default', - MediaSizeClearsCustomMargins: 'media size clears custom margins', - LayoutClearsCustomMargins: 'layout clears custom margins', - IgnoreDocumentMarginsFromPDF: 'ignore document margins from pdf', - MediaSizeClearsCustomMarginsPDF: 'media size clears custom margins pdf', - RequestScrollToOutOfBoundsTextbox: - 'request scroll to out of bounds textbox', - ControlsDisabledOnError: 'controls disabled on error', - }, -}; - -Object.assign(window, {custom_margins_test: custom_margins_test}); -suite(custom_margins_test.suiteName, function() { +suite('CustomMarginsTest', function() { let container: PrintPreviewMarginControlContainerElement; let model: PrintPreviewModelElement; @@ -266,7 +246,7 @@ // Test that controls correctly appear when custom margins are selected and // disappear when the preview is loading. - test(custom_margins_test.TestNames.ControlsCheck, function() { + test('ControlsCheck', function() { const getCustomMarginsValue = function(): MarginsSetting { return container.getSettingValue('customMargins') as MarginsSetting; }; @@ -325,7 +305,7 @@ // Tests that the margin controls can be correctly set from the sticky // settings. - test(custom_margins_test.TestNames.SetFromStickySettings, function() { + test('SetFromStickySettings', function() { return finishSetup().then(() => { const controls = getControls(); @@ -345,7 +325,7 @@ }); // Test that dragging margin controls updates the custom margins setting. - test(custom_margins_test.TestNames.DragControls, function() { + test('DragControls', function() { /** * Tests that the control can be moved from its current position (assumed * to be the default margins) to newPositionInPts by dragging it. @@ -428,7 +408,7 @@ // Test that setting the margin controls with their textbox inputs updates // the custom margins setting. test( - custom_margins_test.TestNames.SetControlsWithTextbox, function() { + 'SetControlsWithTextbox', function() { return finishSetup().then(() => { const controls = getControls(); // Set a shorter delay for testing so the test doesn't take too @@ -475,7 +455,7 @@ // as the decimal delimiter and '.' as the thousands delimiter. Regression // test for https://crbug.com/1005816. test( - custom_margins_test.TestNames.SetControlsWithTextboxMetric, function() { + 'SetControlsWithTextboxMetric', function() { measurementSystem = new MeasurementSystem('.', ',', MeasurementSystemUnitType.METRIC); return finishSetup().then(() => { @@ -537,8 +517,7 @@ // Test that if there is a custom margins sticky setting, it is restored // when margin setting changes. test( - custom_margins_test.TestNames.RestoreStickyMarginsAfterDefault, - function() { + 'RestoreStickyMarginsAfterDefault', function() { const marginValues = setupCustomMargins(); return finishSetup().then(() => { // Simulate setting custom margins. @@ -566,7 +545,7 @@ // Test that if the media size changes, the custom margins are cleared. test( - custom_margins_test.TestNames.MediaSizeClearsCustomMargins, function() { + 'MediaSizeClearsCustomMargins', function() { return validateMarginsClearedForSetting( 'mediaSize', {height_microns: 200000, width_microns: 200000}) .then(() => { @@ -586,7 +565,7 @@ // Test that if the orientation changes, the custom margins are cleared. test( - custom_margins_test.TestNames.LayoutClearsCustomMargins, function() { + 'LayoutClearsCustomMargins', function() { return validateMarginsClearedForSetting('layout', true).then(() => { // Simulate setting custom margins again model.set('settings.margins.value', MarginsType.CUSTOM); @@ -606,7 +585,7 @@ // not updated based on the document margins - i.e. PDFs do not change the // custom margins state. test( - custom_margins_test.TestNames.IgnoreDocumentMarginsFromPDF, function() { + 'IgnoreDocumentMarginsFromPDF', function() { model.set('settings.margins.available', false); return finishSetup().then(() => { assertEquals( @@ -616,13 +595,11 @@ // Test that if margins are not available but the user changes the media // size, the custom margins are cleared. - test( - custom_margins_test.TestNames.MediaSizeClearsCustomMarginsPDF, - function() { - model.set('settings.margins.available', false); - return validateMarginsClearedForSetting( - 'mediaSize', {height_microns: 200000, width_microns: 200000}); - }); + test('MediaSizeClearsCustomMarginsPDF', function() { + model.set('settings.margins.available', false); + return validateMarginsClearedForSetting( + 'mediaSize', {height_microns: 200000, width_microns: 200000}); + }); function whenAnimationFrameDone() { return new Promise(resolve => window.requestAnimationFrame(resolve)); @@ -631,8 +608,7 @@ // Test that if the user focuses a textbox that is not visible, the // text-focus event is fired with the correct values to scroll by. test( - custom_margins_test.TestNames.RequestScrollToOutOfBoundsTextbox, - function() { + 'RequestScrollToOutOfBoundsTextbox', function() { return finishSetup() .then(() => { // Wait for the controls to be set up, which occurs in an @@ -690,7 +666,7 @@ // Tests that the margin controls can be correctly set from the sticky // settings. test( - custom_margins_test.TestNames.ControlsDisabledOnError, function() { + 'ControlsDisabledOnError', function() { return finishSetup().then(() => { // Simulate setting custom margins. model.set('settings.margins.value', MarginsType.CUSTOM);
diff --git a/chrome/test/data/webui/print_preview/destination_search_test.ts b/chrome/test/data/webui/print_preview/destination_search_test.ts index 6653e7b..0dba92c 100644 --- a/chrome/test/data/webui/print_preview/destination_search_test.ts +++ b/chrome/test/data/webui/print_preview/destination_search_test.ts
@@ -10,17 +10,7 @@ import {NativeLayerStub} from './native_layer_stub.js'; import {createDestinationStore, getCddTemplate, setupTestListenerElement} from './print_preview_test_utils.js'; -const destination_search_test = { - suiteName: 'DestinationSearchTest', - TestNames: { - GetCapabilitiesSucceeds: 'get capabilities succeeds', - GetCapabilitiesFails: 'get capabilities fails', - }, -}; - -Object.assign(window, {destination_search_test: destination_search_test}); - -suite(destination_search_test.suiteName, function() { +suite('DestinationSearchTest', function() { let dialog: PrintPreviewDestinationDialogElement; let destinationStore: DestinationStore; @@ -84,8 +74,7 @@ // Tests that a destination is selected if the user clicks on it and // capabilities fetch succeeds. test( - destination_search_test.TestNames.GetCapabilitiesSucceeds, - async function() { + 'GetCapabilitiesSucceeds', async function() { const destId = '00112233DEADBEEF'; nativeLayer.setLocalDestinationCapabilities(getCddTemplate(destId)); @@ -104,16 +93,14 @@ // Tests what happens when capabilities cannot be retrieved for the chosen // destination. The destination will still be selected in this case. - test( - destination_search_test.TestNames.GetCapabilitiesFails, async function() { - const destId = '001122DEADBEEF'; - nativeLayer.setLocalDestinationCapabilities( - getCddTemplate(destId), true); - requestSetup(destId); - const args = await nativeLayer.whenCalled('getPrinterCapabilities'); - assertEquals(destId, args.destinationId); - // The destination is selected even though capabilities cannot be - // retrieved. - assertEquals(destId, destinationStore.selectedDestination!.id); - }); + test('GetCapabilitiesFails', async function() { + const destId = '001122DEADBEEF'; + nativeLayer.setLocalDestinationCapabilities(getCddTemplate(destId), true); + requestSetup(destId); + const args = await nativeLayer.whenCalled('getPrinterCapabilities'); + assertEquals(destId, args.destinationId); + // The destination is selected even though capabilities cannot be + // retrieved. + assertEquals(destId, destinationStore.selectedDestination!.id); + }); });
diff --git a/chrome/test/data/webui/print_preview/destination_search_test_chromeos.ts b/chrome/test/data/webui/print_preview/destination_search_test_chromeos.ts index 46ab6b12..5731210 100644 --- a/chrome/test/data/webui/print_preview/destination_search_test_chromeos.ts +++ b/chrome/test/data/webui/print_preview/destination_search_test_chromeos.ts
@@ -11,21 +11,7 @@ import {NativeLayerStub} from './native_layer_stub.js'; import {createDestinationStore, getCddTemplate, setupTestListenerElement} from './print_preview_test_utils.js'; -const destination_search_test_chromeos = { - suiteName: 'DestinationSearchTest', - TestNames: { - ReceiveSuccessfulSetup: 'receive successful setup', - ResolutionFails: 'resolution fails', - ReceiveSuccessfulSetupWithPolicies: - 'receive successful setup with policies', - }, -}; - -Object.assign( - window, - {destination_search_test_chromeos: destination_search_test_chromeos}); - -suite(destination_search_test_chromeos.suiteName, function() { +suite('DestinationSearchTest', function() { let dialog: PrintPreviewDestinationDialogCrosElement; let destinationStore: DestinationStore; @@ -91,10 +77,9 @@ } // Tests that a destination is selected if the user clicks on it and setup - // (for CrOS) or capabilities fetch (for non-Cros) succeeds. + // succeeds. test( - destination_search_test_chromeos.TestNames.ReceiveSuccessfulSetup, - async function() { + 'ReceiveSuccessfulSetup', async function() { const destId = '00112233DEADBEEF'; const response = { printerId: destId, @@ -116,19 +101,16 @@ }); // Test what happens when the setupPrinter request is rejected. - test( - destination_search_test_chromeos.TestNames.ResolutionFails, - async function() { - const destId = '001122DEADBEEF'; - const originalDestination = destinationStore.selectedDestination; - nativeLayerCros.setSetupPrinterResponse( - {printerId: destId, capabilities: {printer: {}, version: '1'}}, - true); - requestSetup(destId); - const actualId = await nativeLayerCros.whenCalled('setupPrinter'); - assertEquals(destId, actualId); - // The selected printer should not have changed, since a printer - // cannot be selected until setup succeeds. - assertEquals(originalDestination, destinationStore.selectedDestination); - }); + test('ResolutionFails', async function() { + const destId = '001122DEADBEEF'; + const originalDestination = destinationStore.selectedDestination; + nativeLayerCros.setSetupPrinterResponse( + {printerId: destId, capabilities: {printer: {}, version: '1'}}, true); + requestSetup(destId); + const actualId = await nativeLayerCros.whenCalled('setupPrinter'); + assertEquals(destId, actualId); + // The selected printer should not have changed, since a printer + // cannot be selected until setup succeeds. + assertEquals(originalDestination, destinationStore.selectedDestination); + }); });
diff --git a/chrome/test/data/webui/print_preview/header_test.ts b/chrome/test/data/webui/print_preview/header_test.ts index f8f5989..4ab93a8 100644 --- a/chrome/test/data/webui/print_preview/header_test.ts +++ b/chrome/test/data/webui/print_preview/header_test.ts
@@ -8,18 +8,7 @@ import {fakeDataBind} from 'chrome://webui-test/polymer_test_util.js'; import {TestPluralStringProxy} from 'chrome://webui-test/test_plural_string_proxy.js'; -const header_test = { - suiteName: 'HeaderTest', - TestNames: { - HeaderPrinterTypes: 'header printer types', - HeaderChangesForState: 'header changes for state', - EnterprisePolicy: 'enterprise policy', - }, -}; - -Object.assign(window, {header_test: header_test}); - -suite(header_test.suiteName, function() { +suite('HeaderTest', function() { let header: PrintPreviewHeaderElement; let pluralString: TestPluralStringProxy; @@ -59,7 +48,7 @@ // Tests that the 4 different messages (non-virtual printer singular and // plural, virtual printer singular and plural) all show up as expected. - test(header_test.TestNames.HeaderPrinterTypes, async function() { + test('HeaderPrinterTypes', async function() { const summary = header.shadowRoot!.querySelector('.summary')!; { const {messageName, itemCount} = @@ -100,7 +89,7 @@ // Tests that the correct message is shown for non-READY states, and that // the print button is disabled appropriately. - test(header_test.TestNames.HeaderChangesForState, async function() { + test('HeaderChangesForState', async function() { const summary = header.shadowRoot!.querySelector('.summary')!; await pluralString.whenCalled('getPluralString'); assertEquals('1 sheet of paper', summary.textContent!.trim()); @@ -119,7 +108,7 @@ }); // Tests that enterprise badge shows up if any setting is managed. - test(header_test.TestNames.EnterprisePolicy, function() { + test('EnterprisePolicy', function() { assertTrue(header.shadowRoot!.querySelector('iron-icon')!.hidden); header.managed = true; assertFalse(header.shadowRoot!.querySelector('iron-icon')!.hidden);
diff --git a/chrome/test/data/webui/print_preview/print_preview_browsertest.cc b/chrome/test/data/webui/print_preview/print_preview_browsertest.cc index 650261d..3a227c4 100644 --- a/chrome/test/data/webui/print_preview/print_preview_browsertest.cc +++ b/chrome/test/data/webui/print_preview/print_preview_browsertest.cc
@@ -788,3 +788,155 @@ IN_PROC_BROWSER_TEST_F(PrintPreviewPreviewAreaTest, ViewportSizeChanges) { RunTestCase("ViewportSizeChanges"); } + +class PrintPreviewCustomMarginsTest : public PrintPreviewBrowserTest { + protected: + void RunTestCase(const std::string& testCase) { + PrintPreviewBrowserTest::RunTest( + "print_preview/custom_margins_test.js", + base::StringPrintf("runMochaTest('CustomMarginsTest', '%s');", + testCase.c_str())); + } +}; + +IN_PROC_BROWSER_TEST_F(PrintPreviewCustomMarginsTest, ControlsCheck) { + RunTestCase("ControlsCheck"); +} + +IN_PROC_BROWSER_TEST_F(PrintPreviewCustomMarginsTest, SetFromStickySettings) { + RunTestCase("SetFromStickySettings"); +} + +IN_PROC_BROWSER_TEST_F(PrintPreviewCustomMarginsTest, DragControls) { + RunTestCase("DragControls"); +} + +IN_PROC_BROWSER_TEST_F(PrintPreviewCustomMarginsTest, SetControlsWithTextbox) { + RunTestCase("SetControlsWithTextbox"); +} + +IN_PROC_BROWSER_TEST_F(PrintPreviewCustomMarginsTest, + SetControlsWithTextboxMetric) { + RunTestCase("SetControlsWithTextboxMetric"); +} + +IN_PROC_BROWSER_TEST_F(PrintPreviewCustomMarginsTest, + RestoreStickyMarginsAfterDefault) { + RunTestCase("RestoreStickyMarginsAfterDefault"); +} + +IN_PROC_BROWSER_TEST_F(PrintPreviewCustomMarginsTest, + MediaSizeClearsCustomMargins) { + RunTestCase("MediaSizeClearsCustomMargins"); +} + +IN_PROC_BROWSER_TEST_F(PrintPreviewCustomMarginsTest, + LayoutClearsCustomMargins) { + RunTestCase("LayoutClearsCustomMargins"); +} + +IN_PROC_BROWSER_TEST_F(PrintPreviewCustomMarginsTest, + IgnoreDocumentMarginsFromPDF) { + RunTestCase("IgnoreDocumentMarginsFromPDF"); +} + +IN_PROC_BROWSER_TEST_F(PrintPreviewCustomMarginsTest, + MediaSizeClearsCustomMarginsPDF) { + RunTestCase("MediaSizeClearsCustomMarginsPDF"); +} + +IN_PROC_BROWSER_TEST_F(PrintPreviewCustomMarginsTest, + RequestScrollToOutOfBoundsTextbox) { + RunTestCase("RequestScrollToOutOfBoundsTextbox"); +} + +IN_PROC_BROWSER_TEST_F(PrintPreviewCustomMarginsTest, ControlsDisabledOnError) { + RunTestCase("ControlsDisabledOnError"); +} + +class PrintPreviewDestinationSearchTest : public PrintPreviewBrowserTest { + protected: + void RunTestCase(const std::string& testCase) { + PrintPreviewBrowserTest::RunTest( +#if BUILDFLAG(IS_CHROMEOS) + "print_preview/destination_search_test_chromeos.js", +#else + "print_preview/destination_search_test.js", +#endif + base::StringPrintf("runMochaTest('DestinationSearchTest', '%s');", + testCase.c_str())); + } +}; + +#if BUILDFLAG(IS_CHROMEOS) +IN_PROC_BROWSER_TEST_F(PrintPreviewDestinationSearchTest, + ReceiveSuccessfulSetup) { + RunTestCase("ReceiveSuccessfulSetup"); +} + +IN_PROC_BROWSER_TEST_F(PrintPreviewDestinationSearchTest, ResolutionFails) { + RunTestCase("ResolutionFails"); +} + +#else +IN_PROC_BROWSER_TEST_F(PrintPreviewDestinationSearchTest, + GetCapabilitiesSucceeds) { + RunTestCase("GetCapabilitiesSucceeds"); +} + +IN_PROC_BROWSER_TEST_F(PrintPreviewDestinationSearchTest, + GetCapabilitiesFails) { + RunTestCase("GetCapabilitiesFails"); +} +#endif + +class PrintPreviewHeaderTest : public PrintPreviewBrowserTest { + protected: + void RunTestCase(const std::string& testCase) { + PrintPreviewBrowserTest::RunTest( + "print_preview/header_test.js", + base::StringPrintf("runMochaTest('HeaderTest', '%s');", + testCase.c_str())); + } +}; + +IN_PROC_BROWSER_TEST_F(PrintPreviewHeaderTest, HeaderPrinterTypes) { + RunTestCase("HeaderPrinterTypes"); +} + +IN_PROC_BROWSER_TEST_F(PrintPreviewHeaderTest, HeaderChangesForState) { + RunTestCase("HeaderChangesForState"); +} + +IN_PROC_BROWSER_TEST_F(PrintPreviewHeaderTest, EnterprisePolicy) { + RunTestCase("EnterprisePolicy"); +} + +class PrintPreviewButtonStripTest : public PrintPreviewBrowserTest { + protected: + void RunTestCase(const std::string& testCase) { + PrintPreviewBrowserTest::RunTest( + "print_preview/button_strip_test.js", + base::StringPrintf("runMochaTest('ButtonStripTest', '%s');", + testCase.c_str())); + } +}; + +IN_PROC_BROWSER_TEST_F(PrintPreviewButtonStripTest, + ButtonStripChangesForState) { + RunTestCase("ButtonStripChangesForState"); +} + +IN_PROC_BROWSER_TEST_F(PrintPreviewButtonStripTest, ButtonOrder) { + RunTestCase("ButtonOrder"); +} + +IN_PROC_BROWSER_TEST_F(PrintPreviewButtonStripTest, ButtonStripFiresEvents) { + RunTestCase("ButtonStripFiresEvents"); +} + +#if BUILDFLAG(IS_CHROMEOS) +IN_PROC_BROWSER_TEST_F(PrintPreviewButtonStripTest, InvalidPinDisablesPrint) { + RunTestCase("InvalidPinDisablesPrint"); +} +#endif
diff --git a/chrome/test/data/webui/print_preview/print_preview_ui_browsertest.js b/chrome/test/data/webui/print_preview/print_preview_ui_browsertest.js index aa423720..2d0a3ef 100644 --- a/chrome/test/data/webui/print_preview/print_preview_ui_browsertest.js +++ b/chrome/test/data/webui/print_preview/print_preview_ui_browsertest.js
@@ -34,190 +34,6 @@ } }; -var PrintPreviewCustomMarginsTest = class extends PrintPreviewTest { - /** @override */ - get browsePreload() { - return 'chrome://print/test_loader.html?module=print_preview/custom_margins_test.js'; - } - - /** @override */ - get suiteName() { - return custom_margins_test.suiteName; - } -}; - -TEST_F('PrintPreviewCustomMarginsTest', 'ControlsCheck', function() { - this.runMochaTest(custom_margins_test.TestNames.ControlsCheck); -}); - -TEST_F('PrintPreviewCustomMarginsTest', 'SetFromStickySettings', function() { - this.runMochaTest(custom_margins_test.TestNames.SetFromStickySettings); -}); - -TEST_F('PrintPreviewCustomMarginsTest', 'DragControls', function() { - this.runMochaTest(custom_margins_test.TestNames.DragControls); -}); - -TEST_F('PrintPreviewCustomMarginsTest', 'SetControlsWithTextbox', function() { - this.runMochaTest(custom_margins_test.TestNames.SetControlsWithTextbox); -}); - -TEST_F( - 'PrintPreviewCustomMarginsTest', 'SetControlsWithTextboxMetric', - function() { - this.runMochaTest( - custom_margins_test.TestNames.SetControlsWithTextboxMetric); - }); - -TEST_F( - 'PrintPreviewCustomMarginsTest', 'RestoreStickyMarginsAfterDefault', - function() { - this.runMochaTest( - custom_margins_test.TestNames.RestoreStickyMarginsAfterDefault); - }); - -TEST_F( - 'PrintPreviewCustomMarginsTest', 'MediaSizeClearsCustomMargins', - function() { - this.runMochaTest( - custom_margins_test.TestNames.MediaSizeClearsCustomMargins); - }); - -TEST_F( - 'PrintPreviewCustomMarginsTest', 'LayoutClearsCustomMargins', function() { - this.runMochaTest( - custom_margins_test.TestNames.LayoutClearsCustomMargins); - }); - -TEST_F( - 'PrintPreviewCustomMarginsTest', 'IgnoreDocumentMarginsFromPDF', - function() { - this.runMochaTest( - custom_margins_test.TestNames.IgnoreDocumentMarginsFromPDF); - }); - -TEST_F( - 'PrintPreviewCustomMarginsTest', 'MediaSizeClearsCustomMarginsPDF', - function() { - this.runMochaTest( - custom_margins_test.TestNames.MediaSizeClearsCustomMarginsPDF); - }); - -TEST_F( - 'PrintPreviewCustomMarginsTest', 'RequestScrollToOutOfBoundsTextbox', - function() { - this.runMochaTest( - custom_margins_test.TestNames.RequestScrollToOutOfBoundsTextbox); - }); - -TEST_F('PrintPreviewCustomMarginsTest', 'ControlsDisabledOnError', function() { - this.runMochaTest(custom_margins_test.TestNames.ControlsDisabledOnError); -}); - -GEN('#if BUILDFLAG(IS_CHROMEOS)'); -var PrintPreviewDestinationSearchTestChromeOS = class extends PrintPreviewTest { - /** @override */ - get browsePreload() { - return 'chrome://print/test_loader.html?module=print_preview/destination_search_test_chromeos.js'; - } - - /** @override */ - get suiteName() { - return destination_search_test_chromeos.suiteName; - } -}; - -TEST_F( - 'PrintPreviewDestinationSearchTestChromeOS', 'ReceiveSuccessfulSetup', - function() { - this.runMochaTest( - destination_search_test_chromeos.TestNames.ReceiveSuccessfulSetup); - }); - -TEST_F( - 'PrintPreviewDestinationSearchTestChromeOS', 'ResolutionFails', function() { - this.runMochaTest( - destination_search_test_chromeos.TestNames.ResolutionFails); - }); - -GEN('#else'); -var PrintPreviewDestinationSearchTest = class extends PrintPreviewTest { - /** @override */ - get browsePreload() { - return 'chrome://print/test_loader.html?module=print_preview/destination_search_test.js'; - } - - /** @override */ - get suiteName() { - return destination_search_test.suiteName; - } -}; - -TEST_F( - 'PrintPreviewDestinationSearchTest', 'GetCapabilitiesSucceeds', function() { - this.runMochaTest( - destination_search_test.TestNames.GetCapabilitiesSucceeds); - }); - -TEST_F('PrintPreviewDestinationSearchTest', 'GetCapabilitiesFails', function() { - this.runMochaTest(destination_search_test.TestNames.GetCapabilitiesFails); -}); -GEN('#endif'); - -var PrintPreviewHeaderTest = class extends PrintPreviewTest { - /** @override */ - get browsePreload() { - return 'chrome://print/test_loader.html?module=print_preview/header_test.js'; - } - - /** @override */ - get suiteName() { - return header_test.suiteName; - } -}; - -TEST_F('PrintPreviewHeaderTest', 'HeaderPrinterTypes', function() { - this.runMochaTest(header_test.TestNames.HeaderPrinterTypes); -}); - -TEST_F('PrintPreviewHeaderTest', 'HeaderChangesForState', function() { - this.runMochaTest(header_test.TestNames.HeaderChangesForState); -}); - -TEST_F('PrintPreviewHeaderTest', 'EnterprisePolicy', function() { - this.runMochaTest(header_test.TestNames.EnterprisePolicy); -}); - -var PrintPreviewButtonStripTest = class extends PrintPreviewTest { - /** @override */ - get browsePreload() { - return 'chrome://print/test_loader.html?module=print_preview/button_strip_test.js'; - } - - /** @override */ - get suiteName() { - return button_strip_test.suiteName; - } -}; - -TEST_F('PrintPreviewButtonStripTest', 'ButtonStripChangesForState', function() { - this.runMochaTest(button_strip_test.TestNames.ButtonStripChangesForState); -}); - -TEST_F('PrintPreviewButtonStripTest', 'ButtonOrder', function() { - this.runMochaTest(button_strip_test.TestNames.ButtonOrder); -}); - -TEST_F('PrintPreviewButtonStripTest', 'ButtonStripFiresEvents', function() { - this.runMochaTest(button_strip_test.TestNames.ButtonStripFiresEvents); -}); - -GEN('#if BUILDFLAG(IS_CHROMEOS)'); -TEST_F('PrintPreviewButtonStripTest', 'InvalidPinDisablesPrint', function() { - this.runMochaTest(button_strip_test.TestNames.InvalidPinDisablesPrint); -}); -GEN('#endif'); - var PrintPreviewDestinationItemTest = class extends PrintPreviewTest { /** @override */ get browsePreload() {
diff --git a/chrome/test/data/webui/settings/chromeos/BUILD.gn b/chrome/test/data/webui/settings/chromeos/BUILD.gn index 8633492..1b303dac 100644 --- a/chrome/test/data/webui/settings/chromeos/BUILD.gn +++ b/chrome/test/data/webui/settings/chromeos/BUILD.gn
@@ -48,7 +48,6 @@ "lacros_extension_controlled_indicator_test.ts", "lock_screen_subpage_test.ts", "nearby_share_receive_dialog_tests.js", - "nearby_share_subpage_tests.js", "onc_mojo_test.ts", "os_about_page_tests.js", "os_page_availability_test.ts", @@ -66,7 +65,6 @@ "test_os_lifetime_browser_proxy.ts", "test_os_sync_browser_proxy.ts", "test_personalization_hub_browser_proxy.js", - "test_profile_info_browser_proxy.js", "utils.ts", # Subfolder files. @@ -161,6 +159,8 @@ "nearby_share_page/nearby_share_confirm_page_test.ts", "nearby_share_page/nearby_share_high_visibility_page_test.ts", + "nearby_share_page/nearby_share_subpage_test.ts", + "nearby_share_page/test_nearby_account_manager_browser_proxy.ts", "os_a11y_page/audio_and_captions_page_test.ts", "os_a11y_page/change_dictation_locale_dialog_test.ts", @@ -245,6 +245,7 @@ "os_people_page/test_fingerprint_browser_proxy.ts", "os_people_page/test_os_sync_browser_proxy.ts", "os_people_page/test_parental_controls_browser_proxy.ts", + "os_people_page/test_profile_info_browser_proxy.ts", "os_printing_page/cups_print_server_test.ts", "os_printing_page/cups_printer_dialog_test.ts",
diff --git a/chrome/test/data/webui/settings/chromeos/fake_receive_manager.js b/chrome/test/data/webui/settings/chromeos/fake_receive_manager.js index 6d6b14a..c03199b 100644 --- a/chrome/test/data/webui/settings/chromeos/fake_receive_manager.js +++ b/chrome/test/data/webui/settings/chromeos/fake_receive_manager.js
@@ -32,6 +32,7 @@ 'unregisterForegroundReceiveSurface', 'accept', 'reject', + 'recordFastInitiationNotificationUsage', ]); /** @private {!ReceiveObserverInterface} */ this.observer_; @@ -72,7 +73,7 @@ } /** - * @param {!ReceiveObserverRemote} observer + * @param {!nearbyShareMojom.ReceiveObserverRemote} observer */ addReceiveObserver(observer) { this.methodCalled('addReceiveObserver'); @@ -88,7 +89,8 @@ } /** - * @return {!Promise<{result: !RegisterReceiveSurfaceResult}>} + * @return {!Promise<{result: + * !nearbyShareMojom.RegisterReceiveSurfaceResult}>} */ async registerForegroundReceiveSurface() { this.inHighVisibility_ = true; @@ -134,6 +136,13 @@ } /** + * @param {!boolean} success + */ + recordFastInitiationNotificationUsage(success) { + this.methodCalled('recordFastInitiationNotificationUsage', success); + } + + /** * @return {boolean} */ getInHighVisibilityForTest() {
diff --git a/chrome/test/data/webui/settings/chromeos/nearby_share_page/nearby_share_subpage_test.ts b/chrome/test/data/webui/settings/chromeos/nearby_share_page/nearby_share_subpage_test.ts new file mode 100644 index 0000000..8216490 --- /dev/null +++ b/chrome/test/data/webui/settings/chromeos/nearby_share_page/nearby_share_subpage_test.ts
@@ -0,0 +1,725 @@ +// Copyright 2020 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import 'chrome://os-settings/lazy_load.js'; + +import {SettingsNearbyShareSubpageElement} from 'chrome://os-settings/lazy_load.js'; +import {CrInputElement, CrToggleElement, NearbyAccountManagerBrowserProxyImpl, nearbyShareMojom, Router, routes, setContactManagerForTesting, setNearbyShareSettingsForTesting, setReceiveManagerForTesting, settingMojom, SettingsToggleButtonElement} from 'chrome://os-settings/os_settings.js'; +import {DeviceNameValidationResult, FastInitiationNotificationState} from 'chrome://resources/mojo/chromeos/ash/services/nearby/public/mojom/nearby_share_settings.mojom-webui.js'; +import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; +import {assertEquals, assertFalse, assertNull, assertTrue} from 'chrome://webui-test/chai_assert.js'; +import {FakeContactManager} from 'chrome://webui-test/nearby_share/shared/fake_nearby_contact_manager.js'; +import {FakeNearbyShareSettings} from 'chrome://webui-test/nearby_share/shared/fake_nearby_share_settings.js'; +import {flushTasks, waitAfterNextRender} from 'chrome://webui-test/polymer_test_util.js'; +import {isVisible} from 'chrome://webui-test/test_util.js'; + +import {FakeReceiveManager} from '../fake_receive_manager.js'; + +import {TestNearbyAccountManagerBrowserProxy} from './test_nearby_account_manager_browser_proxy.js'; + +const {RegisterReceiveSurfaceResult} = nearbyShareMojom; + +suite('<settings-nearby-share-subpage>', () => { + let subpage: SettingsNearbyShareSubpageElement; + let featureToggleButton: SettingsToggleButtonElement; + let fakeReceiveManager: FakeReceiveManager; + let accountManagerBrowserProxy: TestNearbyAccountManagerBrowserProxy; + let fakeContactManager: FakeContactManager; + let fakeSettings: FakeNearbyShareSettings; + + suiteSetup(() => { + accountManagerBrowserProxy = new TestNearbyAccountManagerBrowserProxy(); + NearbyAccountManagerBrowserProxyImpl.setInstanceForTesting( + accountManagerBrowserProxy); + }); + + function setupFakes(): void { + fakeReceiveManager = new FakeReceiveManager(); + setReceiveManagerForTesting(fakeReceiveManager); + + fakeContactManager = new FakeContactManager(); + setContactManagerForTesting(fakeContactManager); + fakeContactManager.setupContactRecords(); + + fakeSettings = new FakeNearbyShareSettings(); + setNearbyShareSettingsForTesting(fakeSettings); + } + + function syncFakeSettings(): void { + subpage.set('settings.enabled', fakeSettings.getEnabledForTest()); + subpage.set( + 'settings.isFastInitiationHardwareSupported', + fakeSettings.getIsFastInitiationHardwareSupportedTest()); + subpage.set( + 'settings.fastInitiationNotificationState', + fakeSettings.getFastInitiationNotificationStateTest()); + subpage.set('settings.deviceName', fakeSettings.getDeviceNameForTest()); + subpage.set('settings.dataUsage', fakeSettings.getDataUsageForTest()); + subpage.set('settings.visibility', fakeSettings.getVisibilityForTest()); + subpage.set( + 'settings.allowedContacts', fakeSettings.getAllowedContactsForTest()); + subpage.set( + 'settings.isOnboardingComplete', fakeSettings.isOnboardingComplete()); + } + + function createSubpage( + isEnabled: boolean, isOnboardingComplete: boolean): void { + subpage = document.createElement('settings-nearby-share-subpage'); + subpage.prefs = { + 'nearby_sharing': { + 'enabled': { + value: isEnabled, + }, + 'data_usage': { + value: 3, + }, + 'device_name': { + value: '', + }, + 'onboarding_complete': { + value: isOnboardingComplete, + }, + }, + }; + subpage.isSettingsRetreived = true; + + document.body.appendChild(subpage); + flush(); + } + + setup(async () => { + setupFakes(); + fakeSettings.setEnabled(true); + fakeSettings.setIsOnboardingComplete(true); + + createSubpage(/*isEnabled=*/ true, /*isOnboardingComplete=*/ true); + syncFakeSettings(); + const toggle = + subpage.shadowRoot!.querySelector<SettingsToggleButtonElement>( + '#featureToggleButton'); + assertTrue(!!toggle); + featureToggleButton = toggle; + await flushTasks(); + }); + + teardown(() => { + subpage.remove(); + accountManagerBrowserProxy.reset(); + Router.getInstance().resetRouteForTesting(); + }); + + // Returns true if the element exists and has not been 'removed' by the + // Polymer template system. + function doesElementExist(selector: string): boolean { + const el = subpage.shadowRoot!.querySelector<HTMLElement>(selector); + return (el !== null) && (el.style.display !== 'none'); + } + + function subpageControlsHidden(isHidden: boolean): void { + assertEquals(isHidden, !doesElementExist('#highVisibilityToggle')); + assertEquals(isHidden, !doesElementExist('#editDeviceNameButton')); + assertEquals(isHidden, !doesElementExist('#editVisibilityButton')); + assertEquals(isHidden, !doesElementExist('#editDataUsageButton')); + } + + function subpageControlsDisabled(isDisabled: boolean): void { + const highVisibilityToggle = + subpage.shadowRoot!.querySelector('#highVisibilityToggle'); + const editDeviceNameButton = + subpage.shadowRoot!.querySelector('#editDeviceNameButton'); + const editVisibilityButton = + subpage.shadowRoot!.querySelector('#editVisibilityButton'); + const editDataUsageButton = + subpage.shadowRoot!.querySelector('#editDataUsageButton'); + + assertTrue(!!highVisibilityToggle); + assertTrue(!!editDeviceNameButton); + assertTrue(!!editVisibilityButton); + assertTrue(!!editDataUsageButton); + + assertEquals(isDisabled, highVisibilityToggle.hasAttribute('disabled')); + assertEquals(isDisabled, editDeviceNameButton.hasAttribute('disabled')); + assertEquals(isDisabled, editVisibilityButton.hasAttribute('disabled')); + assertEquals(isDisabled, editDataUsageButton.hasAttribute('disabled')); + } + + test('feature toggle button controls preference', () => { + // Ensure that these controls are enabled/disabled when the Nearby is + // enabled/disabled. + assertTrue(featureToggleButton.checked); + assertTrue(subpage.prefs.nearby_sharing.enabled.value); + assertEquals('On', featureToggleButton.label.trim()); + subpageControlsHidden(false); + subpageControlsDisabled(false); + + featureToggleButton.click(); + flush(); + + assertFalse(featureToggleButton.checked); + assertFalse(subpage.prefs.nearby_sharing.enabled.value); + assertEquals('Off', featureToggleButton.label.trim()); + subpageControlsHidden(false); + }); + + test('toggle row controls preference', () => { + assertTrue(featureToggleButton.checked); + assertTrue(subpage.prefs.nearby_sharing.enabled.value); + assertEquals('On', featureToggleButton.label.trim()); + + featureToggleButton.click(); + + assertFalse(featureToggleButton.checked); + assertFalse(subpage.prefs.nearby_sharing.enabled.value); + assertEquals('Off', featureToggleButton.label.trim()); + }); + + suite('Deeplinking', () => { + const deepLinkTestData = [ + { + settingId: settingMojom.Setting.kNearbyShareOnOff.toString(), + deepLinkElement: '#featureToggleButton', + }, + { + settingId: settingMojom.Setting.kNearbyShareDeviceName.toString(), + deepLinkElement: '#editDeviceNameButton', + }, + { + settingId: settingMojom.Setting.kNearbyShareDeviceVisibility.toString(), + deepLinkElement: '#editVisibilityButton', + }, + { + settingId: settingMojom.Setting.kNearbyShareContacts.toString(), + deepLinkElement: '#manageContactsLinkRow', + }, + { + settingId: settingMojom.Setting.kNearbyShareDataUsage.toString(), + deepLinkElement: '#editDataUsageButton', + }, + { + settingId: settingMojom.Setting + .kDevicesNearbyAreSharingNotificationOnOff.toString(), + deepLinkElement: '#fastInitiationNotificationToggle', + }, + ]; + + deepLinkTestData.forEach((testData) => { + test( + `Deep link to nearby setting element ${testData.deepLinkElement}`, + async () => { + const params = new URLSearchParams(); + params.append('settingId', testData.settingId); + Router.getInstance().navigateTo(routes.NEARBY_SHARE, params); + flush(); + + const deepLinkElement = + subpage.shadowRoot!.querySelector<HTMLElement>( + testData.deepLinkElement); + assertTrue(!!deepLinkElement); + await waitAfterNextRender(deepLinkElement); + assertEquals( + deepLinkElement, subpage.shadowRoot!.activeElement, + `Nearby share setting element ${testData.deepLinkElement} + should be focused for settingId= ${testData.settingId}`); + }); + }); + }); + + test('update device name preference', () => { + assertEquals('', subpage.prefs.nearby_sharing.device_name.value); + + const editDeviceNameButton = + subpage.shadowRoot!.querySelector<HTMLButtonElement>( + '#editDeviceNameButton'); + assertTrue(!!editDeviceNameButton); + editDeviceNameButton.click(); + flush(); + + const dialog = + subpage.shadowRoot!.querySelector('nearby-share-device-name-dialog'); + assertTrue(!!dialog); + const newName = 'NEW NAME'; + const crInput = dialog.shadowRoot!.querySelector('cr-input'); + assertTrue(!!crInput); + crInput.value = newName; + const actionButton = + dialog.shadowRoot!.querySelector<HTMLButtonElement>('.action-button'); + assertTrue(!!actionButton); + actionButton.click(); + flush(); + syncFakeSettings(); + flush(); + + assertEquals(newName, subpage.get('settings').deviceName); + }); + + test('validate device name preference', async () => { + const button = subpage.shadowRoot!.querySelector<HTMLButtonElement>( + '#editDeviceNameButton'); + assertTrue(!!button); + button.click(); + flush(); + const dialog = + subpage.shadowRoot!.querySelector('nearby-share-device-name-dialog'); + assertTrue(!!dialog); + const input = dialog.shadowRoot!.querySelector<CrInputElement>('cr-input'); + assertTrue(!!input); + const doneButton = + dialog.shadowRoot!.querySelector<HTMLButtonElement>('#doneButton'); + assertTrue(!!doneButton); + + fakeSettings.setNextDeviceNameResult( + DeviceNameValidationResult.kErrorEmpty); + input.dispatchEvent( + new CustomEvent('input', {bubbles: true, composed: true})); + // Allow the validation promise to resolve. + await waitAfterNextRender(input); + flush(); + assertTrue(input.invalid); + assertTrue(doneButton.disabled); + + fakeSettings.setNextDeviceNameResult(DeviceNameValidationResult.kValid); + input.dispatchEvent( + new CustomEvent('input', {bubbles: true, composed: true})); + await waitAfterNextRender(input); + flush(); + assertFalse(input.invalid); + assertFalse(doneButton.disabled); + }); + + test('update data usage preference', () => { + assertEquals(2, subpage.get('settings').dataUsage); + + const editDataUsageButton = + subpage.shadowRoot!.querySelector<HTMLButtonElement>( + '#editDataUsageButton'); + assertTrue(!!editDataUsageButton); + editDataUsageButton.click(); + flush(); + + const dialog = + subpage.shadowRoot!.querySelector('nearby-share-data-usage-dialog'); + assertTrue(!!dialog); + + const dataUsageWifiOnlyButton = + dialog.shadowRoot!.querySelector<HTMLButtonElement>( + '#dataUsageWifiOnlyButton'); + assertTrue(!!dataUsageWifiOnlyButton); + dataUsageWifiOnlyButton.click(); + + const actionButton = + dialog.shadowRoot!.querySelector<HTMLButtonElement>('.action-button'); + assertTrue(!!actionButton); + actionButton.click(); + + flush(); + syncFakeSettings(); + flush(); + + assertEquals(3, subpage.get('settings').dataUsage); + }); + + test('update visibility shows dialog', () => { + // NOTE: all value editing is done and tested in the + // nearby-contact-visibility component which is hosted directly on the + // dialog. Here we just verify the dialog shows up, it has the component, + // and it has a close/action button. + const visibilityButton = + subpage.shadowRoot!.querySelector<HTMLButtonElement>( + '#editVisibilityButton'); + assertTrue(!!visibilityButton); + visibilityButton.click(); + flush(); + + const dialog = subpage.shadowRoot!.querySelector( + 'nearby-share-contact-visibility-dialog'); + assertTrue(!!dialog); + assertTrue(!!dialog.shadowRoot!.querySelector('nearby-contact-visibility')); + const button = + dialog.shadowRoot!.querySelector<HTMLButtonElement>('.action-button'); + assertTrue(!!button); + button.click(); + }); + + test('toggle high visibility from UI', async () => { + const toggle = subpage.shadowRoot!.querySelector<HTMLButtonElement>( + '#highVisibilityToggle'); + assertTrue(!!toggle); + toggle.click(); + flush(); + assertTrue(fakeReceiveManager.getInHighVisibilityForTest()); + + const dialog = + subpage.shadowRoot!.querySelector('nearby-share-receive-dialog'); + assertTrue(!!dialog); + + await waitAfterNextRender(dialog); + const highVisibilityDialog = + dialog.shadowRoot!.querySelector('nearby-share-high-visibility-page'); + assertTrue(isVisible(highVisibilityDialog)); + + dialog['close_'](); + assertFalse(fakeReceiveManager.getInHighVisibilityForTest()); + }); + + test('high visibility UI updates from high visibility changes', async () => { + const highVisibilityToggle = + subpage.shadowRoot!.querySelector<CrToggleElement>( + '#highVisibilityToggle'); + assertTrue(!!highVisibilityToggle); + assertFalse(highVisibilityToggle.checked); + + fakeReceiveManager.setInHighVisibilityForTest(true); + assertTrue(highVisibilityToggle.checked); + + fakeReceiveManager.setInHighVisibilityForTest(false); + assertFalse(highVisibilityToggle.checked); + + // Process stopped unchecks the toggle. + fakeReceiveManager.setInHighVisibilityForTest(true); + assertTrue(highVisibilityToggle.checked); + subpage.onNearbyProcessStopped(); + flush(); + assertFalse(highVisibilityToggle.checked); + + // Failure to start advertising unchecks the toggle. + fakeReceiveManager.setInHighVisibilityForTest(false); + fakeReceiveManager.setInHighVisibilityForTest(true); + assertTrue(highVisibilityToggle.checked); + subpage.onStartAdvertisingFailure(); + flush(); + assertFalse(highVisibilityToggle.checked); + + // Toggle still gets unchecked even if advertising was not attempted. + // E.g. if Bluetooth is off when high visibility is toggled. + fakeReceiveManager.setInHighVisibilityForTest(false); + subpage.set('inHighVisibility_', true); + subpage['showHighVisibilityPage_'](); + const dialog = + subpage.shadowRoot!.querySelector('nearby-share-receive-dialog'); + assertTrue(!!dialog); + await waitAfterNextRender(dialog); + const highVisibilityDialog = + dialog.shadowRoot!.querySelector('nearby-share-high-visibility-page'); + assertTrue(!!highVisibilityDialog); + await waitAfterNextRender(dialog); + assertTrue(isVisible(highVisibilityDialog)); + highVisibilityDialog.registerResult = + RegisterReceiveSurfaceResult.kNoConnectionMedium; + await waitAfterNextRender(highVisibilityDialog); + const template = + highVisibilityDialog.shadowRoot!.querySelector('nearby-page-template'); + assertTrue(!!template); + const button = + template.shadowRoot!.querySelector<HTMLButtonElement>('#closeButton'); + assertTrue(!!button); + button.click(); + flush(); + assertFalse(highVisibilityToggle.checked); + }); + + test('GAIA email, account manager enabled', async () => { + await accountManagerBrowserProxy.whenCalled('getAccounts'); + flush(); + + const profileName = subpage.shadowRoot!.querySelector('#profileName'); + assertTrue(!!profileName); + assertEquals('Primary Account', profileName.textContent!.trim()); + const profileLabel = subpage.shadowRoot!.querySelector('#profileLabel'); + assertTrue(!!profileLabel); + assertEquals('primary@gmail.com', profileLabel.textContent!.trim()); + }); + + test('show receive dialog', () => { + subpage.set('showReceiveDialog_', true); + flush(); + + const dialog = + subpage.shadowRoot!.querySelector('nearby-share-receive-dialog'); + assertTrue(!!dialog); + }); + + test('show high visibility dialog', async () => { + // Mock performance.now to return a constant 0 for testing. + const originalNow = performance.now; + performance.now = () => { + return 0; + }; + + const params = new URLSearchParams(); + params.append('receive', '1'); + params.append('timeout', '600'); // 10 minutes + Router.getInstance().navigateTo(routes.NEARBY_SHARE, params); + + const dialog = + subpage.shadowRoot!.querySelector('nearby-share-receive-dialog'); + assertTrue(!!dialog); + const highVisibilityDialog = + dialog.shadowRoot!.querySelector('nearby-share-high-visibility-page'); + assertTrue(!!highVisibilityDialog); + assertFalse(highVisibilityDialog['highVisibilityTimedOut_']()); + + flush(); + await waitAfterNextRender(dialog); + + assertTrue(isVisible(highVisibilityDialog)); + assertEquals(600 * 1000, highVisibilityDialog.shutoffTimestamp); + + // Restore mock + performance.now = originalNow; + }); + + test('high visibility dialog times out', async () => { + // Mock performance.now to return a constant 0 for testing. + const originalNow = performance.now; + performance.now = () => { + return 0; + }; + + const params = new URLSearchParams(); + params.append('receive', '1'); + params.append('timeout', '600'); // 10 minutes + Router.getInstance().navigateTo(routes.NEARBY_SHARE, params); + + const dialog = + subpage.shadowRoot!.querySelector('nearby-share-receive-dialog'); + assertTrue(!!dialog); + const highVisibilityDialog = + dialog.shadowRoot!.querySelector('nearby-share-high-visibility-page'); + assertTrue(!!highVisibilityDialog); + + highVisibilityDialog['calculateRemainingTime_'](); + assertFalse(highVisibilityDialog['highVisibilityTimedOut_']()); + + // Set time past the shutoffTime. + performance.now = () => { + return 6000001; + }; + + highVisibilityDialog['calculateRemainingTime_'](); + await waitAfterNextRender(dialog); + assertTrue(isVisible(highVisibilityDialog)); + assertTrue(highVisibilityDialog['highVisibilityTimedOut_']()); + + // Restore mock + performance.now = originalNow; + }); + + test('download contacts on attach', () => { + // Ensure contacts download occurs when the subpage is attached. + assertTrue(fakeContactManager.downloadContactsCalled); + }); + + test('Do not download contacts on attach pre-onboarding', async () => { + subpage.remove(); + Router.getInstance().resetRouteForTesting(); + + setupFakes(); + fakeSettings.setEnabled(false); + fakeSettings.setIsOnboardingComplete(false); + syncFakeSettings(); + createSubpage(/*isEnabled=*/ false, /*isOnboardingComplete=*/ false); + + await flushTasks(); + // Ensure contacts download occurs when the subpage is attached. + assertFalse(fakeContactManager.downloadContactsCalled); + }); + + test('Show setup button pre-onboarding', async () => { + subpage.remove(); + Router.getInstance().resetRouteForTesting(); + + setupFakes(); + createSubpage(/*isEnabled=*/ false, /*isOnboardingComplete=*/ false); + + await flushTasks(); + assertFalse(doesElementExist('#featureToggleButton')); + assertTrue(doesElementExist('#setupRow')); + + // Clicking starts onboarding flow + const setupRow = subpage.shadowRoot!.querySelector('#setupRow'); + assertTrue(!!setupRow); + const button = setupRow.querySelector('cr-button'); + assertTrue(!!button); + button.click(); + await flushTasks(); + assertTrue(doesElementExist('#receiveDialog')); + + const receiveDialog = subpage.shadowRoot!.querySelector('#receiveDialog'); + assertTrue(!!receiveDialog); + + const element = receiveDialog.shadowRoot!.querySelector('#onboarding-one'); + assertTrue(!!element); + + assertEquals('active', element.className); + }); + + test('feature toggle UI changes', () => { + // Ensure toggle off UI occurs when toggle off. + assertTrue(featureToggleButton.checked); + assertEquals('On', featureToggleButton.label.trim()); + assertTrue(featureToggleButton.classList.contains('enabled-toggle-on')); + assertFalse(featureToggleButton.classList.contains('enabled-toggle-off')); + + featureToggleButton.click(); + + assertFalse(featureToggleButton.checked); + assertEquals('Off', featureToggleButton.label.trim()); + assertFalse(featureToggleButton.classList.contains('enabled-toggle-on')); + assertTrue(featureToggleButton.classList.contains('enabled-toggle-off')); + }); + + test('subpage hidden when feature toggled off', () => { + // Ensure that the subpage content is hidden when the Nearby is off. + const subpageContent = + subpage.shadowRoot!.querySelector<HTMLElement>('#subpageContent'); + const highVizToggle = subpage.shadowRoot!.querySelector<HTMLButtonElement>( + '#highVisibilityToggle'); + const editDeviceNameButton = + subpage.shadowRoot!.querySelector<HTMLButtonElement>( + '#editDeviceNameButton'); + const editVisibilityButton = + subpage.shadowRoot!.querySelector<HTMLButtonElement>( + '#editVisibilityButton'); + const editDataUsageButton = + subpage.shadowRoot!.querySelector<HTMLButtonElement>( + '#editDataUsageButton'); + + assertTrue(!!subpageContent); + assertTrue(!!highVizToggle); + assertTrue(!!editDeviceNameButton); + assertTrue(!!editVisibilityButton); + assertTrue(!!editDataUsageButton); + + assertTrue(featureToggleButton.checked); + assertTrue(subpage.prefs.nearby_sharing.enabled.value); + assertEquals('On', featureToggleButton.label.trim()); + assertTrue(doesElementExist('#help')); + + editVisibilityButton.click(); + flush(); + const visibilityDialog = subpage.shadowRoot!.querySelector( + 'nearby-share-contact-visibility-dialog'); + assertTrue(!!visibilityDialog); + assertTrue(!!visibilityDialog.shadowRoot!.querySelector( + 'nearby-contact-visibility')); + + editDeviceNameButton.click(); + flush(); + const deviceNameDialog = + subpage.shadowRoot!.querySelector('nearby-share-device-name-dialog'); + assertTrue(!!deviceNameDialog); + + editDataUsageButton.click(); + flush(); + const dataUsageDialog = + subpage.shadowRoot!.querySelector('nearby-share-data-usage-dialog'); + assertTrue(!!dataUsageDialog); + + highVizToggle.click(); + flush(); + const receiveDialog = + subpage.shadowRoot!.querySelector('nearby-share-receive-dialog'); + assertTrue(!!receiveDialog); + + const helpContent = + subpage.shadowRoot!.querySelector<HTMLElement>('#helpContent'); + assertTrue(!!helpContent); + + featureToggleButton.click(); + flush(); + + assertFalse(featureToggleButton.checked); + assertFalse(subpage.prefs.nearby_sharing.enabled.value); + assertEquals('Off', featureToggleButton.label.trim()); + assertEquals('none', subpageContent.style.display); + assertEquals('none', helpContent.style.display); + subpageControlsHidden(false); + assertFalse(doesElementExist('#help')); + }); + + test('Fast init toggle exists', () => { + assertTrue(!!subpage.shadowRoot!.querySelector( + '#fastInitiationNotificationToggle')); + }); + + test('UX changes disabled when no hardware support', async () => { + subpage.set('settings.isFastInitiationHardwareSupported', false); + await flushTasks(); + + // Toggle doesnt exist + const fastInitToggle = subpage.shadowRoot!.querySelector<CrToggleElement>( + '#fastInitiationNotificationToggle'); + assertNull(fastInitToggle); + + // Subpage contents do not show when feature off + featureToggleButton.click(); + flush(); + + assertFalse(featureToggleButton.checked); + assertFalse(subpage.prefs.nearby_sharing.enabled.value); + assertEquals('Off', featureToggleButton.label.trim()); + + subpageControlsHidden(true); + }); + + test('Fast initiation notification toggle', async () => { + const fastInitToggle = subpage.shadowRoot!.querySelector<CrToggleElement>( + '#fastInitiationNotificationToggle'); + assertTrue(!!fastInitToggle); + await flushTasks(); + assertTrue(fastInitToggle.checked); + assertEquals( + FastInitiationNotificationState.kEnabled, + subpage.get('settings').fastInitiationNotificationState); + + fastInitToggle.click(); + await flushTasks(); + assertFalse(fastInitToggle.checked); + assertEquals( + FastInitiationNotificationState.kDisabledByUser, + subpage.get('settings').fastInitiationNotificationState); + }); + + test('Subpage content visible but disabled when feature off', () => { + featureToggleButton.click(); + flush(); + + assertFalse(featureToggleButton.checked); + assertFalse(subpage.prefs.nearby_sharing.enabled.value); + assertEquals('Off', featureToggleButton.label.trim()); + + subpageControlsHidden(false); + subpageControlsDisabled(true); + }); + + test('Subpage content not visible pre-onboarding', async () => { + featureToggleButton.click(); + subpage.set('prefs.nearby_sharing.onboarding_complete.value', false); + await flushTasks(); + + assertFalse(subpage.prefs.nearby_sharing.enabled.value); + subpageControlsHidden(true); + }); + + test('Subpage content visible but disabled when feature off', () => { + featureToggleButton.click(); + flush(); + + assertFalse(featureToggleButton.checked); + assertFalse(subpage.prefs.nearby_sharing.enabled.value); + assertEquals('Off', featureToggleButton.label.trim()); + + subpageControlsHidden(false); + subpageControlsDisabled(true); + }); + + test('Subpage content not visible pre-onboarding', async () => { + featureToggleButton.click(); + subpage.set('prefs.nearby_sharing.onboarding_complete.value', false); + await flushTasks(); + + assertFalse(subpage.prefs.nearby_sharing.enabled.value); + subpageControlsHidden(true); + }); +});
diff --git a/chrome/test/data/webui/settings/chromeos/nearby_share_page/test_nearby_account_manager_browser_proxy.ts b/chrome/test/data/webui/settings/chromeos/nearby_share_page/test_nearby_account_manager_browser_proxy.ts new file mode 100644 index 0000000..27b1859 --- /dev/null +++ b/chrome/test/data/webui/settings/chromeos/nearby_share_page/test_nearby_account_manager_browser_proxy.ts
@@ -0,0 +1,33 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +import {Account, NearbyAccountManagerBrowserProxy} from 'chrome://os-settings/os_settings.js'; +import {TestBrowserProxy} from 'chrome://webui-test/test_browser_proxy.js'; + +export class TestNearbyAccountManagerBrowserProxy extends TestBrowserProxy + implements NearbyAccountManagerBrowserProxy { + constructor() { + super([ + 'getAccounts', + ]); + } + + getAccounts(): Promise<Account[]> { + this.methodCalled('getAccounts'); + + return Promise.resolve([ + { + id: '123', + accountType: 1, + isDeviceAccount: true, + isSignedIn: true, + unmigrated: false, + fullName: 'Primary Account', + pic: 'data:image/png;base64,primaryAccountPicData', + email: 'primary@gmail.com', + organization: undefined, + }, + ]); + } +}
diff --git a/chrome/test/data/webui/settings/chromeos/nearby_share_subpage_tests.js b/chrome/test/data/webui/settings/chromeos/nearby_share_subpage_tests.js deleted file mode 100644 index 69510fc7..0000000 --- a/chrome/test/data/webui/settings/chromeos/nearby_share_subpage_tests.js +++ /dev/null
@@ -1,676 +0,0 @@ -// Copyright 2020 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -import {NearbyAccountManagerBrowserProxyImpl, nearbyShareMojom, Router, routes, setContactManagerForTesting, setNearbyShareSettingsForTesting, setReceiveManagerForTesting} from 'chrome://os-settings/os_settings.js'; -import {DeviceNameValidationResult, FastInitiationNotificationState} from 'chrome://resources/mojo/chromeos/ash/services/nearby/public/mojom/nearby_share_settings.mojom-webui.js'; -import {flush} from 'chrome://resources/polymer/v3_0/polymer/polymer_bundled.min.js'; -import {assertEquals} from 'chrome://webui-test/chai_assert.js'; -import {FakeContactManager} from 'chrome://webui-test/nearby_share/shared/fake_nearby_contact_manager.js'; -import {FakeNearbyShareSettings} from 'chrome://webui-test/nearby_share/shared/fake_nearby_share_settings.js'; -import {waitAfterNextRender} from 'chrome://webui-test/polymer_test_util.js'; -import {TestBrowserProxy} from 'chrome://webui-test/test_browser_proxy.js'; -import {isVisible} from 'chrome://webui-test/test_util.js'; - -import {FakeReceiveManager} from './fake_receive_manager.js'; - -const {RegisterReceiveSurfaceResult} = nearbyShareMojom; - -/** @implements {AccountManagerBrowserProxy} */ -class TestAccountManagerBrowserProxy extends TestBrowserProxy { - constructor() { - super([ - 'getAccounts', - ]); - } - - /** @override */ - getAccounts() { - this.methodCalled('getAccounts'); - - return Promise.resolve([ - { - id: '123', - accountType: 1, - isDeviceAccount: true, - isSignedIn: true, - unmigrated: false, - fullName: 'Primary Account', - pic: 'data:image/png;base64,primaryAccountPicData', - email: 'primary@gmail.com', - }, - ]); - } -} - -suite('NearbyShare', function() { - /** @type {?SettingsNearbyShareSubpage} */ - let subpage = null; - /** @type {?SettingsToggleButtonElement} */ - let featureToggleButton = null; - /** @type {?FakeReceiveManager} */ - let fakeReceiveManager = null; - /** @type {AccountManagerBrowserProxy} */ - let accountManagerBrowserProxy = null; - /** @type {!FakeContactManager} */ - let fakeContactManager = null; - /** @type {!FakeNearbyShareSettings} */ - let fakeSettings = null; - - setup(function() { - setupFakes(); - fakeSettings.setEnabled(true); - fakeSettings.setIsOnboardingComplete(true); - - - createSubpage(/*is_enabled=*/ true, /*is_onboarding_complete=*/ true); - syncFakeSettings(); - featureToggleButton = - subpage.shadowRoot.querySelector('#featureToggleButton'); - - return flushAsync(); - }); - - teardown(function() { - subpage.remove(); - Router.getInstance().resetRouteForTesting(); - }); - - function setupFakes() { - accountManagerBrowserProxy = new TestAccountManagerBrowserProxy(); - NearbyAccountManagerBrowserProxyImpl.setInstanceForTesting( - accountManagerBrowserProxy); - - fakeReceiveManager = new FakeReceiveManager(); - setReceiveManagerForTesting(fakeReceiveManager); - - fakeContactManager = new FakeContactManager(); - setContactManagerForTesting(fakeContactManager); - fakeContactManager.setupContactRecords(); - - fakeSettings = new FakeNearbyShareSettings(); - setNearbyShareSettingsForTesting(fakeSettings); - } - - function syncFakeSettings() { - subpage.set('settings.enabled', fakeSettings.getEnabledForTest()); - subpage.set( - 'settings.isFastInitiationHardwareSupported', - fakeSettings.getIsFastInitiationHardwareSupportedTest()); - subpage.set( - 'settings.fastInitiationNotificationState', - fakeSettings.getFastInitiationNotificationStateTest()); - subpage.set('settings.deviceName', fakeSettings.getDeviceNameForTest()); - subpage.set('settings.dataUsage', fakeSettings.getDataUsageForTest()); - subpage.set('settings.visibility', fakeSettings.getVisibilityForTest()); - subpage.set( - 'settings.allowedContacts', fakeSettings.getAllowedContactsForTest()); - subpage.set( - 'settings.isOnboardingComplete', fakeSettings.isOnboardingComplete()); - } - - function createSubpage(is_enabled, is_onboarding_complete) { - PolymerTest.clearBody(); - - subpage = document.createElement('settings-nearby-share-subpage'); - subpage.prefs = { - 'nearby_sharing': { - 'enabled': { - value: is_enabled, - }, - 'data_usage': { - value: 3, - }, - 'device_name': { - value: '', - }, - 'onboarding_complete': { - value: is_onboarding_complete, - }, - }, - }; - subpage.isSettingsRetreived = true; - - document.body.appendChild(subpage); - flush(); - } - - // Returns true if the element exists and has not been 'removed' by the - // Polymer template system. - function doesElementExist(selector) { - const el = subpage.shadowRoot.querySelector(selector); - return (el !== null) && (el.style.display !== 'none'); - } - - function subpageControlsHidden(is_hidden) { - assertEquals(is_hidden, !doesElementExist('#highVisibilityToggle')); - assertEquals(is_hidden, !doesElementExist('#editDeviceNameButton')); - assertEquals(is_hidden, !doesElementExist('#editVisibilityButton')); - assertEquals(is_hidden, !doesElementExist('#editDataUsageButton')); - } - - function subpageControlsDisabled(is_disabled) { - assertEquals( - is_disabled, - subpage.shadowRoot.querySelector('#highVisibilityToggle') - .hasAttribute('disabled')); - assertEquals( - is_disabled, - subpage.shadowRoot.querySelector('#editDeviceNameButton') - .hasAttribute('disabled')); - assertEquals( - is_disabled, - subpage.shadowRoot.querySelector('#editVisibilityButton') - .hasAttribute('disabled')); - assertEquals( - is_disabled, - subpage.shadowRoot.querySelector('#editDataUsageButton') - .hasAttribute('disabled')); - } - - function flushAsync() { - flush(); - // Use setTimeout to wait for the next macrotask. - return new Promise(resolve => setTimeout(resolve)); - } - - test('feature toggle button controls preference', function() { - // Ensure that these controls are enabled/disabled when the Nearby is - // enabled/disabled. - assertEquals(true, featureToggleButton.checked); - assertEquals(true, subpage.prefs.nearby_sharing.enabled.value); - assertEquals('On', featureToggleButton.label.trim()); - subpageControlsHidden(false); - subpageControlsDisabled(false); - - featureToggleButton.click(); - flush(); - - assertEquals(false, featureToggleButton.checked); - assertEquals(false, subpage.prefs.nearby_sharing.enabled.value); - assertEquals('Off', featureToggleButton.label.trim()); - subpageControlsHidden(false); - }); - - test('toggle row controls preference', function() { - assertEquals(true, featureToggleButton.checked); - assertEquals(true, subpage.prefs.nearby_sharing.enabled.value); - assertEquals('On', featureToggleButton.label.trim()); - - featureToggleButton.click(); - - assertEquals(false, featureToggleButton.checked); - assertEquals(false, subpage.prefs.nearby_sharing.enabled.value); - assertEquals('Off', featureToggleButton.label.trim()); - }); - - suite('Deeplinking', () => { - const deepLinkTestData = [ - {settingId: '208', deepLinkElement: '#featureToggleButton'}, - {settingId: '214', deepLinkElement: '#editDeviceNameButton'}, - {settingId: '215', deepLinkElement: '#editVisibilityButton'}, - {settingId: '216', deepLinkElement: '#manageContactsLinkRow'}, - {settingId: '217', deepLinkElement: '#editDataUsageButton'}, - {settingId: '220', deepLinkElement: '#fastInitiationNotificationToggle'}, - ]; - - deepLinkTestData.forEach((testData) => { - test( - 'Deep link to nearby setting element ' + testData.deepLinkElement, - async () => { - const params = new URLSearchParams(); - params.append('settingId', testData.settingId); - Router.getInstance().navigateTo(routes.NEARBY_SHARE, params); - - flush(); - - const deepLinkElement = - subpage.shadowRoot.querySelector(testData.deepLinkElement); - await waitAfterNextRender(deepLinkElement); - assertEquals( - deepLinkElement, subpage.shadowRoot.activeElement, - 'Nearby share setting element ' + testData.deepLinkElement + - ' should be focused for settingId=' + testData.settingId); - }); - }); - }); - - test('update device name preference', function() { - assertEquals('', subpage.prefs.nearby_sharing.device_name.value); - - subpage.shadowRoot.querySelector('#editDeviceNameButton').click(); - flush(); - - const dialog = - subpage.shadowRoot.querySelector('nearby-share-device-name-dialog'); - const oldName = subpage.settings.deviceName; - const newName = 'NEW NAME'; - dialog.shadowRoot.querySelector('cr-input').value = newName; - dialog.shadowRoot.querySelector('.action-button').click(); - flush(); - syncFakeSettings(); - flush(); - - assertEquals(newName, subpage.settings.deviceName); - subpage.set('settings.deviceName', oldName); - }); - - test('validate device name preference', async () => { - subpage.shadowRoot.querySelector('#editDeviceNameButton').click(); - flush(); - const dialog = - subpage.shadowRoot.querySelector('nearby-share-device-name-dialog'); - const input = dialog.shadowRoot.querySelector('cr-input'); - const doneButton = dialog.shadowRoot.querySelector('#doneButton'); - - fakeSettings.setNextDeviceNameResult( - DeviceNameValidationResult.kErrorEmpty); - input.dispatchEvent( - new CustomEvent('input', {bubbles: true, composed: true})); - // Allow the validation promise to resolve. - await waitAfterNextRender(); - flush(); - assertTrue(input.invalid); - assertTrue(doneButton.disabled); - - fakeSettings.setNextDeviceNameResult(DeviceNameValidationResult.kValid); - input.dispatchEvent( - new CustomEvent('input', {bubbles: true, composed: true})); - await waitAfterNextRender(); - flush(); - assertFalse(input.invalid); - assertFalse(doneButton.disabled); - }); - - test('update data usage preference', function() { - assertEquals(2, subpage.settings.dataUsage); - - subpage.shadowRoot.querySelector('#editDataUsageButton').click(); - flush(); - - const dialog = - subpage.shadowRoot.querySelector('nearby-share-data-usage-dialog'); - dialog.shadowRoot.querySelector('#dataUsageWifiOnlyButton').click(); - dialog.shadowRoot.querySelector('.action-button').click(); - flush(); - syncFakeSettings(); - flush(); - - assertEquals(3, subpage.settings.dataUsage); - }); - - test('update visibility shows dialog', function() { - // NOTE: all value editing is done and tested in the - // nearby-contact-visibility component which is hosted directly on the - // dialog. Here we just verify the dialog shows up, it has the component, - // and it has a close/action button. - subpage.shadowRoot.querySelector('#editVisibilityButton').click(); - flush(); - - const dialog = subpage.shadowRoot.querySelector( - 'nearby-share-contact-visibility-dialog'); - assertTrue( - dialog.shadowRoot.querySelector('nearby-contact-visibility') !== null); - dialog.shadowRoot.querySelector('.action-button').click(); - }); - - test('toggle high visibility from UI', async function() { - subpage.shadowRoot.querySelector('#highVisibilityToggle').click(); - flush(); - assertTrue(fakeReceiveManager.getInHighVisibilityForTest()); - - const dialog = - subpage.shadowRoot.querySelector('nearby-share-receive-dialog'); - assertTrue(!!dialog); - - await waitAfterNextRender(dialog); - const highVisibilityDialog = - dialog.shadowRoot.querySelector('nearby-share-high-visibility-page'); - assertTrue(isVisible(highVisibilityDialog)); - - dialog.close_(); - assertFalse(fakeReceiveManager.getInHighVisibilityForTest()); - }); - - test( - 'high visibility UI updates from high visibility changes', - async function() { - const highVisibilityToggle = - subpage.shadowRoot.querySelector('#highVisibilityToggle'); - assertFalse(highVisibilityToggle.checked); - - fakeReceiveManager.setInHighVisibilityForTest(true); - assertTrue(highVisibilityToggle.checked); - - fakeReceiveManager.setInHighVisibilityForTest(false); - assertFalse(highVisibilityToggle.checked); - - // Process stopped unchecks the toggle. - fakeReceiveManager.setInHighVisibilityForTest(true); - assertTrue(highVisibilityToggle.checked); - subpage.onNearbyProcessStopped(); - flush(); - assertFalse(highVisibilityToggle.checked); - - // Failure to start advertising unchecks the toggle. - fakeReceiveManager.setInHighVisibilityForTest(false); - fakeReceiveManager.setInHighVisibilityForTest(true); - assertTrue(highVisibilityToggle.checked); - subpage.onStartAdvertisingFailure(); - flush(); - assertFalse(highVisibilityToggle.checked); - - // Toggle still gets unchecked even if advertising was not attempted. - // E.g. if Bluetooth is off when high visibility is toggled. - fakeReceiveManager.setInHighVisibilityForTest(false); - subpage.inHighVisibility_ = true; - subpage.showHighVisibilityPage_(); - const dialog = - subpage.shadowRoot.querySelector('nearby-share-receive-dialog'); - assertTrue(!!dialog); - await waitAfterNextRender(dialog); - const highVisibilityDialog = dialog.shadowRoot.querySelector( - 'nearby-share-high-visibility-page'); - await waitAfterNextRender(dialog); - assertTrue(isVisible(highVisibilityDialog)); - highVisibilityDialog.registerResult = - RegisterReceiveSurfaceResult.kNoConnectionMedium; - await waitAfterNextRender(highVisibilityDialog); - highVisibilityDialog.shadowRoot.querySelector('nearby-page-template') - .shadowRoot.querySelector('#closeButton') - .click(); - flush(); - assertFalse(highVisibilityToggle.checked); - }); - - test('GAIA email, account manager enabled', async () => { - await accountManagerBrowserProxy.whenCalled('getAccounts'); - flush(); - - const profileName = subpage.shadowRoot.querySelector('#profileName'); - assertEquals('Primary Account', profileName.textContent.trim()); - const profileLabel = subpage.shadowRoot.querySelector('#profileLabel'); - assertEquals('primary@gmail.com', profileLabel.textContent.trim()); - }); - - test('show receive dialog', function() { - subpage.showReceiveDialog_ = true; - flush(); - - const dialog = - subpage.shadowRoot.querySelector('nearby-share-receive-dialog'); - assertTrue(!!dialog); - }); - - test('show high visibility dialog', async function() { - // Mock performance.now to return a constant 0 for testing. - const originalNow = performance.now; - performance.now = () => { - return 0; - }; - - const params = new URLSearchParams(); - params.append('receive', '1'); - params.append('timeout', '600'); // 10 minutes - Router.getInstance().navigateTo(routes.NEARBY_SHARE, params); - - const dialog = - subpage.shadowRoot.querySelector('nearby-share-receive-dialog'); - assertTrue(!!dialog); - const highVisibilityDialog = - dialog.shadowRoot.querySelector('nearby-share-high-visibility-page'); - assertTrue(!!highVisibilityDialog); - assertFalse(highVisibilityDialog.highVisibilityTimedOut_()); - - flush(); - await waitAfterNextRender(dialog); - - assertTrue(isVisible(highVisibilityDialog)); - assertEquals(highVisibilityDialog.shutoffTimestamp, 600 * 1000); - - // Restore mock - performance.now = originalNow; - }); - - test('high visibility dialog times out', async function() { - // Mock performance.now to return a constant 0 for testing. - const originalNow = performance.now; - performance.now = () => { - return 0; - }; - - const params = new URLSearchParams(); - params.append('receive', '1'); - params.append('timeout', '600'); // 10 minutes - Router.getInstance().navigateTo(routes.NEARBY_SHARE, params); - - const dialog = - subpage.shadowRoot.querySelector('nearby-share-receive-dialog'); - assertTrue(!!dialog); - const highVisibilityDialog = - dialog.shadowRoot.querySelector('nearby-share-high-visibility-page'); - assertTrue(!!highVisibilityDialog); - - highVisibilityDialog.calculateRemainingTime_(); - assertFalse(highVisibilityDialog.highVisibilityTimedOut_()); - - // Set time past the shutoffTime. - performance.now = () => { - return 6000001; - }; - - highVisibilityDialog.calculateRemainingTime_(); - await waitAfterNextRender(dialog); - assertTrue(isVisible(highVisibilityDialog)); - assertTrue(highVisibilityDialog.highVisibilityTimedOut_()); - - // Restore mock - performance.now = originalNow; - }); - - test('download contacts on attach', async () => { - await flushAsync(); - // Ensure contacts download occurs when the subpage is attached. - assertTrue(fakeContactManager.downloadContactsCalled); - }); - - test('Do not download contacts on attach pre-onboarding', async () => { - await flushAsync(); - - subpage.remove(); - Router.getInstance().resetRouteForTesting(); - - setupFakes(); - fakeSettings.setEnabled(false); - fakeSettings.setIsOnboardingComplete(false); - syncFakeSettings(); - createSubpage(/*is_enabled=*/ false, /*is_onboarding_complete=*/ false); - - await flushAsync(); - // Ensure contacts download occurs when the subpage is attached. - assertFalse(fakeContactManager.downloadContactsCalled); - }); - - test('Show setup button pre-onboarding', async () => { - await flushAsync(); - - subpage.remove(); - Router.getInstance().resetRouteForTesting(); - - setupFakes(); - createSubpage(/*is_enabled=*/ false, /*is_onboarding_complete=*/ false); - - await flushAsync(); - assertFalse(doesElementExist('#featureToggleButton')); - assertTrue(doesElementExist('#setupRow')); - - // Clicking starts onboarding flow - subpage.shadowRoot.querySelector('#setupRow') - .querySelector('cr-button') - .click(); - await flushAsync(); - assertTrue(doesElementExist('#receiveDialog')); - assertEquals( - 'active', - subpage.shadowRoot.querySelector('#receiveDialog') - .shadowRoot.querySelector('#onboarding-one') - .className); - }); - - test('feature toggle UI changes', function() { - // Ensure toggle off UI occurs when toggle off. - assertEquals(true, featureToggleButton.checked); - assertEquals('On', featureToggleButton.label.trim()); - assertTrue(featureToggleButton.classList.contains('enabled-toggle-on')); - assertFalse(featureToggleButton.classList.contains('enabled-toggle-off')); - - featureToggleButton.click(); - - assertEquals(false, featureToggleButton.checked); - assertEquals('Off', featureToggleButton.label.trim()); - assertFalse(featureToggleButton.classList.contains('enabled-toggle-on')); - assertTrue(featureToggleButton.classList.contains('enabled-toggle-off')); - }); - - test('subpage hidden when feature toggled off', function() { - // Ensure that the subpage content is hidden when the Nearby is off. - const subpageContent = subpage.shadowRoot.querySelector('#subpageContent'); - const highVizToggle = - subpage.shadowRoot.querySelector('#highVisibilityToggle'); - const editDeviceNameButton = - subpage.shadowRoot.querySelector('#editDeviceNameButton'); - const editVisibilityButton = - subpage.shadowRoot.querySelector('#editVisibilityButton'); - const editDataUsageButton = - subpage.shadowRoot.querySelector('#editDataUsageButton'); - - assertEquals(true, featureToggleButton.checked); - assertEquals(true, subpage.prefs.nearby_sharing.enabled.value); - assertEquals('On', featureToggleButton.label.trim()); - assertTrue(doesElementExist('#help')); - - editVisibilityButton.click(); - flush(); - const visibilityDialog = subpage.shadowRoot.querySelector( - 'nearby-share-contact-visibility-dialog'); - assertTrue(!!visibilityDialog); - assertTrue( - visibilityDialog.shadowRoot.querySelector( - 'nearby-contact-visibility') !== null); - - editDeviceNameButton.click(); - flush(); - const deviceNameDialog = - subpage.shadowRoot.querySelector('nearby-share-device-name-dialog'); - assertTrue(!!deviceNameDialog); - - editDataUsageButton.click(); - flush(); - const dataUsageDialog = - subpage.shadowRoot.querySelector('nearby-share-data-usage-dialog'); - assertTrue(!!dataUsageDialog); - - highVizToggle.click(); - flush(); - const receiveDialog = - subpage.shadowRoot.querySelector('nearby-share-receive-dialog'); - assertTrue(!!receiveDialog); - - featureToggleButton.click(); - flush(); - - assertEquals(false, featureToggleButton.checked); - assertEquals(false, subpage.prefs.nearby_sharing.enabled.value); - assertEquals('Off', featureToggleButton.label.trim()); - assertEquals('none', subpageContent.style.display); - assertEquals( - 'none', subpage.shadowRoot.querySelector('#helpContent').style.display); - subpageControlsHidden(false); - assertFalse(doesElementExist('#help')); - }); - - test('Fast init toggle exists', function() { - assertTrue(!!subpage.shadowRoot.querySelector( - '#fastInitiationNotificationToggle')); - }); - - test('UX changes disabled when no hardware support', async () => { - subpage.set('settings.isFastInitiationHardwareSupported', false); - await flushAsync(); - - // Toggle doesnt exist - const fastInitToggle = - subpage.shadowRoot.querySelector('#fastInitiationNotificationToggle'); - assertFalse(!!fastInitToggle); - - // Subpage contents do not show when feature off - featureToggleButton.click(); - flush(); - - assertFalse(featureToggleButton.checked); - assertFalse(subpage.prefs.nearby_sharing.enabled.value); - assertEquals('Off', featureToggleButton.label.trim()); - - subpageControlsHidden(true); - }); - - test('Fast initiation notification toggle', async () => { - const fastInitToggle = - subpage.shadowRoot.querySelector('#fastInitiationNotificationToggle'); - assertTrue(!!fastInitToggle); - await flushAsync(); - assertTrue(fastInitToggle.checked); - assertEquals( - FastInitiationNotificationState.kEnabled, - subpage.settings.fastInitiationNotificationState); - - fastInitToggle.click(); - await flushAsync(); - assertFalse(fastInitToggle.checked); - assertEquals( - FastInitiationNotificationState.kDisabledByUser, - subpage.settings.fastInitiationNotificationState); - }); - - test('Subpage content visible but disabled when feature off', async () => { - featureToggleButton.click(); - flush(); - - assertFalse(featureToggleButton.checked); - assertFalse(subpage.prefs.nearby_sharing.enabled.value); - assertEquals('Off', featureToggleButton.label.trim()); - - subpageControlsHidden(false); - subpageControlsDisabled(true); - }); - - test('Subpage content not visible pre-onboarding', async () => { - featureToggleButton.click(); - subpage.set('prefs.nearby_sharing.onboarding_complete.value', false); - await flushAsync(); - - assertFalse(subpage.prefs.nearby_sharing.enabled.value); - subpageControlsHidden(true); - }); - - test('Subpage content visible but disabled when feature off', async () => { - featureToggleButton.click(); - flush(); - - assertEquals(false, featureToggleButton.checked); - assertEquals(false, subpage.prefs.nearby_sharing.enabled.value); - assertEquals('Off', featureToggleButton.label.trim()); - - subpageControlsHidden(false); - subpageControlsDisabled(true); - }); - - test('Subpage content not visible pre-onboarding', async () => { - featureToggleButton.click(); - subpage.set('prefs.nearby_sharing.onboarding_complete.value', false); - await flushAsync(); - - assertEquals(false, subpage.prefs.nearby_sharing.enabled.value); - subpageControlsHidden(true); - }); -});
diff --git a/chrome/test/data/webui/settings/chromeos/os_people_page/os_people_page_test.ts b/chrome/test/data/webui/settings/chromeos/os_people_page/os_people_page_test.ts index 89586ef8..f9be9d7 100644 --- a/chrome/test/data/webui/settings/chromeos/os_people_page/os_people_page_test.ts +++ b/chrome/test/data/webui/settings/chromeos/os_people_page/os_people_page_test.ts
@@ -16,9 +16,9 @@ import {eventToPromise} from 'chrome://webui-test/test_util.js'; import {TestSyncBrowserProxy} from '../test_os_sync_browser_proxy.js'; -import {TestProfileInfoBrowserProxy} from '../test_profile_info_browser_proxy.js'; import {TestAccountManagerBrowserProxy} from './test_account_manager_browser_proxy.js'; +import {TestProfileInfoBrowserProxy} from './test_profile_info_browser_proxy.js'; interface SubpageTriggerData { triggerSelector: string;
diff --git a/chrome/test/data/webui/settings/chromeos/test_profile_info_browser_proxy.js b/chrome/test/data/webui/settings/chromeos/os_people_page/test_profile_info_browser_proxy.ts similarity index 73% rename from chrome/test/data/webui/settings/chromeos/test_profile_info_browser_proxy.js rename to chrome/test/data/webui/settings/chromeos/os_people_page/test_profile_info_browser_proxy.ts index 2695d9cd..cb35a35 100644 --- a/chrome/test/data/webui/settings/chromeos/test_profile_info_browser_proxy.js +++ b/chrome/test/data/webui/settings/chromeos/os_people_page/test_profile_info_browser_proxy.ts
@@ -2,10 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. +import {ProfileInfo, ProfileInfoBrowserProxy} from 'chrome://os-settings/os_settings.js'; import {TestBrowserProxy} from 'chrome://webui-test/test_browser_proxy.js'; -/** @implements {ProfileInfoBrowserProxy} */ -export class TestProfileInfoBrowserProxy extends TestBrowserProxy { +export class TestProfileInfoBrowserProxy extends TestBrowserProxy implements + ProfileInfoBrowserProxy { + fakeProfileInfo: ProfileInfo; + constructor() { super([ 'getProfileInfo', @@ -19,14 +22,12 @@ }; } - /** @override */ - getProfileInfo() { + getProfileInfo(): Promise<ProfileInfo> { this.methodCalled('getProfileInfo'); return Promise.resolve(this.fakeProfileInfo); } - /** @override */ - getProfileStatsCount() { + getProfileStatsCount(): void { this.methodCalled('getProfileStatsCount'); } }
diff --git a/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js b/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js index 04b8af2..58e6ac25 100644 --- a/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js +++ b/chrome/test/data/webui/settings/chromeos/os_settings_browsertest.js
@@ -555,8 +555,8 @@ ], ['NearbyShareReceiveDialog', 'nearby_share_receive_dialog_tests.js'], [ - 'NearbyShareSubpage', - 'nearby_share_subpage_tests.js', + 'NearbySharePageNearbyShareSubpage', + 'nearby_share_page/nearby_share_subpage_test.js', {enabled: ['features::kNearbySharing']}, ], ['OncMojoTest', 'onc_mojo_test.js'],
diff --git a/chrome/updater/device_management/dm_client.cc b/chrome/updater/device_management/dm_client.cc index 11655c9b..d71f621 100644 --- a/chrome/updater/device_management/dm_client.cc +++ b/chrome/updater/device_management/dm_client.cc
@@ -75,7 +75,7 @@ GURL GetDMServerUrl() const override { return server_url_; } std::string GetAgentParameter() const override { - return base::StrCat({"Updater-", kUpdaterVersion}); + return GetUpdaterUserAgent(); } std::string GetPlatformParameter() const override;
diff --git a/chrome/updater/net/network_fetcher_mac.mm b/chrome/updater/net/network_fetcher_mac.mm index 92553ab..e3c003ec 100644 --- a/chrome/updater/net/network_fetcher_mac.mm +++ b/chrome/updater/net/network_fetcher_mac.mm
@@ -26,6 +26,7 @@ #include "chrome/updater/constants.h" #include "chrome/updater/net/network.h" #include "chrome/updater/policy/service.h" +#include "chrome/updater/util/util.h" #include "components/update_client/network.h" #import "net/base/mac/url_conversions.h" #include "third_party/abseil-cpp/absl/types/optional.h" @@ -343,6 +344,8 @@ urlRequest.HTTPMethod = @"POST"; urlRequest.HTTPBody = [[NSData alloc] initWithBytes:post_data.c_str() length:post_data.size()]; + [urlRequest setValue:base::SysUTF8ToNSString(GetUpdaterUserAgent()) + forHTTPHeaderField:@"User-Agent"]; [urlRequest addValue:base::SysUTF8ToNSString(content_type) forHTTPHeaderField:@"Content-Type"];
diff --git a/chrome/updater/net/network_fetcher_win.cc b/chrome/updater/net/network_fetcher_win.cc index dba31425..ac28ae7 100644 --- a/chrome/updater/net/network_fetcher_win.cc +++ b/chrome/updater/net/network_fetcher_win.cc
@@ -18,12 +18,10 @@ #include "base/logging.h" #include "base/memory/scoped_refptr.h" #include "base/sequence_checker.h" -#include "base/strings/strcat.h" #include "base/strings/sys_string_conversions.h" #include "base/strings/utf_string_conversions.h" #include "chrome/updater/policy/service.h" -#include "chrome/updater/updater_branding.h" -#include "chrome/updater/updater_version.h" +#include "chrome/updater/util/util.h" #include "chrome/updater/util/win_util.h" #include "chrome/updater/win/user_info.h" #include "components/update_client/network.h" @@ -188,9 +186,7 @@ : proxy_configuration_( GetProxyConfiguration(policy_service_proxy_configuration)), session_handle_(winhttp::CreateSessionHandle( - base::StrCat({base::ASCIIToWide(PRODUCT_FULLNAME_STRING), L" ", - kUpdaterVersionUtf16}) - .c_str(), + base::ASCIIToWide(GetUpdaterUserAgent()).c_str(), proxy_configuration_->access_type())) {} std::unique_ptr<update_client::NetworkFetcher> Create() {
diff --git a/chrome/updater/test/integration_tests.cc b/chrome/updater/test/integration_tests.cc index 44eeec3..413c6e66 100644 --- a/chrome/updater/test/integration_tests.cc +++ b/chrome/updater/test/integration_tests.cc
@@ -951,11 +951,7 @@ ASSERT_TRUE(WaitForUpdaterExit()); ASSERT_NO_FATAL_FAILURE(ExpectAppVersion(kAppId, v1)); - - // TODO(crbug.com/1471724): An overinstall with a new AP should change the AP. - // Once this is fixed, the below assertion should be: - // ASSERT_NO_FATAL_FAILURE(ExpectAppTag(kAppId, "foo2")); - ASSERT_NO_FATAL_FAILURE(ExpectAppTag(kAppId, "foo")); + ASSERT_NO_FATAL_FAILURE(ExpectAppTag(kAppId, "foo2")); ASSERT_NO_FATAL_FAILURE(ExpectUninstallPing(&test_server)); ASSERT_NO_FATAL_FAILURE(Uninstall());
diff --git a/chrome/updater/test/integration_tests_impl.cc b/chrome/updater/test/integration_tests_impl.cc index 4ef98a4..0e8ba91 100644 --- a/chrome/updater/test/integration_tests_impl.cc +++ b/chrome/updater/test/integration_tests_impl.cc
@@ -300,9 +300,10 @@ test_server->ExpectOnce( {request::GetPathMatcher(base::StringPrintf( R"(%s\?request=%s&apptype=Chrome&)" - R"(agent=Updater-%s&platform=.*&deviceid=%s)", + R"(agent=%s\+%s&platform=.*&deviceid=%s)", test_server->device_management_path().c_str(), request_type.c_str(), - kUpdaterVersion, GetDefaultDMStorage()->GetDeviceID().c_str())), + PRODUCT_FULLNAME_STRING, kUpdaterVersion, + GetDefaultDMStorage()->GetDeviceID().c_str())), request::GetHeaderMatcher( "Authorization", base::StringPrintf("%s token=%s", authorization_type.c_str(),
diff --git a/chrome/updater/tools/print_guids_for_version.py b/chrome/updater/tools/print_guids_for_version.py new file mode 100644 index 0000000..13ec96a --- /dev/null +++ b/chrome/updater/tools/print_guids_for_version.py
@@ -0,0 +1,86 @@ +# Copyright 2023 The Chromium Authors +# Use of this source code is governed by a BSD-style license that can be +# found in the LICENSE file. +"""A script that prints the generated IIDs/CLSIDs/LIBIDs for the COM interfaces, +classes, and libraries. + +The entries in this file need to be kept in sync with the corresponding values +in `chrome/updater/app/server/win/BUILD.gn`. + +Usage: + python3 print_guids_for_version.py --version "119.0.5999.0" +""" + +import argparse +import uuid + + +def _Main(): + """Prints the COM IIDs/CLSIDs/LIBIDs.""" + cmd_parser = argparse.ArgumentParser( + description='Script to print the COM IIDs/CLSIDs/LIBIDs.') + + cmd_parser.add_argument('--version', + dest='version', + type=str, + required=True, + help='updater version to print the GUIDs for.') + flags = cmd_parser.parse_args() + + # These GUIDs must depend on branding only. + branding_only_placeholder_guids = { + "69464FF0-D9EC-4037-A35F-8AE4358106CC": "UpdaterLib", + "158428a4-6014-4978-83ba-9fad0dabe791": "UpdaterUserClass", + "415FD747-D79E-42D7-93AC-1BA6E5FD4E93": "UpdaterSystemClass", + "63B8FFB1-5314-48C9-9C57-93EC8BC6184B": "IUpdater", + "02AFCB67-0899-4676-91A9-67D92B3B7918": "IUpdaterUser", + "FCE335F3-A55C-496E-814F-85971C9FA6F1": "IUpdaterSystem", + "46ACF70B-AC13-406D-B53B-B2C4BF091FF6": "IUpdateState", + "C3485D9F-C684-4C43-B85B-E339EA395C29": "IUpdateStateUser", + "EA6FDC05-CDC5-4EA4-AB41-CCBD1040A2B5": "IUpdateStateSystem", + "2FCD14AF-B645-4351-8359-E80A0E202A0B": "ICompleteStatus", + "9AD1A645-5A4B-4D36-BC21-F0059482E6EA": "ICompleteStatusUser", + "E2BD9A6B-0A19-4C89-AE8B-B7E9E51D9A07": "ICompleteStatusSystem", + "7B416CFD-4216-4FD6-BD83-7C586054676E": "IUpdaterObserver", + "B54493A0-65B7-408C-B650-06265D2182AC": "IUpdaterObserverUser", + "057B500A-4BA2-496A-B1CD-C5DED3CCC61B": "IUpdaterObserverSystem", + "8BAB6F84-AD67-4819-B846-CC890880FD3B": "IUpdaterCallback", + "34ADC89D-552B-4102-8AE5-D613A691335B": "IUpdaterCallbackUser", + "F0D6763A-0182-4136-B1FA-508E334CFFC1": "IUpdaterCallbackSystem", + "A22AFC54-2DEF-4578-9187-DB3B24381090": "IUpdaterAppState", + "028FEB84-44BC-4A73-A0CD-603678155CC3": "IUpdaterAppStateUser", + "92631531-8044-46F4-B645-CDFBCCC7FA3B": "IUpdaterAppStateSystem", + "EFE903C0-E820-4136-9FAE-FDCD7F256302": "IUpdaterAppStatesCallback", + "BCFCF95C-DE48-4F42-B0E9-D50DB407DB53": + "IUpdaterAppStatesCallbackUser", + "2CB8867E-495E-459F-B1B6-2DD7FFDBD462": + "IUpdaterAppStatesCallbackSystem", + } + + # These GUIDs must depend on branding and version. + branding_version_placeholder_guids = { + "C6CE92DB-72CA-42EF-8C98-6EE92481B3C9": "UpdaterInternalLib", + "1F87FE2F-D6A9-4711-9D11-8187705F8457": "UpdaterInternalUserClass", + "4556BA55-517E-4F03-8016-331A43C269C9": "UpdaterInternalSystemClass", + "526DA036-9BD3-4697-865A-DA12D37DFFCA": "IUpdaterInternal", + "C82AFDA3-CA76-46EE-96E9-474717BFA7BA": "IUpdaterInternalUser", + "E690EB97-6E46-4361-AF8F-90A4F5496475": "IUpdaterInternalSystem", + "D272C794-2ACE-4584-B993-3B90C622BE65": "IUpdaterInternalCallback", + "618D9B82-9F51-4490-AF24-BB80489E1537": "IUpdaterInternalCallbackUser", + "7E806C73-B2A4-4BC5-BDAD-2249D87F67FC": + "IUpdaterInternalCallbackSystem", + } + + updater_product_full_name = "GoogleUpdater" + name = updater_product_full_name + for key, interface_name in branding_only_placeholder_guids.items(): + print(interface_name, ":", + str(uuid.uuid5(uuid.UUID(key), name)).upper()) + name = updater_product_full_name + flags.version + for key, interface_name in branding_version_placeholder_guids.items(): + print(interface_name, ":", + str(uuid.uuid5(uuid.UUID(key), name)).upper()) + + +if __name__ == '__main__': + _Main()
diff --git a/chrome/updater/update_service_impl.cc b/chrome/updater/update_service_impl.cc index 56ee2a6a..9c01b995 100644 --- a/chrome/updater/update_service_impl.cc +++ b/chrome/updater/update_service_impl.cc
@@ -581,6 +581,13 @@ // Pre-register the app if there is no registration for it. This app // registration is removed later if the app install encounters an error. persisted_data_->RegisterApp(registration); + } else { + // Update brand and ap. + RegistrationRequest request; + request.app_id = registration.app_id; + request.brand_code = registration.brand_code; + request.ap = registration.ap; + persisted_data_->RegisterApp(request); } std::multimap<std::string, base::RepeatingClosure>::iterator pos =
diff --git a/chrome/updater/updater.cc b/chrome/updater/updater.cc index 60c7bd7d..4ca7a48 100644 --- a/chrome/updater/updater.cc +++ b/chrome/updater/updater.cc
@@ -129,8 +129,18 @@ #endif InitializeThreadPool("updater"); - const base::ScopedClosureRunner shutdown_thread_pool( - base::BindOnce([] { base::ThreadPoolInstance::Get()->Shutdown(); })); + const base::ScopedClosureRunner shutdown_thread_pool(base::BindOnce([] { + // For the updater, it is important to join all threads before `UpdaterMain` + // exits, otherwise the behavior of the program is undefined. The threads + // in the pool can still run after shutdown to handle CONTINUE_ON_SHUTDOWN + // tasks, for example. In Chrome, the thread pool is leaked for this reason + // and there is no way to join its threads in production code. The updater + // has no such requirements (crbug.com/1484776). + base::ThreadPoolInstance* thread_pool = base::ThreadPoolInstance::Get(); + thread_pool->Shutdown(); + thread_pool->JoinForTesting(); // IN-TEST + base::ThreadPoolInstance::Set(nullptr); + })); // Records a backtrace in the log, crashes the program, saves a crash dump, // and reports the crash.
diff --git a/chrome/updater/util/util.cc b/chrome/updater/util/util.cc index 974f32c9..17579bea 100644 --- a/chrome/updater/util/util.cc +++ b/chrome/updater/util/util.cc
@@ -281,6 +281,10 @@ << settings.log_file_path; } +std::string GetUpdaterUserAgent() { + return base::StrCat({PRODUCT_FULLNAME_STRING, " ", kUpdaterVersion}); +} + // This function and the helper functions are copied from net/base/url_util.cc // to avoid the dependency on //net. GURL AppendQueryParameter(const GURL& url,
diff --git a/chrome/updater/util/util.h b/chrome/updater/util/util.h index 4aaa2cc..a46c6e4 100644 --- a/chrome/updater/util/util.h +++ b/chrome/updater/util/util.h
@@ -132,6 +132,9 @@ // Initializes logging for an executable. void InitLogging(UpdaterScope updater_scope); +// Returns HTTP user-agent value. +std::string GetUpdaterUserAgent(); + // Returns a new GURL by appending the given query parameter name and the // value. Unsafe characters in the name and the value are escaped like // %XX%XX. The original query component is preserved if it's present.
diff --git a/chromeos/CHROMEOS_LKGM b/chromeos/CHROMEOS_LKGM index 250f756..95ced761 100644 --- a/chromeos/CHROMEOS_LKGM +++ b/chromeos/CHROMEOS_LKGM
@@ -1 +1 @@ -15620.0.0 \ No newline at end of file +15621.0.0 \ No newline at end of file
diff --git a/chromeos/ash/components/growth/campaigns_manager.cc b/chromeos/ash/components/growth/campaigns_manager.cc index b1de8b79..9233db2 100644 --- a/chromeos/ash/components/growth/campaigns_manager.cc +++ b/chromeos/ash/components/growth/campaigns_manager.cc
@@ -18,10 +18,14 @@ CampaignsManager* g_instance = nullptr; +inline constexpr char kCampaignFileName[] = "campaigns.json"; + absl::optional<base::Value::Dict> ReadCampaignsFile( - const base::FilePath& campaigns_file_path) { + const base::FilePath& campaigns_component_path) { std::string campaigns_data; - if (!base::ReadFileToString(campaigns_file_path, &campaigns_data)) { + if (!base::ReadFileToString( + campaigns_component_path.Append(kCampaignFileName), + &campaigns_data)) { LOG(ERROR) << "Failed to read campaigns file from disk."; return absl::nullopt; }
diff --git a/chromeos/ash/components/growth/campaigns_manager_unittest.cc b/chromeos/ash/components/growth/campaigns_manager_unittest.cc index a6596d2..5e5bc12 100644 --- a/chromeos/ash/components/growth/campaigns_manager_unittest.cc +++ b/chromeos/ash/components/growth/campaigns_manager_unittest.cc
@@ -111,7 +111,7 @@ EXPECT_CALL(mock_client_, LoadCampaignsComponent(_)) .WillOnce(InvokeCallbackArgument<0, CampaignComponentLoadedCallback>( - campaigns_file)); + temp_dir_.GetPath())); campaigns_manager_->LoadCampaigns(); observer.Wait();
diff --git a/chromeos/ash/components/quick_start/fake_quick_start_decoder.cc b/chromeos/ash/components/quick_start/fake_quick_start_decoder.cc index ef10009d..e8245734 100644 --- a/chromeos/ash/components/quick_start/fake_quick_start_decoder.cc +++ b/chromeos/ash/components/quick_start/fake_quick_start_decoder.cc
@@ -79,6 +79,16 @@ absl::nullopt); } +void FakeQuickStartDecoder::DecodeQuickStartMessage( + const absl::optional<std::vector<uint8_t>>& data, + DecodeQuickStartMessageCallback callback) { + if (error_ != absl::nullopt) { + std::move(callback).Run(nullptr, error_); + } else { + std::move(callback).Run(std::move(quick_start_message_), absl::nullopt); + } +} + void FakeQuickStartDecoder::SetUserVerificationRequested( bool is_awaiting_user_verification) { user_verification_request_ = @@ -127,4 +137,9 @@ error_ = error; } +void FakeQuickStartDecoder::SetQuickStartMessage( + mojom::QuickStartMessagePtr quick_start_message) { + quick_start_message_ = std::move(quick_start_message); +} + } // namespace ash::quick_start
diff --git a/chromeos/ash/components/quick_start/fake_quick_start_decoder.h b/chromeos/ash/components/quick_start/fake_quick_start_decoder.h index 66628f69..193be64d 100644 --- a/chromeos/ash/components/quick_start/fake_quick_start_decoder.h +++ b/chromeos/ash/components/quick_start/fake_quick_start_decoder.h
@@ -42,6 +42,9 @@ void DecodeUserVerificationResult( const absl::optional<std::vector<uint8_t>>& data, DecodeUserVerificationResultCallback callback) override; + void DecodeQuickStartMessage( + const absl::optional<std::vector<uint8_t>>& data, + DecodeQuickStartMessageCallback callback) override; void SetExpectedData(std::vector<uint8_t> expected_data); void SetAssertionResponse(mojom::FidoAssertionResponsePtr fido_assertion); @@ -64,6 +67,8 @@ const std::string& cryptauth_device_id, absl::optional<mojom::QuickStartDecoderError> error); + void SetQuickStartMessage(mojom::QuickStartMessagePtr quick_start_message); + private: std::vector<uint8_t> expected_data_; mojo::ReceiverSet<ash::quick_start::mojom::QuickStartDecoder> receiver_set_; @@ -72,6 +77,7 @@ mojom::FidoAssertionResponsePtr fido_assertion_; mojom::UserVerificationRequestedPtr user_verification_request_; mojom::UserVerificationResponsePtr user_verification_response_; + mojom::QuickStartMessagePtr quick_start_message_; absl::optional<mojom::QuickStartDecoderError> error_; std::string response_cryptauth_device_id_; };
diff --git a/chromeos/ash/components/scalable_iph/scalable_iph_constants.h b/chromeos/ash/components/scalable_iph/scalable_iph_constants.h index dc58c653..5e3bcf9 100644 --- a/chromeos/ash/components/scalable_iph/scalable_iph_constants.h +++ b/chromeos/ash/components/scalable_iph/scalable_iph_constants.h
@@ -9,6 +9,8 @@ namespace scalable_iph { +constexpr char16_t kNotificationSummaryText[] = u"Welcome Tips"; + constexpr char kScalableIphDebugHost[] = "scalable-iph-debug"; constexpr char kScalableIphDebugURL[] = "chrome-untrusted://scalable-iph-debug/";
diff --git a/chromeos/ash/services/nearby/public/cpp/mock_quick_start_decoder.h b/chromeos/ash/services/nearby/public/cpp/mock_quick_start_decoder.h index 40a34674..cc4b0fe3 100644 --- a/chromeos/ash/services/nearby/public/cpp/mock_quick_start_decoder.h +++ b/chromeos/ash/services/nearby/public/cpp/mock_quick_start_decoder.h
@@ -68,6 +68,12 @@ DecodeUserVerificationRequestedCallback callback), (override)); + MOCK_METHOD(void, + DecodeQuickStartMessage, + (const absl::optional<std::vector<uint8_t>>& data, + DecodeQuickStartMessageCallback callback), + (override)); + private: mojo::ReceiverSet<ash::quick_start::mojom::QuickStartDecoder> receiver_set_; mojo::SharedRemote<ash::quick_start::mojom::QuickStartDecoder> shared_remote_;
diff --git a/chromeos/ash/services/nearby/public/mojom/quick_start_decoder.mojom b/chromeos/ash/services/nearby/public/mojom/quick_start_decoder.mojom index 5732b45..00bf1ba 100644 --- a/chromeos/ash/services/nearby/public/mojom/quick_start_decoder.mojom +++ b/chromeos/ash/services/nearby/public/mojom/quick_start_decoder.mojom
@@ -52,4 +52,10 @@ // Decode the UserVerificationResult sent from the target device. DecodeUserVerificationResult(array<uint8>? data) => ( UserVerificationResponse? response, QuickStartDecoderError? error); + + // Decode any kind of Quick Start message and return either a + // QuickStartMessage, which is a union over all the message types, or an + // error if the data cannot be parsed as any known message. + DecodeQuickStartMessage(array<uint8>? data) => ( + QuickStartMessage? result, QuickStartDecoderError? error); };
diff --git a/chromeos/ash/services/nearby/public/mojom/quick_start_decoder_types.mojom b/chromeos/ash/services/nearby/public/mojom/quick_start_decoder_types.mojom index 9b23fe7..8136615d 100644 --- a/chromeos/ash/services/nearby/public/mojom/quick_start_decoder_types.mojom +++ b/chromeos/ash/services/nearby/public/mojom/quick_start_decoder_types.mojom
@@ -34,11 +34,13 @@ bool is_awaiting_user_verification; }; -// TODO (b/291903244): Convert Responses on QuickStartDecoder to Union Type enum QuickStartDecoderError { kEmptyMessage = 0, kUnableToReadAsJSON = 1, kMessageDoesNotMatchSchema = 2, + kUnexpectedMessageType = 3, + kUnknownPayload = 4, + kUnableToReadAsBase64 = 5, }; struct WifiCredentials { @@ -63,3 +65,12 @@ struct NotifySourceOfUpdateResponse { bool ack_received; }; + +union QuickStartMessage { + BootstrapConfigurations bootstrap_configurations; + WifiCredentials wifi_credentials; + NotifySourceOfUpdateResponse notify_source_of_update_response; + FidoAssertionResponse fido_assertion_response; + UserVerificationRequested user_verification_requested; + UserVerificationResponse user_verification_response; +};
diff --git a/chromeos/ash/services/orca/public/mojom/orca_service.mojom b/chromeos/ash/services/orca/public/mojom/orca_service.mojom index f7466f4..60bd6bc 100644 --- a/chromeos/ash/services/orca/public/mojom/orca_service.mojom +++ b/chromeos/ash/services/orca/public/mojom/orca_service.mojom
@@ -6,7 +6,7 @@ // the Chromium repo. This file should be updated first, before syncing in the // other repos. -// Next MinVersion: 2 +// Next MinVersion: 3 module ash.orca.mojom; @@ -120,8 +120,17 @@ // Requests the service to perform a freeform rewrite. RequestFreeformWrite@3(string input) => (TextQueryResponse response); - // Insert the given text into the current text input target. + // Inserts the given text into the current text input target. InsertText@4(string text); + + // Sends a consent approval to the service. + [MinVersion=2] ApproveConsent@5(); + + // Sends a consent declinal to the service. + [MinVersion=2] DeclineConsent@6(); + + // Sends a consent dismissal to the service. + [MinVersion=2] DismissConsent@7(); }; // Used by the UI to bootstrap the connection with the service. @@ -144,6 +153,12 @@ interface TextActuator { // Close the UI and insert `text` into the focused input field. InsertText@0(string text); + + // Processes the consent approval. + [MinVersion=2] ApproveConsent@1(); + + // Processes the consent declinal. + [MinVersion=2] DeclineConsent@2(); }; // An interface that can respond to text query requests with responses.
diff --git a/chromeos/chromeos_strings.grd b/chromeos/chromeos_strings.grd index ece9ee6..d81af05 100644 --- a/chromeos/chromeos_strings.grd +++ b/chromeos/chromeos_strings.grd
@@ -4112,6 +4112,12 @@ that includes a top row key but does not include the search key"> Shortcut with top row keys need to include the search key. </message> + <message name="IDS_SHORTCUT_CUSTOMIZATION_SEACH_WITH_FUNCTION_KEY_NOT_ALLOWED_STATUS_MESSAGE" + desc="The status message that displays when user press a key combination + that includes the search key with a function key." + translateable="false"> + Shortcut with function keys and search are not allowed. Press a new shortcut. + </message> <message name="IDS_SHORTCUT_CUSTOMIZATION_NON_SEARCH_SHORTCUT_WARNING" desc="The status (warning) message that displays when user attempts to input a shortcut that does not include the search/meta key."> Shortcut without search key might conflict with some app's shortcut. Press this shortcut again to continue using it, or press a new shortcut using the search key.
diff --git a/chromeos/chromeos_strings_grd/IDS_SHORTCUT_CUSTOMIZATION_SEACH_WITH_FUNCTION_KEY_NOT_ALLOWED_STATUS_MESSAGE.png.sha1 b/chromeos/chromeos_strings_grd/IDS_SHORTCUT_CUSTOMIZATION_SEACH_WITH_FUNCTION_KEY_NOT_ALLOWED_STATUS_MESSAGE.png.sha1 new file mode 100644 index 0000000..2ecef41 --- /dev/null +++ b/chromeos/chromeos_strings_grd/IDS_SHORTCUT_CUSTOMIZATION_SEACH_WITH_FUNCTION_KEY_NOT_ALLOWED_STATUS_MESSAGE.png.sha1
@@ -0,0 +1 @@ +d8e8f3f9b654a65152d0220a1c4570a3a7ec6547 \ No newline at end of file
diff --git a/chromeos/tast_control.gni b/chromeos/tast_control.gni index 49dec930..32196d4c 100644 --- a/chromeos/tast_control.gni +++ b/chromeos/tast_control.gni
@@ -230,6 +230,9 @@ # https://crbug.com/1483337 "lacros.Activate.keep_alive", + # b/301133350 + "privacyhub.SettingsPage.feature_v1_mic_cam_loc_golden", + # READ COMMENT AT TOP BEFORE ADDING NEW TESTS HERE. ]
diff --git a/clank b/clank index e3a3ec4..ca072aad 160000 --- a/clank +++ b/clank
@@ -1 +1 @@ -Subproject commit e3a3ec407403dece9002c87d4de7130e2ab877e4 +Subproject commit ca072aadc88771c0536b5c9b92925967b0dae51c
diff --git a/components/attribution_reporting/event_report_windows.cc b/components/attribution_reporting/event_report_windows.cc index d42ffe3..c94c794 100644 --- a/components/attribution_reporting/event_report_windows.cc +++ b/components/attribution_reporting/event_report_windows.cc
@@ -35,7 +35,6 @@ constexpr char kStartTime[] = "start_time"; constexpr char kEndTimes[] = "end_times"; -constexpr base::TimeDelta kWindowDeadlineOffset = base::Hours(1); constexpr base::TimeDelta kMinReportWindow = base::Hours(1); bool EventReportWindowsValid(base::TimeDelta start_time, @@ -72,7 +71,7 @@ base::TimeDelta deadline) { // Valid conversion reports should always have a valid reporting deadline. DCHECK(deadline.is_positive()); - return source_time + deadline + kWindowDeadlineOffset; + return source_time + deadline; } } // namespace
diff --git a/components/attribution_reporting/event_report_windows_unittest.cc b/components/attribution_reporting/event_report_windows_unittest.cc index 9d2b4b5..4c9123b8 100644 --- a/components/attribution_reporting/event_report_windows_unittest.cc +++ b/components/attribution_reporting/event_report_windows_unittest.cc
@@ -21,8 +21,6 @@ using ::attribution_reporting::mojom::SourceRegistrationError; using WindowResult = EventReportWindows::WindowResult; -constexpr base::TimeDelta kWindowDeadlineOffset = base::Hours(1); - TEST(EventReportWindowsTest, CreateWindow) { const struct { base::TimeDelta window_time; @@ -369,27 +367,27 @@ } kTestCases[] = { { .trigger_time = source_time, - .expected = source_time + base::Hours(2) + kWindowDeadlineOffset, + .expected = source_time + base::Hours(2), }, { .trigger_time = source_time + base::Hours(2) - base::Milliseconds(1), - .expected = source_time + base::Hours(2) + kWindowDeadlineOffset, + .expected = source_time + base::Hours(2), }, { .trigger_time = source_time + base::Hours(2), - .expected = source_time + base::Days(1) + kWindowDeadlineOffset, + .expected = source_time + base::Days(1), }, { .trigger_time = source_time + base::Days(1) - base::Milliseconds(1), - .expected = source_time + base::Days(1) + kWindowDeadlineOffset, + .expected = source_time + base::Days(1), }, { .trigger_time = source_time + base::Days(1), - .expected = source_time + base::Days(7) + kWindowDeadlineOffset, + .expected = source_time + base::Days(7), }, { .trigger_time = source_time + base::Days(7), - .expected = source_time + base::Days(7) + kWindowDeadlineOffset, + .expected = source_time + base::Days(7), }}; for (const auto& test_case : kTestCases) { @@ -407,19 +405,18 @@ const struct { int index; base::Time expected; - } kTestCases[] = { - { - .index = 0, - .expected = source_time + base::Hours(1) + kWindowDeadlineOffset, - }, - { - .index = 1, - .expected = source_time + base::Days(3) + kWindowDeadlineOffset, - }, - { - .index = 2, - .expected = source_time + base::Days(7) + kWindowDeadlineOffset, - }}; + } kTestCases[] = {{ + .index = 0, + .expected = source_time + base::Hours(1), + }, + { + .index = 1, + .expected = source_time + base::Days(3), + }, + { + .index = 2, + .expected = source_time + base::Days(7), + }}; for (const auto& test_case : kTestCases) { EXPECT_EQ(
diff --git a/components/autofill/core/browser/BUILD.gn b/components/autofill/core/browser/BUILD.gn index 500be12..3a18ccb 100644 --- a/components/autofill/core/browser/BUILD.gn +++ b/components/autofill/core/browser/BUILD.gn
@@ -639,6 +639,7 @@ "//build:branding_buildflags", "//build:chromeos_buildflags", "//components/commerce/core:commerce_types", + "//components/commerce/core:utils", "//components/device_reauth", "//components/feature_engagement", "//components/google/core/common", @@ -1180,6 +1181,7 @@ "//components/policy/core/common", "//components/prefs:test_support", "//components/resources", + "//components/search:search", "//components/security_state/core", "//components/signin/public/identity_manager:test_support", "//components/strings",
diff --git a/components/autofill/core/browser/browser_autofill_manager.cc b/components/autofill/core/browser/browser_autofill_manager.cc index d801bf6..283389020 100644 --- a/components/autofill/core/browser/browser_autofill_manager.cc +++ b/components/autofill/core/browser/browser_autofill_manager.cc
@@ -1101,6 +1101,12 @@ } bool BrowserAutofillManager::IsFormNonSecure(const FormData& form) const { + // Check if testing override applies. + if (consider_form_as_secure_for_testing_.has_value() && + consider_form_as_secure_for_testing_.value()) { + return false; + } + return IsFormOrClientNonSecure(client(), form); } @@ -2762,6 +2768,11 @@ return autofill_field; } +void BrowserAutofillManager::SetConsiderFormAsSecureForTesting( + absl::optional<bool> consider_form_as_secure_for_testing) { + consider_form_as_secure_for_testing_ = consider_form_as_secure_for_testing; +} + bool BrowserAutofillManager::FormHasAddressField(const FormData& form) { for (const FormFieldData& field : form.fields) { const AutofillField* autofill_field = GetAutofillField(form, field);
diff --git a/components/autofill/core/browser/browser_autofill_manager.h b/components/autofill/core/browser/browser_autofill_manager.h index 3ddfcf9..fa2e31f 100644 --- a/components/autofill/core/browser/browser_autofill_manager.h +++ b/components/autofill/core/browser/browser_autofill_manager.h
@@ -347,6 +347,11 @@ return *autocomplete_unrecognized_fallback_logger_; } + // Sets the value of `consider_form_as_secure_for_testing_`. We want to + // set this to true for test purposes only. + void SetConsiderFormAsSecureForTesting( + absl::optional<bool> consider_form_as_secure_for_testing); + protected: // Stores a `callback` for `form_signature`, possibly overriding an older // callback for `form_signature` or triggering a pending callback in case too @@ -767,6 +772,9 @@ bool has_observed_one_time_code_field_ = false; // Is there a field with phone number collection observed? bool has_observed_phone_number_field_ = false; + // If this is true, we consider the form to be secure. (Only use this for + // testing purposes). + absl::optional<bool> consider_form_as_secure_for_testing_; // When the user first interacted with a potentially fillable form on this // page.
diff --git a/components/autofill/core/browser/data_model/autofill_offer_data.cc b/components/autofill/core/browser/data_model/autofill_offer_data.cc index e112912c..62d5ea5 100644 --- a/components/autofill/core/browser/data_model/autofill_offer_data.cc +++ b/components/autofill/core/browser/data_model/autofill_offer_data.cc
@@ -11,6 +11,8 @@ namespace autofill { +// TODO(crbug.com/1483969): Refactor these methods and create separate +// constructors that are specific to each offer. // static AutofillOfferData AutofillOfferData::GPayCardLinkedOffer( int64_t offer_id, @@ -32,10 +34,11 @@ const std::vector<GURL>& merchant_origins, const GURL& offer_details_url, const DisplayStrings& display_strings, - const std::string& promo_code) { + const std::string& promo_code, + bool is_merchant_wide) { return AutofillOfferData(OfferType::FREE_LISTING_COUPON_OFFER, offer_id, expiry, merchant_origins, offer_details_url, - display_strings, promo_code); + display_strings, promo_code, is_merchant_wide); } // static @@ -158,6 +161,11 @@ base::ranges::count(merchant_origins_, origin) > 0; } +bool AutofillOfferData::IsMerchantWideOffer() const { + CHECK(IsFreeListingCouponOffer()); + return is_merchant_wide_offer_; +} + AutofillOfferData::AutofillOfferData( int64_t offer_id, const base::Time& expiry, @@ -181,13 +189,15 @@ const std::vector<GURL>& merchant_origins, const GURL& offer_details_url, const DisplayStrings& display_strings, - const std::string& promo_code) + const std::string& promo_code, + bool is_merchant_wide) : offer_type_(offer_type), offer_id_(offer_id), expiry_(expiry), offer_details_url_(offer_details_url), merchant_origins_(merchant_origins), display_strings_(display_strings), - promo_code_(promo_code) {} + promo_code_(promo_code), + is_merchant_wide_offer_(is_merchant_wide) {} } // namespace autofill
diff --git a/components/autofill/core/browser/data_model/autofill_offer_data.h b/components/autofill/core/browser/data_model/autofill_offer_data.h index e91b94c5..6d884e6 100644 --- a/components/autofill/core/browser/data_model/autofill_offer_data.h +++ b/components/autofill/core/browser/data_model/autofill_offer_data.h
@@ -60,7 +60,8 @@ const std::vector<GURL>& merchant_origins, const GURL& offer_details_url, const DisplayStrings& display_strings, - const std::string& promo_code); + const std::string& promo_code, + bool is_merchant_wide = false); // Returns an AutofillOfferData for a GPay promo code offer. static AutofillOfferData GPayPromoCodeOffer( int64_t offer_id, @@ -70,6 +71,8 @@ const DisplayStrings& display_strings, const std::string& promo_code); + // TODO(crbug.com/1483969): Refactor this class to ensure the correct access + // specifiers and move constructors and move assignment constructors. AutofillOfferData(); ~AutofillOfferData(); AutofillOfferData(const AutofillOfferData&); @@ -100,6 +103,9 @@ // given |origin| in the list of |merchant_origins|. bool IsActiveAndEligibleForOrigin(const GURL& origin) const; + // Returns true if the current offer is a site wide offer. + bool IsMerchantWideOffer() const; + OfferType GetOfferType() const { return offer_type_; } int64_t GetOfferId() const { return offer_id_; } const base::Time& GetExpiry() const { return expiry_; } @@ -153,7 +159,8 @@ const std::vector<GURL>& merchant_origins, const GURL& offer_details_url, const DisplayStrings& display_strings, - const std::string& promo_code); + const std::string& promo_code, + bool is_merchant_wide = false); // The specific type of offer, which informs decisions made by other classes, // such as UI rendering or metrics. @@ -191,6 +198,10 @@ // A promo/gift/coupon code that can be applied at checkout with the merchant. std::string promo_code_; + + // This only applies to free-listing offers, and it indicates whether the + // offer is a site-wide promo, e.g. 15% off on everything. + bool is_merchant_wide_offer_ = false; }; } // namespace autofill
diff --git a/components/autofill/core/browser/payments/autofill_offer_manager.cc b/components/autofill/core/browser/payments/autofill_offer_manager.cc index 138dd654..cef012e 100644 --- a/components/autofill/core/browser/payments/autofill_offer_manager.cc +++ b/components/autofill/core/browser/payments/autofill_offer_manager.cc
@@ -16,6 +16,7 @@ #include "components/autofill/core/common/autofill_features.h" #include "components/autofill/core/common/autofill_payments_features.h" #include "components/commerce/core/commerce_types.h" +#include "components/commerce/core/commerce_utils.h" #include "components/feature_engagement/public/feature_constants.h" #include "components/search/ntp_features.h" #include "components/strings/grit/components_strings.h" @@ -28,7 +29,7 @@ return AutofillOfferData::FreeListingCouponOffer( discount_info.id, base::Time::FromDoubleT(discount_info.expiry_time_sec), {url}, url, DisplayStrings{discount_info.description_detail}, - discount_info.discount_code.value_or("")); + discount_info.discount_code.value_or(""), discount_info.is_merchant_wide); } AutofillOfferManager::AutofillOfferManager(
diff --git a/components/autofill/core/browser/payments/autofill_offer_manager_unittest.cc b/components/autofill/core/browser/payments/autofill_offer_manager_unittest.cc index 1a658ec..b8028b4 100644 --- a/components/autofill/core/browser/payments/autofill_offer_manager_unittest.cc +++ b/components/autofill/core/browser/payments/autofill_offer_manager_unittest.cc
@@ -21,6 +21,7 @@ #include "components/autofill/core/common/autofill_payments_features.h" #include "components/commerce/core/commerce_types.h" #include "components/commerce/core/test_utils.h" +#include "components/search/ntp_features.h" #include "components/strings/grit/components_strings.h" #include "components/sync/test/test_sync_service.h" #include "services/network/public/cpp/shared_url_loader_factory.h" @@ -46,6 +47,11 @@ "http://www.example.com/en/payments?name=checkout"; const char kOfferDetailsUrl[] = "http://pay.google.com"; +// Free-listing offer data +constexpr char kDetail[] = "Discount description details"; +constexpr char kDiscountCode[] = "discount-code"; +constexpr int64_t kDiscountId = 123; + } // namespace class AutofillOfferManagerTest : public testing::Test { @@ -317,18 +323,16 @@ EXPECT_EQ(offer2, *result); } -TEST_F(AutofillOfferManagerTest, GetShoppingServiceOfferForUrl_ReturnOffer) { - const GURL url("http://www.example.com"); - const std::string detail = "Discount description detail"; - const std::string discount_code = "discount-code"; - const int64_t discount_id = 123; +TEST_F(AutofillOfferManagerTest, + GetShoppingServiceOfferForUrl_ReturnNonMerchantWideOffer) { + const GURL url(kTestUrl); const double expiry_time_sec = (AutofillClock::Now() + base::Days(2)).ToDoubleT(); - const AutofillOfferData expected_autofill_offer_data = + const AutofillOfferData expected_autofill_non_merchant_wide_offer_data = AutofillOfferData::FreeListingCouponOffer( - discount_id, base::Time::FromDoubleT(expiry_time_sec), {url}, url, - DisplayStrings{detail}, discount_code); + kDiscountId, base::Time::FromDoubleT(expiry_time_sec), {url}, url, + DisplayStrings{kDetail}, kDiscountCode, false); ON_CALL(*mock_shopping_service_delegate_, GetDiscountInfoForUrls) .WillByDefault([&](const std::vector<GURL>& urls, @@ -336,8 +340,8 @@ const commerce::DiscountsMap discounts_map{ {url, {commerce::CreateValidDiscountInfo( - detail, /*terms_and_conditions=*/"", - /*value_in_text=*/"$10 off", discount_code, discount_id, + kDetail, /*terms_and_conditions=*/"", + /*value_in_text=*/"$10 off", kDiscountCode, kDiscountId, /*is_merchant_wide=*/false, expiry_time_sec)}}}; base::SequencedTaskRunner::GetCurrentDefault()->PostTask( FROM_HERE, base::BindOnce(std::move(callback), discounts_map)); @@ -348,7 +352,43 @@ EXPECT_CALL(*mock_shopping_service_delegate_, GetDiscountInfoForUrls); base::MockCallback<AutofillOfferManager::AsyncOfferCallback> callback; - EXPECT_CALL(callback, Run(url, expected_autofill_offer_data)); + EXPECT_CALL(callback, + Run(url, expected_autofill_non_merchant_wide_offer_data)); + + autofill_offer_manager_->GetShoppingServiceOfferForUrl(url, callback.Get()); + task_environment_.RunUntilIdle(); +} + +TEST_F(AutofillOfferManagerTest, + GetShoppingServiceOfferForUrl_ReturnMerchantWideOffer) { + const GURL url(kTestUrl); + const double expiry_time_sec = + (AutofillClock::Now() + base::Days(2)).ToDoubleT(); + + const AutofillOfferData expected_autofill_merchant_wide_offer_data = + AutofillOfferData::FreeListingCouponOffer( + kDiscountId, base::Time::FromDoubleT(expiry_time_sec), {url}, url, + DisplayStrings{kDetail}, kDiscountCode, true); + + ON_CALL(*mock_shopping_service_delegate_, GetDiscountInfoForUrls) + .WillByDefault([&](const std::vector<GURL>& urls, + commerce::DiscountInfoCallback callback) { + const commerce::DiscountsMap discounts_map{ + {url, + {commerce::CreateValidDiscountInfo( + kDetail, /*terms_and_conditions=*/"", + /*value_in_text=*/"$10 off", kDiscountCode, kDiscountId, + /*is_merchant_wide=*/true, expiry_time_sec)}}}; + base::SequencedTaskRunner::GetCurrentDefault()->PostTask( + FROM_HERE, base::BindOnce(std::move(callback), discounts_map)); + }); + EXPECT_CALL(*mock_shopping_service_delegate_, + IsDiscountEligibleToShowOnNavigation()) + .WillOnce(testing::Return(true)); + EXPECT_CALL(*mock_shopping_service_delegate_, GetDiscountInfoForUrls); + + base::MockCallback<AutofillOfferManager::AsyncOfferCallback> callback; + EXPECT_CALL(callback, Run(url, expected_autofill_merchant_wide_offer_data)); autofill_offer_manager_->GetShoppingServiceOfferForUrl(url, callback.Get()); task_environment_.RunUntilIdle(); @@ -356,7 +396,7 @@ TEST_F(AutofillOfferManagerTest, GetShoppingServiceOfferForUrl_ReturnEmptyResult) { - const GURL url("http://www.example.com"); + const GURL url(kTestUrl); ON_CALL(*mock_shopping_service_delegate_, GetDiscountInfoForUrls) .WillByDefault([](const std::vector<GURL>& urls, commerce::DiscountInfoCallback callback) {
diff --git a/components/autofill/core/browser/payments/offer_notification_handler.cc b/components/autofill/core/browser/payments/offer_notification_handler.cc index 1956771..b99d992 100644 --- a/components/autofill/core/browser/payments/offer_notification_handler.cc +++ b/components/autofill/core/browser/payments/offer_notification_handler.cc
@@ -10,8 +10,8 @@ #include "components/autofill/core/browser/payments/autofill_offer_manager.h" #include "components/autofill/core/browser/payments/offer_notification_options.h" #include "components/autofill/core/common/autofill_payments_features.h" +#include "components/commerce/core/commerce_utils.h" #include "components/search/ntp_features.h" -#include "net/base/url_util.h" #include "url/gurl.h" namespace autofill { @@ -40,15 +40,6 @@ return true; } -bool UrlContainsDiscountUtmTag(const GURL& url) { - std::string utm_name; - // TODO(b:289242951): Update the utm tag and value once they are finalized. - if (!net::GetValueForKeyInQuery(url, "utm_source", &utm_name)) { - return false; - } - return utm_name == "chrome-history-cluster-with-discount"; -} - } // namespace OfferNotificationHandler::OfferNotificationHandler( @@ -64,7 +55,7 @@ bool show_offer_notification_sync = !(base::FeatureList::IsEnabled( ntp_features::kNtpHistoryClustersModuleDiscounts) && - UrlContainsDiscountUtmTag(url)) && + commerce::UrlContainsDiscountUtmTag(url)) && ValidOfferExistsForUrl(url); if (show_offer_notification_sync) { @@ -79,9 +70,10 @@ AutofillOfferData* offer = offer_manager_->GetOfferForUrl(url); CHECK(IsOfferValid(offer)); int64_t offer_id = offer->GetOfferId(); + bool offer_id_has_shown_before = shown_notification_ids_.contains(offer_id); client->UpdateOfferNotification( - offer, {.notification_has_been_shown = - shown_notification_ids_.contains(offer_id)}); + offer, {.notification_has_been_shown = offer_id_has_shown_before, + .show_notification_automatically = !offer_id_has_shown_before}); shown_notification_ids_.insert(offer_id); } else { client->DismissOfferNotification(); @@ -119,12 +111,29 @@ if (!client || url != client->GetLastCommittedPrimaryMainFrameURL()) { return; } - int64_t offer_id = offer.GetOfferId(); - client->UpdateOfferNotification( - &offer, {.notification_has_been_shown = - shown_notification_ids_.contains(offer_id), - .expand_notification_icon = true}); + OfferNotificationOptions offer_notification_options = { + .notification_has_been_shown = shown_notification_ids_.contains(offer_id), + .expand_notification_icon = true}; + + // The following order of the if block matters: + // * If the url contains the expected UTM tags, the notification should + // always show automatically, otherwise + // * If the available offer is a merchant-wide offer, the notification + // should always be hidden until the user explicitly clicks on the icon. + // * None of the above, falls back to whether the offer has shown before. If + // the offer has shown before, the bubble will not show automatically. + if (base::FeatureList::IsEnabled( + ntp_features::kNtpHistoryClustersModuleDiscounts) && + commerce::UrlContainsDiscountUtmTag(url)) { + offer_notification_options.show_notification_automatically = true; + } else if (offer.IsMerchantWideOffer()) { + offer_notification_options.show_notification_automatically = false; + } else { + offer_notification_options.show_notification_automatically = + !shown_notification_ids_.contains(offer_id); + } + client->UpdateOfferNotification(&offer, offer_notification_options); shown_notification_ids_.insert(offer_id); }
diff --git a/components/autofill/core/browser/payments/offer_notification_options.h b/components/autofill/core/browser/payments/offer_notification_options.h index ab0f2ba..28a1e1b 100644 --- a/components/autofill/core/browser/payments/offer_notification_options.h +++ b/components/autofill/core/browser/payments/offer_notification_options.h
@@ -11,10 +11,16 @@ // should show. struct OfferNotificationOptions { // Indicates whether this notification has been shown since profile start-up. + // This is only used in Android. + // TODO(crbug.com/1483010): Revisit if we can consolidate + // notification_has_been_shown and show_notification_automatically. bool notification_has_been_shown = false; // Indicates whether the notification will automatically expand upon being // shown. bool expand_notification_icon = false; + // Indicates whether the notification bubble should be shown automatically + // when the user navigates to the qualified page. + bool show_notification_automatically = false; }; } // namespace autofill
diff --git a/components/autofill/core/common/autofill_features.cc b/components/autofill/core/common/autofill_features.cc index 89348a5..c96f0b6 100644 --- a/components/autofill/core/common/autofill_features.cc +++ b/components/autofill/core/common/autofill_features.cc
@@ -705,13 +705,6 @@ "AutofillKeyboardAccessory_LAUNCHED", base::FEATURE_ENABLED_BY_DEFAULT); -// When enabled, Autofill suggestions from keyboard accessory chips are only -// accepted if at least 500ms have passed between showing the accessory and -// interacting with the accessory chip. -BASE_FEATURE(kAutofillKeyboardAccessoryAcceptanceDelayThreshold, - "AutofillKeyboardAccessoryAcceptanceDelayThreshold", - base::FEATURE_ENABLED_BY_DEFAULT); - // Controls whether the touch to fill surface is shown for credit cards on // Android. BASE_FEATURE(kAutofillTouchToFillForCreditCardsAndroid,
diff --git a/components/autofill/core/common/autofill_features.h b/components/autofill/core/common/autofill_features.h index baa2336..91bf64f 100644 --- a/components/autofill/core/common/autofill_features.h +++ b/components/autofill/core/common/autofill_features.h
@@ -243,8 +243,6 @@ #if BUILDFLAG(IS_ANDROID) COMPONENT_EXPORT(AUTOFILL) BASE_DECLARE_FEATURE(kAutofillKeyboardAccessory); COMPONENT_EXPORT(AUTOFILL) -BASE_DECLARE_FEATURE(kAutofillKeyboardAccessoryAcceptanceDelayThreshold); -COMPONENT_EXPORT(AUTOFILL) BASE_DECLARE_FEATURE(kAutofillTouchToFillForCreditCardsAndroid); COMPONENT_EXPORT(AUTOFILL) BASE_DECLARE_FEATURE(kAutofillVirtualViewStructureAndroid);
diff --git a/components/commerce/core/BUILD.gn b/components/commerce/core/BUILD.gn index 00ae01b..5e19295 100644 --- a/components/commerce/core/BUILD.gn +++ b/components/commerce/core/BUILD.gn
@@ -192,8 +192,6 @@ "discounts_storage.h", "metrics/scheduled_metrics_manager.cc", "metrics/scheduled_metrics_manager.h", - "parcel_manager.cc", - "parcel_manager.h", "price_tracking_utils.cc", "price_tracking_utils.h", "shopping_bookmark_model_observer.cc", @@ -413,5 +411,17 @@ source_set("commerce_types") { sources = [ "commerce_types.h" ] - deps = [ "//url" ] + deps = [ + ":proto", + "//base", + "//url", + ] +} + +source_set("utils") { + sources = [ + "commerce_utils.cc", + "commerce_utils.h", + ] + deps = [ "//net:net" ] }
diff --git a/components/commerce/core/DEPS b/components/commerce/core/DEPS index cf4aac0..5d5f31a 100644 --- a/components/commerce/core/DEPS +++ b/components/commerce/core/DEPS
@@ -20,6 +20,7 @@ "+components/variations", "+mojo/public/cpp/bindings", "+net/base/registry_controlled_domains/registry_controlled_domain.h", + "+net/base/url_util.h", "+net/http", "+net/base", "+net/traffic_annotation",
diff --git a/components/commerce/core/commerce_types.h b/components/commerce/core/commerce_types.h index 5d5fdab..56204c6 100644 --- a/components/commerce/core/commerce_types.h +++ b/components/commerce/core/commerce_types.h
@@ -5,9 +5,14 @@ #ifndef COMPONENTS_COMMERCE_CORE_COMMERCE_TYPES_H_ #define COMPONENTS_COMMERCE_CORE_COMMERCE_TYPES_H_ +#include <map> +#include <memory> #include <string> #include <vector> +#include "base/functional/callback.h" +#include "base/time/time.h" +#include "components/commerce/core/proto/parcel.pb.h" #include "third_party/abseil-cpp/absl/types/optional.h" #include "url/gurl.h" @@ -122,6 +127,21 @@ bool server_image_available{false}; }; +// Information returned by Parcels API. +struct ParcelTrackingStatus { + public: + ParcelTrackingStatus(); + explicit ParcelTrackingStatus(const ParcelStatus&); + ParcelTrackingStatus(const ParcelTrackingStatus&); + ParcelTrackingStatus& operator=(const ParcelTrackingStatus&); + ~ParcelTrackingStatus(); + + ParcelIdentifier::Carrier carrier; + std::string tracking_id; + GURL tracking_url; + base::Time estimated_delivery_time; +}; + // Callbacks and typedefs for various accessors in the shopping service. using DiscountsMap = std::map<GURL, std::vector<DiscountInfo>>; using DiscountInfoCallback = base::OnceCallback<void(const DiscountsMap&)>; @@ -135,7 +155,9 @@ const absl::optional<const ProductInfo>&)>; using IsShoppingPageCallback = base::OnceCallback<void(const GURL&, absl::optional<bool>)>; - +using GetParcelStatusCallback = base::OnceCallback< + void(bool /*success*/, std::unique_ptr<std::vector<ParcelTrackingStatus>>)>; +using StopParcelTrackingCallback = base::OnceCallback<void(bool /*success*/)>; } // namespace commerce #endif // COMPONENTS_COMMERCE_CORE_COMMERCE_TYPES_H_
diff --git a/components/commerce/core/commerce_utils.cc b/components/commerce/core/commerce_utils.cc new file mode 100644 index 0000000..aba63cf --- /dev/null +++ b/components/commerce/core/commerce_utils.cc
@@ -0,0 +1,26 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/commerce/core/commerce_utils.h" + +#include "net/base/url_util.h" +#include "url/gurl.h" + +namespace commerce { + +namespace { +// TODO(b:289242951): Update the utm tag and value once they are finalized. +constexpr char kUtmSourceTag[] = "utm_source"; +constexpr char kUtmSourceValue[] = "chrome-history-cluster-with-discount"; +} // namespace + +bool UrlContainsDiscountUtmTag(const GURL& url) { + std::string utm_name; + if (!net::GetValueForKeyInQuery(url, kUtmSourceTag, &utm_name)) { + return false; + } + return utm_name == kUtmSourceValue; +} + +} // namespace commerce
diff --git a/components/commerce/core/commerce_utils.h b/components/commerce/core/commerce_utils.h new file mode 100644 index 0000000..a50a6bed --- /dev/null +++ b/components/commerce/core/commerce_utils.h
@@ -0,0 +1,17 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_COMMERCE_CORE_COMMERCE_UTILS_H_ +#define COMPONENTS_COMMERCE_CORE_COMMERCE_UTILS_H_ + +class GURL; + +namespace commerce { + +// Returns whether the `url` contains the discount utm tags. +bool UrlContainsDiscountUtmTag(const GURL& url); + +} // namespace commerce + +#endif // COMPONENTS_COMMERCE_CORE_COMMERCE_UTILS_H_
diff --git a/components/commerce/core/parcel/BUILD.gn b/components/commerce/core/parcel/BUILD.gn index c8718d81..0590870 100644 --- a/components/commerce/core/parcel/BUILD.gn +++ b/components/commerce/core/parcel/BUILD.gn
@@ -4,13 +4,18 @@ source_set("parcel") { sources = [ + "parcels_manager.cc", + "parcels_manager.h", "parcels_server_proxy.cc", "parcels_server_proxy.h", "parcels_storage.cc", "parcels_storage.h", ] deps = [ + "//base", + "//components/commerce/core:account_checker", "//components/commerce/core:commerce_constants", + "//components/commerce/core:commerce_types", "//components/commerce/core:feature_list", "//components/commerce/core:parcel_tracking_db_content_proto", "//components/commerce/core:proto", @@ -28,13 +33,17 @@ source_set("unit_tests") { testonly = true - sources = [ "parcels_server_proxy_unittest.cc" ] + sources = [ + "parcels_server_proxy_unittest.cc", + "parcels_storage_unittest.cc", + ] # Expose all deps for test support. public_deps = [ ":parcel", "//base/test:test_support", "//components/commerce/core:commerce_constants", + "//components/commerce/core:parcel_tracking_db_content_proto", "//components/commerce/core:proto", "//components/endpoint_fetcher:test_support", "//components/signin/public/identity_manager:test_support",
diff --git a/components/commerce/core/parcel/parcels_manager.cc b/components/commerce/core/parcel/parcels_manager.cc new file mode 100644 index 0000000..aa33905 --- /dev/null +++ b/components/commerce/core/parcel/parcels_manager.cc
@@ -0,0 +1,100 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/commerce/core/parcel/parcels_manager.h" + +#include "base/functional/bind.h" +#include "components/commerce/core/parcel/parcels_server_proxy.h" +#include "components/commerce/core/parcel/parcels_storage.h" +#include "services/network/public/cpp/shared_url_loader_factory.h" + +namespace commerce { + +namespace { + +void OnGetParcelStatusDone( + GetParcelStatusCallback callback, + ParcelRequestStatus request_status, + std::unique_ptr<std::vector<ParcelStatus>> parcel_status) { + auto result = std::make_unique<std::vector<ParcelTrackingStatus>>(); + for (auto& status : *parcel_status) { + result->emplace_back(status); + } + std::move(callback).Run(request_status == ParcelRequestStatus::kSuccess, + std::move(result)); +} + +std::vector<ParcelIdentifier> ConvertParcelIdentifier( + const std::vector<std::pair<ParcelIdentifier::Carrier, std::string>>& + parcel_identifiers) { + std::vector<ParcelIdentifier> result; + for (auto& identifier : parcel_identifiers) { + ParcelIdentifier id; + id.set_carrier(identifier.first); + id.set_tracking_id(identifier.second); + } + return result; +} + +void OnStopTrackingParcelDone(StopParcelTrackingCallback callback, + ParcelRequestStatus status) { + std::move(callback).Run(status == ParcelRequestStatus::kSuccess); +} + +void OnStopTrackingAllParcelsDone(StopParcelTrackingCallback callback, + ParcelRequestStatus status) { + std::move(callback).Run(status == ParcelRequestStatus::kSuccess); +} +} // namespace + +ParcelsManager::ParcelsManager( + signin::IdentityManager* identity_manager, + scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, + SessionProtoStorage<parcel_tracking_db::ParcelTrackingContent>* + parcel_tracking_proto_db, + AccountChecker* account_checker) + : parcels_server_proxy_( + std::make_unique<ParcelsServerProxy>(identity_manager, + url_loader_factory)), + parcels_storage_( + std::make_unique<ParcelsStorage>(parcel_tracking_proto_db)) {} + +ParcelsManager::~ParcelsManager() = default; + +void ParcelsManager::StartTrackingParcels( + const std::vector<std::pair<ParcelIdentifier::Carrier, std::string>>& + parcel_identifiers, + const std::string& source_page_domain, + GetParcelStatusCallback callback) { + parcels_server_proxy_->StartTrackingParcels( + ConvertParcelIdentifier(parcel_identifiers), source_page_domain, + base::BindOnce(&OnGetParcelStatusDone, std::move(callback))); +} + +void ParcelsManager::GetParcelStatus( + const std::vector<std::pair<ParcelIdentifier::Carrier, std::string>>& + parcel_identifiers, + GetParcelStatusCallback callback) { + // TODO(qinmin): check db first before sending request to the server. + parcels_server_proxy_->GetParcelStatus( + ConvertParcelIdentifier(parcel_identifiers), + base::BindOnce(&OnGetParcelStatusDone, std::move(callback))); +} + +void ParcelsManager::StopTrackingParcel(const std::string& tracking_id, + StopParcelTrackingCallback callback) { + parcels_server_proxy_->StopTrackingParcel( + tracking_id, + base::BindOnce(&OnStopTrackingParcelDone, std::move(callback))); +} + +void ParcelsManager::StopTrackingAllParcels( + StopParcelTrackingCallback callback) { + parcels_server_proxy_->StopTrackingAllParcels( + base::BindOnce(&OnStopTrackingAllParcelsDone, std::move(callback))); +} + +// Called to stop tracking a given parcel. + +} // namespace commerce
diff --git a/components/commerce/core/parcel_manager.h b/components/commerce/core/parcel/parcels_manager.h similarity index 67% rename from components/commerce/core/parcel_manager.h rename to components/commerce/core/parcel/parcels_manager.h index 6230cce1..d85714b 100644 --- a/components/commerce/core/parcel_manager.h +++ b/components/commerce/core/parcel/parcels_manager.h
@@ -2,12 +2,14 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -#ifndef COMPONENTS_COMMERCE_CORE_PARCEL_MANAGER_H_ -#define COMPONENTS_COMMERCE_CORE_PARCEL_MANAGER_H_ +#ifndef COMPONENTS_COMMERCE_CORE_PARCEL_PARCELS_MANAGER_H_ +#define COMPONENTS_COMMERCE_CORE_PARCEL_PARCELS_MANAGER_H_ #include <memory> +#include <utility> #include "base/memory/scoped_refptr.h" +#include "components/commerce/core/commerce_types.h" #include "components/commerce/core/proto/parcel.pb.h" #include "components/commerce/core/proto/parcel_tracking_db_content.pb.h" #include "components/session_proto_db/session_proto_storage.h" @@ -26,32 +28,30 @@ class ParcelsStorage; // Class for managing all the parcel information -class ParcelManager { +class ParcelsManager { public: - using GetParcelStatusCallback = - base::OnceCallback<void(bool /*success*/, - std::unique_ptr<std::vector<ParcelStatus>>)>; - using StopParcelTrackingCallback = base::OnceCallback<void(bool /*success*/)>; - - ParcelManager( + ParcelsManager( signin::IdentityManager* identity_manager, scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, SessionProtoStorage<parcel_tracking_db::ParcelTrackingContent>* parcel_tracking_proto_db, AccountChecker* account_checker); - ~ParcelManager(); - ParcelManager(const ParcelManager&) = delete; - ParcelManager& operator=(const ParcelManager&) = delete; + ~ParcelsManager(); + ParcelsManager(const ParcelsManager&) = delete; + ParcelsManager& operator=(const ParcelsManager&) = delete; // Starts tracking a list of parcels. void StartTrackingParcels( - const std::vector<ParcelIdentifier>& parcel_identifiers, + const std::vector<std::pair<ParcelIdentifier::Carrier, std::string>>& + parcel_identifiers, const std::string& source_page_domain, GetParcelStatusCallback callback); // Gets status for a list of parcels. - void GetParcelStatus(const std::vector<ParcelIdentifier>& parcel_identifiers, - GetParcelStatusCallback callback); + void GetParcelStatus( + const std::vector<std::pair<ParcelIdentifier::Carrier, std::string>>& + parcel_identifiers, + GetParcelStatusCallback callback); // Called to stop tracking a given parcel. void StopTrackingParcel(const std::string& tracking_id, @@ -68,4 +68,4 @@ } // namespace commerce -#endif // COMPONENTS_COMMERCE_CORE_PARCEL_MANAGER_H_ +#endif // COMPONENTS_COMMERCE_CORE_PARCEL_PARCELS_MANAGER_H_
diff --git a/components/commerce/core/parcel/parcels_storage.cc b/components/commerce/core/parcel/parcels_storage.cc index a03ea0e..5ad98c9 100644 --- a/components/commerce/core/parcel/parcels_storage.cc +++ b/components/commerce/core/parcel/parcels_storage.cc
@@ -28,45 +28,57 @@ ParcelsStorage::~ParcelsStorage() = default; -void ParcelsStorage::Init() { +void ParcelsStorage::Init(OnInitializedCallback callback) { DCHECK(!is_initialized_); proto_db_->LoadAllEntries(base::BindOnce(&ParcelsStorage::OnAllParcelsLoaded, - weak_ptr_factory_.GetWeakPtr())); + weak_ptr_factory_.GetWeakPtr(), + std::move(callback))); } -void ParcelsStorage::GetAllParcelStatus(GetParcelStatusCallback callback) { +std::unique_ptr<std::vector<ParcelStatus>> +ParcelsStorage::GetAllParcelStatus() { DCHECK(is_initialized_); - // TODO(qinmin): Call the callback with everything in cache. + auto result = std::make_unique<std::vector<ParcelStatus>>(); + for (auto& kv : parcels_cache_) { + result->emplace_back(kv.second); + } + return result; } void ParcelsStorage::UpdateParcelStatus( const std::vector<ParcelStatus>& parcel_status, StorageUpdateCallback callback) { + DCHECK(is_initialized_); + std::vector<std::pair<std::string, ParcelTrackingContent>> content_to_insert; for (const auto& status : parcel_status) { std::string key = GetDbKeyFromParcelStatus(status.parcel_identifier()); - if (parcels_cache_.find(key) != parcels_cache_.end()) { - // TODO(qinmin): Update the db. - } else { - // TODO(qinmin): Insert into db. - } + ParcelTrackingContent content; + content.set_key(key); + auto* new_status = content.mutable_parcel_status(); + *new_status = status; + content_to_insert.emplace_back(key, content); parcels_cache_[key] = status; } + proto_db_->UpdateEntries(std::move(content_to_insert), std::move(callback)); } void ParcelsStorage::DeleteParcelStatus( const ParcelIdentifier& parcel_identifier, StorageUpdateCallback callback) { + DCHECK(is_initialized_); std::string key = GetDbKeyFromParcelStatus(parcel_identifier); parcels_cache_.erase(key); proto_db_->DeleteOneEntry(key, base::BindOnce(std::move(callback))); } void ParcelsStorage::DeleteAllParcelStatus(StorageUpdateCallback callback) { + DCHECK(is_initialized_); parcels_cache_.clear(); proto_db_->DeleteAllContent(std::move(callback)); } -void ParcelsStorage::OnAllParcelsLoaded(bool success, +void ParcelsStorage::OnAllParcelsLoaded(OnInitializedCallback callback, + bool success, ParcelTrackings parcel_trackings) { DCHECK(!is_initialized_); if (!success) { @@ -77,6 +89,7 @@ auto& parcel_status = kv.second.parcel_status(); parcels_cache_.emplace(std::move(kv.first), std::move(parcel_status)); } + std::move(callback).Run(success); } } // namespace commerce
diff --git a/components/commerce/core/parcel/parcels_storage.h b/components/commerce/core/parcel/parcels_storage.h index 3a28918..295c309 100644 --- a/components/commerce/core/parcel/parcels_storage.h +++ b/components/commerce/core/parcel/parcels_storage.h
@@ -15,16 +15,18 @@ #include "components/session_proto_db/session_proto_storage.h" namespace commerce { -using ParcelTrackingContent = parcel_tracking_db::ParcelTrackingContent; -using GetParcelStatusCallback = - base::OnceCallback<void(std::unique_ptr<std::vector<ParcelStatus>>)>; -using ParcelTrackings = - std::vector<SessionProtoStorage<ParcelTrackingContent>::KeyAndValue>; -using StorageUpdateCallback = base::OnceCallback<void(bool /*success*/)>; // Class for storing parcel tracking information in db. class ParcelsStorage { public: + using ParcelTrackingContent = parcel_tracking_db::ParcelTrackingContent; + using GetParcelStatusCallback = + base::OnceCallback<void(std::unique_ptr<std::vector<ParcelStatus>>)>; + using ParcelTrackings = + std::vector<SessionProtoStorage<ParcelTrackingContent>::KeyAndValue>; + using StorageUpdateCallback = base::OnceCallback<void(bool /*success*/)>; + using OnInitializedCallback = base::OnceCallback<void(bool /*success*/)>; + explicit ParcelsStorage( SessionProtoStorage<ParcelTrackingContent>* parcel_tracking_db); ParcelsStorage(const ParcelsStorage&) = delete; @@ -32,10 +34,10 @@ virtual ~ParcelsStorage(); // Initialize the storage, populate the cache entries. - void Init(); + void Init(OnInitializedCallback callback); // Gets all parcel status. - void GetAllParcelStatus(GetParcelStatusCallback callback); + std::unique_ptr<std::vector<ParcelStatus>> GetAllParcelStatus(); // Updates the status for a list of parcels. void UpdateParcelStatus(const std::vector<ParcelStatus>& parcel_status, @@ -49,7 +51,12 @@ void DeleteAllParcelStatus(StorageUpdateCallback callback); private: - void OnAllParcelsLoaded(bool success, ParcelTrackings parcel_trackings); + void OnAllParcelsLoaded(OnInitializedCallback callback, + bool success, + ParcelTrackings parcel_trackings); + + void InsertParcelStatus(const ParcelStatus& parcel_status, + StorageUpdateCallback callback); raw_ptr<SessionProtoStorage<ParcelTrackingContent>> proto_db_;
diff --git a/components/commerce/core/parcel/parcels_storage_unittest.cc b/components/commerce/core/parcel/parcels_storage_unittest.cc new file mode 100644 index 0000000..8e57f52 --- /dev/null +++ b/components/commerce/core/parcel/parcels_storage_unittest.cc
@@ -0,0 +1,266 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include <string> + +#include "base/check.h" +#include "base/functional/callback.h" +#include "base/run_loop.h" +#include "base/strings/stringprintf.h" +#include "base/test/scoped_feature_list.h" +#include "base/test/task_environment.h" +#include "components/commerce/core/parcel/parcels_storage.h" +#include "components/commerce/core/proto/parcel.pb.h" +#include "components/commerce/core/proto/parcel_tracking_db_content.pb.h" +#include "components/session_proto_db/session_proto_storage.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +using testing::_; +using testing::InSequence; + +namespace { + +const commerce::ParcelIdentifier::Carrier kCarrier1 = + commerce::ParcelIdentifier::UPS; +const std::string kTrackingId1 = "abc"; +const std::string kTrackingId2 = "xyz"; +const commerce::ParcelStatus::ParcelState kDefaultState = + commerce::ParcelStatus::NEW; + +std::string GetStorageKey(commerce::ParcelIdentifier::Carrier carrier, + const std::string& tracking_id) { + return base::StringPrintf("%d_%s", carrier, tracking_id.c_str()); +} + +commerce::ParcelStatus CreateParcelStatus( + commerce::ParcelIdentifier::Carrier carrier, + const std::string& tracking_id, + commerce::ParcelStatus::ParcelState state) { + commerce::ParcelStatus status; + auto* identifier = status.mutable_parcel_identifier(); + identifier->set_tracking_id(tracking_id); + identifier->set_carrier(carrier); + status.set_parcel_state(state); + return status; +} + +parcel_tracking_db::ParcelTrackingContent CreateParcelTrackingContent( + commerce::ParcelIdentifier::Carrier carrier, + const std::string& tracking_id, + commerce::ParcelStatus::ParcelState state) { + parcel_tracking_db::ParcelTrackingContent content; + content.set_key(GetStorageKey(carrier, tracking_id)); + auto* parcel_status = content.mutable_parcel_status(); + *parcel_status = CreateParcelStatus(carrier, tracking_id, state); + return content; +} + +std::vector< + SessionProtoStorage<parcel_tracking_db::ParcelTrackingContent>::KeyAndValue> +MockDbLoadResponse() { + parcel_tracking_db::ParcelTrackingContent content = + CreateParcelTrackingContent(kCarrier1, kTrackingId1, kDefaultState); + + return std::vector<SessionProtoStorage< + parcel_tracking_db::ParcelTrackingContent>::KeyAndValue>{ + {GetStorageKey(kCarrier1, kTrackingId1), content}}; +} + +void DoNothing(bool success) {} + +class MockProtoStorage + : public SessionProtoStorage<parcel_tracking_db::ParcelTrackingContent> { + public: + MockProtoStorage() = default; + ~MockProtoStorage() override = default; + + MOCK_METHOD(void, + LoadContentWithPrefix, + (const std::string& key_prefix, + SessionProtoStorage<parcel_tracking_db::ParcelTrackingContent>:: + LoadCallback callback), + (override)); + MOCK_METHOD(void, + InsertContent, + (const std::string& key, + const parcel_tracking_db::ParcelTrackingContent& value, + SessionProtoStorage<parcel_tracking_db::ParcelTrackingContent>:: + OperationCallback callback), + (override)); + MOCK_METHOD(void, + DeleteOneEntry, + (const std::string& key, + SessionProtoStorage<parcel_tracking_db::ParcelTrackingContent>:: + OperationCallback callback), + (override)); + MOCK_METHOD( + void, + UpdateEntries, + ((const std::vector< + std::pair<std::string, parcel_tracking_db::ParcelTrackingContent>>& + entries_to_update), + SessionProtoStorage<parcel_tracking_db::ParcelTrackingContent>:: + OperationCallback callback), + (override)); + MOCK_METHOD(void, + DeleteAllContent, + (SessionProtoStorage<parcel_tracking_db::ParcelTrackingContent>:: + OperationCallback callback), + (override)); + MOCK_METHOD( + void, + LoadAllEntries, + (SessionProtoStorage< + parcel_tracking_db::ParcelTrackingContent>::LoadCallback callback), + (override)); + MOCK_METHOD(void, + LoadOneEntry, + (const std::string& key, + SessionProtoStorage<parcel_tracking_db::ParcelTrackingContent>:: + LoadCallback callback), + (override)); + MOCK_METHOD(void, + PerformMaintenance, + (const std::vector<std::string>& keys_to_keep, + const std::string& key_substring_to_match, + SessionProtoStorage<parcel_tracking_db::ParcelTrackingContent>:: + OperationCallback callback), + (override)); + MOCK_METHOD(void, + DeleteContentWithPrefix, + (const std::string& key_prefix, + SessionProtoStorage<parcel_tracking_db::ParcelTrackingContent>:: + OperationCallback callback), + (override)); + MOCK_METHOD(void, Destroy, (), (const, override)); + + void MockLoadAllResponse() { + ON_CALL(*this, LoadAllEntries) + .WillByDefault( + [](SessionProtoStorage<parcel_tracking_db::ParcelTrackingContent>:: + LoadCallback callback) { + std::move(callback).Run(true, MockDbLoadResponse()); + }); + } + + void MockOperationResult(bool succeeded) { + ON_CALL(*this, InsertContent) + .WillByDefault( + [succeeded]( + const std::string& key, + const parcel_tracking_db::ParcelTrackingContent& value, + SessionProtoStorage<parcel_tracking_db::ParcelTrackingContent>:: + OperationCallback callback) { + std::move(callback).Run(succeeded); + }); + ON_CALL(*this, DeleteOneEntry) + .WillByDefault( + [succeeded]( + const std::string& key, + SessionProtoStorage<parcel_tracking_db::ParcelTrackingContent>:: + OperationCallback callback) { + std::move(callback).Run(succeeded); + }); + ON_CALL(*this, DeleteAllContent) + .WillByDefault( + [succeeded]( + SessionProtoStorage<parcel_tracking_db::ParcelTrackingContent>:: + OperationCallback callback) { + std::move(callback).Run(succeeded); + }); + } +}; + +} // namespace + +namespace commerce { + +class ParcelsStorageTest : public testing::Test { + public: + ParcelsStorageTest() = default; + ~ParcelsStorageTest() override = default; + + void SetUp() override { + proto_db_ = std::make_unique<MockProtoStorage>(); + proto_db_->MockLoadAllResponse(); + storage_ = std::make_unique<ParcelsStorage>(proto_db_.get()); + EXPECT_CALL(*proto_db_, LoadAllEntries(_)); + storage_->Init(base::BindOnce(&DoNothing)); + } + + protected: + base::test::TaskEnvironment task_environment_; + std::unique_ptr<MockProtoStorage> proto_db_; + std::unique_ptr<ParcelsStorage> storage_; +}; + +TEST_F(ParcelsStorageTest, TestGetAllParcelStatus) { + auto all_parcels = storage_->GetAllParcelStatus(); + ASSERT_EQ(1u, all_parcels->size()); + auto& parcel_1 = (*all_parcels)[0]; + ASSERT_EQ(kTrackingId1, parcel_1.parcel_identifier().tracking_id()); + ASSERT_EQ(kCarrier1, parcel_1.parcel_identifier().carrier()); + ASSERT_EQ(kDefaultState, parcel_1.parcel_state()); +} + +TEST_F(ParcelsStorageTest, TestDeleteAllParcelStatus) { + EXPECT_CALL(*proto_db_, DeleteAllContent(_)); + storage_->DeleteAllParcelStatus(base::BindOnce(&DoNothing)); + task_environment_.RunUntilIdle(); + auto all_parcels = storage_->GetAllParcelStatus(); + ASSERT_EQ(0u, all_parcels->size()); +} + +TEST_F(ParcelsStorageTest, TestDeleteParcelStatus) { + EXPECT_CALL(*proto_db_, DeleteOneEntry(_, _)).Times(2); + + // Delete an invalid parcel identifier + ParcelIdentifier identifier; + identifier.set_carrier(commerce::ParcelIdentifier::FEDEX); + identifier.set_tracking_id("xyz"); + storage_->DeleteParcelStatus(identifier, base::BindOnce(&DoNothing)); + task_environment_.RunUntilIdle(); + + auto all_parcels = storage_->GetAllParcelStatus(); + ASSERT_EQ(1u, all_parcels->size()); + + // Delete the parcel identifier in storage. + identifier.set_carrier(kCarrier1); + identifier.set_tracking_id(kTrackingId1); + storage_->DeleteParcelStatus(identifier, base::BindOnce(&DoNothing)); + task_environment_.RunUntilIdle(); + + all_parcels = storage_->GetAllParcelStatus(); + ASSERT_EQ(0u, all_parcels->size()); +} + +TEST_F(ParcelsStorageTest, TestUpdateParcelStatus) { + EXPECT_CALL(*proto_db_, UpdateEntries(_, _)).Times(1); + + std::vector<ParcelStatus> status; + ParcelStatus status1 = CreateParcelStatus(kCarrier1, kTrackingId1, + commerce::ParcelStatus::PICKED_UP); + ParcelStatus status2 = + CreateParcelStatus(kCarrier1, kTrackingId2, kDefaultState); + status.emplace_back(status1); + status.emplace_back(status2); + + // Delete the parcel identifier in storage. + storage_->UpdateParcelStatus(status, base::BindOnce(&DoNothing)); + task_environment_.RunUntilIdle(); + + auto all_parcels = storage_->GetAllParcelStatus(); + ASSERT_EQ(2u, all_parcels->size()); + std::map<std::string, ParcelStatus> status_map; + for (int i = 0; i < 2; ++i) { + auto p = (*all_parcels)[i]; + status_map.emplace(p.parcel_identifier().tracking_id(), p); + } + + ASSERT_EQ(status1.parcel_state(), status_map[kTrackingId1].parcel_state()); + ASSERT_EQ(status2.parcel_state(), status_map[kTrackingId2].parcel_state()); +} + +} // namespace commerce
diff --git a/components/commerce/core/parcel_manager.cc b/components/commerce/core/parcel_manager.cc deleted file mode 100644 index 467cb2c..0000000 --- a/components/commerce/core/parcel_manager.cc +++ /dev/null
@@ -1,84 +0,0 @@ -// Copyright 2023 The Chromium Authors -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -#include "components/commerce/core/parcel_manager.h" - -#include "base/functional/bind.h" -#include "components/commerce/core/parcel/parcels_server_proxy.h" -#include "components/commerce/core/parcel/parcels_storage.h" -#include "services/network/public/cpp/shared_url_loader_factory.h" - -namespace commerce { - -namespace { - -void OnGetParcelStatusDone( - ParcelManager::GetParcelStatusCallback callback, - ParcelRequestStatus status, - std::unique_ptr<std::vector<ParcelStatus>> parcel_status) { - std::move(callback).Run(status == ParcelRequestStatus::kSuccess, - std::move(parcel_status)); -} - -void OnStopTrackingParcelDone( - ParcelManager::StopParcelTrackingCallback callback, - ParcelRequestStatus status) { - std::move(callback).Run(status == ParcelRequestStatus::kSuccess); -} - -void OnStopTrackingAllParcelsDone( - ParcelManager::StopParcelTrackingCallback callback, - ParcelRequestStatus status) { - std::move(callback).Run(status == ParcelRequestStatus::kSuccess); -} -} // namespace - -ParcelManager::ParcelManager( - signin::IdentityManager* identity_manager, - scoped_refptr<network::SharedURLLoaderFactory> url_loader_factory, - SessionProtoStorage<parcel_tracking_db::ParcelTrackingContent>* - parcel_tracking_proto_db, - AccountChecker* account_checker) - : parcels_server_proxy_( - std::make_unique<ParcelsServerProxy>(identity_manager, - url_loader_factory)), - parcels_storage_( - std::make_unique<ParcelsStorage>(parcel_tracking_proto_db)) {} - -ParcelManager::~ParcelManager() = default; - -void ParcelManager::StartTrackingParcels( - const std::vector<ParcelIdentifier>& parcel_identifiers, - const std::string& source_page_domain, - GetParcelStatusCallback callback) { - parcels_server_proxy_->StartTrackingParcels( - parcel_identifiers, source_page_domain, - base::BindOnce(&OnGetParcelStatusDone, std::move(callback))); -} - -void ParcelManager::GetParcelStatus( - const std::vector<ParcelIdentifier>& parcel_identifiers, - GetParcelStatusCallback callback) { - // TODO(qinmin): check db first before sending request to the server. - parcels_server_proxy_->GetParcelStatus( - parcel_identifiers, - base::BindOnce(&OnGetParcelStatusDone, std::move(callback))); -} - -void ParcelManager::StopTrackingParcel(const std::string& tracking_id, - StopParcelTrackingCallback callback) { - parcels_server_proxy_->StopTrackingParcel( - tracking_id, - base::BindOnce(&OnStopTrackingParcelDone, std::move(callback))); -} - -void ParcelManager::StopTrackingAllParcels( - StopParcelTrackingCallback callback) { - parcels_server_proxy_->StopTrackingAllParcels( - base::BindOnce(&OnStopTrackingAllParcelsDone, std::move(callback))); -} - -// Called to stop tracking a given parcel. - -} // namespace commerce
diff --git a/components/commerce/core/shopping_service.cc b/components/commerce/core/shopping_service.cc index 25c29379..8f4249d7 100644 --- a/components/commerce/core/shopping_service.cc +++ b/components/commerce/core/shopping_service.cc
@@ -25,6 +25,7 @@ #include "components/commerce/core/discounts_storage.h" #include "components/commerce/core/metrics/metrics_utils.h" #include "components/commerce/core/metrics/scheduled_metrics_manager.h" +#include "components/commerce/core/parcel/parcels_manager.h" #include "components/commerce/core/pref_names.h" #include "components/commerce/core/price_tracking_utils.h" #include "components/commerce/core/proto/commerce_subscription_db_content.pb.h" @@ -107,6 +108,21 @@ DiscountInfo& DiscountInfo::operator=(const DiscountInfo&) = default; DiscountInfo::~DiscountInfo() = default; +ParcelTrackingStatus::ParcelTrackingStatus() = default; +ParcelTrackingStatus::ParcelTrackingStatus(const ParcelTrackingStatus&) = + default; +ParcelTrackingStatus& ParcelTrackingStatus::operator=( + const ParcelTrackingStatus&) = default; +ParcelTrackingStatus::~ParcelTrackingStatus() = default; +ParcelTrackingStatus::ParcelTrackingStatus(const ParcelStatus& parcel_status) { + ParcelTrackingStatus status; + status.carrier = parcel_status.parcel_identifier().carrier(); + status.tracking_id = parcel_status.parcel_identifier().tracking_id(); + status.tracking_url = GURL(parcel_status.tracking_url()); + status.estimated_delivery_time = base::Time::FromDeltaSinceWindowsEpoch( + base::Microseconds(parcel_status.estimated_delivery_time_usec())); +} + ShoppingService::ShoppingService( const std::string& country_on_startup, const std::string& locale_on_startup, @@ -185,7 +201,7 @@ } if (parcel_tracking_proto_db) { - parcel_manager_ = std::make_unique<ParcelManager>( + parcels_manager_ = std::make_unique<ParcelsManager>( identity_manager, url_loader_factory, parcel_tracking_proto_db, account_checker_.get()); } @@ -1482,36 +1498,48 @@ } void ShoppingService::StartTrackingParcels( - const std::vector<ParcelIdentifier>& parcel_identifiers, + const std::vector<std::pair<ParcelIdentifier::Carrier, std::string>>& + parcel_identifiers, const std::string& source_page_domain, - ParcelManager::GetParcelStatusCallback callback) { - if (parcel_manager_) { - parcel_manager_->StartTrackingParcels( + GetParcelStatusCallback callback) { + if (parcels_manager_) { + parcels_manager_->StartTrackingParcels( parcel_identifiers, source_page_domain, std::move(callback)); + } else { + std::move(callback).Run( + false, std::make_unique<std::vector<ParcelTrackingStatus>>()); } } void ShoppingService::GetParcelStatus( - const std::vector<ParcelIdentifier>& parcel_identifiers, - ParcelManager::GetParcelStatusCallback callback) { - if (parcel_manager_) { - parcel_manager_->GetParcelStatus(parcel_identifiers, std::move(callback)); + const std::vector<std::pair<ParcelIdentifier::Carrier, std::string>>& + parcel_identifiers, + GetParcelStatusCallback callback) { + if (parcels_manager_) { + parcels_manager_->GetParcelStatus(parcel_identifiers, std::move(callback)); + } else { + std::move(callback).Run( + false, std::make_unique<std::vector<ParcelTrackingStatus>>()); } } void ShoppingService::StopTrackingParcel( const std::string& tracking_id, base::OnceCallback<void(bool)> callback) { - if (parcel_manager_) { - parcel_manager_->StopTrackingParcel(tracking_id, std::move(callback)); + if (parcels_manager_) { + parcels_manager_->StopTrackingParcel(tracking_id, std::move(callback)); + } else { + std::move(callback).Run(false); } } // Called to stop tracking all parcels. void ShoppingService::StopTrackingAllParcels( base::OnceCallback<void(bool)> callback) { - if (parcel_manager_) { - parcel_manager_->StopTrackingAllParcels(std::move(callback)); + if (parcels_manager_) { + parcels_manager_->StopTrackingAllParcels(std::move(callback)); + } else { + std::move(callback).Run(false); } }
diff --git a/components/commerce/core/shopping_service.h b/components/commerce/core/shopping_service.h index 6018be1..42bd83a 100644 --- a/components/commerce/core/shopping_service.h +++ b/components/commerce/core/shopping_service.h
@@ -9,6 +9,7 @@ #include <memory> #include <string> #include <tuple> +#include <utility> #include "base/cancelable_callback.h" #include "base/containers/flat_set.h" @@ -23,7 +24,6 @@ #include "base/uuid.h" #include "components/commerce/core/account_checker.h" #include "components/commerce/core/commerce_types.h" -#include "components/commerce/core/parcel_manager.h" #include "components/commerce/core/proto/commerce_subscription_db_content.pb.h" #include "components/commerce/core/proto/discounts_db_content.pb.h" #include "components/commerce/core/proto/parcel_tracking_db_content.pb.h" @@ -120,6 +120,7 @@ class BookmarkUpdateManager; class DiscountsStorage; +class ParcelsManager; class ShoppingPowerBookmarkDataProvider; class ShoppingBookmarkModelObserver; class SubscriptionsManager; @@ -400,15 +401,18 @@ // Starts tracking a list of parcels from a given page. void StartTrackingParcels( - const std::vector<ParcelIdentifier>& parcel_identifiers, + const std::vector<std::pair<ParcelIdentifier::Carrier, std::string>>& + parcel_identifiers, const std::string& source_page_domain, - ParcelManager::GetParcelStatusCallback callback); + GetParcelStatusCallback callback); // Gets status for a list of parcels. If the parcel status is outdated, a // request will be sent to the server to retrieve the information. Otherwise, // recently cached status will be returned in the callback. - void GetParcelStatus(const std::vector<ParcelIdentifier>& parcel_identifiers, - ParcelManager::GetParcelStatusCallback callback); + void GetParcelStatus( + const std::vector<std::pair<ParcelIdentifier::Carrier, std::string>>& + parcel_identifiers, + GetParcelStatusCallback callback); // Called to stop tracking a given parcel. void StopTrackingParcel(const std::string& tracking_id, @@ -662,7 +666,7 @@ std::unique_ptr<DiscountsStorage> discounts_storage_; // Object for tracking parcel status. - std::unique_ptr<ParcelManager> parcel_manager_; + std::unique_ptr<ParcelsManager> parcels_manager_; // A consent throttle that will hold callbacks until the specific consent is // obtained.
diff --git a/components/feature_engagement/public/android/java/src/org/chromium/components/feature_engagement/FeatureConstants.java b/components/feature_engagement/public/android/java/src/org/chromium/components/feature_engagement/FeatureConstants.java index 08b7f0f..b45cb34 100644 --- a/components/feature_engagement/public/android/java/src/org/chromium/components/feature_engagement/FeatureConstants.java +++ b/components/feature_engagement/public/android/java/src/org/chromium/components/feature_engagement/FeatureConstants.java
@@ -78,6 +78,7 @@ FeatureConstants.IPH_SHARING_HUB_LINK_TOGGLE_FEATURE, FeatureConstants.IPH_WEB_FEED_FOLLOW_FEATURE, FeatureConstants.IPH_WEB_FEED_POST_FOLLOW_DIALOG_FEATURE, + FeatureConstants.IPH_WEB_FEED_POST_FOLLOW_DIALOG_FEATURE_WITH_UI_UPDATE, FeatureConstants.SHARED_HIGHLIGHTING_BUILDER_FEATURE, FeatureConstants.SHARED_HIGHLIGHTING_RECEIVER_FEATURE, FeatureConstants.SHARING_HUB_WEBNOTES_STYLIZE_FEATURE, @@ -356,6 +357,12 @@ String IPH_WEB_FEED_POST_FOLLOW_DIALOG_FEATURE = "IPH_WebFeedPostFollowDialog"; /** + * A dialog IPH feature to inform users about the WebFeed post-follow after the UI update. + */ + String IPH_WEB_FEED_POST_FOLLOW_DIALOG_FEATURE_WITH_UI_UPDATE = + "IPH_WebFeedPostFollowDialogWithUIUpdate"; + + /** * An IPH feature to inform users about the link-to-text on selection share. */ String SHARED_HIGHLIGHTING_BUILDER_FEATURE = "IPH_SharedHighlightingBuilder";
diff --git a/components/feature_engagement/public/feature_configurations.cc b/components/feature_engagement/public/feature_configurations.cc index bad2049..23be00b 100644 --- a/components/feature_engagement/public/feature_configurations.cc +++ b/components/feature_engagement/public/feature_configurations.cc
@@ -941,6 +941,22 @@ return config; } + if (kIPHWebFeedPostFollowDialogFeatureWithUIUpdate.name == feature->name) { + // A config that allows one of the WebFeed post follow dialogs to be + // presented 3 times after the UI update. + absl::optional<FeatureConfig> config = FeatureConfig(); + config->valid = true; + config->availability = Comparator(ANY, 0); + config->session_rate = Comparator(ANY, 0); + config->trigger = + EventConfig("web_feed_post_follow_dialog_trigger_with_ui_update", + Comparator(LESS_THAN, 3), 360, 360); + config->used = + EventConfig("web_feed_post_follow_dialog_shown_with_ui_update", + Comparator(ANY, 0), 360, 360); + return config; + } + if (kIPHVideoTutorialNTPChromeIntroFeature.name == feature->name) { // A config that allows the chrome intro video tutorial card to show up // until explicitly interacted upon.
diff --git a/components/feature_engagement/public/feature_constants.cc b/components/feature_engagement/public/feature_constants.cc index 51a47af..6d4c165 100644 --- a/components/feature_engagement/public/feature_constants.cc +++ b/components/feature_engagement/public/feature_constants.cc
@@ -420,6 +420,9 @@ BASE_FEATURE(kIPHWebFeedPostFollowDialogFeature, "IPH_WebFeedPostFollowDialog", base::FEATURE_ENABLED_BY_DEFAULT); +BASE_FEATURE(kIPHWebFeedPostFollowDialogFeatureWithUIUpdate, + "IPH_WebFeedPostFollowDialogWithUIUpdate", + base::FEATURE_ENABLED_BY_DEFAULT); BASE_FEATURE(kIPHSharedHighlightingBuilder, "IPH_SharedHighlightingBuilder", base::FEATURE_DISABLED_BY_DEFAULT);
diff --git a/components/feature_engagement/public/feature_constants.h b/components/feature_engagement/public/feature_constants.h index 6208dd8..97c0c07f 100644 --- a/components/feature_engagement/public/feature_constants.h +++ b/components/feature_engagement/public/feature_constants.h
@@ -174,6 +174,7 @@ BASE_DECLARE_FEATURE(kIPHSharingHubLinkToggleFeature); BASE_DECLARE_FEATURE(kIPHWebFeedFollowFeature); BASE_DECLARE_FEATURE(kIPHWebFeedPostFollowDialogFeature); +BASE_DECLARE_FEATURE(kIPHWebFeedPostFollowDialogFeatureWithUIUpdate); BASE_DECLARE_FEATURE(kIPHSharedHighlightingBuilder); BASE_DECLARE_FEATURE(kIPHSharedHighlightingReceiverFeature); BASE_DECLARE_FEATURE(kIPHSharingHubWebnotesStylizeFeature);
diff --git a/components/feature_engagement/public/feature_list.cc b/components/feature_engagement/public/feature_list.cc index 0c63267..1fb410f 100644 --- a/components/feature_engagement/public/feature_list.cc +++ b/components/feature_engagement/public/feature_list.cc
@@ -105,6 +105,7 @@ &kIPHSharingHubLinkToggleFeature, &kIPHWebFeedFollowFeature, &kIPHWebFeedPostFollowDialogFeature, + &kIPHWebFeedPostFollowDialogFeatureWithUIUpdate, &kIPHSharedHighlightingBuilder, &kIPHSharedHighlightingReceiverFeature, &kIPHSharingHubWebnotesStylizeFeature,
diff --git a/components/feature_engagement/public/feature_list.h b/components/feature_engagement/public/feature_list.h index 9109b40e..6cfaac8 100644 --- a/components/feature_engagement/public/feature_list.h +++ b/components/feature_engagement/public/feature_list.h
@@ -202,6 +202,8 @@ DEFINE_VARIATION_PARAM(kIPHWebFeedFollowFeature, "IPH_WebFeedFollow"); DEFINE_VARIATION_PARAM(kIPHWebFeedPostFollowDialogFeature, "IPH_WebFeedPostFollowDialog"); +DEFINE_VARIATION_PARAM(kIPHWebFeedPostFollowDialogFeatureWithUIUpdate, + "IPH_WebFeedPostFollowDialogWithUIUpdate"); DEFINE_VARIATION_PARAM(kIPHSharedHighlightingBuilder, "IPH_SharedHighlightingBuilder"); DEFINE_VARIATION_PARAM(kIPHSharedHighlightingReceiverFeature, @@ -511,6 +513,7 @@ VARIATION_ENTRY(kIPHWebFeedAwarenessFeature), VARIATION_ENTRY(kIPHWebFeedFollowFeature), VARIATION_ENTRY(kIPHWebFeedPostFollowDialogFeature), + VARIATION_ENTRY(kIPHWebFeedPostFollowDialogFeatureWithUIUpdate), VARIATION_ENTRY(kIPHSharedHighlightingBuilder), VARIATION_ENTRY(kIPHSharedHighlightingReceiverFeature), VARIATION_ENTRY(kIPHSharingHubWebnotesStylizeFeature),
diff --git a/components/gwp_asan/client/guarded_page_allocator.cc b/components/gwp_asan/client/guarded_page_allocator.cc index d0be2f8..e1c13bb7 100644 --- a/components/gwp_asan/client/guarded_page_allocator.cc +++ b/components/gwp_asan/client/guarded_page_allocator.cc
@@ -432,7 +432,7 @@ metadata_[metadata_idx].alloc_size = size; metadata_[metadata_idx].alloc_ptr = reinterpret_cast<uintptr_t>(ptr); - void* trace[AllocatorState::kMaxStackFrames]; + const void* trace[AllocatorState::kMaxStackFrames]; size_t len = AllocationInfo::GetStackTrace(trace, AllocatorState::kMaxStackFrames); metadata_[metadata_idx].alloc.trace_len = @@ -450,7 +450,7 @@ void GuardedPageAllocator::RecordDeallocationMetadata( AllocatorState::MetadataIdx metadata_idx) { - void* trace[AllocatorState::kMaxStackFrames]; + const void* trace[AllocatorState::kMaxStackFrames]; size_t len = AllocationInfo::GetStackTrace(trace, AllocatorState::kMaxStackFrames); metadata_[metadata_idx].dealloc.trace_len =
diff --git a/components/gwp_asan/client/lightweight_detector.cc b/components/gwp_asan/client/lightweight_detector.cc index 20dbb80..bb29aa72 100644 --- a/components/gwp_asan/client/lightweight_detector.cc +++ b/components/gwp_asan/client/lightweight_detector.cc
@@ -70,7 +70,7 @@ slot_metadata.alloc_size = size; slot_metadata.alloc_ptr = reinterpret_cast<uintptr_t>(ptr); - void* trace[LightweightDetectorState::kMaxStackFrames]; + const void* trace[LightweightDetectorState::kMaxStackFrames]; size_t len = AllocationInfo::GetStackTrace( trace, LightweightDetectorState::kMaxStackFrames); slot_metadata.dealloc.trace_len =
diff --git a/components/gwp_asan/common/allocation_info.cc b/components/gwp_asan/common/allocation_info.cc index c0033df1..6b11a209 100644 --- a/components/gwp_asan/common/allocation_info.cc +++ b/components/gwp_asan/common/allocation_info.cc
@@ -13,7 +13,7 @@ namespace gwp_asan::internal { -size_t AllocationInfo::GetStackTrace(void** trace, size_t count) { +size_t AllocationInfo::GetStackTrace(const void** trace, size_t count) { // TODO(vtsyrklevich): Investigate using trace_event::CFIBacktraceAndroid // on 32-bit Android for canary/dev (where we can dynamically load unwind // data.) @@ -22,8 +22,7 @@ // stack trace collection for base::debug::StackTrace doesn't work; however, // AArch64 builds ship with frame pointers so we can still collect stack // traces in that case. - return base::debug::TraceStackFramePointers(const_cast<const void**>(trace), - count, 0); + return base::debug::TraceStackFramePointers(trace, count, 0); #else return base::debug::CollectStackTrace(trace, count); #endif
diff --git a/components/gwp_asan/common/allocation_info.h b/components/gwp_asan/common/allocation_info.h index f8180f0..edbe0a43 100644 --- a/components/gwp_asan/common/allocation_info.h +++ b/components/gwp_asan/common/allocation_info.h
@@ -11,7 +11,7 @@ // Information saved for allocations and deallocations. struct AllocationInfo { - static size_t GetStackTrace(void** trace, size_t count); + static size_t GetStackTrace(const void** trace, size_t count); static uint64_t GetCurrentTid(); // (De)allocation thread id or base::kInvalidThreadId if no (de)allocation
diff --git a/components/omnibox/browser/autocomplete_controller.cc b/components/omnibox/browser/autocomplete_controller.cc index 2377d401..a55f1e1 100644 --- a/components/omnibox/browser/autocomplete_controller.cc +++ b/components/omnibox/browser/autocomplete_controller.cc
@@ -1755,8 +1755,10 @@ // score to the match with the highest respective model prediction score. if (!OmniboxFieldTrial::IsMlUrlScoringCounterfactual()) { auto match_itr = prediction_and_match_itr_heap.top().second; - match_itr->RecordAdditionalInfo("ml_legacy_relevance", + match_itr->RecordAdditionalInfo("ml legacy relevance", match_itr->relevance); + match_itr->RecordAdditionalInfo( + "ml model output", (prediction_and_match_itr_heap.top().first * 100)); match_itr->relevance = relevance_heap.top(); } relevance_heap.pop();
diff --git a/components/segmentation_platform/embedder/default_model/default_model_test_base.cc b/components/segmentation_platform/embedder/default_model/default_model_test_base.cc index 133d9a6e..79c0fa94 100644 --- a/components/segmentation_platform/embedder/default_model/default_model_test_base.cc +++ b/components/segmentation_platform/embedder/default_model/default_model_test_base.cc
@@ -79,6 +79,7 @@ auto result = ExecuteWithInput(input); EXPECT_TRUE(result.has_value()); + EXPECT_TRUE(fetched_metadata_); EXPECT_TRUE(fetched_metadata_->has_output_config()); auto prediction_result = metadata_utils::CreatePredictionResult( result.value(), fetched_metadata_->output_config(), base::Time::Now(),
diff --git a/components/segmentation_platform/embedder/default_model/intentional_user_model.cc b/components/segmentation_platform/embedder/default_model/intentional_user_model.cc index 051abb4e..a379916 100644 --- a/components/segmentation_platform/embedder/default_model/intentional_user_model.cc +++ b/components/segmentation_platform/embedder/default_model/intentional_user_model.cc
@@ -26,10 +26,14 @@ constexpr int64_t kIntentionalUserSignalStorageLength = 28; // Wait until we have 7 days of data. constexpr int64_t kIntentionalUserMinSignalCollectionLength = 7; +// Refresh result every 7 days. +constexpr int64_t kIntentionalUserResultTTLDays = 7; // Threshold for our heuristic, if the user launched Chrome directly at least 2 // times in the last 28 days then we consider them an intentional user. constexpr int64_t kIntentionalLaunchThreshold = 2; +constexpr int64_t kIntentionalUserModelVersion = 2; + // InputFeatures. // MobileStartup.LaunchCause enum values to record an aggregate, these values @@ -66,8 +70,6 @@ config->AddSegmentId(SegmentId::INTENTIONAL_USER_SEGMENT, std::make_unique<IntentionalUserModel>()); config->auto_execute_and_cache = true; - config->segment_selection_ttl = base::Days(7); - config->unknown_selection_ttl = base::Days(7); config->is_boolean_segment = true; return config; @@ -84,15 +86,23 @@ kIntentionalUserMinSignalCollectionLength, kIntentionalUserSignalStorageLength); - // Set discrete mapping. - writer.AddBooleanSegmentDiscreteMapping(kIntentionalUserKey); + // If the result from ExecuteModelWithInput is greater than 0.5 then return + // the intentional user label, otherwise return the non-intentional label. + writer.AddOutputConfigForBinaryClassifier( + /*threshold=*/0.5f, /*positive_label=*/ + SegmentIdToHistogramVariant(SegmentId::INTENTIONAL_USER_SEGMENT), + /*negative_label=*/kLegacyNegativeLabel); + writer.AddPredictedResultTTLInOutputConfig( + /*top_label_to_ttl_list=*/{}, + /*default_ttl=*/kIntentionalUserResultTTLDays, + /*time_unit=*/proto::TimeUnit::DAY); // Set features. writer.AddUmaFeatures(kIntentionalUserUMAFeatures.data(), kIntentionalUserUMAFeatures.size()); return std::make_unique<ModelConfig>(std::move(intentional_user_metadata), - /*model_version=*/1); + kIntentionalUserModelVersion); } void IntentionalUserModel::ExecuteModelWithInput(
diff --git a/components/segmentation_platform/embedder/default_model/intentional_user_model_unittest.cc b/components/segmentation_platform/embedder/default_model/intentional_user_model_unittest.cc index c94c498..9d0b2b4 100644 --- a/components/segmentation_platform/embedder/default_model/intentional_user_model_unittest.cc +++ b/components/segmentation_platform/embedder/default_model/intentional_user_model_unittest.cc
@@ -5,6 +5,7 @@ #include "components/segmentation_platform/embedder/default_model/intentional_user_model.h" #include "components/segmentation_platform/embedder/default_model/default_model_test_base.h" +#include "components/segmentation_platform/public/constants.h" namespace segmentation_platform { @@ -45,4 +46,20 @@ /*expected_result=*/{1}); } +TEST_F(IntentionalUserModelTest, TestLabels) { + ExpectInitAndFetchModel(); + + // If Chrome hasn't been launched from its main launcher icon then the user is + // not intentional. + ExpectClassifierResults({0}, {kLegacyNegativeLabel}); + ExpectClassifierResults({1}, {kLegacyNegativeLabel}); + + // If chrome was launched at least twice from its main laincher icon then the + // user is intentional. + ExpectClassifierResults( + {2}, {SegmentIdToHistogramVariant(SegmentId::INTENTIONAL_USER_SEGMENT)}); + ExpectClassifierResults( + {10}, {SegmentIdToHistogramVariant(SegmentId::INTENTIONAL_USER_SEGMENT)}); +} + } // namespace segmentation_platform
diff --git a/components/segmentation_platform/embedder/default_model/resume_heavy_user_model.cc b/components/segmentation_platform/embedder/default_model/resume_heavy_user_model.cc index 6acddbfc..29e35d34 100644 --- a/components/segmentation_platform/embedder/default_model/resume_heavy_user_model.cc +++ b/components/segmentation_platform/embedder/default_model/resume_heavy_user_model.cc
@@ -22,8 +22,7 @@ // Default parameters for the model. constexpr SegmentId kSegmentId = SegmentId::RESUME_HEAVY_USER_SEGMENT; -constexpr int kResumeHeavyUserSegmentSelectionTTLDays = 14; -constexpr int kResumeHeavyUserSegmentUnknownSelectionTTLDays = 14; +constexpr int64_t kModelVersion = 2; // InputFeatures. constexpr std::array<MetadataWriter::UMAFeature, 5> kUMAFeatures = { @@ -50,16 +49,6 @@ config->AddSegmentId(SegmentId::RESUME_HEAVY_USER_SEGMENT, std::make_unique<ResumeHeavyUserModel>()); config->auto_execute_and_cache = true; - config->segment_selection_ttl = - base::Days(base::GetFieldTrialParamByFeatureAsInt( - features::kResumeHeavyUserSegmentFeature, - kVariationsParamNameSegmentSelectionTTLDays, - kResumeHeavyUserSegmentSelectionTTLDays)); - config->unknown_selection_ttl = - base::Days(base::GetFieldTrialParamByFeatureAsInt( - features::kResumeHeavyUserSegmentFeature, - kVariationsParamNameUnknownSelectionTTLDays, - kResumeHeavyUserSegmentUnknownSelectionTTLDays)); config->is_boolean_segment = true; return config; @@ -76,13 +65,19 @@ /*min_signal_collection_length_days=*/7, /*signal_storage_length_days=*/14); - // Set discrete mapping. - writer.AddBooleanSegmentDiscreteMapping(kResumeHeavyUserKey); + // Set OutputConfig. + writer.AddOutputConfigForBinaryClassifier( + /*threshold=*/0.5f, + /*positive_label=*/SegmentIdToHistogramVariant(kSegmentId), + /*negative_label=*/kLegacyNegativeLabel); + + writer.AddPredictedResultTTLInOutputConfig( + /*top_label_to_ttl_list=*/{}, /*default_ttl=*/14, + /*time_unit=*/proto::TimeUnit::DAY); // Set features. writer.AddUmaFeatures(kUMAFeatures.data(), kUMAFeatures.size()); - return std::make_unique<ModelConfig>(std::move(metadata), - /*model_version=*/1); + return std::make_unique<ModelConfig>(std::move(metadata), kModelVersion); } void ResumeHeavyUserModel::ExecuteModelWithInput(
diff --git a/components/segmentation_platform/embedder/default_model/resume_heavy_user_model_unittest.cc b/components/segmentation_platform/embedder/default_model/resume_heavy_user_model_unittest.cc index 85df72b5..a2013dd 100644 --- a/components/segmentation_platform/embedder/default_model/resume_heavy_user_model_unittest.cc +++ b/components/segmentation_platform/embedder/default_model/resume_heavy_user_model_unittest.cc
@@ -17,19 +17,26 @@ TEST_F(ResumeHeavyUserModelTest, InitAndFetchModel) { ExpectInitAndFetchModel(); + ASSERT_TRUE(fetched_metadata_); } TEST_F(ResumeHeavyUserModelTest, ExecuteModelWithInput) { + ExpectInitAndFetchModel(); + ASSERT_TRUE(fetched_metadata_); + + EXPECT_FALSE(ExecuteWithInput(/*inputs=*/{})); + + ModelProvider::Request input = {}; // Input arguments in order: bookmarks_opened, mv_tiles_clicked, // opened_ntp_from_tab_groups, opened_item_from_history - ExpectExecutionWithInput(/*inputs=*/{0, 0, 0, 0, 0}, /*expected_error=*/false, - /*expected_result=*/{0}); - ExpectExecutionWithInput(/*inputs=*/{1, 0, 0, 0, 0}, /*expected_error=*/false, - /*expected_result=*/{0}); - ExpectExecutionWithInput(/*inputs=*/{2, 0, 0, 0, 0}, /*expected_error=*/false, - /*expected_result=*/{1}); - ExpectExecutionWithInput(/*inputs=*/{0, 3, 0, 0, 0}, /*expected_error=*/false, - /*expected_result=*/{1}); + ExpectClassifierResults(/*input=*/{0, 0, 0, 0, 0}, {kLegacyNegativeLabel}); + ExpectClassifierResults(/*input=*/{1, 0, 0, 0, 0}, {kLegacyNegativeLabel}); + ExpectClassifierResults( + /*input=*/{2, 0, 0, 0, 0}, + {SegmentIdToHistogramVariant(SegmentId::RESUME_HEAVY_USER_SEGMENT)}); + ExpectClassifierResults( + /*input=*/{0, 3, 0, 0, 0}, + {SegmentIdToHistogramVariant(SegmentId::RESUME_HEAVY_USER_SEGMENT)}); } } // namespace segmentation_platform
diff --git a/components/segmentation_platform/internal/metadata/metadata_utils.cc b/components/segmentation_platform/internal/metadata/metadata_utils.cc index 31c4b8c..3c457c4 100644 --- a/components/segmentation_platform/internal/metadata/metadata_utils.cc +++ b/components/segmentation_platform/internal/metadata/metadata_utils.cc
@@ -530,9 +530,7 @@ SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_FEED_USER, SegmentId::OPTIMIZATION_TARGET_SEGMENTATION_CHROME_START_ANDROID_V2, SegmentId::POWER_USER_SEGMENT, - SegmentId::CROSS_DEVICE_USER_SEGMENT, - SegmentId::INTENTIONAL_USER_SEGMENT, - SegmentId::RESUME_HEAVY_USER_SEGMENT}; + SegmentId::CROSS_DEVICE_USER_SEGMENT}; return segment_ids_use_legacy.contains(segment_id); }
diff --git a/components/segmentation_platform/internal/post_processor/post_processor.cc b/components/segmentation_platform/internal/post_processor/post_processor.cc index 2f149c7a..24c7b5f 100644 --- a/components/segmentation_platform/internal/post_processor/post_processor.cc +++ b/components/segmentation_platform/internal/post_processor/post_processor.cc
@@ -4,9 +4,11 @@ #include "components/segmentation_platform/internal/post_processor/post_processor.h" +#include "base/time/time.h" #include "components/segmentation_platform/internal/metadata/metadata_utils.h" #include "base/check_op.h" +#include "base/logging.h" #include "base/notreached.h" #include "components/segmentation_platform/public/result.h" @@ -212,6 +214,12 @@ if (prediction_result.result_size() > 0 && prediction_result.has_output_config()) { ordered_labels = GetClassifierResults(prediction_result); + if (!prediction_result.output_config().has_predicted_result_ttl()) { + LOG(ERROR) << "Prediction result has no `predicted_result_ttl` on its " + "`output_config`, returning empty TTL."; + return base::TimeDelta(); + } + auto predicted_result_ttl = prediction_result.output_config().predicted_result_ttl(); auto top_label_to_ttl_map = predicted_result_ttl.top_label_to_ttl_map();
diff --git a/components/segmentation_platform/internal/selection/request_dispatcher.cc b/components/segmentation_platform/internal/selection/request_dispatcher.cc index 34ab4ac..f0f768b 100644 --- a/components/segmentation_platform/internal/selection/request_dispatcher.cc +++ b/components/segmentation_platform/internal/selection/request_dispatcher.cc
@@ -169,10 +169,10 @@ WrappedCallback callback) { if (storage_service_->config_holder()->IsLegacySegmentationKey( segmentation_key)) { - VLOG(1) << "Segmentation key: " << segmentation_key - << " is using a legacy config with the new API which is not " - "supported. Legacy segments should use " - "GetSelectedSegmentOnDemand or migrate to the new config."; + LOG(ERROR) << "Segmentation key: " << segmentation_key + << " is using a legacy config with the new API which is not " + "supported. Legacy segments should use " + "GetSelectedSegmentOnDemand or migrate to the new config."; base::SingleThreadTaskRunner::GetCurrentDefault()->PostTask( FROM_HERE, base::BindOnce(std::move(callback), /*is_cached_result=*/false,
diff --git a/components/variations/cros_evaluate_seed/BUILD.gn b/components/variations/cros_evaluate_seed/BUILD.gn index 8b7900d..b6b72c11 100644 --- a/components/variations/cros_evaluate_seed/BUILD.gn +++ b/components/variations/cros_evaluate_seed/BUILD.gn
@@ -19,6 +19,8 @@ "cros_safe_seed_manager.h", "cros_variations_field_trial_creator.cc", "cros_variations_field_trial_creator.h", + "early_boot_enabled_state_provider.cc", + "early_boot_enabled_state_provider.h", "early_boot_seed_store.cc", "early_boot_seed_store.h", "evaluate_seed.cc", @@ -43,6 +45,7 @@ testonly = true sources = [ "cros_safe_seed_manager_unittest.cc", + "early_boot_enabled_state_provider_unittest.cc", "early_boot_seed_store_unittest.cc", "evaluate_seed_unittest.cc", ]
diff --git a/components/variations/cros_evaluate_seed/early_boot_enabled_state_provider.cc b/components/variations/cros_evaluate_seed/early_boot_enabled_state_provider.cc new file mode 100644 index 0000000..7e3837a --- /dev/null +++ b/components/variations/cros_evaluate_seed/early_boot_enabled_state_provider.cc
@@ -0,0 +1,20 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/variations/cros_evaluate_seed/early_boot_enabled_state_provider.h" + +namespace variations::cros_early_boot::evaluate_seed { + +EarlyBootEnabledStateProvider::EarlyBootEnabledStateProvider() = default; +EarlyBootEnabledStateProvider::~EarlyBootEnabledStateProvider() = default; + +bool EarlyBootEnabledStateProvider::IsConsentGiven() const { + return false; +} + +bool EarlyBootEnabledStateProvider::IsReportingEnabled() const { + return false; +} + +} // namespace variations::cros_early_boot::evaluate_seed
diff --git a/components/variations/cros_evaluate_seed/early_boot_enabled_state_provider.h b/components/variations/cros_evaluate_seed/early_boot_enabled_state_provider.h new file mode 100644 index 0000000..1c96057 --- /dev/null +++ b/components/variations/cros_evaluate_seed/early_boot_enabled_state_provider.h
@@ -0,0 +1,33 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef COMPONENTS_VARIATIONS_CROS_EVALUATE_SEED_EARLY_BOOT_ENABLED_STATE_PROVIDER_H_ +#define COMPONENTS_VARIATIONS_CROS_EVALUATE_SEED_EARLY_BOOT_ENABLED_STATE_PROVIDER_H_ + +#include <components/metrics/enabled_state_provider.h> + +namespace variations::cros_early_boot::evaluate_seed { + +// Override of EnabledStateProvider to determine whether to report metrics in +// early-boot contexts on ChromeOS. +// This is a trivial class: we never want to report metrics in early-boot, as +// they'd be too easily confused with metrics from chromium. +class EarlyBootEnabledStateProvider : public metrics::EnabledStateProvider { + public: + EarlyBootEnabledStateProvider(); + + EarlyBootEnabledStateProvider(const EarlyBootEnabledStateProvider&) = delete; + EarlyBootEnabledStateProvider& operator=( + const EarlyBootEnabledStateProvider&) = delete; + + ~EarlyBootEnabledStateProvider() override; + + // EnabledStateProvider methods + bool IsConsentGiven() const override; + bool IsReportingEnabled() const override; +}; + +} // namespace variations::cros_early_boot::evaluate_seed + +#endif // COMPONENTS_VARIATIONS_CROS_EVALUATE_SEED_EARLY_BOOT_ENABLED_STATE_PROVIDER_H_
diff --git a/components/variations/cros_evaluate_seed/early_boot_enabled_state_provider_unittest.cc b/components/variations/cros_evaluate_seed/early_boot_enabled_state_provider_unittest.cc new file mode 100644 index 0000000..c66abb8 --- /dev/null +++ b/components/variations/cros_evaluate_seed/early_boot_enabled_state_provider_unittest.cc
@@ -0,0 +1,25 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "components/variations/cros_evaluate_seed/early_boot_enabled_state_provider.h" + +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" + +namespace variations::cros_early_boot::evaluate_seed { + +namespace { + +TEST(EarlyBootEnabledStateProviderTest, Consent) { + EarlyBootEnabledStateProvider provider; + EXPECT_FALSE(provider.IsConsentGiven()); +} + +TEST(EarlyBootEnabledStateProviderTest, ReportingEnabled) { + EarlyBootEnabledStateProvider provider; + EXPECT_FALSE(provider.IsReportingEnabled()); +} + +} // namespace +} // namespace variations::cros_early_boot::evaluate_seed
diff --git a/content/browser/attribution_reporting/attribution_storage_delegate_impl_unittest.cc b/content/browser/attribution_reporting/attribution_storage_delegate_impl_unittest.cc index 9e8ead1..a6710c06 100644 --- a/content/browser/attribution_reporting/attribution_storage_delegate_impl_unittest.cc +++ b/content/browser/attribution_reporting/attribution_storage_delegate_impl_unittest.cc
@@ -134,7 +134,7 @@ base::Time source_time = base::Time::Now(); const AttributionReport report = GetReport(source_time, /*trigger_time=*/source_time); - EXPECT_EQ(source_time + kDefaultFirstWindow + base::Hours(1), + EXPECT_EQ(source_time + kDefaultFirstWindow, AttributionStorageDelegateImpl().GetEventLevelReportTime( report.GetStoredSource()->event_report_windows(), source_time, report.attribution_info().time)); @@ -146,7 +146,7 @@ base::Time trigger_time = source_time + kDefaultFirstWindow - base::Minutes(1); const AttributionReport report = GetReport(source_time, trigger_time); - EXPECT_EQ(source_time + kDefaultFirstWindow + base::Hours(1), + EXPECT_EQ(source_time + kDefaultFirstWindow, AttributionStorageDelegateImpl().GetEventLevelReportTime( report.GetStoredSource()->event_report_windows(), source_time, report.attribution_info().time)); @@ -161,7 +161,7 @@ base::Time trigger_time = source_time + kDefaultFirstWindow + base::Minutes(1); const AttributionReport report = GetReport(source_time, trigger_time); - EXPECT_EQ(source_time + kDefaultSecondWindow + base::Hours(1), + EXPECT_EQ(source_time + kDefaultSecondWindow, AttributionStorageDelegateImpl().GetEventLevelReportTime( report.GetStoredSource()->event_report_windows(), source_time, report.attribution_info().time)); @@ -175,7 +175,7 @@ // Set the impression to expire before the first window. const AttributionReport report = GetReport(source_time, trigger_time, /*expiry=*/base::Hours(2)); - EXPECT_EQ(source_time + base::Hours(3), + EXPECT_EQ(source_time + base::Hours(2), AttributionStorageDelegateImpl().GetEventLevelReportTime( report.GetStoredSource()->event_report_windows(), source_time, report.attribution_info().time)); @@ -190,7 +190,7 @@ const AttributionReport report = GetReport(source_time, trigger_time, /*expiry=*/base::Days(4)); - EXPECT_EQ(source_time + base::Days(4) + base::Hours(1), + EXPECT_EQ(source_time + base::Days(4), AttributionStorageDelegateImpl().GetEventLevelReportTime( report.GetStoredSource()->event_report_windows(), source_time, report.attribution_info().time)); @@ -205,8 +205,7 @@ const AttributionReport report = GetReport(source_time, trigger_time, /*expiry=*/base::Days(9)); - // The expiry window is reported one hour after expiry time. - EXPECT_EQ(source_time + base::Days(9) + base::Hours(1), + EXPECT_EQ(source_time + base::Days(9), AttributionStorageDelegateImpl().GetEventLevelReportTime( report.GetStoredSource()->event_report_windows(), source_time, report.attribution_info().time)); @@ -303,11 +302,10 @@ constexpr base::TimeDelta kExpiry = base::Days(9); constexpr base::Time kEarlyReportTime1 = - kImpressionTime + kDefaultFirstWindow + base::Hours(1); + kImpressionTime + kDefaultFirstWindow; constexpr base::Time kEarlyReportTime2 = - kImpressionTime + kDefaultSecondWindow + base::Hours(1); - constexpr base::Time kExpiryReportTime = - kImpressionTime + kExpiry + base::Hours(1); + kImpressionTime + kDefaultSecondWindow; + constexpr base::Time kExpiryReportTime = kImpressionTime + kExpiry; const struct { SourceType source_type; @@ -325,8 +323,7 @@ .sequence_index = 1, .expected = {{ .trigger_data = 0, - .trigger_time = - kExpiryReportTime - base::Hours(1) - base::Milliseconds(1), + .trigger_time = kExpiryReportTime - base::Milliseconds(1), .report_time = kExpiryReportTime, }}, }, @@ -335,8 +332,7 @@ .sequence_index = 2, .expected = {{ .trigger_data = 1, - .trigger_time = - kExpiryReportTime - base::Hours(1) - base::Milliseconds(1), + .trigger_time = kExpiryReportTime - base::Milliseconds(1), .report_time = kExpiryReportTime, }}, }, @@ -351,8 +347,7 @@ .sequence_index = 20, .expected = {{ .trigger_data = 3, - .trigger_time = - kEarlyReportTime1 - base::Hours(1) - base::Milliseconds(1), + .trigger_time = kEarlyReportTime1 - base::Milliseconds(1), .report_time = kEarlyReportTime1, }}, }, @@ -363,14 +358,12 @@ { { .trigger_data = 4, - .trigger_time = kEarlyReportTime1 - base::Hours(1) - - base::Milliseconds(1), + .trigger_time = kEarlyReportTime1 - base::Milliseconds(1), .report_time = kEarlyReportTime1, }, { .trigger_data = 2, - .trigger_time = kEarlyReportTime1 - base::Hours(1) - - base::Milliseconds(1), + .trigger_time = kEarlyReportTime1 - base::Milliseconds(1), .report_time = kEarlyReportTime1, }, }, @@ -382,14 +375,12 @@ { { .trigger_data = 4, - .trigger_time = kEarlyReportTime1 - base::Hours(1) - - base::Milliseconds(1), + .trigger_time = kEarlyReportTime1 - base::Milliseconds(1), .report_time = kEarlyReportTime1, }, { .trigger_data = 4, - .trigger_time = kEarlyReportTime1 - base::Hours(1) - - base::Milliseconds(1), + .trigger_time = kEarlyReportTime1 - base::Milliseconds(1), .report_time = kEarlyReportTime1, }, }, @@ -401,20 +392,17 @@ { { .trigger_data = 1, - .trigger_time = kExpiryReportTime - base::Hours(1) - - base::Milliseconds(1), + .trigger_time = kExpiryReportTime - base::Milliseconds(1), .report_time = kExpiryReportTime, }, { .trigger_data = 6, - .trigger_time = kEarlyReportTime2 - base::Hours(1) - - base::Milliseconds(1), + .trigger_time = kEarlyReportTime2 - base::Milliseconds(1), .report_time = kEarlyReportTime2, }, { .trigger_data = 7, - .trigger_time = kEarlyReportTime1 - base::Hours(1) - - base::Milliseconds(1), + .trigger_time = kEarlyReportTime1 - base::Milliseconds(1), .report_time = kEarlyReportTime1, }, },
diff --git a/content/browser/attribution_reporting/attribution_utils.cc b/content/browser/attribution_reporting/attribution_utils.cc index c19bae0..f4b6570 100644 --- a/content/browser/attribution_reporting/attribution_utils.cc +++ b/content/browser/attribution_reporting/attribution_utils.cc
@@ -15,7 +15,6 @@ namespace { -constexpr base::TimeDelta kWindowDeadlineOffset = base::Hours(1); constexpr base::TimeDelta kWindowTinyOffset = base::Milliseconds(1); } // namespace @@ -28,8 +27,8 @@ base::Time LastTriggerTimeForReportTime(base::Time report_time) { // kWindowTinyOffset is needed as the window is not selected right at - // report_time - kWindowDeadlineOffset. - return report_time - kWindowDeadlineOffset - kWindowTinyOffset; + // report_time. + return report_time - kWindowTinyOffset; } std::string SerializeAttributionJson(base::ValueView body, bool pretty_print) {
diff --git a/content/browser/attribution_reporting/attribution_utils_unittest.cc b/content/browser/attribution_reporting/attribution_utils_unittest.cc index d571b43..e9a9b88 100644 --- a/content/browser/attribution_reporting/attribution_utils_unittest.cc +++ b/content/browser/attribution_reporting/attribution_utils_unittest.cc
@@ -12,8 +12,7 @@ TEST(AttributionUtilsTest, LastTriggerTimeForReportTime) { const base::Time time = base::Time::Now(); - EXPECT_EQ(LastTriggerTimeForReportTime(time), - time - base::Hours(1) - base::Milliseconds(1)); + EXPECT_EQ(LastTriggerTimeForReportTime(time), time - base::Milliseconds(1)); } } // namespace
diff --git a/content/browser/devtools/protocol/network_handler.cc b/content/browser/devtools/protocol/network_handler.cc index ee5dd47..0b5e6e1 100644 --- a/content/browser/devtools/protocol/network_handler.cc +++ b/content/browser/devtools/protocol/network_handler.cc
@@ -827,6 +827,11 @@ blockedReasons->push_back( Network::SetCookieBlockedReasonEnum::UnknownError); } + if (status.HasExclusionReason( + net::CookieInclusionStatus::EXCLUDE_NO_COOKIE_CONTENT)) { + blockedReasons->push_back( + Network::SetCookieBlockedReasonEnum::NoCookieContent); + } return blockedReasons; }
diff --git a/content/browser/devtools/protocol/storage_handler.cc b/content/browser/devtools/protocol/storage_handler.cc index 158460d..09922b47 100644 --- a/content/browser/devtools/protocol/storage_handler.cc +++ b/content/browser/devtools/protocol/storage_handler.cc
@@ -1030,15 +1030,9 @@ case AccessType::kBid: type_enum = Storage::InterestGroupAccessTypeEnum::Bid; break; - case AccessType::kAdditionalBid: - type_enum = Storage::InterestGroupAccessTypeEnum::AdditionalBid; - break; case AccessType::kWin: type_enum = Storage::InterestGroupAccessTypeEnum::Win; break; - case AccessType::kAdditionalBidWin: - type_enum = Storage::InterestGroupAccessTypeEnum::AdditionalBidWin; - break; }; frontend_->InterestGroupAccessed(access_time.ToDoubleT(), type_enum, owner_origin.Serialize(), name);
diff --git a/content/browser/interest_group/ad_auction_service_impl.cc b/content/browser/interest_group/ad_auction_service_impl.cc index bd7dd234..bc55a0b7 100644 --- a/content/browser/interest_group/ad_auction_service_impl.cc +++ b/content/browser/interest_group/ad_auction_service_impl.cc
@@ -445,6 +445,7 @@ void AdAuctionServiceImpl::GetInterestGroupAdAuctionData( const url::Origin& seller, + blink::mojom::AdAuctionCoordinator coordinator, GetInterestGroupAdAuctionDataCallback callback) { // If the interest group API is not allowed for this origin do nothing. if (!IsInterestGroupAPIAllowed( @@ -456,6 +457,7 @@ BiddingAndAuctionDataConstructionState state; state.callback = std::move(callback); state.seller = seller; + state.coordinator = coordinator; GetInterestGroupManager().GetInterestGroupAdAuctionData( GetTopWindowOrigin(), @@ -840,8 +842,9 @@ } state.data = std::move(data); + blink::mojom::AdAuctionCoordinator coordinator = state.coordinator; GetInterestGroupManager().GetBiddingAndAuctionServerKey( - GetRefCountedTrustedURLLoaderFactory().get(), + GetRefCountedTrustedURLLoaderFactory().get(), coordinator, base::BindOnce(&AdAuctionServiceImpl::OnGotBiddingAndAuctionServerKey, weak_ptr_factory_.GetWeakPtr(), std::move(state))); }
diff --git a/content/browser/interest_group/ad_auction_service_impl.h b/content/browser/interest_group/ad_auction_service_impl.h index 4a4af67d..78db7fdc 100644 --- a/content/browser/interest_group/ad_auction_service_impl.h +++ b/content/browser/interest_group/ad_auction_service_impl.h
@@ -81,6 +81,7 @@ DeprecatedReplaceInURNCallback callback) override; void GetInterestGroupAdAuctionData( const url::Origin& seller, + blink::mojom::AdAuctionCoordinator coordinator, GetInterestGroupAdAuctionDataCallback callback) override; void CreateAdRequest(blink::mojom::AdRequestConfigPtr config, CreateAdRequestCallback callback) override; @@ -118,6 +119,7 @@ BiddingAndAuctionData data; base::Uuid request_id; url::Origin seller; + blink::mojom::AdAuctionCoordinator coordinator; GetInterestGroupAdAuctionDataCallback callback; };
diff --git a/content/browser/interest_group/ad_auction_service_impl_unittest.cc b/content/browser/interest_group/ad_auction_service_impl_unittest.cc index b6f93b3..4027c36 100644 --- a/content/browser/interest_group/ad_auction_service_impl_unittest.cc +++ b/content/browser/interest_group/ad_auction_service_impl_unittest.cc
@@ -8444,7 +8444,7 @@ base::RunLoop run_loop; absl::optional<AdAuctionDataAndId> output; interest_service->GetInterestGroupAdAuctionData( - seller, + seller, blink::mojom::AdAuctionCoordinator::kGCP, base::BindLambdaForTesting([&](mojo_base::BigBuffer result, const absl::optional<base::Uuid>& id) { AdAuctionDataAndId data;
diff --git a/content/browser/interest_group/auction_runner_unittest.cc b/content/browser/interest_group/auction_runner_unittest.cc index 2003a39..48418bed 100644 --- a/content/browser/interest_group/auction_runner_unittest.cc +++ b/content/browser/interest_group/auction_runner_unittest.cc
@@ -4752,24 +4752,9 @@ ElementsAreRequests( BuildPrivateAggregationRequest(/*bucket=*/10, /*value=*/23), BuildPrivateAggregationRequest(/*bucket=*/30, /*value=*/43))))); - // Bid count should only be incremented by 1. - base::RunLoop run_loop; - interest_group_manager_->GetInterestGroup( - kBidder1Key, - base::BindLambdaForTesting( - [&](absl::optional<StorageInterestGroup> interest_group) { - ASSERT_TRUE(interest_group); - // MakeInterestGroup() set `bid_count` to 5, so it should be 6 - // (not 7). - EXPECT_EQ(6, interest_group->bidding_browser_signals->bid_count); - run_loop.Quit(); - })); - run_loop.Run(); - - // Both uses should get reported to the observer, however. EXPECT_THAT(result_.interest_groups_that_bid, - testing::UnorderedElementsAre(kBidder1Key, kBidder1Key)); + testing::UnorderedElementsAre(kBidder1Key)); EXPECT_EQ(R"({"renderURL":"https://component2-bid.test/"})", result_.winning_group_ad_metadata); // Currently an interest group participating twice in an auction is counted
diff --git a/content/browser/interest_group/bidding_and_auction_server_key_fetcher.cc b/content/browser/interest_group/bidding_and_auction_server_key_fetcher.cc index cb51bd4..6a02ab6 100644 --- a/content/browser/interest_group/bidding_and_auction_server_key_fetcher.cc +++ b/content/browser/interest_group/bidding_and_auction_server_key_fetcher.cc
@@ -58,84 +58,115 @@ )"); } // namespace -BiddingAndAuctionServerKeyFetcher::BiddingAndAuctionServerKeyFetcher() = - default; +BiddingAndAuctionServerKeyFetcher::PerCoordinatorFetcherState:: + PerCoordinatorFetcherState() = default; +BiddingAndAuctionServerKeyFetcher::PerCoordinatorFetcherState:: + ~PerCoordinatorFetcherState() = default; +BiddingAndAuctionServerKeyFetcher::PerCoordinatorFetcherState:: + PerCoordinatorFetcherState(PerCoordinatorFetcherState&& state) = default; +BiddingAndAuctionServerKeyFetcher::PerCoordinatorFetcherState& +BiddingAndAuctionServerKeyFetcher::PerCoordinatorFetcherState::operator=( + PerCoordinatorFetcherState&& state) = default; + +BiddingAndAuctionServerKeyFetcher::BiddingAndAuctionServerKeyFetcher() { + fetcher_state_map_.insert_or_assign(blink::mojom::AdAuctionCoordinator::kGCP, + PerCoordinatorFetcherState()); + fetcher_state_map_.insert_or_assign(blink::mojom::AdAuctionCoordinator::kAWS, + PerCoordinatorFetcherState()); + CHECK_EQ( + fetcher_state_map_.size(), + static_cast<size_t>(blink::mojom::AdAuctionCoordinator::kMaxValue) - + static_cast<size_t>(blink::mojom::AdAuctionCoordinator::kMinValue) + + 1); + if (base::FeatureList::IsEnabled( + blink::features::kFledgeBiddingAndAuctionServer)) { + fetcher_state_map_.at(blink::mojom::AdAuctionCoordinator::kGCP).key_url = + GURL(blink::features::kFledgeBiddingAndAuctionKeyURL.Get()); + } +} + BiddingAndAuctionServerKeyFetcher::~BiddingAndAuctionServerKeyFetcher() = default; void BiddingAndAuctionServerKeyFetcher::GetOrFetchKey( network::mojom::URLLoaderFactory* loader_factory, + blink::mojom::AdAuctionCoordinator coordinator, BiddingAndAuctionServerKeyFetcherCallback callback) { - GURL key_url(blink::features::kFledgeBiddingAndAuctionKeyURL.Get()); - if (!key_url.is_valid()) { + PerCoordinatorFetcherState& state = fetcher_state_map_.at(coordinator); + if (!state.key_url.is_valid()) { std::move(callback).Run(absl::nullopt); return; } // If we have keys and they haven't expired just call the callback now. - if (keys_.size() > 0 && expiration_ > base::Time::Now()) { + if (state.keys.size() > 0 && state.expiration > base::Time::Now()) { // Use a random key from the set to limit the server's ability to identify // us based on the key we use. - std::move(callback).Run(keys_[base::RandInt(0, keys_.size() - 1)]); + std::move(callback).Run( + state.keys[base::RandInt(0, state.keys.size() - 1)]); return; } - queue_.push_back(std::move(callback)); - if (queue_.size() > 1) { + state.queue.push_back(std::move(callback)); + if (state.queue.size() > 1) { return; } - keys_.clear(); + state.keys.clear(); + CHECK(!state.loader); auto resource_request = std::make_unique<network::ResourceRequest>(); - resource_request->url = key_url; + resource_request->url = state.key_url; resource_request->credentials_mode = network::mojom::CredentialsMode::kOmit; resource_request->trusted_params.emplace(); resource_request->trusted_params->isolation_info = net::IsolationInfo(); - loader_ = network::SimpleURLLoader::Create( + state.loader = network::SimpleURLLoader::Create( std::move(resource_request), kBiddingAndAuctionServerKeyFetchTrafficAnnotation); - loader_->SetTimeoutDuration(kRequestTimeout); + state.loader->SetTimeoutDuration(kRequestTimeout); - loader_->DownloadToString( + state.loader->DownloadToString( loader_factory, base::BindOnce(&BiddingAndAuctionServerKeyFetcher::OnFetchKeyComplete, - weak_ptr_factory_.GetWeakPtr()), + weak_ptr_factory_.GetWeakPtr(), coordinator), /*max_body_size=*/kMaxBodySize); } void BiddingAndAuctionServerKeyFetcher::OnFetchKeyComplete( + blink::mojom::AdAuctionCoordinator coordinator, std::unique_ptr<std::string> response) { + fetcher_state_map_.at(coordinator).loader.reset(); if (!response) { - FailAllCallbacks(); + FailAllCallbacks(coordinator); return; } - loader_.reset(); data_decoder::DataDecoder::ParseJsonIsolated( *response, base::BindOnce(&BiddingAndAuctionServerKeyFetcher::OnParsedKeys, - weak_ptr_factory_.GetWeakPtr())); + weak_ptr_factory_.GetWeakPtr(), coordinator)); } void BiddingAndAuctionServerKeyFetcher::OnParsedKeys( + blink::mojom::AdAuctionCoordinator coordinator, data_decoder::DataDecoder::ValueOrError result) { if (!result.has_value()) { - FailAllCallbacks(); + FailAllCallbacks(coordinator); return; } const base::Value::Dict* response_dict = result->GetIfDict(); if (!response_dict) { - FailAllCallbacks(); + FailAllCallbacks(coordinator); return; } - const base::Value::List* keys = response_dict->FindList("keys"); - if (!keys) { - FailAllCallbacks(); + const base::Value::List* key_values = response_dict->FindList("keys"); + if (!key_values) { + FailAllCallbacks(coordinator); return; } - for (const auto& entry : *keys) { + std::vector<BiddingAndAuctionServerKey> keys; + for (const auto& entry : *key_values) { BiddingAndAuctionServerKey key; const base::Value::Dict* key_dict = entry.GetIfDict(); if (!key_dict) { @@ -156,38 +187,43 @@ continue; } key.id = key_id; - keys_.push_back(std::move(key)); + keys.push_back(std::move(key)); } - if (keys_.size() == 0) { - FailAllCallbacks(); + if (keys.size() == 0) { + FailAllCallbacks(coordinator); return; } - expiration_ = base::Time::Now() + kKeyRequestInterval; + PerCoordinatorFetcherState& state = fetcher_state_map_.at(coordinator); + state.keys = std::move(keys); + state.expiration = base::Time::Now() + kKeyRequestInterval; - while (!queue_.empty()) { + while (!state.queue.empty()) { // We call the callback *before* removing the current request from the list. - // It is possible that the callback may synchronously enqueue another - // request. If we remove the current request first then enqueuing the - // request would start another thread of execution since there was an empty - // queue. + // That avoids the problem if callback were to synchronously enqueue another + // request. If we removed the current request first then enqueued the + // request, that would start another thread of execution since there was an + // empty queue. // Use a random key from the set to limit the server's ability to identify // us based on the key we use. - std::move(queue_.front()).Run(keys_[base::RandInt(0, keys_.size() - 1)]); - queue_.pop_front(); + std::move(state.queue.front()) + .Run(state.keys[base::RandInt(0, state.keys.size() - 1)]); + state.queue.pop_front(); } } -void BiddingAndAuctionServerKeyFetcher::FailAllCallbacks() { - while (!queue_.empty()) { +void BiddingAndAuctionServerKeyFetcher::FailAllCallbacks( + blink::mojom::AdAuctionCoordinator coordinator) { + PerCoordinatorFetcherState& state = fetcher_state_map_.at(coordinator); + while (!state.queue.empty()) { // We call the callback *before* removing the current request from the list. - // It is possible that the callback may synchronously enqueue another - // request. If we remove the current request first then enqueuing the - // request would start another thread of execution since there was an empty - // queue. - std::move(queue_.front()).Run(absl::nullopt); - queue_.pop_front(); + // That avoids the problem if callback were to synchronously enqueue another + // request. If we removed the current request first then enqueued the + // request, that would start another thread of execution since there was an + // empty queue. + std::move(state.queue.front()).Run(absl::nullopt); + state.queue.pop_front(); } }
diff --git a/content/browser/interest_group/bidding_and_auction_server_key_fetcher.h b/content/browser/interest_group/bidding_and_auction_server_key_fetcher.h index 82851346..9a6a841 100644 --- a/content/browser/interest_group/bidding_and_auction_server_key_fetcher.h +++ b/content/browser/interest_group/bidding_and_auction_server_key_fetcher.h
@@ -6,12 +6,15 @@ #define CONTENT_BROWSER_INTEREST_GROUP_BIDDING_AND_AUCTION_SERVER_KEY_FETCHER_H_ #include <string> +#include <vector> #include "base/containers/circular_deque.h" #include "base/functional/callback.h" #include "content/common/content_export.h" #include "services/data_decoder/public/cpp/data_decoder.h" #include "third_party/abseil-cpp/absl/types/optional.h" +#include "third_party/blink/public/mojom/interest_group/ad_auction_service.mojom-shared.h" +#include "url/gurl.h" namespace network { class SimpleURLLoader; @@ -28,6 +31,9 @@ uint8_t id; // key id corresponding to this key. }; +// BiddingAndAuctionServerKeyFetcher Manages fetching and caching of the public +// keys for Bidding and Auction Server endpoints from each of the designated +// Coordinators. class CONTENT_EXPORT BiddingAndAuctionServerKeyFetcher { public: using BiddingAndAuctionServerKeyFetcherCallback = @@ -45,31 +51,48 @@ // network with the provided loader_factory if necessary. If the key is // immediately available then the callback may be called synchronously. void GetOrFetchKey(network::mojom::URLLoaderFactory* loader_factory, + blink::mojom::AdAuctionCoordinator coordinator, BiddingAndAuctionServerKeyFetcherCallback callback); private: // Called when the JSON blob containing the keys have been successfully // fetched over the network. - void OnFetchKeyComplete(std::unique_ptr<std::string> response); + void OnFetchKeyComplete(blink::mojom::AdAuctionCoordinator coordinator, + std::unique_ptr<std::string> response); // Called when the JSON blob containing the keys has be parsed into // base::Values. Uses the parsed result to add keys to the cache and calls // queued callbacks. - void OnParsedKeys(data_decoder::DataDecoder::ValueOrError result); - void FailAllCallbacks(); + void OnParsedKeys(blink::mojom::AdAuctionCoordinator coordinator, + data_decoder::DataDecoder::ValueOrError result); + void FailAllCallbacks(blink::mojom::AdAuctionCoordinator coordinator); - // queue_ contains callbacks waiting for a key to be fetched over the network. - base::circular_deque<BiddingAndAuctionServerKeyFetcherCallback> queue_; + struct PerCoordinatorFetcherState { + PerCoordinatorFetcherState(); + ~PerCoordinatorFetcherState(); - // keys_ contains a list of keys received from the server (if any). - std::vector<BiddingAndAuctionServerKey> keys_; + PerCoordinatorFetcherState(PerCoordinatorFetcherState&& state); + PerCoordinatorFetcherState& operator=(PerCoordinatorFetcherState&& state); - // expiration_ contains the expiration time for any keys that are cached by - // this object. - base::Time expiration_ = base::Time::Min(); + GURL key_url; - // loader_ contains the SimpleURLLoader being used to fetch the keys. - std::unique_ptr<network::SimpleURLLoader> loader_; + // queue_ contains callbacks waiting for a key to be fetched over the + // network. + base::circular_deque<BiddingAndAuctionServerKeyFetcherCallback> queue; + + // keys_ contains a list of keys received from the server (if any). + std::vector<BiddingAndAuctionServerKey> keys; + + // expiration_ contains the expiration time for any keys that are cached by + // this object. + base::Time expiration = base::Time::Min(); + + // loader_ contains the SimpleURLLoader being used to fetch the keys. + std::unique_ptr<network::SimpleURLLoader> loader; + }; + + base::flat_map<blink::mojom::AdAuctionCoordinator, PerCoordinatorFetcherState> + fetcher_state_map_; base::WeakPtrFactory<BiddingAndAuctionServerKeyFetcher> weak_ptr_factory_{ this};
diff --git a/content/browser/interest_group/bidding_and_auction_server_key_fetcher_unittest.cc b/content/browser/interest_group/bidding_and_auction_server_key_fetcher_unittest.cc index 3f2c3a1..3dcef250 100644 --- a/content/browser/interest_group/bidding_and_auction_server_key_fetcher_unittest.cc +++ b/content/browser/interest_group/bidding_and_auction_server_key_fetcher_unittest.cc
@@ -46,7 +46,7 @@ base::RunLoop run_loop; fetcher.GetOrFetchKey( - &url_loader_factory_, + &url_loader_factory_, blink::mojom::AdAuctionCoordinator::kGCP, base::BindLambdaForTesting( [&](absl::optional<BiddingAndAuctionServerKey> maybe_key) { EXPECT_FALSE(maybe_key.has_value()); @@ -84,7 +84,7 @@ SCOPED_TRACE(response); base::RunLoop run_loop; fetcher.GetOrFetchKey( - &url_loader_factory_, + &url_loader_factory_, blink::mojom::AdAuctionCoordinator::kGCP, base::BindLambdaForTesting( [&](absl::optional<BiddingAndAuctionServerKey> maybe_key) { EXPECT_FALSE(maybe_key.has_value()); @@ -102,14 +102,14 @@ int completed = 0; base::RunLoop run_loop; fetcher.GetOrFetchKey( - &url_loader_factory_, + &url_loader_factory_, blink::mojom::AdAuctionCoordinator::kGCP, base::BindLambdaForTesting( [&](absl::optional<BiddingAndAuctionServerKey> maybe_key) { EXPECT_FALSE(maybe_key.has_value()); completed++; })); fetcher.GetOrFetchKey( - &url_loader_factory_, + &url_loader_factory_, blink::mojom::AdAuctionCoordinator::kGCP, base::BindLambdaForTesting( [&](absl::optional<BiddingAndAuctionServerKey> maybe_key) { EXPECT_FALSE(maybe_key.has_value()); @@ -128,13 +128,13 @@ int completed = 0; base::RunLoop run_loop; fetcher.GetOrFetchKey( - &url_loader_factory_, + &url_loader_factory_, blink::mojom::AdAuctionCoordinator::kGCP, base::BindLambdaForTesting( [&](absl::optional<BiddingAndAuctionServerKey> maybe_key) { EXPECT_FALSE(maybe_key.has_value()); completed++; fetcher.GetOrFetchKey( - &url_loader_factory_, + &url_loader_factory_, blink::mojom::AdAuctionCoordinator::kGCP, base::BindLambdaForTesting( [&](absl::optional<BiddingAndAuctionServerKey> maybe_key) { EXPECT_FALSE(maybe_key.has_value()); @@ -154,7 +154,7 @@ content::BiddingAndAuctionServerKey key; base::RunLoop run_loop; fetcher.GetOrFetchKey( - &url_loader_factory_, + &url_loader_factory_, blink::mojom::AdAuctionCoordinator::kGCP, base::BindLambdaForTesting( [&](absl::optional<BiddingAndAuctionServerKey> maybe_key) { EXPECT_TRUE(maybe_key.has_value()); @@ -177,13 +177,13 @@ int completed = 0; base::RunLoop run_loop; fetcher.GetOrFetchKey( - &url_loader_factory_, + &url_loader_factory_, blink::mojom::AdAuctionCoordinator::kGCP, base::BindLambdaForTesting( [&](absl::optional<BiddingAndAuctionServerKey> maybe_key) { EXPECT_TRUE(maybe_key.has_value()); completed++; fetcher.GetOrFetchKey( - &url_loader_factory_, + &url_loader_factory_, blink::mojom::AdAuctionCoordinator::kGCP, base::BindLambdaForTesting( [&](absl::optional<BiddingAndAuctionServerKey> maybe_key) { EXPECT_TRUE(maybe_key.has_value()); @@ -208,7 +208,7 @@ content::BiddingAndAuctionServerKey key; base::RunLoop run_loop; fetcher.GetOrFetchKey( - &url_loader_factory_, + &url_loader_factory_, blink::mojom::AdAuctionCoordinator::kGCP, base::BindLambdaForTesting( [&](absl::optional<BiddingAndAuctionServerKey> maybe_key) { EXPECT_TRUE(maybe_key.has_value()); @@ -230,7 +230,7 @@ content::BiddingAndAuctionServerKey key; base::RunLoop run_loop; fetcher.GetOrFetchKey( - &url_loader_factory_, + &url_loader_factory_, blink::mojom::AdAuctionCoordinator::kGCP, base::BindLambdaForTesting( [&](absl::optional<BiddingAndAuctionServerKey> maybe_key) { EXPECT_TRUE(maybe_key.has_value()); @@ -257,14 +257,14 @@ content::BiddingAndAuctionServerKey key1, key2; base::RunLoop run_loop; fetcher.GetOrFetchKey( - &url_loader_factory_, + &url_loader_factory_, blink::mojom::AdAuctionCoordinator::kGCP, base::BindLambdaForTesting( [&](absl::optional<BiddingAndAuctionServerKey> maybe_key) { EXPECT_TRUE(maybe_key.has_value()); key1 = *maybe_key; })); fetcher.GetOrFetchKey( - &url_loader_factory_, + &url_loader_factory_, blink::mojom::AdAuctionCoordinator::kGCP, base::BindLambdaForTesting( [&](absl::optional<BiddingAndAuctionServerKey> maybe_key) { key2 = *maybe_key; @@ -293,7 +293,7 @@ content::BiddingAndAuctionServerKey key; base::RunLoop run_loop; fetcher.GetOrFetchKey( - &url_loader_factory_, + &url_loader_factory_, blink::mojom::AdAuctionCoordinator::kGCP, base::BindLambdaForTesting( [&](absl::optional<BiddingAndAuctionServerKey> maybe_key) { EXPECT_TRUE(maybe_key.has_value()); @@ -317,7 +317,7 @@ content::BiddingAndAuctionServerKey key; base::RunLoop run_loop; fetcher.GetOrFetchKey( - &url_loader_factory_, + &url_loader_factory_, blink::mojom::AdAuctionCoordinator::kGCP, base::BindLambdaForTesting( [&](absl::optional<BiddingAndAuctionServerKey> maybe_key) { EXPECT_TRUE(maybe_key.has_value());
diff --git a/content/browser/interest_group/interest_group_auction.cc b/content/browser/interest_group/interest_group_auction.cc index 6b1e9e6..d038ed1 100644 --- a/content/browser/interest_group/interest_group_auction.cc +++ b/content/browser/interest_group/interest_group_auction.cc
@@ -976,10 +976,6 @@ if (bid_state->made_bid) { interest_groups.emplace(bid_state->bidder->interest_group.owner, bid_state->bidder->interest_group.name); - auction_->interest_group_manager_->NotifyInterestGroupAccessed( - InterestGroupManagerImpl::InterestGroupObserver::kBid, - bid_state->bidder->interest_group.owner, - bid_state->bidder->interest_group.name); bid_count++; } } @@ -2650,12 +2646,6 @@ if (saved_response_) { interest_groups.insert(saved_response_->bidding_groups.begin(), saved_response_->bidding_groups.end()); - for (const auto& ig_bid : interest_groups) { - interest_group_manager_->NotifyInterestGroupAccessed( - InterestGroupManagerImpl::InterestGroupObserver:: - InterestGroupObserver::kBid, - ig_bid.owner, ig_bid.name); - } return; } @@ -2663,16 +2653,13 @@ buyer_helper->GetInterestGroupsThatBidAndReportBidCounts(interest_groups); } - // Notify devtools of additional bids. These don't go into `interest_groups`, - // that's only things in the database. - for (const auto& bid_state : bid_states_for_additional_bids_) { - DCHECK(bid_state->made_bid); - interest_group_manager_->NotifyInterestGroupAccessed( - InterestGroupManagerImpl::InterestGroupObserver::InterestGroupObserver:: - kAdditionalBid, - bid_state->bidder->interest_group.owner, - bid_state->bidder->interest_group.name); - } + // TODO(http://crbug.com/1464874, https://crbug.com/1475640): Report + // additional bids to devtools as well, similar to what + // BuyerHelper::GetInterestGroupsThatBidAndReportBidCounts does for things + // from interest groups. Likely will need to untangle + // InterestGroupManagerImpl::RecordInterestGroupBids doing both DB recording + // and debugging notification (and reporting is the wrong time for the debug + // info, too). // Retrieve data from component auctions as well. for (const auto& component_auction_info : component_auctions_) {
diff --git a/content/browser/interest_group/interest_group_auction.h b/content/browser/interest_group/interest_group_auction.h index 75d4bfb4..ecf80c1 100644 --- a/content/browser/interest_group/interest_group_auction.h +++ b/content/browser/interest_group/interest_group_auction.h
@@ -590,11 +590,9 @@ // Returns all interest groups that bid in an auction. Expected to be called // after the bidding and scoring phase completes. Returns an empty set if the // auction failed for any reason other than the seller rejecting all bids. - // Bids from additional bids are not returned, since they do not really have + // Bids from additional bids are not included, since they do not really have // interest groups (and we don't want to attribute them to database IGs with // aliasing names). - // - // All bids (including additional bids) are also reported to the observer. void GetInterestGroupsThatBidAndReportBidCounts( blink::InterestGroupSet& interest_groups) const;
diff --git a/content/browser/interest_group/interest_group_auction_reporter.cc b/content/browser/interest_group/interest_group_auction_reporter.cc index 06828fe..9a7b680 100644 --- a/content/browser/interest_group/interest_group_auction_reporter.cc +++ b/content/browser/interest_group/interest_group_auction_reporter.cc
@@ -934,13 +934,6 @@ interest_group_manager_->RecordInterestGroupWin( blink::InterestGroupKey(winning_group.owner, winning_group.name), winning_bid_info_.ad_metadata); - interest_group_manager_->NotifyInterestGroupAccessed( - InterestGroupManagerImpl::InterestGroupObserver::kWin, - winning_group.owner, winning_group.name); - } else { - interest_group_manager_->NotifyInterestGroupAccessed( - InterestGroupManagerImpl::InterestGroupObserver::kAdditionalBidWin, - winning_group.owner, winning_group.name); } interest_group_manager_->RegisterAdKeysAsJoined(
diff --git a/content/browser/interest_group/interest_group_auction_reporter_unittest.cc b/content/browser/interest_group/interest_group_auction_reporter_unittest.cc index ad1db767..67c4ab0 100644 --- a/content/browser/interest_group/interest_group_auction_reporter_unittest.cc +++ b/content/browser/interest_group/interest_group_auction_reporter_unittest.cc
@@ -145,24 +145,14 @@ "\"This be metadata\""}}}) .Build(); - // Join the interest groups that "won" and "lost" the auction - this matters - // for tests that make sure the interest group is updated correctly. + // Join the interest group that "won" the auction - this matters for tests + // that make sure the interest group is updated correctly. const blink::InterestGroup& interest_group = winning_bid_info_.storage_interest_group->interest_group; interest_group_manager_impl_->JoinInterestGroup( interest_group, /*joining_url=*/kWinningBidderOrigin.GetURL()); - auto losing_interest_group = - blink::TestInterestGroupBuilder(kLosingBidderOrigin, kLosingBidderName) - .SetBiddingUrl(kLosingBidderScriptUrl) - // A non-empty ad list is needed by KAnonKeyForAdBid(). - .SetAds({{{GURL("https://ad.render.url.test/"), "null"}}}) - .Build(); - interest_group_manager_impl_->JoinInterestGroup( - losing_interest_group, - /*joining_url=*/kLosingBidderOrigin.GetURL()); - winning_bid_info_.render_url = (*interest_group.ads)[0].render_url; winning_bid_info_.ad_metadata = kWinningAdMetadata; @@ -357,26 +347,6 @@ EXPECT_EQ((*prev_wins)[0]->ad_json, kWinningAdMetadata); } - void ExpectBidsForKey(const url::Origin& origin, - const std::string& name, - int expected_bids) { - absl::optional<StorageInterestGroup> interest_group = - interest_group_manager_impl_->BlockingGetInterestGroup(origin, name); - ASSERT_TRUE(interest_group); - EXPECT_EQ(expected_bids, interest_group->bidding_browser_signals->bid_count) - << origin << "," << name; - } - - void ExpectNoBidsRecorded() { - ExpectBidsForKey(kWinningBidderOrigin, kWinningBidderName, 0); - ExpectBidsForKey(kLosingBidderOrigin, kLosingBidderName, 0); - } - - void ExpectBidsRecordedOnce() { - ExpectBidsForKey(kWinningBidderOrigin, kWinningBidderName, 1); - ExpectBidsForKey(kLosingBidderOrigin, kLosingBidderName, 1); - } - // AuctionWorkletManager::Delegate implementation. // // Note that none of these matter for these tests, as the the mock worklet @@ -450,8 +420,6 @@ const std::string kWinningBidderName = "winning interest group name"; const std::string kWinningAdMetadata = R"({"render_url": "https://foo/"})"; - const GURL kLosingBidderScriptUrl = - GURL("https://losing.bidder.origin.test/bidder_script.js"); const url::Origin kLosingBidderOrigin = url::Origin::Create(GURL("https://losing.bidder.origin.test/")); const std::string kLosingBidderName = "losing interest group name"; @@ -465,6 +433,10 @@ const url::Origin kComponentSellerOrigin = url::Origin::Create(kComponentSellerScriptUrl); + const std::vector<blink::InterestGroupKey> kExpectedInterestGroupsThatBid{ + {kWinningBidderOrigin, kWinningBidderName}, + {kLosingBidderOrigin, kLosingBidderName}}; + // Private aggregation requests. Their values don't matter, beyond that // they're different from each other. const auction_worklet::mojom::PrivateAggregationRequestPtr @@ -1264,12 +1236,15 @@ TEST_F(InterestGroupAuctionReporterTest, RecordWinAndBids) { SetUpAndStartSingleSellerAuction(); ExpectNoWinsRecorded(); - ExpectNoBidsRecorded(); + EXPECT_THAT(interest_group_manager_impl_->TakeInterestGroupsThatBid(), + testing::UnorderedElementsAre()); // The win and bids should be recorded immediately upon navigation. interest_group_auction_reporter_->OnNavigateToWinningAdCallback().Run(); ExpectWinRecordedOnce(); - ExpectBidsRecordedOnce(); + EXPECT_THAT( + interest_group_manager_impl_->TakeInterestGroupsThatBid(), + testing::UnorderedElementsAreArray(kExpectedInterestGroupsThatBid)); WaitForReportResultAndRunCallback(kSellerScriptUrl, absl::nullopt); WaitForReportWinAndRunCallback(absl::nullopt); @@ -1277,7 +1252,8 @@ // The win and bids should have been recorded only once. ExpectWinRecordedOnce(); - ExpectBidsRecordedOnce(); + EXPECT_THAT(interest_group_manager_impl_->TakeInterestGroupsThatBid(), + testing::UnorderedElementsAre()); } // Check that the winning interest group and bids are reported to the @@ -1285,7 +1261,8 @@ // after all reporting scripts have been run. TEST_F(InterestGroupAuctionReporterTest, RecordWinAndBidsLateNavigation) { SetUpAndStartSingleSellerAuction(); - ExpectNoBidsRecorded(); + EXPECT_THAT(interest_group_manager_impl_->TakeInterestGroupsThatBid(), + testing::UnorderedElementsAre()); WaitForReportResultAndRunCallback(kSellerScriptUrl, absl::nullopt); WaitForReportWinAndRunCallback(absl::nullopt); @@ -1293,18 +1270,22 @@ // Running reporting scripts should not cause the win or any bids to be // recorded. ExpectNoWinsRecorded(); - ExpectNoBidsRecorded(); + EXPECT_THAT(interest_group_manager_impl_->TakeInterestGroupsThatBid(), + testing::UnorderedElementsAre()); // The bids should be recorded immediately upon navigation. interest_group_auction_reporter_->OnNavigateToWinningAdCallback().Run(); ExpectWinRecordedOnce(); - ExpectBidsRecordedOnce(); + EXPECT_THAT( + interest_group_manager_impl_->TakeInterestGroupsThatBid(), + testing::UnorderedElementsAreArray(kExpectedInterestGroupsThatBid)); WaitForCompletion(); // The win and bids should have been recorded only once. ExpectWinRecordedOnce(); - ExpectBidsRecordedOnce(); + EXPECT_THAT(interest_group_manager_impl_->TakeInterestGroupsThatBid(), + testing::UnorderedElementsAre()); } // Check that the passed in `k_anon_keys_to_join` are reported to the @@ -1715,7 +1696,8 @@ EXPECT_THAT(interest_group_manager_impl_->TakeJoinedKAnonSets(), testing::UnorderedElementsAre()); ExpectNoWinsRecorded(); - ExpectNoBidsRecorded(); + EXPECT_THAT(interest_group_manager_impl_->TakeInterestGroupsThatBid(), + testing::UnorderedElementsAre()); EXPECT_THAT(private_aggregation_manager_.TakePrivateAggregationRequests(), testing::UnorderedElementsAre()); EXPECT_TRUE( @@ -1782,7 +1764,9 @@ EXPECT_THAT(interest_group_manager_impl_->TakeJoinedKAnonSets(), testing::UnorderedElementsAreArray(k_anon_keys_to_join_)); ExpectWinRecordedOnce(); - ExpectBidsRecordedOnce(); + EXPECT_THAT( + interest_group_manager_impl_->TakeInterestGroupsThatBid(), + testing::UnorderedElementsAreArray(kExpectedInterestGroupsThatBid)); // Private aggregation data should have been passed along only once. EXPECT_THAT(
diff --git a/content/browser/interest_group/interest_group_browsertest.cc b/content/browser/interest_group/interest_group_browsertest.cc index 1ed0a74..8a7bdca 100644 --- a/content/browser/interest_group/interest_group_browsertest.cc +++ b/content/browser/interest_group/interest_group_browsertest.cc
@@ -15968,21 +15968,24 @@ // shell(). [[nodiscard]] std::string GetInterestGroupAdAuctionData( url::Origin seller, + absl::optional<std::string> coordinator, absl::optional<ToRenderFrameHost> execution_target = absl::nullopt) { return EvalJs(execution_target ? *execution_target : shell(), JsReplace(R"( + let config = {seller: $1} + if ($2) { + config.coordinator = $2; + } (async function() { try { - let data = await navigator.getInterestGroupAdAuctionData({ - seller: $1 - }); + let data = await navigator.getInterestGroupAdAuctionData(config); return btoa(String.fromCharCode.apply(null, data.request)) + '|' + data.requestId; } catch (e) { return e.toString(); } })())", - seller)) + seller, coordinator.value_or(""))) .ExtractString(); } @@ -15997,7 +16000,7 @@ ASSERT_TRUE(NavigateToURL(shell(), test_url)); - EXPECT_EQ("|", GetInterestGroupAdAuctionData(test_origin)); + EXPECT_EQ("|", GetInterestGroupAdAuctionData(test_origin, "gcp")); } IN_PROC_BROWSER_TEST_F(InterestGroupBiddingAndAuctionServerBrowserTest, @@ -16011,7 +16014,22 @@ "TypeError: Failed to execute 'getInterestGroupAdAuctionData' on " "'Navigator': seller 'null' for AdAuctionDataConfig must be a valid " "https origin.", - GetInterestGroupAdAuctionData(url::Origin())); + GetInterestGroupAdAuctionData(url::Origin(), "gcp")); +} + +IN_PROC_BROWSER_TEST_F(InterestGroupBiddingAndAuctionServerBrowserTest, + TestInvalidCoordinator) { + GURL test_url = https_server_->GetURL("a.test", "/interest_group/empty.html"); + url::Origin test_origin = url::Origin::Create(test_url); + + ASSERT_TRUE(NavigateToURL(shell(), test_url)); + + EXPECT_EQ( + "TypeError: Failed to execute 'getInterestGroupAdAuctionData' on " + "'Navigator': Failed to read the 'coordinator' property from " + "'AdAuctionDataConfig': The provided value 'foo' is not a valid enum " + "value of type AdAuctionCoordinator.", + GetInterestGroupAdAuctionData(test_origin, "foo")); } IN_PROC_BROWSER_TEST_F(InterestGroupBiddingAndAuctionServerBrowserTest, @@ -16056,8 +16074,8 @@ WebContentsConsoleObserver console_observer(shell()->web_contents()); console_observer.SetPattern(WarningPermissionsPolicy("*", "*")); - EXPECT_EQ("|", - GetInterestGroupAdAuctionData(test_origin, execution_target)); + EXPECT_EQ("|", GetInterestGroupAdAuctionData(test_origin, "gcp", + execution_target)); #if BUILDFLAG(IS_ANDROID) RenderFrameHost* execution_targets_with_message[] = {cross_origin_iframe}; #else @@ -16409,10 +16427,10 @@ "NotAllowedError: Failed to execute 'getInterestGroupAdAuctionData' " "on 'Navigator': " "Feature run-ad-auction is not enabled by Permissions Policy", - GetInterestGroupAdAuctionData(test_origin, execution_target)); + GetInterestGroupAdAuctionData(test_origin, "gcp", execution_target)); } else { - EXPECT_EQ("|", - GetInterestGroupAdAuctionData(test_origin, execution_target)); + EXPECT_EQ("|", GetInterestGroupAdAuctionData(test_origin, "gcp", + execution_target)); } } } @@ -16440,15 +16458,12 @@ for (bool should_win : {true, false}) { SCOPED_TRACE(should_win); - AttachInterestGroupObserver(); ClearReceivedRequests(); ASSERT_TRUE(NavigateToURL(shell(), test_url)); std::string auction_nonce = CreateAuctionNonceAndWait(); GURL additional_bid_logic_url = https_server_->GetURL( "b.test", "/interest_group/bidding_logic_additional_bid.js"); - url::Origin additional_bid_origin = - url::Origin::Create(additional_bid_logic_url); std::string auction_config = JsReplace( R"({ @@ -16473,7 +16488,7 @@ test_origin, https_server_->GetURL("a.test", "/interest_group/decision_logic.js"), auction_nonce, additional_bid_ad_url, additional_bid_logic_url, - additional_bid_origin, should_win ? 1.99 : 0.1); + url::Origin::Create(additional_bid_logic_url), should_win ? 1.99 : 0.1); RunAuctionAndWaitForURLAndNavigateIframe( auction_config, should_win ? additional_bid_ad_url : ad_url); @@ -16483,24 +16498,10 @@ https_server_->GetURL("a.test", "/echoall?report_bidder_additional")); EXPECT_FALSE(HasServerSeenUrl( https_server_->GetURL("a.test", "/echoall?report_bidder"))); - WaitForAccessObserved({ - {TestInterestGroupObserver::kLoaded, test_origin, "cars"}, - {TestInterestGroupObserver::kBid, test_origin, "cars"}, - {TestInterestGroupObserver::kAdditionalBid, additional_bid_origin, - "campaign123"}, - {TestInterestGroupObserver::kAdditionalBidWin, additional_bid_origin, - "campaign123"}, - }); } else { WaitForUrl(https_server_->GetURL("a.test", "/echoall?report_bidder")); EXPECT_FALSE(HasServerSeenUrl(https_server_->GetURL( "a.test", "/echoall?report_bidder_additional"))); - WaitForAccessObserved( - {{TestInterestGroupObserver::kLoaded, test_origin, "cars"}, - {TestInterestGroupObserver::kBid, test_origin, "cars"}, - {TestInterestGroupObserver::kAdditionalBid, additional_bid_origin, - "campaign123"}, - {TestInterestGroupObserver::kWin, test_origin, "cars"}}); } } }
diff --git a/content/browser/interest_group/interest_group_manager_impl.cc b/content/browser/interest_group/interest_group_manager_impl.cc index 33e03a93..b09a0bca 100644 --- a/content/browser/interest_group/interest_group_manager_impl.cc +++ b/content/browser/interest_group/interest_group_manager_impl.cc
@@ -31,6 +31,7 @@ #include "mojo/public/cpp/bindings/self_owned_receiver.h" #include "services/network/public/cpp/shared_url_loader_factory.h" #include "services/network/public/mojom/client_security_state.mojom.h" +#include "third_party/blink/public/common/features.h" #include "third_party/blink/public/common/interest_group/interest_group.h" #include "url/gurl.h" @@ -249,6 +250,10 @@ if (group_keys.empty()) { return; } + for (const auto& group_key : group_keys) { + NotifyInterestGroupAccessed(InterestGroupObserver::kBid, group_key.owner, + group_key.name); + } impl_.AsyncCall(&InterestGroupStorage::RecordInterestGroupBids) .WithArgs(group_keys); } @@ -256,6 +261,8 @@ void InterestGroupManagerImpl::RecordInterestGroupWin( const blink::InterestGroupKey& group_key, const std::string& ad_json) { + NotifyInterestGroupAccessed(InterestGroupObserver::kWin, group_key.owner, + group_key.name); impl_.AsyncCall(&InterestGroupStorage::RecordInterestGroupWin) .WithArgs(group_key, std::move(ad_json)); } @@ -454,9 +461,10 @@ void InterestGroupManagerImpl::GetBiddingAndAuctionServerKey( network::mojom::URLLoaderFactory* loader, + blink::mojom::AdAuctionCoordinator coordinator, base::OnceCallback<void(absl::optional<BiddingAndAuctionServerKey>)> callback) { - ba_key_fetcher_.GetOrFetchKey(loader, std::move(callback)); + ba_key_fetcher_.GetOrFetchKey(loader, coordinator, std::move(callback)); } void InterestGroupManagerImpl::OnJoinInterestGroupPermissionsChecked(
diff --git a/content/browser/interest_group/interest_group_manager_impl.h b/content/browser/interest_group/interest_group_manager_impl.h index f86bc74..6c1730f 100644 --- a/content/browser/interest_group/interest_group_manager_impl.h +++ b/content/browser/interest_group/interest_group_manager_impl.h
@@ -90,16 +90,7 @@ class CONTENT_EXPORT InterestGroupObserver : public base::CheckedObserver { public: - enum AccessType { - kJoin, - kLeave, - kUpdate, - kLoaded, - kBid, - kAdditionalBid, - kWin, - kAdditionalBidWin - }; + enum AccessType { kJoin, kLeave, kUpdate, kLoaded, kBid, kWin }; virtual void OnInterestGroupAccessed(const base::Time& access_time, AccessType type, const url::Origin& owner_origin, @@ -199,7 +190,6 @@ // Adds an entry to the bidding history for this interest group. void RecordInterestGroupBids(const blink::InterestGroupSet& groups); - // Adds an entry to the win history for this interest group. `ad_json` is a // piece of opaque data to identify the winning ad. void RecordInterestGroupWin(const blink::InterestGroupKey& group_key, @@ -339,6 +329,7 @@ void GetBiddingAndAuctionServerKey( network::mojom::URLLoaderFactory* loader, + blink::mojom::AdAuctionCoordinator coordinator, base::OnceCallback<void(absl::optional<BiddingAndAuctionServerKey>)> callback); @@ -351,10 +342,6 @@ k_anonymity_manager_ = std::move(k_anonymity_manager); } - void NotifyInterestGroupAccessed(InterestGroupObserver::AccessType type, - const url::Origin& owner_origin, - const std::string& name); - private: // InterestGroupUpdateManager calls private members to write updates to the // database. @@ -433,6 +420,9 @@ // To be called only by `update_manager_`. void ReportUpdateFailed(const blink::InterestGroupKey& group_key, bool parse_failure); + void NotifyInterestGroupAccessed(InterestGroupObserver::AccessType type, + const url::Origin& owner_origin, + const std::string& name); void OnGetInterestGroupsComplete( base::OnceCallback<void(std::vector<StorageInterestGroup>)> callback,
diff --git a/content/browser/interest_group/test_interest_group_manager_impl.h b/content/browser/interest_group/test_interest_group_manager_impl.h index 1475283..85975374 100644 --- a/content/browser/interest_group/test_interest_group_manager_impl.h +++ b/content/browser/interest_group/test_interest_group_manager_impl.h
@@ -97,7 +97,7 @@ std::vector<GURL> TakeReportUrlsOfType(ReportType report_type); // Returns all interest groups that bid, removing them from the internal list - // in the process. This is based on observer events, not database ones. + // in the process. std::vector<blink::InterestGroupKey> TakeInterestGroupsThatBid(); // Returns all K-anon sets that have been joined, removing them from the
diff --git a/content/browser/interest_group/test_interest_group_observer.cc b/content/browser/interest_group/test_interest_group_observer.cc index a19bfa0..16e89c5 100644 --- a/content/browser/interest_group/test_interest_group_observer.cc +++ b/content/browser/interest_group/test_interest_group_observer.cc
@@ -13,7 +13,6 @@ #include "base/time/time.h" #include "content/browser/interest_group/interest_group_manager_impl.h" #include "content/common/content_export.h" -#include "testing/gmock/include/gmock/gmock-matchers.h" #include "testing/gtest/include/gtest/gtest.h" #include "url/origin.h" @@ -44,7 +43,7 @@ run_loop_->Run(); run_loop_.reset(); } - EXPECT_THAT(accesses_, ::testing::UnorderedElementsAreArray(expected)); + EXPECT_EQ(expected, accesses_); // Clear accesses so can be reused. accesses_.clear();
diff --git a/content/shell/browser/shell_platform_data_aura.cc b/content/shell/browser/shell_platform_data_aura.cc index 72b880e..50450e5e 100644 --- a/content/shell/browser/shell_platform_data_aura.cc +++ b/content/shell/browser/shell_platform_data_aura.cc
@@ -81,7 +81,9 @@ #if BUILDFLAG(IS_OZONE) // Setup global display::Screen singleton. - screen_ = std::make_unique<aura::ScopedScreenOzone>(); + if (!display::Screen::HasScreen()) { + screen_ = std::make_unique<aura::ScreenOzone>(); + } #endif // BUILDFLAG(IS_OZONE) ui::PlatformWindowInitProperties properties;
diff --git a/content/shell/browser/shell_platform_data_aura.h b/content/shell/browser/shell_platform_data_aura.h index ff67f75d..0631869b 100644 --- a/content/shell/browser/shell_platform_data_aura.h +++ b/content/shell/browser/shell_platform_data_aura.h
@@ -20,8 +20,8 @@ } // namespace aura #if BUILDFLAG(IS_OZONE) -namespace display { -class ScopedNativeScreen; +namespace aura { +class ScreenOzone; } #endif @@ -47,7 +47,7 @@ private: #if BUILDFLAG(IS_OZONE) - std::unique_ptr<display::ScopedNativeScreen> screen_; + std::unique_ptr<aura::ScreenOzone> screen_; #endif std::unique_ptr<aura::WindowTreeHost> host_;
diff --git a/content/test/data/attribution_reporting/interop/aggregatable_dedup_key.json b/content/test/data/attribution_reporting/interop/aggregatable_dedup_key.json index d0d6f28..81da184 100644 --- a/content/test/data/attribution_reporting/interop/aggregatable_dedup_key.json +++ b/content/test/data/attribution_reporting/interop/aggregatable_dedup_key.json
@@ -216,25 +216,25 @@ "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "1643411973", + "scheduled_report_time": "1643408373", "source_event_id": "123", "source_type": "navigation", "trigger_data": "1" }, "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "1643411973000" + "report_time": "1643408373000" }, { "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "1643411973", + "scheduled_report_time": "1643408373", "source_event_id": "123", "source_type": "navigation", "trigger_data": "2" }, "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "1643411973000" + "report_time": "1643408373000" } ], "aggregatable_results": [
diff --git a/content/test/data/attribution_reporting/interop/aggregatable_report_window.json b/content/test/data/attribution_reporting/interop/aggregatable_report_window.json index a053611..952735a 100644 --- a/content/test/data/attribution_reporting/interop/aggregatable_report_window.json +++ b/content/test/data/attribution_reporting/interop/aggregatable_report_window.json
@@ -201,12 +201,12 @@ "randomized_trigger_rate": 0.0024263, // 176,400 s = 2 days (default first event_report_window) + 1 hour // (base delay) - "scheduled_report_time": "176400", + "scheduled_report_time": "172800", "source_event_id": "123", "source_type": "navigation", "trigger_data": "1" }, - "report_time": "176400000", + "report_time": "172800000", "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution" }, { @@ -215,12 +215,12 @@ "randomized_trigger_rate": 0.0024263, // 176,400 s = 2 day (default first event_report_window) + 1 hour // (base delay) - "scheduled_report_time": "176400", + "scheduled_report_time": "172800", "source_event_id": "123", "source_type": "navigation", "trigger_data": "2" }, - "report_time": "176400000", + "report_time": "172800000", "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution" } ],
diff --git a/content/test/data/attribution_reporting/interop/aggregatable_storage_limit.json b/content/test/data/attribution_reporting/interop/aggregatable_storage_limit.json index 6965175..356bd6d1 100644 --- a/content/test/data/attribution_reporting/interop/aggregatable_storage_limit.json +++ b/content/test/data/attribution_reporting/interop/aggregatable_storage_limit.json
@@ -165,36 +165,36 @@ "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "1643411973", + "scheduled_report_time": "1643408373", "source_event_id": "111", "source_type": "navigation", "trigger_data": "1" }, "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "1643411973000" + "report_time": "1643408373000" }, { "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "1643411974", + "scheduled_report_time": "1643408374", "source_event_id": "222", "source_type": "navigation", "trigger_data": "2" }, - "report_time": "1643411974000", + "report_time": "1643408374000", "report_url": "https://another-reporter.test/.well-known/attribution-reporting/report-event-attribution" }, { "payload": { "attribution_destination": "https://another-destination.test", "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "1643411975", + "scheduled_report_time": "1643408375", "source_event_id": "333", "source_type": "navigation", "trigger_data": "3" }, - "report_time": "1643411975000", + "report_time": "1643408375000", "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution" } ],
diff --git a/content/test/data/attribution_reporting/interop/basic.json b/content/test/data/attribution_reporting/interop/basic.json index ae9be3ba..1b930fb 100644 --- a/content/test/data/attribution_reporting/interop/basic.json +++ b/content/test/data/attribution_reporting/interop/basic.json
@@ -50,13 +50,13 @@ "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "1643411973", + "scheduled_report_time": "1643408373", "source_event_id": "123", "source_type": "navigation", "trigger_data": "7" }, "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "1643411973000" + "report_time": "1643408373000" } ], "verbose_debug_reports": [
diff --git a/content/test/data/attribution_reporting/interop/basic_aggregatable.json b/content/test/data/attribution_reporting/interop/basic_aggregatable.json index 200d063..12c2430a9 100644 --- a/content/test/data/attribution_reporting/interop/basic_aggregatable.json +++ b/content/test/data/attribution_reporting/interop/basic_aggregatable.json
@@ -60,13 +60,13 @@ "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "1643411973", + "scheduled_report_time": "1643408373", "source_event_id": "123", "source_type": "navigation", "trigger_data": "7" }, "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "1643411973000" + "report_time": "1643408373000" } ], "aggregatable_results": [
diff --git a/content/test/data/attribution_reporting/interop/channel_capacity.json b/content/test/data/attribution_reporting/interop/channel_capacity.json index 5421d34..b0ce5a6 100644 --- a/content/test/data/attribution_reporting/interop/channel_capacity.json +++ b/content/test/data/attribution_reporting/interop/channel_capacity.json
@@ -231,25 +231,25 @@ "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0007154, - "scheduled_report_time": "7204", + "scheduled_report_time": "3604", "source_event_id": "123", "source_type": "navigation", "trigger_data": "3" }, "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "7204000" + "report_time": "3604000" }, { "payload": { "attribution_destination": "https://destination2.test", "randomized_trigger_rate": 1.0, - "scheduled_report_time": "7206", + "scheduled_report_time": "3606", "source_event_id": "456", "source_type": "navigation", "trigger_data": "4" }, "report_url": "https://reporter2.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "7206000" + "report_time": "3606000" } ] }
diff --git a/content/test/data/attribution_reporting/interop/config_trigger_data_cardinality.json b/content/test/data/attribution_reporting/interop/config_trigger_data_cardinality.json index 397f59cb..791f7ad 100644 --- a/content/test/data/attribution_reporting/interop/config_trigger_data_cardinality.json +++ b/content/test/data/attribution_reporting/interop/config_trigger_data_cardinality.json
@@ -53,13 +53,13 @@ // (3 * 4 + 3) choose 3 = 455 // 455 / (455 - 1 + exp(14)) = .0003782 "randomized_trigger_rate": 0.0003782, - "scheduled_report_time": "1643411973", + "scheduled_report_time": "1643408373", "source_event_id": "123", "source_type": "navigation", "trigger_data": "3" }, "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "1643411973000" + "report_time": "1643408373000" } ] }
diff --git a/content/test/data/attribution_reporting/interop/dedup_key.json b/content/test/data/attribution_reporting/interop/dedup_key.json index 63ee9c26..cc50df2 100644 --- a/content/test/data/attribution_reporting/interop/dedup_key.json +++ b/content/test/data/attribution_reporting/interop/dedup_key.json
@@ -116,25 +116,25 @@ "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "1643411973", + "scheduled_report_time": "1643408373", "source_event_id": "123", "source_type": "navigation", "trigger_data": "3" }, "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "1643411973000" + "report_time": "1643408373000" }, { "payload": { "randomized_trigger_rate": 0.0024263, "attribution_destination": "https://destination.test", - "scheduled_report_time": "1643411973", + "scheduled_report_time": "1643408373", "source_event_id": "123", "source_type": "navigation", "trigger_data": "1" }, "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "1643411973000" + "report_time": "1643408373000" } ], "verbose_debug_reports": [
diff --git a/content/test/data/attribution_reporting/interop/destination_limit.json b/content/test/data/attribution_reporting/interop/destination_limit.json index 902bc2d..ecce9ca 100644 --- a/content/test/data/attribution_reporting/interop/destination_limit.json +++ b/content/test/data/attribution_reporting/interop/destination_limit.json
@@ -342,60 +342,60 @@ "payload": { "attribution_destination": "https://destination1.test", "randomized_trigger_rate": 0.0001372, - "scheduled_report_time": "1643325573", + "scheduled_report_time": "1643321973", "source_event_id": "111", "source_type": "navigation", "trigger_data": "1" }, "report_url": "https://reporter1.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "1643325573000" + "report_time": "1643321973000" }, { "payload": { "attribution_destination": "https://destination2.test", "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "1643411977", + "scheduled_report_time": "1643408377", "source_event_id": "333", "source_type": "navigation", "trigger_data": "3" }, "report_url": "https://reporter2.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "1643411977000" + "report_time": "1643408377000" }, { "payload": { "attribution_destination": "https://destination2.test", "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "1643411979", + "scheduled_report_time": "1643408379", "source_event_id": "444", "source_type": "navigation", "trigger_data": "4" }, - "report_time": "1643411979000", + "report_time": "1643408379000", "report_url": "https://reporter1.test/.well-known/attribution-reporting/report-event-attribution" }, { "payload": { "attribution_destination": "https://destination2.test", "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "1643411981", + "scheduled_report_time": "1643408381", "source_event_id": "666", "source_type": "navigation", "trigger_data": "6" }, - "report_time": "1643411981000", + "report_time": "1643408381000", "report_url": "https://reporter1.test/.well-known/attribution-reporting/report-event-attribution" }, { "payload": { "attribution_destination": "https://destination3.test", "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "1643498373", + "scheduled_report_time": "1643494773", "source_event_id": "555", "source_type": "navigation", "trigger_data": "5" }, - "report_time": "1643498373000", + "report_time": "1643494773000", "report_url": "https://reporter1.test/.well-known/attribution-reporting/report-event-attribution" } ],
diff --git a/content/test/data/attribution_reporting/interop/destination_rate_limit.json b/content/test/data/attribution_reporting/interop/destination_rate_limit.json index ec82421..7cdd3087 100644 --- a/content/test/data/attribution_reporting/interop/destination_rate_limit.json +++ b/content/test/data/attribution_reporting/interop/destination_rate_limit.json
@@ -295,36 +295,36 @@ "payload": { "attribution_destination": "https://destination3.test", "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "1643411973", + "scheduled_report_time": "1643408373", "source_event_id": "111", "source_type": "navigation", "trigger_data": "2" }, "report_url": "https://reporter1.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "1643411973000" + "report_time": "1643408373000" }, { "payload": { "attribution_destination": "https://destination5.test", "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "1643411975", + "scheduled_report_time": "1643408375", "source_event_id": "123", "source_type": "navigation", "trigger_data": "4" }, "report_url": "https://reporter2.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "1643411975000" + "report_time": "1643408375000" }, { "payload": { "attribution_destination": "https://destination8.test", "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "1643412034", + "scheduled_report_time": "1643408434", "source_event_id": "444", "source_type": "navigation", "trigger_data": "6" }, - "report_time": "1643412034000", + "report_time": "1643408434000", "report_url": "https://reporter1.test/.well-known/attribution-reporting/report-event-attribution" } ],
diff --git a/content/test/data/attribution_reporting/interop/event_level_report_time.json b/content/test/data/attribution_reporting/interop/event_level_report_time.json index 7bc82eb..be4bb22 100644 --- a/content/test/data/attribution_reporting/interop/event_level_report_time.json +++ b/content/test/data/attribution_reporting/interop/event_level_report_time.json
@@ -206,72 +206,72 @@ "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0001372, - "scheduled_report_time": "1643335573", + "scheduled_report_time": "1643331973", "source_event_id": "123", "source_type": "navigation", "trigger_data": "1" }, "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "1643335573000" + "report_time": "1643331973000" }, { "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0008051, - "scheduled_report_time": "1643411974", + "scheduled_report_time": "1643408374", "source_event_id": "456", "source_type": "navigation", "trigger_data": "2" }, "report_url": "https://reporter2.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "1643411974000" + "report_time": "1643408374000" }, { "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0008051, - "scheduled_report_time": "1643421974", + "scheduled_report_time": "1643418374", "source_event_id": "456", "source_type": "navigation", "trigger_data": "3" }, "report_url": "https://reporter2.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "1643421974000" + "report_time": "1643418374000" }, { "payload": { "attribution_destination": "https://destination2.test", "randomized_trigger_rate": 0.0000025, - "scheduled_report_time": "1643421976", + "scheduled_report_time": "1643418376", "source_event_id": "666", "source_type": "event", "trigger_data": "1" }, - "report_time": "1643421976000", + "report_time": "1643418376000", "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution" }, { "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "1644103175", + "scheduled_report_time": "1644099575", "source_event_id": "789", "source_type": "navigation", "trigger_data": "4" }, "report_url": "https://reporter3.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "1644103175000" + "report_time": "1644099575000" }, { "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "1644103175", + "scheduled_report_time": "1644099575", "source_event_id": "789", "source_type": "navigation", "trigger_data": "5" }, - "report_time": "1644103175000", + "report_time": "1644099575000", "report_url": "https://reporter3.test/.well-known/attribution-reporting/report-event-attribution" } ]
diff --git a/content/test/data/attribution_reporting/interop/event_level_storage_limit.json b/content/test/data/attribution_reporting/interop/event_level_storage_limit.json index 39566cb..7ad9a02 100644 --- a/content/test/data/attribution_reporting/interop/event_level_storage_limit.json +++ b/content/test/data/attribution_reporting/interop/event_level_storage_limit.json
@@ -165,24 +165,24 @@ "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "1643411973", + "scheduled_report_time": "1643408373", "source_event_id": "111", "source_type": "navigation", "trigger_data": "1" }, "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "1643411973000" + "report_time": "1643408373000" }, { "payload": { "attribution_destination": "https://another-destination.test", "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "1643411975", + "scheduled_report_time": "1643408375", "source_event_id": "333", "source_type": "navigation", "trigger_data": "3" }, - "report_time": "1643411975000", + "report_time": "1643408375000", "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution" } ],
diff --git a/content/test/data/attribution_reporting/interop/event_level_trigger_filter_data.json b/content/test/data/attribution_reporting/interop/event_level_trigger_filter_data.json index caa52e5..ae7b9752 100644 --- a/content/test/data/attribution_reporting/interop/event_level_trigger_filter_data.json +++ b/content/test/data/attribution_reporting/interop/event_level_trigger_filter_data.json
@@ -272,49 +272,49 @@ "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "176400", + "scheduled_report_time": "172800", "source_event_id": "123", "source_type": "navigation", "trigger_data": "3" }, "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "176400000" + "report_time": "172800000" }, { "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "176400", + "scheduled_report_time": "172800", "source_event_id": "123", "source_type": "navigation", "trigger_data": "5" }, "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "176400000" + "report_time": "172800000" }, { "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "176400", + "scheduled_report_time": "172800", "source_event_id": "123", "source_type": "navigation", "trigger_data": "6" }, "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "176400000" + "report_time": "172800000" }, { "payload": { "attribution_destination": "https://another-destination.test", "randomized_trigger_rate": 0.0000025, - "scheduled_report_time": "2595600", + "scheduled_report_time": "2592000", "source_event_id": "456", "source_type": "event", "trigger_data": "1" }, "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "2595600001" + "report_time": "2592000001" } ], "verbose_debug_reports": [
diff --git a/content/test/data/attribution_reporting/interop/event_level_trigger_priority.json b/content/test/data/attribution_reporting/interop/event_level_trigger_priority.json index f4af085f..d961903 100644 --- a/content/test/data/attribution_reporting/interop/event_level_trigger_priority.json +++ b/content/test/data/attribution_reporting/interop/event_level_trigger_priority.json
@@ -184,37 +184,37 @@ "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "1643411973", + "scheduled_report_time": "1643408373", "source_event_id": "123", "source_type": "navigation", "trigger_data": "1" }, "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "1643411973000" + "report_time": "1643408373000" }, { "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "1643411973", + "scheduled_report_time": "1643408373", "source_event_id": "123", "source_type": "navigation", "trigger_data": "5" }, "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "1643411973000" + "report_time": "1643408373000" }, { "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "1643411973", + "scheduled_report_time": "1643408373", "source_event_id": "123", "source_type": "navigation", "trigger_data": "6" }, "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "1643411973000" + "report_time": "1643408373000" } ], "verbose_debug_reports": [ @@ -223,7 +223,7 @@ "body": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "1643411973", + "scheduled_report_time": "1643408373", "source_event_id": "123", "source_type": "navigation", "trigger_data": "4" @@ -238,7 +238,7 @@ "body": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "1643843973", + "scheduled_report_time": "1643840373", "source_event_id": "123", "source_type": "navigation", "trigger_data": "7"
diff --git a/content/test/data/attribution_reporting/interop/event_report_window.json b/content/test/data/attribution_reporting/interop/event_report_window.json index 60c8e54..8c98204 100644 --- a/content/test/data/attribution_reporting/interop/event_report_window.json +++ b/content/test/data/attribution_reporting/interop/event_report_window.json
@@ -190,42 +190,40 @@ "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0001372, - // 7200 s = 3600 s (clamped event_report_window) + 1 h (base - // delay) - "scheduled_report_time": "7200", + // 3600 s = 3600 s (clamped event_report_window) delay + "scheduled_report_time": "3600", "source_event_id": "123", "source_type": "navigation", "trigger_data": "1" }, "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "7200000" + "report_time": "3600000" }, { "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0000025, - // 92,001 s = 1 s (source timestamp) + 88,400 s (event_report_window) - // + 1 h (base delay) - "scheduled_report_time": "92001", + // 88,401 s = 1 s (source timestamp) + 88,400 s (event_report_window) + "scheduled_report_time": "88401", "source_event_id": "456", "source_type": "event", "trigger_data": "1" }, - "report_time": "92001000", + "report_time": "88401000", "report_url": "https://reporter2.test/.well-known/attribution-reporting/report-event-attribution" }, { "payload": { "attribution_destination": "https://destination2.test", "randomized_trigger_rate": 0.0000025, - // 90,002 s = 2 s (source timestamp) + 86,400 s (clamped - // event_report_window) + 1h (base delay) - "scheduled_report_time": "90002", + // 86,r02 s = 2 s (source timestamp) + 86,400 s (clamped + // event_report_window) + "scheduled_report_time": "86402", "source_event_id": "789", "source_type": "event", "trigger_data": "0" }, - "report_time": "90002000", + "report_time": "86402000", "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution" } ],
diff --git a/content/test/data/attribution_reporting/interop/event_report_windows.json b/content/test/data/attribution_reporting/interop/event_report_windows.json index 05a1263..e145666 100644 --- a/content/test/data/attribution_reporting/interop/event_report_windows.json +++ b/content/test/data/attribution_reporting/interop/event_report_windows.json
@@ -193,41 +193,38 @@ "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0008051, - // 90000 s = 86400 s + 1 h (base delay). - "scheduled_report_time": "90000", + "scheduled_report_time": "86400", "source_event_id": "123", "source_type": "navigation", "trigger_data": "1" }, "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "90000000" + "report_time": "86400000" }, { "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0008051, - // 1299600 s = 1296000 s + 1 h (base delay). - "scheduled_report_time": "1299600", + "scheduled_report_time": "1296000", "source_event_id": "123", "source_type": "navigation", "trigger_data": "2" }, "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "1299600000" + "report_time": "1296000000" }, { "payload": { "attribution_destination": "https://destination2.test", "randomized_trigger_rate": 0.0001372, - // 7201 s = 3600 s (rounded window) + 1 h (base delay) + 1 s (source - // timestamp). - "scheduled_report_time": "7201", + // 3601 s = 3600 s (rounded window) + 1 s (source timestamp). + "scheduled_report_time": "3601", "source_event_id": "456", "source_type": "navigation", "trigger_data": "4" }, "report_url": "https://reporter2.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "7201000" + "report_time": "3601000" } ], "verbose_debug_reports": [
diff --git a/content/test/data/attribution_reporting/interop/event_source.json b/content/test/data/attribution_reporting/interop/event_source.json index 5878ae3d..d49b201 100644 --- a/content/test/data/attribution_reporting/interop/event_source.json +++ b/content/test/data/attribution_reporting/interop/event_source.json
@@ -48,13 +48,13 @@ "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0000025, - "scheduled_report_time": "1645831173", + "scheduled_report_time": "1645827573", "source_event_id": "123", "source_type": "event", "trigger_data": "1" }, "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "1645831173000" + "report_time": "1645827573000" } ] }
diff --git a/content/test/data/attribution_reporting/interop/event_source_event_report_windows.json b/content/test/data/attribution_reporting/interop/event_source_event_report_windows.json index 9c672f6..dd1a5ecf 100644 --- a/content/test/data/attribution_reporting/interop/event_source_event_report_windows.json +++ b/content/test/data/attribution_reporting/interop/event_source_event_report_windows.json
@@ -103,27 +103,25 @@ "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0000291, - // 25200 s = 21600 s + 1 h (base delay). - "scheduled_report_time": "25200", + "scheduled_report_time": "21600", "source_event_id": "123", "source_type": "event", "trigger_data": "0" }, "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "25200000" + "report_time": "21600000" }, { "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0000291, - // 46800 s = 43200 s + 1 h (base delay). - "scheduled_report_time": "46800", + "scheduled_report_time": "43200", "source_event_id": "123", "source_type": "event", "trigger_data": "1" }, "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "46800000" + "report_time": "43200000" } ], "verbose_debug_reports": [
diff --git a/content/test/data/attribution_reporting/interop/event_source_trigger_priority.json b/content/test/data/attribution_reporting/interop/event_source_trigger_priority.json index bde0ccd..f24bc5c 100644 --- a/content/test/data/attribution_reporting/interop/event_source_trigger_priority.json +++ b/content/test/data/attribution_reporting/interop/event_source_trigger_priority.json
@@ -91,13 +91,13 @@ "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0000025, - "scheduled_report_time": "1645831173", + "scheduled_report_time": "1645827573", "source_event_id": "123", "source_type": "event", "trigger_data": "1" }, "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "1645831173000" + "report_time": "1645827573000" } ], "verbose_debug_reports": [ @@ -106,7 +106,7 @@ "body": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0000025, - "scheduled_report_time": "1645831173", + "scheduled_report_time": "1645827573", "source_event_id": "123", "source_type": "event", "trigger_data": "0"
diff --git a/content/test/data/attribution_reporting/interop/expired_source.json b/content/test/data/attribution_reporting/interop/expired_source.json index ca8b85b1..0982382 100644 --- a/content/test/data/attribution_reporting/interop/expired_source.json +++ b/content/test/data/attribution_reporting/interop/expired_source.json
@@ -202,36 +202,36 @@ "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0001372, - "scheduled_report_time": "1643325573", + "scheduled_report_time": "1643321973", "source_event_id": "123", "source_type": "navigation", "trigger_data": "0" }, - "report_time": "1643325573000", + "report_time": "1643321973000", "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution" }, { "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0001372, - "scheduled_report_time": "1643413975", + "scheduled_report_time": "1643410375", "source_event_id": "789", "source_type": "navigation", "trigger_data": "5" }, - "report_time": "1643413975000", + "report_time": "1643410375000", "report_url": "https://another-reporter.test/.well-known/attribution-reporting/report-event-attribution" }, { "payload": { "attribution_destination": "https://another-destination.test", "randomized_trigger_rate": 0.0000025, - "scheduled_report_time": "1643498374", + "scheduled_report_time": "1643494774", "source_event_id": "654", "source_type": "event", "trigger_data": "1" }, - "report_time": "1643498374001", + "report_time": "1643494774001", "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution" } ],
diff --git a/content/test/data/attribution_reporting/interop/max_event_level_reports_per_source.json b/content/test/data/attribution_reporting/interop/max_event_level_reports_per_source.json index c451c13..d69430e 100644 --- a/content/test/data/attribution_reporting/interop/max_event_level_reports_per_source.json +++ b/content/test/data/attribution_reporting/interop/max_event_level_reports_per_source.json
@@ -116,13 +116,13 @@ "payload": { "attribution_destination": "https://destination2.test", "randomized_trigger_rate": 0.0000208, - "scheduled_report_time": "176402", + "scheduled_report_time": "172802", "source_event_id": "456", "source_type": "navigation", "trigger_data": "3" }, "report_url": "https://reporter2.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "176402000" + "report_time": "172802000" } ], "verbose_debug_reports": [ @@ -131,7 +131,7 @@ "body": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 8e-7, - "scheduled_report_time": "176400", + "scheduled_report_time": "172800", "source_event_id": "123", "source_type": "navigation", "trigger_data": "2" @@ -146,7 +146,7 @@ "body": { "attribution_destination": "https://destination2.test", "randomized_trigger_rate": 0.0000208, - "scheduled_report_time": "176402", + "scheduled_report_time": "172802", "source_event_id": "456", "source_type": "navigation", "trigger_data": "4"
diff --git a/content/test/data/attribution_reporting/interop/most_recent_source.json b/content/test/data/attribution_reporting/interop/most_recent_source.json index cbe7d8e..8fb6fb6 100644 --- a/content/test/data/attribution_reporting/interop/most_recent_source.json +++ b/content/test/data/attribution_reporting/interop/most_recent_source.json
@@ -65,13 +65,13 @@ "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "1643411974", + "scheduled_report_time": "1643408374", "source_event_id": "456", "source_type": "navigation", "trigger_data": "7" }, "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "1643411974000" + "report_time": "1643408374000" } ] }
diff --git a/content/test/data/attribution_reporting/interop/multiple_destinations.json b/content/test/data/attribution_reporting/interop/multiple_destinations.json index 5d5ed8e..d2d735f 100644 --- a/content/test/data/attribution_reporting/interop/multiple_destinations.json +++ b/content/test/data/attribution_reporting/interop/multiple_destinations.json
@@ -94,13 +94,13 @@ "https://destination.test" ], "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "1643411973", + "scheduled_report_time": "1643408373", "source_event_id": "123", "source_type": "navigation", "trigger_data": "7" }, "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "1643411973000" + "report_time": "1643408373000" }, { "payload": { @@ -109,13 +109,13 @@ "https://destination.test" ], "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "1643411973", + "scheduled_report_time": "1643408373", "source_event_id": "123", "source_type": "navigation", "trigger_data": "5" }, "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "1643411973000" + "report_time": "1643408373000" } ], "aggregatable_results": [
diff --git a/content/test/data/attribution_reporting/interop/rate_limit_max_attribution_reporting_endpoints.json b/content/test/data/attribution_reporting/interop/rate_limit_max_attribution_reporting_endpoints.json index f879694..5e54c7b4 100644 --- a/content/test/data/attribution_reporting/interop/rate_limit_max_attribution_reporting_endpoints.json +++ b/content/test/data/attribution_reporting/interop/rate_limit_max_attribution_reporting_endpoints.json
@@ -278,49 +278,49 @@ "payload": { "attribution_destination": [ "https://another-destination.test", "https://destination.test" ], "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "1643411973", + "scheduled_report_time": "1643408373", "source_event_id": "111", "source_type": "navigation", "trigger_data": "7" }, "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "1643411973000" + "report_time": "1643408373000" }, { "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "1643411977", + "scheduled_report_time": "1643408377", "source_event_id": "222", "source_type": "navigation", "trigger_data": "6" }, "report_url": "https://another-reporter.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "1643411977000" + "report_time": "1643408377000" }, { "payload": { "attribution_destination": "https://another-destination.test", "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "1643411979", + "scheduled_report_time": "1643408379", "source_event_id": "333", "source_type": "navigation", "trigger_data": "5" }, "report_url": "https://another-reporter.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "1643411979000" + "report_time": "1643408379000" }, { "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0000025, - "scheduled_report_time": "1645831181", + "scheduled_report_time": "1645827581", "source_event_id": "444", "source_type": "event", "trigger_data": "1" }, "report_url": "https://another-reporter.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "1645831181000" + "report_time": "1645827581000" } ], "verbose_debug_reports": [
diff --git a/content/test/data/attribution_reporting/interop/rate_limit_max_attributions.json b/content/test/data/attribution_reporting/interop/rate_limit_max_attributions.json index 507351d4..80e9c507 100644 --- a/content/test/data/attribution_reporting/interop/rate_limit_max_attributions.json +++ b/content/test/data/attribution_reporting/interop/rate_limit_max_attributions.json
@@ -400,73 +400,73 @@ "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0001372, - "scheduled_report_time": "1643325573", + "scheduled_report_time": "1643321973", "source_event_id": "111", "source_type": "navigation", "trigger_data": "1" }, "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "1643325573000" + "report_time": "1643321973000" }, { "payload": { "attribution_destination": [ "https://another-destination.test", "https://destination.test" ], "randomized_trigger_rate": 0.0001372, - "scheduled_report_time": "1643325575", + "scheduled_report_time": "1643321975", "source_event_id": "222", "source_type": "navigation", "trigger_data": "7" }, - "report_time": "1643325575000", + "report_time": "1643321975000", "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution" }, { "payload": { "attribution_destination": [ "https://another-destination.test", "https://destination.test" ], "randomized_trigger_rate": 0.0001372, - "scheduled_report_time": "1643325575", + "scheduled_report_time": "1643321975", "source_event_id": "222", "source_type": "navigation", "trigger_data": "3" }, "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "1643325575000" + "report_time": "1643321975000" }, { "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "1643411977", + "scheduled_report_time": "1643408377", "source_event_id": "333", "source_type": "navigation", "trigger_data": "2" }, "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "1643411977000" + "report_time": "1643408377000" }, { "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "1643411981", + "scheduled_report_time": "1643408381", "source_event_id": "555", "source_type": "navigation", "trigger_data": "4" }, "report_url": "https://reporter2.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "1643411981001" + "report_time": "1643408381001" }, { "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0000025, - "scheduled_report_time": "1645831183", + "scheduled_report_time": "1645827583", "source_event_id": "666", "source_type": "event", "trigger_data": "0" }, "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "1645831183000" + "report_time": "1645827583000" } ], "aggregatable_results": [
diff --git a/content/test/data/attribution_reporting/interop/rate_limit_max_reporting_origins_per_source_reporting_site.json b/content/test/data/attribution_reporting/interop/rate_limit_max_reporting_origins_per_source_reporting_site.json index f21e858..64ee6b4 100644 --- a/content/test/data/attribution_reporting/interop/rate_limit_max_reporting_origins_per_source_reporting_site.json +++ b/content/test/data/attribution_reporting/interop/rate_limit_max_reporting_origins_per_source_reporting_site.json
@@ -172,36 +172,36 @@ "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "1643411973", + "scheduled_report_time": "1643408373", "source_event_id": "222", "source_type": "navigation", "trigger_data": "1" }, - "report_time": "1643411973001", + "report_time": "1643408373001", "report_url": "https://another-reporter.test/.well-known/attribution-reporting/report-event-attribution" }, { "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "1643411973", + "scheduled_report_time": "1643408373", "source_event_id": "333", "source_type": "navigation", "trigger_data": "2" }, - "report_time": "1643411973002", + "report_time": "1643408373002", "report_url": "https://a.reporter.test/.well-known/attribution-reporting/report-event-attribution" }, { "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "1643498373", + "scheduled_report_time": "1643494773", "source_event_id": "555", "source_type": "navigation", "trigger_data": "4" }, - "report_time": "1643498373000", + "report_time": "1643494773000", "report_url": "https://b.reporter.test/.well-known/attribution-reporting/report-event-attribution" } ],
diff --git a/content/test/data/attribution_reporting/interop/rate_limit_max_source_registration_reporting_origin_endpoints.json b/content/test/data/attribution_reporting/interop/rate_limit_max_source_registration_reporting_origin_endpoints.json index c4e4ae2..ab1d04f 100644 --- a/content/test/data/attribution_reporting/interop/rate_limit_max_source_registration_reporting_origin_endpoints.json +++ b/content/test/data/attribution_reporting/interop/rate_limit_max_source_registration_reporting_origin_endpoints.json
@@ -271,49 +271,49 @@ "payload": { "attribution_destination": "https://destination1.test", "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "1643411973", + "scheduled_report_time": "1643408373", "source_event_id": "111", "source_type": "navigation", "trigger_data": "7" }, "report_url": "https://reporter1.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "1643411973000" + "report_time": "1643408373000" }, { "payload": { "attribution_destination": "https://destination1.test", "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "1643411974", + "scheduled_report_time": "1643408374", "source_event_id": "222", "source_type": "navigation", "trigger_data": "6" }, "report_url": "https://reporter2.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "1643411974000" + "report_time": "1643408374000" }, { "payload": { "attribution_destination": "https://destination2.test", "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "1643411976", + "scheduled_report_time": "1643408376", "source_event_id": "333", "source_type": "navigation", "trigger_data": "5" }, "report_url": "https://reporter2.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "1643411976000" + "report_time": "1643408376000" }, { "payload": { "attribution_destination": "https://destination1.test", "randomized_trigger_rate": 0.0000025, - "scheduled_report_time": "1648423173", + "scheduled_report_time": "1648419573", "source_event_id": "555", "source_type": "event", "trigger_data": "1" }, "report_url": "https://reporter3.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "1648423173000" + "report_time": "1648419573000" } ], "verbose_debug_reports": [
diff --git a/content/test/data/attribution_reporting/interop/same_destination_site.json b/content/test/data/attribution_reporting/interop/same_destination_site.json index 90a149f..1c3b016a 100644 --- a/content/test/data/attribution_reporting/interop/same_destination_site.json +++ b/content/test/data/attribution_reporting/interop/same_destination_site.json
@@ -69,13 +69,13 @@ "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "1643411973", + "scheduled_report_time": "1643408373", "source_event_id": "123", "source_type": "navigation", "trigger_data": "7" }, "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "1643411973000" + "report_time": "1643408373000" } ], "verbose_debug_reports": [
diff --git a/content/test/data/attribution_reporting/interop/same_reporting_origin.json b/content/test/data/attribution_reporting/interop/same_reporting_origin.json index a7df061..f8542152 100644 --- a/content/test/data/attribution_reporting/interop/same_reporting_origin.json +++ b/content/test/data/attribution_reporting/interop/same_reporting_origin.json
@@ -67,13 +67,13 @@ "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "1643411973", + "scheduled_report_time": "1643408373", "source_event_id": "123", "source_type": "navigation", "trigger_data": "7" }, "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "1643411973000" + "report_time": "1643408373000" } ] }
diff --git a/content/test/data/attribution_reporting/interop/source_deactivation.json b/content/test/data/attribution_reporting/interop/source_deactivation.json index 1012f7c22..a86ac1c 100644 --- a/content/test/data/attribution_reporting/interop/source_deactivation.json +++ b/content/test/data/attribution_reporting/interop/source_deactivation.json
@@ -157,12 +157,12 @@ "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0001372, - "scheduled_report_time": "1643325574", + "scheduled_report_time": "1643321974", "source_event_id": "222", "source_type": "navigation", "trigger_data": "2" }, - "report_time": "1643325574000", + "report_time": "1643321974000", "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution" } ]
diff --git a/content/test/data/attribution_reporting/interop/source_priority.json b/content/test/data/attribution_reporting/interop/source_priority.json index 522e75e..d43f6323 100644 --- a/content/test/data/attribution_reporting/interop/source_priority.json +++ b/content/test/data/attribution_reporting/interop/source_priority.json
@@ -85,13 +85,13 @@ "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "1643411974", + "scheduled_report_time": "1643408374", "source_event_id": "456", "source_type": "navigation", "trigger_data": "7" }, "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "1643411974000" + "report_time": "1643408374000" } ] }
diff --git a/content/test/data/attribution_reporting/interop/source_storage_limit.json b/content/test/data/attribution_reporting/interop/source_storage_limit.json index b66c60e0..0b04895af 100644 --- a/content/test/data/attribution_reporting/interop/source_storage_limit.json +++ b/content/test/data/attribution_reporting/interop/source_storage_limit.json
@@ -193,12 +193,12 @@ "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "1643412073", + "scheduled_report_time": "1643408473", "source_event_id": "555", "source_type": "navigation", "trigger_data": "4" }, - "report_time": "1643412073000", + "report_time": "1643408473000", "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution" } ],
diff --git a/content/test/data/attribution_reporting/interop/success_debug_event_level.json b/content/test/data/attribution_reporting/interop/success_debug_event_level.json index 948a050..96879437 100644 --- a/content/test/data/attribution_reporting/interop/success_debug_event_level.json +++ b/content/test/data/attribution_reporting/interop/success_debug_event_level.json
@@ -175,7 +175,7 @@ "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "1643411973", + "scheduled_report_time": "1643408373", "source_event_id": "123", "source_type": "navigation", "trigger_data": "7", @@ -183,59 +183,59 @@ "trigger_debug_key": "333" }, "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "1643411973000" + "report_time": "1643408373000" }, { "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "1643411973", + "scheduled_report_time": "1643408373", "source_event_id": "123", "source_type": "navigation", "trigger_data": "6", "source_debug_key": "111" }, "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "1643411973000" + "report_time": "1643408373000" }, { "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "1643411973", + "scheduled_report_time": "1643408373", "source_event_id": "123", "source_type": "navigation", "trigger_data": "5", "source_debug_key": "111" }, "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "1643411973000" + "report_time": "1643408373000" }, { "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "1643411973", + "scheduled_report_time": "1643408373", "source_event_id": "456", "source_type": "navigation", "trigger_data": "4", "trigger_debug_key": "555" }, "report_url": "https://another-reporter.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "1643411973001" + "report_time": "1643408373001" }, { "payload": { "attribution_destination": "https://another-destination.test", "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "1643411973", + "scheduled_report_time": "1643408373", "source_event_id": "789", "source_type": "navigation", "trigger_data": "3", "trigger_debug_key": "666" }, "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "1643411973002" + "report_time": "1643408373002" } ], "debug_event_level_results": [ @@ -243,7 +243,7 @@ "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "1643411973", + "scheduled_report_time": "1643408373", "source_event_id": "123", "source_type": "navigation", "trigger_data": "7",
diff --git a/content/test/data/attribution_reporting/interop/top_level_filter_data.json b/content/test/data/attribution_reporting/interop/top_level_filter_data.json index 693de3ad..3554d4fa 100644 --- a/content/test/data/attribution_reporting/interop/top_level_filter_data.json +++ b/content/test/data/attribution_reporting/interop/top_level_filter_data.json
@@ -340,36 +340,36 @@ "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "1643411973", + "scheduled_report_time": "1643408373", "source_event_id": "123", "source_type": "navigation", "trigger_data": "3" }, "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "1643411973000" + "report_time": "1643408373000" }, { "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "1643411973", + "scheduled_report_time": "1643408373", "source_event_id": "123", "source_type": "navigation", "trigger_data": "5" }, - "report_time": "1643411973000", + "report_time": "1643408373000", "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution" }, { "payload": { "attribution_destination": "https://another-destination.test", "randomized_trigger_rate": 0.0000025, - "scheduled_report_time": "1645831173", + "scheduled_report_time": "1645827573", "source_event_id": "456", "source_type": "event", "trigger_data": "1" }, - "report_time": "1645831173001", + "report_time": "1645827573001", "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution" } ],
diff --git a/content/test/data/attribution_reporting/interop/verbose_debug_report_multiple_data.json b/content/test/data/attribution_reporting/interop/verbose_debug_report_multiple_data.json index da67a7d..7ee0e83e 100644 --- a/content/test/data/attribution_reporting/interop/verbose_debug_report_multiple_data.json +++ b/content/test/data/attribution_reporting/interop/verbose_debug_report_multiple_data.json
@@ -80,13 +80,13 @@ "payload": { "attribution_destination": "https://destination.test", "randomized_trigger_rate": 0.0024263, - "scheduled_report_time": "1643411973", + "scheduled_report_time": "1643408373", "source_event_id": "123", "source_type": "navigation", "trigger_data": "1" }, "report_url": "https://reporter.test/.well-known/attribution-reporting/report-event-attribution", - "report_time": "1643411973000" + "report_time": "1643408373000" } ], "verbose_debug_reports": [
diff --git a/content/test/gpu/unexpected_passes/gpu_builders.py b/content/test/gpu/unexpected_passes/gpu_builders.py index 6ecc477..d3fb530 100644 --- a/content/test/gpu/unexpected_passes/gpu_builders.py +++ b/content/test/gpu/unexpected_passes/gpu_builders.py
@@ -22,7 +22,7 @@ # Builders running tests in Chrome Labs. tests = test_map.get('isolated_scripts', []) for t in tests: - if t.get('isolate_name') not in self.GetIsolateNames(): + if t.get('test') not in self.GetIsolateNames(): continue if self._suite in t.get('args', []): return True
diff --git a/content/test/gpu/unexpected_passes/gpu_builders_unittest.py b/content/test/gpu/unexpected_passes/gpu_builders_unittest.py index 022db14..cd311a11 100755 --- a/content/test/gpu/unexpected_passes/gpu_builders_unittest.py +++ b/content/test/gpu/unexpected_passes/gpu_builders_unittest.py
@@ -24,7 +24,7 @@ 'args': [ 'webgl_conformance', ], - 'isolate_name': 'telemetry_gpu_integration_test', + 'test': 'telemetry_gpu_integration_test', }, ], } @@ -52,7 +52,7 @@ 'args': [ 'webgl_conformance', ], - 'isolate_name': 'not_telemetry', + 'test': 'not_telemetry', }, ], } @@ -80,7 +80,7 @@ 'args': [ 'not_a_suite', ], - 'isolate_name': 'telemetry_gpu_integration_test', + 'test': 'telemetry_gpu_integration_test', }, ], }
diff --git a/device/fido/features.cc b/device/fido/features.cc index a358428..fd01a20c 100644 --- a/device/fido/features.cc +++ b/device/fido/features.cc
@@ -64,10 +64,10 @@ "WebAuthenticationAndroidCredMan", base::FEATURE_DISABLED_BY_DEFAULT); -// Enabled in M118. Remove in or after M121. +// Not yet enabled by default. BASE_FEATURE(kWebAuthnAndroidCredManForHybrid, "WebAuthenticationAndroidCredManForHybrid", - base::FEATURE_ENABLED_BY_DEFAULT); + base::FEATURE_DISABLED_BY_DEFAULT); // Added in M118, Not yet enabled by default. BASE_FEATURE(kWebAuthnAndroidCredManAndGmsCore,
diff --git a/docs/chromium_browser_vs_google_chrome.md b/docs/chromium_browser_vs_google_chrome.md index 1ed161f8..7aadbf2 100644 --- a/docs/chromium_browser_vs_google_chrome.md +++ b/docs/chromium_browser_vs_google_chrome.md
@@ -43,7 +43,8 @@ * Cache is kept in `~/.cache/chromium` * New release testing depends on the distribution * Distributions are encouraged to track stable channel releases: see - http://googlechromereleases.blogspot.com/, http://omahaproxy.appspot.com/ - and http://gsdview.appspot.com/chromium-browser-official/ + https://chromereleases.googleblog.com/, + https://chromiumdash.appspot.com/releases?platform=Linux + and https://gsdview.appspot.com/chromium-browser-official/ * Google API keys depend on the distribution * See https://www.chromium.org/developers/how-tos/api-keys
diff --git a/docs/updater/functional_spec.md b/docs/updater/functional_spec.md index a9a0077..1c86704 100644 --- a/docs/updater/functional_spec.md +++ b/docs/updater/functional_spec.md
@@ -463,7 +463,7 @@ [Omaha Protocol](protocol_3_1.md). The updater uses platform-native network stacks (WinHTTP on Windows and -NSURLSession on macOS). +NSURLSession on macOS) with user-agent `"{PRODUCT_FULLNAME} {UpdaterVersion}"`. #### Security It is not possible to MITM the updater even if the network (including TLS) is
diff --git a/docs/website b/docs/website index c83dfca..ca1c5b7 160000 --- a/docs/website +++ b/docs/website
@@ -1 +1 @@ -Subproject commit c83dfcabbbce1956edf91dbdc1d863cb062e3fd5 +Subproject commit ca1c5b7a5c17baf0bda343ab5bb4e18c30c87c01
diff --git a/extensions/common/user_script.cc b/extensions/common/user_script.cc index 2a46fc2..15003759 100644 --- a/extensions/common/user_script.cc +++ b/extensions/common/user_script.cc
@@ -199,24 +199,20 @@ } bool UserScript::MatchesURL(const GURL& url) const { - if (!url_set_.is_empty()) { - if (!url_set_.MatchesURL(url)) - return false; + if (!url_set_.is_empty() && !url_set_.MatchesURL(url)) { + return false; } - if (!exclude_url_set_.is_empty()) { - if (exclude_url_set_.MatchesURL(url)) - return false; + if (!exclude_url_set_.is_empty() && exclude_url_set_.MatchesURL(url)) { + return false; } - if (!globs_.empty()) { - if (!UrlMatchesGlobs(&globs_, url)) - return false; + if (!globs_.empty() && !UrlMatchesGlobs(&globs_, url)) { + return false; } - if (!exclude_globs_.empty()) { - if (UrlMatchesGlobs(&exclude_globs_, url)) - return false; + if (!exclude_globs_.empty() && UrlMatchesGlobs(&exclude_globs_, url)) { + return false; } return true;
diff --git a/fuchsia_web/webengine/browser/web_engine_browser_main_parts.cc b/fuchsia_web/webengine/browser/web_engine_browser_main_parts.cc index e006f0a..69388fd 100644 --- a/fuchsia_web/webengine/browser/web_engine_browser_main_parts.cc +++ b/fuchsia_web/webengine/browser/web_engine_browser_main_parts.cc
@@ -244,7 +244,7 @@ base::Unretained(this))); // Configure Ozone with an Aura implementation of the Screen abstraction. - screen_ = std::make_unique<aura::ScopedScreenOzone>(); + screen_ = std::make_unique<aura::ScreenOzone>(); // Create the FuchsiaCdmManager at startup rather than on-demand, to allow it // to perform potentially expensive startup work in the background.
diff --git a/fuchsia_web/webengine/browser/web_engine_browser_main_parts.h b/fuchsia_web/webengine/browser/web_engine_browser_main_parts.h index f0037396b..3b5911f 100644 --- a/fuchsia_web/webengine/browser/web_engine_browser_main_parts.h +++ b/fuchsia_web/webengine/browser/web_engine_browser_main_parts.h
@@ -22,8 +22,8 @@ class FuchsiaIntlProfileWatcher; } -namespace display { -class ScopedNativeScreen; +namespace aura { +class ScreenOzone; } namespace content { @@ -122,7 +122,7 @@ content::ContentBrowserClient* const browser_client_; - std::unique_ptr<display::ScopedNativeScreen> screen_; + std::unique_ptr<aura::ScreenOzone> screen_; // Used to publish diagnostics including the active Contexts and FrameHosts. std::unique_ptr<sys::ComponentInspector> component_inspector_;
diff --git a/infra/config/generated/builders/try/android-12-x64-rel-compilator/properties.json b/infra/config/generated/builders/try/android-12-x64-rel-compilator/properties.json index 202a6bc..8e7d7dca 100644 --- a/infra/config/generated/builders/try/android-12-x64-rel-compilator/properties.json +++ b/infra/config/generated/builders/try/android-12-x64-rel-compilator/properties.json
@@ -63,8 +63,7 @@ }, "$build/siso": { "configs": [ - "builder", - "local_typescript" + "builder" ], "enable_cloud_profiler": true, "enable_cloud_trace": true,
diff --git a/infra/config/generated/builders/try/android-nougat-x86-rel-compilator/properties.json b/infra/config/generated/builders/try/android-nougat-x86-rel-compilator/properties.json index 21b66708..3c835d09 100644 --- a/infra/config/generated/builders/try/android-nougat-x86-rel-compilator/properties.json +++ b/infra/config/generated/builders/try/android-nougat-x86-rel-compilator/properties.json
@@ -59,6 +59,15 @@ "metrics_project": "chromium-reclient-metrics", "scandeps_server": true }, + "$build/siso": { + "configs": [ + "builder" + ], + "enable_cloud_profiler": true, + "enable_cloud_trace": true, + "experiments": [], + "project": "rbe-chromium-untrusted" + }, "$recipe_engine/resultdb/test_presentation": { "column_keys": [], "grouping_keys": [
diff --git a/infra/config/generated/luci/cr-buildbucket.cfg b/infra/config/generated/luci/cr-buildbucket.cfg index a12d75c..7f0182b 100644 --- a/infra/config/generated/luci/cr-buildbucket.cfg +++ b/infra/config/generated/luci/cr-buildbucket.cfg
@@ -827,6 +827,7 @@ use_invocation_timestamp: true } } + description_html: "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-asan-compile-dbg\">android-asan-compile-dbg</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -922,6 +923,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-android-nvidia-shield-tv\">gpu-fyi-try-android-nvidia-shield-tv</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -1016,6 +1018,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-android-m-nexus-5x-64\">gpu-fyi-try-android-m-nexus-5x-64</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -1110,6 +1113,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-android-p-pixel-2-32\">gpu-fyi-try-android-p-pixel-2-32</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -1204,6 +1208,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-android-r-pixel-4-32\">gpu-fyi-try-android-r-pixel-4-32</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -1298,6 +1303,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-android-pixel-6-64\">gpu-fyi-try-android-pixel-6-64</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-cq-android-arm64\">gpu-fyi-cq-android-arm64</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -1581,6 +1587,7 @@ use_invocation_timestamp: true } } + description_html: "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-arm64-rel\">android-arm64-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-arm64-siso-rel\">android-arm64-siso-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-try-android-m-nexus-5x-64\">gpu-try-android-m-nexus-5x-64</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -1675,6 +1682,7 @@ use_invocation_timestamp: true } } + description_html: "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-webview-nougat-arm64-dbg\">android-webview-nougat-arm64-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android_unswarmed_pixel_aosp\">android_unswarmed_pixel_aosp</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android_arm64_dbg_recipe\">android_arm64_dbg_recipe</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -1769,6 +1777,7 @@ use_invocation_timestamp: true } } + description_html: "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-webview-oreo-arm64-dbg\">android-webview-oreo-arm64-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android_arm64_dbg_recipe\">android_arm64_dbg_recipe</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -1863,6 +1872,7 @@ use_invocation_timestamp: true } } + description_html: "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-webview-pie-arm64-dbg\">android-webview-pie-arm64-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android_arm64_dbg_recipe\">android_arm64_dbg_recipe</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -1958,6 +1968,7 @@ use_invocation_timestamp: true } } + description_html: "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-arm-compile-dbg\">android-arm-compile-dbg</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -2053,6 +2064,7 @@ use_invocation_timestamp: true } } + description_html: "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-oreo-arm64-dbg\">android-oreo-arm64-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-pie-arm64-dbg\">android-pie-arm64-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-webview-nougat-arm64-dbg\">android-webview-nougat-arm64-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-webview-oreo-arm64-dbg\">android-webview-oreo-arm64-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-webview-pie-arm64-dbg\">android-webview-pie-arm64-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android_arm64_dbg_recipe\">android_arm64_dbg_recipe</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android_unswarmed_pixel_aosp\">android_unswarmed_pixel_aosp</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/try-nougat-phone-tester\">try-nougat-phone-tester</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -2145,6 +2157,7 @@ use_invocation_timestamp: true } } + description_html: "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-arm64-all-targets-dbg\">android-arm64-all-targets-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android_compile_dbg\">android_compile_dbg</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -2238,6 +2251,7 @@ use_invocation_timestamp: true } } + description_html: "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-12-x64-dbg\">android-12-x64-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-12l-x64-dbg\">android-12l-x64-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-webview-12-x64-dbg\">android-webview-12-x64-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-webview-13-x64-dbg\">android-webview-13-x64-dbg</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -2334,6 +2348,7 @@ use_invocation_timestamp: true } } + description_html: "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_compile_x64_dbg\">android_compile_x64_dbg</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -2429,6 +2444,7 @@ use_invocation_timestamp: true } } + description_html: "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_compile_x86_dbg\">android_compile_x86_dbg</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -2799,6 +2815,7 @@ use_invocation_timestamp: true } } + description_html: "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-x64-cast\">android-x64-cast</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -2894,6 +2911,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-x64-castos-audio\">linux-x64-castos-audio</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -2988,6 +3006,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-x64-castos\">linux-x64-castos</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -3082,6 +3101,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-arm64-castos\">linux-arm64-castos</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -3176,6 +3196,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-x64-castos-dbg\">linux-x64-castos-dbg</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -3362,6 +3383,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-chromeos-amd64-generic\">gpu-fyi-try-chromeos-amd64-generic</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -3457,6 +3479,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-chromeos-kevin\">gpu-fyi-try-chromeos-kevin</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -3552,6 +3575,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-chromeos-skylab-kevin\">gpu-fyi-try-chromeos-skylab-kevin</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -5657,6 +5681,7 @@ use_invocation_timestamp: true } } + description_html: "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-dawn-arm-rel\">android-dawn-arm-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -5752,6 +5777,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-android-arm-deps-rel\">dawn-android-arm-deps-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -5846,6 +5872,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-android-arm-deps-rel\">dawn-android-arm-deps-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -5940,6 +5967,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-android-arm-deps-rel\">dawn-android-arm-deps-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -6034,6 +6062,7 @@ use_invocation_timestamp: true } } + description_html: "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-dawn-arm-rel\">android-dawn-arm-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -6128,6 +6157,7 @@ use_invocation_timestamp: true } } + description_html: "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-dawn-arm-rel\">android-dawn-arm-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -6223,6 +6253,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-android-arm64-deps-rel\">dawn-android-arm64-deps-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -6318,6 +6349,7 @@ use_invocation_timestamp: true } } + description_html: "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-dawn-arm64-rel\">android-dawn-arm64-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -6413,6 +6445,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-try-linux-tsan-rel\">dawn-try-linux-tsan-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -6508,6 +6541,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-dawn-rel\">linux-dawn-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -6602,6 +6636,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-linux-x64-deps-rel\">dawn-linux-x64-deps-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -6695,6 +6730,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-linux-x64-deps-rel\">dawn-linux-x64-deps-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -6788,6 +6824,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-linux-x64-deps-rel\">dawn-linux-x64-deps-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -6881,6 +6918,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-dawn-rel\">linux-dawn-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -6974,6 +7012,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-dawn-rel\">linux-dawn-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -7159,6 +7198,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-try-mac-arm64-rel\">dawn-try-mac-arm64-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -7252,6 +7292,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-dawn-rel\">mac-dawn-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-try-mac-amd-exp\">dawn-try-mac-amd-exp</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-try-mac-intel-exp\">dawn-try-mac-intel-exp</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -7344,6 +7385,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-mac-x64-deps-rel\">dawn-mac-x64-deps-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -7437,6 +7479,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-mac-x64-deps-rel\">dawn-mac-x64-deps-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -7530,6 +7573,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-mac-x64-deps-rel\">dawn-mac-x64-deps-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -7623,6 +7667,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-try-mac-amd-exp\">dawn-try-mac-amd-exp</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -7716,6 +7761,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-try-mac-intel-exp\">dawn-try-mac-intel-exp</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -7809,6 +7855,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-dawn-rel\">mac-dawn-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -7902,6 +7949,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-dawn-rel\">mac-dawn-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -7996,6 +8044,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-try-win10-x64-intel-asan\">dawn-try-win10-x64-intel-asan</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-try-win10-x64-nvidia-asan\">dawn-try-win10-x64-nvidia-asan</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -8090,6 +8139,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-try-win10-x64-intel-asan\">dawn-try-win10-x64-intel-asan</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -8184,6 +8234,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-try-win10-x64-nvidia-asan\">dawn-try-win10-x64-nvidia-asan</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -8279,6 +8330,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-try-win-x64-intel-exp\">dawn-try-win-x64-intel-exp</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-dawn-rel\">win-dawn-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -8373,6 +8425,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-win10-x64-deps-rel\">dawn-win10-x64-deps-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -8466,6 +8519,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-win10-x64-deps-rel\">dawn-win10-x64-deps-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -8559,6 +8613,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-win10-x64-deps-rel\">dawn-win10-x64-deps-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -8652,6 +8707,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-try-win-x64-intel-exp\">dawn-try-win-x64-intel-exp</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -8745,6 +8801,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-dawn-rel\">win-dawn-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -8838,6 +8895,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-dawn-rel\">win-dawn-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -8932,6 +8990,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-try-win-x86-intel-exp\">dawn-try-win-x86-intel-exp</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-try-win10-x86-rel\">dawn-try-win10-x86-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -9026,6 +9085,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-win10-x86-deps-rel\">dawn-win10-x86-deps-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -9119,6 +9179,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-win10-x86-deps-rel\">dawn-win10-x86-deps-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -9213,6 +9274,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-win10-x86-deps-rel\">dawn-win10-x86-deps-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -9306,6 +9368,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-try-win-x86-intel-exp\">dawn-try-win-x86-intel-exp</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -9399,6 +9462,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-try-win10-x86-rel\">dawn-try-win10-x86-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -9492,6 +9556,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/dawn-try-win10-x86-rel\">dawn-try-win10-x86-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -10066,6 +10131,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-android-nvidia-shield-tv\">gpu-fyi-try-android-nvidia-shield-tv</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-android-p-pixel-2-32\">gpu-fyi-try-android-p-pixel-2-32</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-android-r-pixel-4-32\">gpu-fyi-try-android-r-pixel-4-32</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -10161,6 +10227,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-android-m-nexus-5x-64\">gpu-fyi-try-android-m-nexus-5x-64</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-android-pixel-6-64\">gpu-fyi-try-android-pixel-6-64</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-cq-android-arm64\">gpu-fyi-cq-android-arm64</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -10256,6 +10323,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-lacros-amd-rel\">gpu-fyi-try-lacros-amd-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-lacros-intel-rel\">gpu-fyi-try-lacros-intel-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -10351,6 +10419,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-linux-amd-rel\">gpu-fyi-try-linux-amd-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-linux-intel-exp\">gpu-fyi-try-linux-intel-exp</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-linux-intel-rel\">gpu-fyi-try-linux-intel-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-linux-nvidia-exp\">gpu-fyi-try-linux-nvidia-exp</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-linux-nvidia-rel\">gpu-fyi-try-linux-nvidia-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -10446,6 +10515,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-linux-nvidia-dbg\">gpu-fyi-try-linux-nvidia-dbg</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -10539,6 +10609,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-amd-pro-rel\">gpu-fyi-try-mac-amd-pro-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-amd-retina-exp\">gpu-fyi-try-mac-amd-retina-exp</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-amd-retina-rel\">gpu-fyi-try-mac-amd-retina-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-intel-exp\">gpu-fyi-try-mac-intel-exp</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-intel-rel\">gpu-fyi-try-mac-intel-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-nvidia-retina-exp\">gpu-fyi-try-mac-nvidia-retina-exp</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-nvidia-retina-rel\">gpu-fyi-try-mac-nvidia-retina-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -10632,6 +10703,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-amd-retina-asan\">gpu-fyi-try-mac-amd-retina-asan</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-intel-asan\">gpu-fyi-try-mac-intel-asan</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -10725,6 +10797,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-amd-retina-dbg\">gpu-fyi-try-mac-amd-retina-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-intel-dbg\">gpu-fyi-try-mac-intel-dbg</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -10818,6 +10891,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-arm64-apple-m1-exp\">gpu-fyi-try-mac-arm64-apple-m1-exp</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-arm64-apple-m1-rel\">gpu-fyi-try-mac-arm64-apple-m1-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-arm64-apple-m2-retina-rel\">gpu-fyi-try-mac-arm64-apple-m2-retina-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -10913,6 +10987,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-win10-nvidia-rel-32\">gpu-fyi-try-win10-nvidia-rel-32</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -11007,6 +11082,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-win10-amd-rel-64\">gpu-fyi-try-win10-amd-rel-64</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-win10-intel-exp-64\">gpu-fyi-try-win10-intel-exp-64</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-win10-intel-rel-64\">gpu-fyi-try-win10-intel-rel-64</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-win10-nvidia-exp-64\">gpu-fyi-try-win10-nvidia-exp-64</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-win10-nvidia-rel-64\">gpu-fyi-try-win10-nvidia-rel-64</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -11102,6 +11178,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-win10-nvidia-dbg-64\">gpu-fyi-try-win10-nvidia-dbg-64</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -11196,6 +11273,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-win10-nvidia-dx12vk-rel-64\">gpu-fyi-try-win10-nvidia-dx12vk-rel-64</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -11291,6 +11369,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-win10-nvidia-dx12vk-dbg-64\">gpu-fyi-try-win10-nvidia-dx12vk-dbg-64</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -11576,6 +11655,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-rel\">linux-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-inverse-fieldtrials-fyi-rel\">linux-inverse-fieldtrials-fyi-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-mbi-mode-per-render-process-host-rel\">linux-mbi-mode-per-render-process-host-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-mbi-mode-per-site-instance-rel\">linux-mbi-mode-per-site-instance-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-dcheck-off-rel\">linux-dcheck-off-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-siso-rel\">linux-siso-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-try-linux-nvidia-rel\">gpu-try-linux-nvidia-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -11668,6 +11748,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-try-linux-nvidia-dbg\">gpu-try-linux-nvidia-dbg</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -11760,6 +11841,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-inverse-fieldtrials-fyi-rel\">mac-inverse-fieldtrials-fyi-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-rel\">mac-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -11850,6 +11932,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-try-mac-amd-retina-dbg\">gpu-try-mac-amd-retina-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-try-mac-intel-dbg\">gpu-try-mac-intel-dbg</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -11944,6 +12027,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-rel\">win-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-siso-rel\">win-siso-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win10_chromium_inverse_fieldtrials_x64_fyi_rel_ng\">win10_chromium_inverse_fieldtrials_x64_fyi_rel_ng</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -12129,6 +12213,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-lacros-amd-rel\">gpu-fyi-try-lacros-amd-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -12223,6 +12308,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-lacros-intel-rel\">gpu-fyi-try-lacros-intel-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -12315,6 +12401,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/leak_detection_linux\">leak_detection_linux</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -13645,6 +13732,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_asan_rel_ng\">linux_chromium_asan_rel_ng</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_asan_siso_rel_ng\">linux_chromium_asan_siso_rel_ng</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -13738,6 +13826,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_asan_rel_ng\">linux_chromium_asan_rel_ng</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_asan_siso_rel_ng\">linux_chromium_asan_siso_rel_ng</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -13925,6 +14014,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-rel\">linux-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-inverse-fieldtrials-fyi-rel\">linux-inverse-fieldtrials-fyi-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-mbi-mode-per-render-process-host-rel\">linux-mbi-mode-per-render-process-host-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-mbi-mode-per-site-instance-rel\">linux-mbi-mode-per-site-instance-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-dcheck-off-rel\">linux-dcheck-off-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-siso-rel\">linux-siso-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_compile_rel_ng\">linux_chromium_compile_rel_ng</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -14020,6 +14110,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-wayland-rel\">linux-wayland-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-wayland-siso-rel\">linux-wayland-siso-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -14114,6 +14205,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_compile_dbg_ng\">linux_chromium_compile_dbg_ng</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_dbg_ng\">linux_chromium_dbg_ng</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -14300,6 +14392,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_cfi_rel_ng\">linux_chromium_cfi_rel_ng</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -14394,6 +14487,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_chromeos_asan_rel_ng\">linux_chromium_chromeos_asan_rel_ng</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -14487,6 +14581,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_chromeos_asan_rel_ng\">linux_chromium_chromeos_asan_rel_ng</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -14675,6 +14770,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_chromeos_msan_rel_ng\">linux_chromium_chromeos_msan_rel_ng</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -14768,6 +14864,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_chromeos_msan_rel_ng\">linux_chromium_chromeos_msan_rel_ng</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -14858,6 +14955,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-try-linux-nvidia-dbg\">gpu-try-linux-nvidia-dbg</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -14951,6 +15049,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-linux-nvidia-dbg\">gpu-fyi-try-linux-nvidia-dbg</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -15045,6 +15144,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-linux-intel-exp\">gpu-fyi-try-linux-intel-exp</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -15139,6 +15239,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-linux-nvidia-exp\">gpu-fyi-try-linux-nvidia-exp</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -15233,6 +15334,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-linux-nvidia-tsn\">gpu-fyi-try-linux-nvidia-tsn</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -15327,6 +15429,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-linux-amd-rel\">gpu-fyi-try-linux-amd-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -15421,6 +15524,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-linux-intel-rel\">gpu-fyi-try-linux-intel-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -15515,6 +15619,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-linux-nvidia-rel\">gpu-fyi-try-linux-nvidia-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -15610,6 +15715,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_msan_rel_ng\">linux_chromium_msan_rel_ng</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -15704,6 +15810,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_msan_rel_ng\">linux_chromium_msan_rel_ng</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -15797,6 +15904,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-rel\">linux-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-inverse-fieldtrials-fyi-rel\">linux-inverse-fieldtrials-fyi-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-mbi-mode-per-render-process-host-rel\">linux-mbi-mode-per-render-process-host-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-mbi-mode-per-site-instance-rel\">linux-mbi-mode-per-site-instance-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-dcheck-off-rel\">linux-dcheck-off-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-siso-rel\">linux-siso-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-try-linux-nvidia-rel\">gpu-try-linux-nvidia-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -15892,6 +16000,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_tsan_rel_ng\">linux_chromium_tsan_rel_ng</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_tsan_siso_rel_ng\">linux_chromium_tsan_siso_rel_ng</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -15986,6 +16095,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_tsan_rel_ng\">linux_chromium_tsan_rel_ng</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_tsan_siso_rel_ng\">linux_chromium_tsan_siso_rel_ng</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -16089,6 +16199,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-rel\">linux-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-inverse-fieldtrials-fyi-rel\">linux-inverse-fieldtrials-fyi-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-mbi-mode-per-render-process-host-rel\">linux-mbi-mode-per-render-process-host-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-mbi-mode-per-site-instance-rel\">linux-mbi-mode-per-site-instance-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-dcheck-off-rel\">linux-dcheck-off-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-siso-rel\">linux-siso-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_compile_rel_ng\">linux_chromium_compile_rel_ng</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -16183,6 +16294,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-wayland-rel\">linux-wayland-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-wayland-siso-rel\">linux-wayland-siso-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -16276,6 +16388,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_dbg_ng\">linux_chromium_dbg_ng</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_compile_dbg_ng\">linux_chromium_compile_dbg_ng</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -16369,6 +16482,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-viz-rel\">linux-viz-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -16834,6 +16948,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac_chromium_asan_rel_ng\">mac_chromium_asan_rel_ng</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -16926,6 +17041,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac_chromium_asan_rel_ng\">mac_chromium_asan_rel_ng</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -17018,6 +17134,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-inverse-fieldtrials-fyi-rel\">mac-inverse-fieldtrials-fyi-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-rel\">mac-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac_chromium_10.15_rel_ng\">mac_chromium_10.15_rel_ng</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac_chromium_11.0_rel_ng\">mac_chromium_11.0_rel_ng</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac12-tests\">mac12-tests</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac13-tests\">mac13-tests</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac_chromium_compile_rel_ng\">mac_chromium_compile_rel_ng</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -17111,6 +17228,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac_chromium_compile_dbg_ng\">mac_chromium_compile_dbg_ng</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac_chromium_dbg_ng\">mac_chromium_dbg_ng</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -17292,6 +17410,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-builder-next\">mac-builder-next</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -17383,6 +17502,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-try-mac-intel-dbg\">gpu-try-mac-intel-dbg</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -17476,6 +17596,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-intel-asan\">gpu-fyi-try-mac-intel-asan</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -17570,6 +17691,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-intel-dbg\">gpu-fyi-try-mac-intel-dbg</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -17664,6 +17786,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-arm64-apple-m1-exp\">gpu-fyi-try-mac-arm64-apple-m1-exp</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -17758,6 +17881,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-intel-exp\">gpu-fyi-try-mac-intel-exp</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -17852,6 +17976,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-amd-retina-exp\">gpu-fyi-try-mac-amd-retina-exp</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -17946,6 +18071,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-nvidia-retina-exp\">gpu-fyi-try-mac-nvidia-retina-exp</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -18040,6 +18166,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-arm64-apple-m1-rel\">gpu-fyi-try-mac-arm64-apple-m1-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -18134,6 +18261,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-intel-rel\">gpu-fyi-try-mac-intel-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -18228,6 +18356,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-amd-retina-asan\">gpu-fyi-try-mac-amd-retina-asan</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -18322,6 +18451,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-amd-retina-dbg\">gpu-fyi-try-mac-amd-retina-dbg</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -18416,6 +18546,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-amd-retina-rel\">gpu-fyi-try-mac-amd-retina-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -18510,6 +18641,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-arm64-apple-m2-retina-rel\">gpu-fyi-try-mac-arm64-apple-m2-retina-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -18604,6 +18736,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-nvidia-retina-rel\">gpu-fyi-try-mac-nvidia-retina-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -18698,6 +18831,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-mac-amd-pro-rel\">gpu-fyi-try-mac-amd-pro-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -18792,6 +18926,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-inverse-fieldtrials-fyi-rel\">mac-inverse-fieldtrials-fyi-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-rel\">mac-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -18886,6 +19021,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-try-mac-amd-retina-dbg\">gpu-try-mac-amd-retina-dbg</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -18980,6 +19116,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-inverse-fieldtrials-fyi-rel\">mac-inverse-fieldtrials-fyi-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-rel\">mac-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -19256,6 +19393,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac_chromium_10.15_rel_ng\">mac_chromium_10.15_rel_ng</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac_chromium_compile_rel_ng\">mac_chromium_compile_rel_ng</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -19350,6 +19488,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac_chromium_11.0_rel_ng\">mac_chromium_11.0_rel_ng</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac_chromium_compile_rel_ng\">mac_chromium_compile_rel_ng</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -19444,6 +19583,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac12-tests\">mac12-tests</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac_chromium_compile_rel_ng\">mac_chromium_compile_rel_ng</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -19534,6 +19674,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-inverse-fieldtrials-fyi-rel\">mac-inverse-fieldtrials-fyi-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-rel\">mac-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac13-tests\">mac13-tests</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac_chromium_compile_rel_ng\">mac_chromium_compile_rel_ng</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -19624,6 +19765,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac_chromium_dbg_ng\">mac_chromium_dbg_ng</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac_chromium_compile_dbg_ng\">mac_chromium_compile_dbg_ng</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -19718,6 +19860,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/network_service_linux\">network_service_linux</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -19811,6 +19954,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/try-nougat-phone-tester\">try-nougat-phone-tester</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android_arm64_dbg_recipe\">android_arm64_dbg_recipe</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -19902,6 +20046,7 @@ use_invocation_timestamp: true } } + description_html: "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-oreo-arm64-dbg\">android-oreo-arm64-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android_arm64_dbg_recipe\">android_arm64_dbg_recipe</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -24001,6 +24146,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/layout_test_leak_detection\">layout_test_leak_detection</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -24095,6 +24241,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-webkit-msan-rel\">linux-webkit-msan-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -24187,6 +24334,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win_chromium_compile_rel_ng\">win_chromium_compile_rel_ng</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -24558,6 +24706,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win_chromium_compile_rel_ng\">win_chromium_compile_rel_ng</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -24651,6 +24800,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win_chromium_compile_dbg_ng\">win_chromium_compile_dbg_ng</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -24744,6 +24894,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-rel\">win-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-siso-rel\">win-siso-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win_chromium_x64_rel_ng\">win_chromium_x64_rel_ng</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win11-x64-fyi-rel\">win11-x64-fyi-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win10_chromium_inverse_fieldtrials_x64_fyi_rel_ng\">win10_chromium_inverse_fieldtrials_x64_fyi_rel_ng</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -24839,6 +24990,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win10_chromium_x64_dbg_ng\">win10_chromium_x64_dbg_ng</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -25115,6 +25267,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-win10-nvidia-dx12vk-dbg-64\">gpu-fyi-try-win10-nvidia-dx12vk-dbg-64</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -25209,6 +25362,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-win10-nvidia-dx12vk-rel-64\">gpu-fyi-try-win10-nvidia-dx12vk-rel-64</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -25303,6 +25457,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-win10-nvidia-dbg-64\">gpu-fyi-try-win10-nvidia-dbg-64</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -25397,6 +25552,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-win10-nvidia-exp-64\">gpu-fyi-try-win10-nvidia-exp-64</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -25490,6 +25646,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-win10-intel-exp-64\">gpu-fyi-try-win10-intel-exp-64</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -25584,6 +25741,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-win10-amd-rel-64\">gpu-fyi-try-win10-amd-rel-64</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -25678,6 +25836,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-win10-intel-rel-64\">gpu-fyi-try-win10-intel-rel-64</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -25772,6 +25931,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-win10-nvidia-rel-64\">gpu-fyi-try-win10-nvidia-rel-64</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -25960,6 +26120,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/gpu-fyi-try-win10-nvidia-rel-32\">gpu-fyi-try-win10-nvidia-rel-32</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -26053,6 +26214,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-rel\">win-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-siso-rel\">win-siso-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win10_chromium_inverse_fieldtrials_x64_fyi_rel_ng\">win10_chromium_inverse_fieldtrials_x64_fyi_rel_ng</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -26143,6 +26305,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win10_chromium_x64_dbg_ng\">win10_chromium_x64_dbg_ng</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -26331,6 +26494,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-rel\">win-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-siso-rel\">win-siso-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win10_chromium_inverse_fieldtrials_x64_fyi_rel_ng\">win10_chromium_inverse_fieldtrials_x64_fyi_rel_ng</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -26422,6 +26586,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win11-x64-fyi-rel\">win11-x64-fyi-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -26616,6 +26781,7 @@ use_invocation_timestamp: true } } + description_html: "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-10-arm64-rel\">android-10-arm64-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -26800,6 +26966,7 @@ use_invocation_timestamp: true } } + description_html: "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-11-x86-rel\">android-11-x86-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -26891,6 +27058,7 @@ use_invocation_timestamp: true } } + description_html: "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-12-x64-dbg\">android-12-x64-dbg</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -27077,6 +27245,7 @@ use_invocation_timestamp: true } } + description_html: "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-12-x64-dual-coverage-exp-rel\">android-12-x64-dual-coverage-exp-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-12-x64-rel\">android-12-x64-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -27172,6 +27341,7 @@ use_invocation_timestamp: true } } + description_html: "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-12l-x64-dbg\">android-12l-x64-dbg</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -27448,6 +27618,7 @@ use_invocation_timestamp: true } } + description_html: "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-13-x64-rel\">android-13-x64-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -27704,6 +27875,7 @@ use_invocation_timestamp: true } } + description_html: "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-angle-chromium-try\">android-angle-chromium-try</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -27875,6 +28047,7 @@ use_invocation_timestamp: true } } + description_html: "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-angle-chromium-try\">android-angle-chromium-try</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -28156,6 +28329,7 @@ use_invocation_timestamp: true } } + description_html: "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_archive_rel_ng\">android_archive_rel_ng</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -28635,6 +28809,7 @@ use_invocation_timestamp: true } } + description_html: "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-bfcache-rel\">android-bfcache-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -28960,6 +29135,7 @@ use_invocation_timestamp: true } } + description_html: "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-chrome-pie-x86-wpt-android-specific\">android-chrome-pie-x86-wpt-android-specific</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -29052,6 +29228,7 @@ use_invocation_timestamp: true } } + description_html: "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-chrome-pie-x86-wpt-fyi-rel\">android-chrome-pie-x86-wpt-fyi-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -29144,6 +29321,7 @@ use_invocation_timestamp: true } } + description_html: "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-code-coverage\">android-code-coverage</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -29236,6 +29414,7 @@ use_invocation_timestamp: true } } + description_html: "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-code-coverage-native\">android-code-coverage-native</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -29327,6 +29506,7 @@ use_invocation_timestamp: true } } + description_html: "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-cronet-arm-dbg\">android-cronet-arm-dbg</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -29418,6 +29598,7 @@ use_invocation_timestamp: true } } + description_html: "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_cronet\">android_cronet</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -29509,6 +29690,7 @@ use_invocation_timestamp: true } } + description_html: "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-cronet-arm64-dbg\">android-cronet-arm64-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-cronet-x64-dbg\">android-cronet-x64-dbg</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -29600,6 +29782,7 @@ use_invocation_timestamp: true } } + description_html: "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-cronet-arm64-rel\">android-cronet-arm64-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -29691,6 +29874,7 @@ use_invocation_timestamp: true } } + description_html: "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-cronet-asan-arm-rel\">android-cronet-asan-arm-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -29874,6 +30058,7 @@ use_invocation_timestamp: true } } + description_html: "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-cronet-mainline-clang-arm64-dbg\">android-cronet-mainline-clang-arm64-dbg</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -29965,6 +30150,7 @@ use_invocation_timestamp: true } } + description_html: "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-cronet-mainline-clang-arm64-rel\">android-cronet-mainline-clang-arm64-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -30056,6 +30242,7 @@ use_invocation_timestamp: true } } + description_html: "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-cronet-mainline-clang-x86-dbg\">android-cronet-mainline-clang-x86-dbg</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -30147,6 +30334,7 @@ use_invocation_timestamp: true } } + description_html: "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-cronet-mainline-clang-x86-rel\">android-cronet-mainline-clang-x86-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -30328,6 +30516,7 @@ use_invocation_timestamp: true } } + description_html: "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-cronet-x64-dbg-12-tests\">android-cronet-x64-dbg-12-tests</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-cronet-x64-dbg-13-tests\">android-cronet-x64-dbg-13-tests</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -30418,6 +30607,7 @@ use_invocation_timestamp: true } } + description_html: "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-cronet-x64-dbg-12-tests\">android-cronet-x64-dbg-12-tests</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -30508,6 +30698,7 @@ use_invocation_timestamp: true } } + description_html: "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-cronet-x64-dbg-13-tests\">android-cronet-x64-dbg-13-tests</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -30599,6 +30790,7 @@ use_invocation_timestamp: true } } + description_html: "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-cronet-x64-rel\">android-cronet-x64-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -30690,6 +30882,7 @@ use_invocation_timestamp: true } } + description_html: "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-cronet-x86-dbg\">android-cronet-x86-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-cronet-x86-dbg-10-tests\">android-cronet-x86-dbg-10-tests</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-cronet-x86-dbg-11-tests\">android-cronet-x86-dbg-11-tests</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-cronet-x86-dbg-oreo-tests\">android-cronet-x86-dbg-oreo-tests</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-cronet-x86-dbg-pie-tests\">android-cronet-x86-dbg-pie-tests</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-cronet-x86-dbg-nougat-tests\">android-cronet-x86-dbg-nougat-tests</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-cronet-x86-dbg-lolipop\">android-cronet-x86-dbg-lolipop</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-cronet-x86-dbg-marshmallow\">android-cronet-x86-dbg-marshmallow</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -30780,6 +30973,7 @@ use_invocation_timestamp: true } } + description_html: "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-cronet-x86-dbg-10-tests\">android-cronet-x86-dbg-10-tests</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -30870,6 +31064,7 @@ use_invocation_timestamp: true } } + description_html: "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-cronet-x86-dbg-11-tests\">android-cronet-x86-dbg-11-tests</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -30960,6 +31155,7 @@ use_invocation_timestamp: true } } + description_html: "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-cronet-x86-dbg-lolipop\">android-cronet-x86-dbg-lolipop</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -31050,6 +31246,7 @@ use_invocation_timestamp: true } } + description_html: "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-cronet-x86-dbg-marshmallow\">android-cronet-x86-dbg-marshmallow</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -31140,6 +31337,7 @@ use_invocation_timestamp: true } } + description_html: "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-cronet-x86-dbg-nougat-tests\">android-cronet-x86-dbg-nougat-tests</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -31230,6 +31428,7 @@ use_invocation_timestamp: true } } + description_html: "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-cronet-x86-dbg-oreo-tests\">android-cronet-x86-dbg-oreo-tests</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -31320,6 +31519,7 @@ use_invocation_timestamp: true } } + description_html: "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-cronet-x86-dbg-pie-tests\">android-cronet-x86-dbg-pie-tests</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -31411,6 +31611,7 @@ use_invocation_timestamp: true } } + description_html: "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-cronet-x86-rel\">android-cronet-x86-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -31616,6 +31817,7 @@ use_invocation_timestamp: true } } + description_html: "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-fieldtrial-rel\">android-fieldtrial-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -31711,6 +31913,7 @@ use_invocation_timestamp: true } } + description_html: "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-nougat-x86-dual-coverage-exp-rel\">android-nougat-x86-dual-coverage-exp-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-nougat-x86-rel\">android-nougat-x86-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-nougat-x86-siso-rel\">android-nougat-x86-siso-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -31804,6 +32007,7 @@ use_invocation_timestamp: true } } + description_html: "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-official\">android-official</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -31899,6 +32103,7 @@ use_invocation_timestamp: true } } + description_html: "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-oreo-x86-rel\">android-oreo-x86-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -31992,6 +32197,7 @@ use_invocation_timestamp: true } } + description_html: "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-perfetto-rel\">android-perfetto-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -32085,6 +32291,7 @@ use_invocation_timestamp: true } } + description_html: "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-pie-arm64-dbg\">android-pie-arm64-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android_arm64_dbg_recipe\">android_arm64_dbg_recipe</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -32180,6 +32387,7 @@ use_invocation_timestamp: true } } + description_html: "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-arm64-rel\">android-arm64-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-arm64-siso-rel\">android-arm64-siso-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -32367,6 +32575,7 @@ use_invocation_timestamp: true } } + description_html: "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-pie-x86-rel\">android-pie-x86-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/android-inverse-fieldtrials-pie-x86-fyi-rel\">android-inverse-fieldtrials-pie-x86-fyi-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -32459,6 +32668,7 @@ use_invocation_timestamp: true } } + description_html: "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-rust-arm32-rel\">android-rust-arm32-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -32550,6 +32760,7 @@ use_invocation_timestamp: true } } + description_html: "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-rust-arm64-dbg\">android-rust-arm64-dbg</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -32641,6 +32852,7 @@ use_invocation_timestamp: true } } + description_html: "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-rust-arm64-rel\">android-rust-arm64-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -32969,6 +33181,7 @@ use_invocation_timestamp: true } } + description_html: "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-webview-10-x86-rel-tests\">android-webview-10-x86-rel-tests</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -33061,6 +33274,7 @@ use_invocation_timestamp: true } } + description_html: "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-webview-12-x64-dbg\">android-webview-12-x64-dbg</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -33152,6 +33366,7 @@ use_invocation_timestamp: true } } + description_html: "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-webview-13-x64-dbg\">android-webview-13-x64-dbg</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -33244,6 +33459,7 @@ use_invocation_timestamp: true } } + description_html: "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-webview-pie-x86-wpt-fyi-rel\">android-webview-pie-x86-wpt-fyi-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -33430,6 +33646,7 @@ use_invocation_timestamp: true } } + description_html: "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-webview-10-x86-rel-tests\">android-webview-10-x86-rel-tests</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -34384,6 +34601,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/chromeos-amd64-generic-asan-rel\">chromeos-amd64-generic-asan-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -34478,6 +34696,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/chromeos-amd64-generic-cfi-thin-lto-rel\">chromeos-amd64-generic-cfi-thin-lto-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -34572,6 +34791,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/chromeos-amd64-generic-dbg\">chromeos-amd64-generic-dbg</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -34666,6 +34886,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/chromeos-amd64-generic-lacros-dbg\">chromeos-amd64-generic-lacros-dbg</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -34760,6 +34981,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/chromeos-amd64-generic-rel\">chromeos-amd64-generic-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/chromeos-amd64-generic-siso-rel\">chromeos-amd64-generic-siso-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -35039,6 +35261,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/chromeos-arm-generic-dbg\">chromeos-arm-generic-dbg</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -35133,6 +35356,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/chromeos-arm-generic-rel\">chromeos-arm-generic-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -35227,6 +35451,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/chromeos-arm64-generic-rel\">chromeos-arm64-generic-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -35318,6 +35543,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/chromeos-jacuzzi-rel\">chromeos-jacuzzi-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -35410,6 +35636,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/chromeos-js-coverage-rel\">chromeos-js-coverage-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/chromeos-js-code-coverage\">chromeos-js-code-coverage</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -35501,6 +35728,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/chromeos-octopus-rel\">chromeos-octopus-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -35637,6 +35865,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/fuchsia-angle-try\">fuchsia-angle-try</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -35740,6 +35969,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/fuchsia-arm64-cast-receiver-rel\">fuchsia-arm64-cast-receiver-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -35835,6 +36065,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/fuchsia-arm64-rel\">fuchsia-arm64-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -35928,6 +36159,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/fuchsia-code-coverage\">fuchsia-code-coverage</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -36022,6 +36254,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/fuchsia-fyi-arm64-dbg\">fuchsia-fyi-arm64-dbg</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -36212,6 +36445,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/fuchsia-fyi-x64-dbg\">fuchsia-fyi-x64-dbg</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -36397,6 +36631,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/fuchsia-official\">fuchsia-official</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -36489,6 +36724,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/fuchsia-x64-accessibility-rel\">fuchsia-x64-accessibility-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -36583,6 +36819,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel\">fuchsia-x64-cast-receiver-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/fuchsia-x64-cast-receiver-siso-rel\">fuchsia-x64-cast-receiver-siso-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -36678,6 +36915,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/fuchsia-compile-x64-dbg\">fuchsia-compile-x64-dbg</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -36773,6 +37011,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/fuchsia-x64-rel\">fuchsia-x64-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -36956,6 +37195,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/ios-angle-try-intel\">ios-angle-try-intel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -37131,6 +37371,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/ios-angle-try-intel\">ios-angle-try-intel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -37227,6 +37468,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/ios-asan\">ios-asan</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -37320,6 +37562,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/ios-blink-dbg-fyi\">ios-blink-dbg-fyi</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -37417,6 +37660,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/ios-catalyst\">ios-catalyst</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -37514,6 +37758,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/ios-device\">ios-device</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -37607,6 +37852,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/ios-fieldtrial-rel\">ios-fieldtrial-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -37701,6 +37947,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/ios-m1-simulator\">ios-m1-simulator</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -37795,6 +38042,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/ios-m1-simulator-cronet\">ios-m1-simulator-cronet</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -37892,6 +38140,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/ios-simulator\">ios-simulator</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/ios-simulator-inverse-fieldtrials-fyi\">ios-simulator-inverse-fieldtrials-fyi</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -37988,6 +38237,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/ios-simulator-code-coverage\">ios-simulator-code-coverage</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -38080,6 +38330,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/ios-simulator-cronet\">ios-simulator-cronet</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -38177,6 +38428,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/ios-simulator-full-configs\">ios-simulator-full-configs</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -38270,6 +38522,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/ios-simulator-multi-window\">ios-simulator-multi-window</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -38367,6 +38620,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/ios-simulator-noncq\">ios-simulator-noncq</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -38554,6 +38808,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/ios-wpt-fyi-rel\">ios-wpt-fyi-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -38648,6 +38903,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/ios16-beta-simulator\">ios16-beta-simulator</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -38836,6 +39092,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/ios16-sdk-simulator\">ios16-sdk-simulator</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -38930,6 +39187,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/ios17-beta-simulator\">ios17-beta-simulator</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -39024,6 +39282,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/ios17-sdk-simulator\">ios17-sdk-simulator</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -39213,6 +39472,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/lacros-amd64-generic-rel\">lacros-amd64-generic-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -39771,6 +40031,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/lacros-arm-generic-rel\">lacros-arm-generic-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -40139,6 +40400,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/lacros-arm64-generic-rel\">lacros-arm64-generic-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -40632,6 +40894,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-angle-chromium-try\">linux-angle-chromium-try</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -40803,6 +41066,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-angle-chromium-try\">linux-angle-chromium-try</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -40966,6 +41230,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-angle-chromium-try\">linux-angle-chromium-try</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -41059,6 +41324,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-annotator-rel\">linux-annotator-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -41248,6 +41514,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_archive_rel_ng\">linux_chromium_archive_rel_ng</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_clobber_rel_ng\">linux_chromium_clobber_rel_ng</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -41343,6 +41610,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-arm64-rel-cft\">linux-arm64-rel-cft</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -41588,6 +41856,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-bfcache-rel\">linux-bfcache-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -41772,6 +42041,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-blink-heap-verification-try\">linux-blink-heap-verification-try</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -41863,6 +42133,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-blink-web-tests-force-accessibility-rel\">linux-blink-web-tests-force-accessibility-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -42177,6 +42448,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-cfm-rel\">linux-cfm-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -42270,6 +42542,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-chromeos-annotator-rel\">linux-chromeos-annotator-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -42647,6 +42920,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-chromeos-code-coverage\">linux-chromeos-code-coverage</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -42741,6 +43015,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-chromeos-compile-dbg\">linux-chromeos-compile-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-chromeos-dbg\">linux-chromeos-dbg</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -42833,6 +43108,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-chromeos-rel\">linux-chromeos-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-chromeos-inverse-fieldtrials-fyi-rel\">linux-chromeos-inverse-fieldtrials-fyi-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-chromeos-siso-rel\">linux-chromeos-siso-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -42926,6 +43202,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-code-coverage\">linux-code-coverage</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -43018,6 +43295,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-exp-asan-lsan-fyi-rel\">linux-exp-asan-lsan-fyi-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -43110,6 +43388,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-exp-msan-fyi-rel\">linux-exp-msan-fyi-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -43202,6 +43481,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-exp-tsan-fyi-rel\">linux-exp-tsan-fyi-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -43296,6 +43576,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-extended-tracing-rel\">linux-extended-tracing-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -43388,6 +43669,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-fieldtrial-rel\">linux-fieldtrial-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -43574,6 +43856,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-gcc-rel\">linux-gcc-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -43666,6 +43949,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-headless-shell-rel\">linux-headless-shell-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -43758,6 +44042,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-js-coverage-rel\">linux-js-coverage-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-js-code-coverage\">linux-js-code-coverage</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -43943,6 +44228,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-lacros-asan-lsan-rel\">linux-lacros-asan-lsan-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -44035,6 +44321,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-lacros-fyi-rel\">linux-lacros-fyi-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -44127,6 +44414,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-lacros-rel\">linux-lacros-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-lacros-siso-rel\">linux-lacros-siso-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -44312,6 +44600,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-lacros-code-coverage\">linux-lacros-code-coverage</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -44404,6 +44693,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-lacros-dbg\">linux-lacros-dbg</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -44679,6 +44969,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-lacros-fyi-rel\">linux-lacros-fyi-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -44772,6 +45063,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-lacros-rel\">linux-lacros-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-lacros-siso-rel\">linux-lacros-siso-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -44864,6 +45156,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-lacros-version-skew-fyi\">linux-lacros-version-skew-fyi</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -45045,6 +45338,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-official\">linux-official</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -45138,6 +45432,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-perfetto-rel\">linux-perfetto-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -45317,6 +45612,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-rel-cft\">linux-rel-cft</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -45500,6 +45796,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-rust-x64-dbg\">linux-rust-x64-dbg</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -45591,6 +45888,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-rust-x64-rel\">linux-rust-x64-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -45685,6 +45983,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-swangle-chromium-try-x64\">linux-swangle-chromium-try-x64</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -45780,6 +46079,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-swangle-chromium-try-x64-exp\">linux-swangle-chromium-try-x64-exp</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -45915,6 +46215,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-swangle-try-tot-swiftshader-x64\">linux-swangle-try-tot-swiftshader-x64</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -46019,6 +46320,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-swangle-try-x64\">linux-swangle-try-x64</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -46114,6 +46416,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-swangle-try-x64-exp\">linux-swangle-try-x64-exp</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -46207,6 +46510,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-ubsan-fyi-rel\">linux-ubsan-fyi-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -46301,6 +46605,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-ubsan-vptr\">linux-ubsan-vptr</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -46392,6 +46697,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-updater-try-builder-dbg\">linux-updater-try-builder-dbg</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -46483,6 +46789,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-updater-try-builder-rel\">linux-updater-try-builder-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -46573,6 +46880,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-updater-try-builder-dbg\">linux-updater-try-builder-dbg</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -46663,6 +46971,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-updater-try-builder-rel\">linux-updater-try-builder-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -46846,6 +47155,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-v4l2-codec-rel\">linux-v4l2-codec-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -47126,6 +47436,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-wpt-content-shell-fyi-rel\">linux-wpt-content-shell-fyi-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -47219,6 +47530,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-wpt-content-shell-leak-detection\">linux-wpt-content-shell-leak-detection</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -47312,6 +47624,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-wpt-fyi-rel\">linux-wpt-fyi-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -47405,6 +47718,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-wpt-identity-fyi-rel\">linux-wpt-identity-fyi-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -47498,6 +47812,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-wpt-input-fyi-rel\">linux-wpt-input-fyi-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -47660,6 +47975,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-angle-chromium-try\">mac-angle-chromium-try</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -47872,6 +48188,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-angle-chromium-try\">mac-angle-chromium-try</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -48043,6 +48360,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-angle-chromium-try\">mac-angle-chromium-try</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -48228,6 +48546,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac_chromium_archive_rel_ng\">mac_chromium_archive_rel_ng</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -48506,6 +48825,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-arm64-on-arm64-rel\">mac-arm64-on-arm64-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -48599,6 +48919,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-fieldtrial-tester\">mac-fieldtrial-tester</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac11-arm64-rel\">mac11-arm64-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac12-arm64-rel\">mac12-arm64-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac13-arm64-rel\">mac13-arm64-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -49108,6 +49429,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-code-coverage\">mac-code-coverage</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -49199,6 +49521,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-fieldtrial-tester\">mac-fieldtrial-tester</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -49287,6 +49610,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-intel-on-arm64-rel\">mac-intel-on-arm64-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -49469,6 +49793,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-official\">mac-official</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -49561,6 +49886,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-osxbeta-rel\">mac-osxbeta-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -49653,6 +49979,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-perfetto-rel\">mac-perfetto-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -49745,6 +50072,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-rel-cft\">mac-rel-cft</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -49836,6 +50164,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-rust-x64-dbg\">mac-rust-x64-dbg</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -49928,6 +50257,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-swangle-chromium-try-x64\">mac-swangle-chromium-try-x64</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -50285,6 +50615,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-updater-try-builder-dbg\">mac-updater-try-builder-dbg</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -50374,6 +50705,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-updater-try-builder-rel\">mac-updater-try-builder-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -50554,6 +50886,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-updater-try-builder-dbg\">mac-updater-try-builder-dbg</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -50644,6 +50977,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-updater-try-builder-rel\">mac-updater-try-builder-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -50733,6 +51067,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac10.15-wpt-content-shell-fyi-rel\">mac10.15-wpt-content-shell-fyi-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -50827,6 +51162,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac11-arm64-rel\">mac11-arm64-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -51097,6 +51433,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac11-arm64-wpt-content-shell-fyi-rel\">mac11-arm64-wpt-content-shell-fyi-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -51187,6 +51524,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac11-wpt-content-shell-fyi-rel\">mac11-wpt-content-shell-fyi-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -51461,6 +51799,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac12-arm64-rel\">mac12-arm64-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -51640,6 +51979,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac12-arm64-wpt-content-shell-fyi-rel\">mac12-arm64-wpt-content-shell-fyi-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -51730,6 +52070,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac12-wpt-content-shell-fyi-rel\">mac12-wpt-content-shell-fyi-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -51914,6 +52255,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac13-arm64-rel\">mac13-arm64-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -52094,6 +52436,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac13-arm64-wpt-content-shell-fyi-rel\">mac13-arm64-wpt-content-shell-fyi-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -52184,6 +52527,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/mac13-wpt-content-shell-fyi-rel\">mac13-wpt-content-shell-fyi-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -52715,6 +53059,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-angle-chromium-x64-try\">win-angle-chromium-x64-try</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -52859,6 +53204,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-angle-chromium-x86-try\">win-angle-chromium-x86-try</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -52960,6 +53306,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-annotator-rel\">win-annotator-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -53145,6 +53492,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win_x64_archive\">win_x64_archive</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -53240,6 +53588,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-asan\">win-asan</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -53554,6 +53903,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-fieldtrial-rel\">win-fieldtrial-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -53738,6 +54088,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-official\">win-official</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -53831,6 +54182,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-perfetto-rel\">win-perfetto-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -54010,6 +54362,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-rel-cft\">win-rel-cft</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -54102,6 +54455,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-rust-x64-dbg\">win-rust-x64-dbg</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -54193,6 +54547,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-rust-x64-rel\">win-rust-x64-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -54287,6 +54642,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-swangle-chromium-try-x86\">win-swangle-chromium-try-x86</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -54422,6 +54778,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-swangle-try-tot-swiftshader-x64\">win-swangle-try-tot-swiftshader-x64</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -54566,6 +54923,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-swangle-try-tot-swiftshader-x86\">win-swangle-try-tot-swiftshader-x86</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -54670,6 +55028,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-swangle-try-x64\">win-swangle-try-x64</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -54765,6 +55124,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-swangle-try-x86\">win-swangle-try-x86</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -54857,6 +55217,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-updater-try-builder-dbg\">win-updater-try-builder-dbg</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -54948,6 +55309,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-updater-try-builder-rel\">win-updater-try-builder-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -55382,6 +55744,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-angle-chromium-x64-try\">win-angle-chromium-x64-try</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -55544,6 +55907,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-angle-chromium-x64-try\">win-angle-chromium-x64-try</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-gpu-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -55636,6 +56000,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win10-code-coverage\">win10-code-coverage</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -55817,6 +56182,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-updater-try-builder-dbg\">win-updater-try-builder-dbg</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -55997,6 +56363,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win-updater-try-builder-rel\">win-updater-try-builder-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -56180,6 +56547,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win10-wpt-content-shell-fyi-rel\">win10-wpt-content-shell-fyi-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -56452,6 +56820,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win11-wpt-content-shell-fyi-rel\">win11-wpt-content-shell-fyi-rel</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -56637,6 +57006,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win_archive\">win_archive</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -56821,6 +57191,7 @@ use_invocation_timestamp: true } } + description_html: "This builder is mirrored by any of the following try builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/try/win32-official\">win32-official</a></li></ul>" shadow_builder_adjustments { service_account: "chromium-try-builder@chops-service-accounts.iam.gserviceaccount.com" pool: "luci.chromium.try" @@ -62683,6 +63054,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-10-arm64-rel\">android-10-arm64-rel</a></li></ul>" } builders { name: "android-11-x86-rel" @@ -62773,6 +63145,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-11-x86-rel\">android-11-x86-rel</a></li></ul>" } builders { name: "android-12-x64-dbg" @@ -62863,6 +63236,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android x64 Builder (dbg)\">Android x64 Builder (dbg)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-12-x64-dbg-tests\">android-12-x64-dbg-tests</a></li></ul>" } builders { name: "android-12-x64-dual-coverage-exp-rel" @@ -62954,7 +63328,7 @@ use_invocation_timestamp: true } } - description_html: "This builder shadows android-12-x64-rel builder to experiment both jacoco and clang coverage enabled builds.\n" + description_html: "This builder shadows android-12-x64-rel builder to experiment both jacoco and clang coverage enabled builds.\n<br/>This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-12-x64-rel\">android-12-x64-rel</a></li></ul>" } builders { name: "android-12-x64-rel" @@ -63045,7 +63419,7 @@ use_invocation_timestamp: true } } - description_html: "This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/android-12-x64-rel-compilator\">android-12-x64-rel-compilator</a>." + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-12-x64-rel\">android-12-x64-rel</a></li></ul><br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/android-12-x64-rel-compilator\">android-12-x64-rel-compilator</a>." } builders { name: "android-12-x64-rel-compilator" @@ -63227,6 +63601,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android x64 Builder (dbg)\">Android x64 Builder (dbg)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-12l-x64-dbg-tests\">android-12l-x64-dbg-tests</a></li></ul>" } builders { name: "android-13-x64-rel" @@ -63317,6 +63692,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-13-x64-rel\">android-13-x64-rel</a></li></ul>" } builders { name: "android-angle-chromium-try" @@ -63482,6 +63858,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-angle-chromium-arm64-builder\">android-angle-chromium-arm64-builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-angle-chromium-arm64-nexus5x\">android-angle-chromium-arm64-nexus5x</a></li></ul>" } builders { name: "android-arm-compile-dbg" @@ -63572,6 +63949,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android arm Builder (dbg)\">Android arm Builder (dbg)</a></li></ul>" } builders { name: "android-arm64-all-targets-dbg" @@ -63662,6 +64040,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android arm64 Builder All Targets (dbg)\">Android arm64 Builder All Targets (dbg)</a></li></ul>" } builders { name: "android-arm64-rel" @@ -63752,7 +64131,7 @@ use_invocation_timestamp: true } } - description_html: "This builder may trigger tests on multiple Android versions.<br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/android-arm64-rel-compilator\">android-arm64-rel-compilator</a>." + description_html: "This builder may trigger tests on multiple Android versions.<br/>This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android Release (Nexus 5X)\">Android Release (Nexus 5X)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-pie-arm64-rel\">android-pie-arm64-rel</a></li></ul><br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/android-arm64-rel-compilator\">android-arm64-rel-compilator</a>." } builders { name: "android-arm64-rel-compilator" @@ -63934,7 +64313,7 @@ use_invocation_timestamp: true } } - description_html: "This builder shadows android-arm64-rel builder to compare between Siso builds and Ninja builds.<br/>\nThis builder should be removed after migrating android-arm64-rel from Ninja to Siso. b/277863839\n<br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/android-arm64-siso-rel-compilator\">android-arm64-siso-rel-compilator</a>." + description_html: "This builder shadows android-arm64-rel builder to compare between Siso builds and Ninja builds.<br/>\nThis builder should be removed after migrating android-arm64-rel from Ninja to Siso. b/277863839\n<br/>This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android Release (Nexus 5X)\">Android Release (Nexus 5X)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-pie-arm64-rel\">android-pie-arm64-rel</a></li></ul><br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/android-arm64-siso-rel-compilator\">android-arm64-siso-rel-compilator</a>." } builders { name: "android-arm64-siso-rel-compilator" @@ -64116,6 +64495,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android ASAN (dbg)\">Android ASAN (dbg)</a></li></ul>" } builders { name: "android-bfcache-rel" @@ -64206,6 +64586,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-bfcache-rel\">android-bfcache-rel</a></li></ul>" } builders { name: "android-binary-size" @@ -64398,6 +64779,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-chrome-pie-x86-wpt-android-specific\">android-chrome-pie-x86-wpt-android-specific</a></li></ul>" } builders { name: "android-chrome-pie-x86-wpt-fyi-rel" @@ -64488,6 +64870,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-chrome-pie-x86-wpt-fyi-rel\">android-chrome-pie-x86-wpt-fyi-rel</a></li></ul>" } builders { name: "android-clang-tidy-rel" @@ -64661,6 +65044,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-code-coverage\">android-code-coverage</a></li></ul>" } builders { name: "android-code-coverage-native" @@ -64751,6 +65135,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-code-coverage-native\">android-code-coverage-native</a></li></ul>" } builders { name: "android-cronet-arm-dbg" @@ -64842,6 +65227,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-arm-dbg\">android-cronet-arm-dbg</a></li></ul>" } builders { name: "android-cronet-arm64-dbg" @@ -64932,6 +65318,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-arm64-dbg\">android-cronet-arm64-dbg</a></li></ul>" } builders { name: "android-cronet-arm64-rel" @@ -65022,6 +65409,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-arm64-rel\">android-cronet-arm64-rel</a></li></ul>" } builders { name: "android-cronet-asan-arm-rel" @@ -65112,6 +65500,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-asan-arm-rel\">android-cronet-asan-arm-rel</a></li></ul>" } builders { name: "android-cronet-mainline-clang-arm64-dbg" @@ -65202,6 +65591,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-mainline-clang-arm64-dbg\">android-cronet-mainline-clang-arm64-dbg</a></li></ul>" } builders { name: "android-cronet-mainline-clang-arm64-rel" @@ -65292,6 +65682,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-mainline-clang-arm64-rel\">android-cronet-mainline-clang-arm64-rel</a></li></ul>" } builders { name: "android-cronet-mainline-clang-x86-dbg" @@ -65382,6 +65773,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-mainline-clang-x86-dbg\">android-cronet-mainline-clang-x86-dbg</a></li></ul>" } builders { name: "android-cronet-mainline-clang-x86-rel" @@ -65472,6 +65864,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-mainline-clang-x86-rel\">android-cronet-mainline-clang-x86-rel</a></li></ul>" } builders { name: "android-cronet-x64-dbg" @@ -65562,6 +65955,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-arm64-dbg\">android-cronet-arm64-dbg</a></li></ul>" } builders { name: "android-cronet-x64-dbg-12-tests" @@ -65652,6 +66046,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-x64-dbg\">android-cronet-x64-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-x64-dbg-12-tests\">android-cronet-x64-dbg-12-tests</a></li></ul>" } builders { name: "android-cronet-x64-dbg-13-tests" @@ -65742,6 +66137,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-x64-dbg\">android-cronet-x64-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-x64-dbg-13-tests\">android-cronet-x64-dbg-13-tests</a></li></ul>" } builders { name: "android-cronet-x64-rel" @@ -65832,6 +66228,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-x64-rel\">android-cronet-x64-rel</a></li></ul>" } builders { name: "android-cronet-x86-dbg" @@ -65922,6 +66319,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-x86-dbg\">android-cronet-x86-dbg</a></li></ul>" } builders { name: "android-cronet-x86-dbg-10-tests" @@ -66013,6 +66411,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-x86-dbg\">android-cronet-x86-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-x86-dbg-10-tests\">android-cronet-x86-dbg-10-tests</a></li></ul>" } builders { name: "android-cronet-x86-dbg-11-tests" @@ -66103,6 +66502,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-x86-dbg\">android-cronet-x86-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-x86-dbg-11-tests\">android-cronet-x86-dbg-11-tests</a></li></ul>" } builders { name: "android-cronet-x86-dbg-lolipop" @@ -66193,6 +66593,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-x86-dbg\">android-cronet-x86-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-x86-dbg-lollipop-tests\">android-cronet-x86-dbg-lollipop-tests</a></li></ul>" } builders { name: "android-cronet-x86-dbg-marshmallow" @@ -66283,6 +66684,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-x86-dbg\">android-cronet-x86-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-x86-dbg-marshmallow-tests\">android-cronet-x86-dbg-marshmallow-tests</a></li></ul>" } builders { name: "android-cronet-x86-dbg-nougat-tests" @@ -66373,6 +66775,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-x86-dbg\">android-cronet-x86-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-x86-dbg-nougat-tests\">android-cronet-x86-dbg-nougat-tests</a></li></ul>" } builders { name: "android-cronet-x86-dbg-oreo-tests" @@ -66463,6 +66866,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-x86-dbg\">android-cronet-x86-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-x86-dbg-oreo-tests\">android-cronet-x86-dbg-oreo-tests</a></li></ul>" } builders { name: "android-cronet-x86-dbg-pie-tests" @@ -66553,6 +66957,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-x86-dbg\">android-cronet-x86-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-x86-dbg-pie-tests\">android-cronet-x86-dbg-pie-tests</a></li></ul>" } builders { name: "android-cronet-x86-rel" @@ -66643,6 +67048,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-x86-rel\">android-cronet-x86-rel</a></li></ul>" } builders { name: "android-dawn-arm-rel" @@ -66731,6 +67137,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Android arm Builder\">Dawn Android arm Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Android arm Release (Nexus 5X)\">Dawn Android arm Release (Nexus 5X)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Android arm Release (Pixel 4)\">Dawn Android arm Release (Pixel 4)</a></li></ul>" } builders { name: "android-dawn-arm64-rel" @@ -66819,6 +67226,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Android arm64 Release (Pixel 6)\">Dawn Android arm64 Release (Pixel 6)</a></li></ul>" } builders { name: "android-deterministic-dbg" @@ -67075,6 +67483,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-fieldtrial-rel\">android-fieldtrial-rel</a></li></ul>" } builders { name: "android-inverse-fieldtrials-pie-x86-fyi-rel" @@ -67165,6 +67574,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-pie-x86-rel\">android-pie-x86-rel</a></li></ul>" } builders { name: "android-nougat-x86-dual-coverage-exp-rel" @@ -67260,7 +67670,7 @@ use_invocation_timestamp: true } } - description_html: "This builder shadows android-nougat-x86-rel builder to experiment both jacoco and clang coverage enabled builds.\n" + description_html: "This builder shadows android-nougat-x86-rel builder to experiment both jacoco and clang coverage enabled builds.\n<br/>This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-nougat-x86-rel\">android-nougat-x86-rel</a></li></ul>" } builders { name: "android-nougat-x86-rel" @@ -67355,7 +67765,7 @@ use_invocation_timestamp: true } } - description_html: "This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/android-nougat-x86-rel-compilator\">android-nougat-x86-rel-compilator</a>." + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-nougat-x86-rel\">android-nougat-x86-rel</a></li></ul><br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/android-nougat-x86-rel-compilator\">android-nougat-x86-rel-compilator</a>." } builders { name: "android-nougat-x86-rel-compilator" @@ -67541,7 +67951,7 @@ use_invocation_timestamp: true } } - description_html: "This builder shadows android-nougat-x86-rel builder to compare between Siso builds and Ninja builds.<br/>\nThis builder should be removed after migrating android-nougat-x86-rel from Ninja to Siso. b/277863839\n<br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/android-nougat-x86-siso-rel-compilator\">android-nougat-x86-siso-rel-compilator</a>." + description_html: "This builder shadows android-nougat-x86-rel builder to compare between Siso builds and Ninja builds.<br/>\nThis builder should be removed after migrating android-nougat-x86-rel from Ninja to Siso. b/277863839\n<br/>This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-nougat-x86-rel\">android-nougat-x86-rel</a></li></ul><br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/android-nougat-x86-siso-rel-compilator\">android-nougat-x86-siso-rel-compilator</a>." } builders { name: "android-nougat-x86-siso-rel-compilator" @@ -67723,6 +68133,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-official\">android-official</a></li></ul>" } builders { name: "android-oreo-arm64-dbg" @@ -67813,6 +68224,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android arm64 Builder (dbg)\">Android arm64 Builder (dbg)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Oreo Phone Tester\">Oreo Phone Tester</a></li></ul>" } builders { name: "android-oreo-x86-rel" @@ -67903,6 +68315,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-oreo-x86-rel\">android-oreo-x86-rel</a></li></ul>" } builders { name: "android-perfetto-rel" @@ -67993,6 +68406,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-perfetto-rel\">android-perfetto-rel</a></li></ul>" } builders { name: "android-pie-arm64-dbg" @@ -68083,6 +68497,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android arm64 Builder (dbg)\">Android arm64 Builder (dbg)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-pie-arm64-dbg\">android-pie-arm64-dbg</a></li></ul>" } builders { name: "android-pie-x86-rel" @@ -68173,6 +68588,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-pie-x86-rel\">android-pie-x86-rel</a></li></ul>" } builders { name: "android-rust-arm32-rel" @@ -68263,6 +68679,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-rust-arm32-rel\">android-rust-arm32-rel</a></li></ul>" } builders { name: "android-rust-arm64-dbg" @@ -68353,6 +68770,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-rust-arm64-dbg\">android-rust-arm64-dbg</a></li></ul>" } builders { name: "android-rust-arm64-rel" @@ -68443,6 +68861,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-rust-arm64-rel\">android-rust-arm64-rel</a></li></ul>" } builders { name: "android-webview-10-x86-rel-tests" @@ -68533,6 +68952,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-x86-rel\">android-x86-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-webview-10-x86-rel-tests\">android-webview-10-x86-rel-tests</a></li></ul>" } builders { name: "android-webview-12-x64-dbg" @@ -68623,6 +69043,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android x64 Builder (dbg)\">Android x64 Builder (dbg)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-webview-12-x64-dbg-tests\">android-webview-12-x64-dbg-tests</a></li></ul>" } builders { name: "android-webview-13-x64-dbg" @@ -68713,6 +69134,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android x64 Builder (dbg)\">Android x64 Builder (dbg)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-webview-13-x64-dbg-tests\">android-webview-13-x64-dbg-tests</a></li></ul>" } builders { name: "android-webview-nougat-arm64-dbg" @@ -68803,6 +69225,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android arm64 Builder (dbg)\">Android arm64 Builder (dbg)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android WebView N (dbg)\">Android WebView N (dbg)</a></li></ul>" } builders { name: "android-webview-oreo-arm64-dbg" @@ -68893,6 +69316,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android arm64 Builder (dbg)\">Android arm64 Builder (dbg)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android WebView O (dbg)\">Android WebView O (dbg)</a></li></ul>" } builders { name: "android-webview-pie-arm64-dbg" @@ -68983,6 +69407,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android arm64 Builder (dbg)\">Android arm64 Builder (dbg)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android WebView P (dbg)\">Android WebView P (dbg)</a></li></ul>" } builders { name: "android-webview-pie-x86-wpt-fyi-rel" @@ -69073,6 +69498,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-webview-pie-x86-wpt-fyi-rel\">android-webview-pie-x86-wpt-fyi-rel</a></li></ul>" } builders { name: "android-x64-cast" @@ -69163,6 +69589,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Cast Android (dbg)\">Cast Android (dbg)</a></li></ul>" } builders { name: "android_archive_rel_ng" @@ -69253,6 +69680,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-archive-rel\">android-archive-rel</a></li></ul>" } builders { name: "android_arm64_dbg_recipe" @@ -69343,6 +69771,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android arm64 Builder (dbg)\">Android arm64 Builder (dbg)</a></li></ul>" } builders { name: "android_blink_rel" @@ -69524,6 +69953,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android arm64 Builder All Targets (dbg)\">Android arm64 Builder All Targets (dbg)</a></li></ul>" } builders { name: "android_compile_x64_dbg" @@ -69615,6 +70045,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android x64 Builder All Targets (dbg)\">Android x64 Builder All Targets (dbg)</a></li></ul>" } builders { name: "android_compile_x86_dbg" @@ -69706,6 +70137,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android x86 Builder (dbg)\">Android x86 Builder (dbg)</a></li></ul>" } builders { name: "android_cronet" @@ -69796,6 +70228,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/android-cronet-arm-rel\">android-cronet-arm-rel</a></li></ul>" } builders { name: "android_optional_gpu_tests_rel" @@ -69976,6 +70409,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android arm64 Builder (dbg)\">Android arm64 Builder (dbg)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android WebView N (dbg)\">Android WebView N (dbg)</a></li></ul>" } builders { name: "branch-config-verifier" @@ -70241,6 +70675,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/chromeos-amd64-generic-asan-rel\">chromeos-amd64-generic-asan-rel</a></li></ul>" } builders { name: "chromeos-amd64-generic-cfi-thin-lto-rel" @@ -70331,6 +70766,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/chromeos-amd64-generic-cfi-thin-lto-rel\">chromeos-amd64-generic-cfi-thin-lto-rel</a></li></ul>" } builders { name: "chromeos-amd64-generic-dbg" @@ -70422,6 +70858,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/chromeos-amd64-generic-dbg\">chromeos-amd64-generic-dbg</a></li></ul>" } builders { name: "chromeos-amd64-generic-lacros-dbg" @@ -70512,6 +70949,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/chromeos-amd64-generic-lacros-dbg\">chromeos-amd64-generic-lacros-dbg</a></li></ul>" } builders { name: "chromeos-amd64-generic-rel" @@ -70606,7 +71044,7 @@ use_invocation_timestamp: true } } - description_html: "This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/chromeos-amd64-generic-rel-compilator\">chromeos-amd64-generic-rel-compilator</a>." + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/chromeos-amd64-generic-rel\">chromeos-amd64-generic-rel</a></li></ul><br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/chromeos-amd64-generic-rel-compilator\">chromeos-amd64-generic-rel-compilator</a>." } builders { name: "chromeos-amd64-generic-rel-compilator" @@ -70792,7 +71230,7 @@ use_invocation_timestamp: true } } - description_html: "This builder shadows chromeos-amd64-generic-rel builder to compare between Siso builds and Ninja builds.<br/>\nThis builder should be removed after migrating chromeos-amd64-generic-rel from Ninja to Siso. b/277863839\n<br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/chromeos-amd64-generic-siso-rel-compilator\">chromeos-amd64-generic-siso-rel-compilator</a>." + description_html: "This builder shadows chromeos-amd64-generic-rel builder to compare between Siso builds and Ninja builds.<br/>\nThis builder should be removed after migrating chromeos-amd64-generic-rel from Ninja to Siso. b/277863839\n<br/>This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/chromeos-amd64-generic-rel\">chromeos-amd64-generic-rel</a></li></ul><br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/chromeos-amd64-generic-siso-rel-compilator\">chromeos-amd64-generic-siso-rel-compilator</a>." } builders { name: "chromeos-amd64-generic-siso-rel-compilator" @@ -70974,6 +71412,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/chromeos-arm-generic-dbg\">chromeos-arm-generic-dbg</a></li></ul>" } builders { name: "chromeos-arm-generic-rel" @@ -71064,6 +71503,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/chromeos-arm-generic-rel\">chromeos-arm-generic-rel</a></li></ul>" } builders { name: "chromeos-arm64-generic-rel" @@ -71154,6 +71594,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/chromeos-arm64-generic-rel\">chromeos-arm64-generic-rel</a></li></ul>" } builders { name: "chromeos-jacuzzi-rel" @@ -71244,6 +71685,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/chromeos-jacuzzi-rel\">chromeos-jacuzzi-rel</a></li></ul>" } builders { name: "chromeos-js-code-coverage" @@ -71334,6 +71776,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/chromeos-js-code-coverage\">chromeos-js-code-coverage</a></li></ul>" } builders { name: "chromeos-js-coverage-rel" @@ -71425,6 +71868,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/chromeos-js-code-coverage\">chromeos-js-code-coverage</a></li></ul>" } builders { name: "chromeos-octopus-rel" @@ -71515,6 +71959,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/chromeos-octopus-rel\">chromeos-octopus-rel</a></li></ul>" } builders { name: "chromium_presubmit" @@ -71691,6 +72136,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Android arm DEPS Builder\">Dawn Android arm DEPS Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Android arm DEPS Release (Nexus 5X)\">Dawn Android arm DEPS Release (Nexus 5X)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Android arm DEPS Release (Pixel 4)\">Dawn Android arm DEPS Release (Pixel 4)</a></li></ul>" } builders { name: "dawn-android-arm64-deps-rel" @@ -71780,6 +72226,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Android arm64 DEPS Release (Pixel 6)\">Dawn Android arm64 DEPS Release (Pixel 6)</a></li></ul>" } builders { name: "dawn-linux-x64-deps-rel" @@ -71869,6 +72316,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Linux x64 DEPS Builder\">Dawn Linux x64 DEPS Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Linux x64 DEPS Release (Intel UHD 630)\">Dawn Linux x64 DEPS Release (Intel UHD 630)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Linux x64 DEPS Release (NVIDIA)\">Dawn Linux x64 DEPS Release (NVIDIA)</a></li></ul>" } builders { name: "dawn-mac-x64-deps-rel" @@ -71958,6 +72406,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Mac x64 DEPS Builder\">Dawn Mac x64 DEPS Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Mac x64 DEPS Release (AMD)\">Dawn Mac x64 DEPS Release (AMD)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Mac x64 DEPS Release (Intel)\">Dawn Mac x64 DEPS Release (Intel)</a></li></ul>" } builders { name: "dawn-try-linux-tsan-rel" @@ -72047,6 +72496,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Linux TSAN Release\">Dawn Linux TSAN Release</a></li></ul>" } builders { name: "dawn-try-mac-amd-exp" @@ -72135,6 +72585,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Mac x64 Builder\">Dawn Mac x64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Mac x64 Experimental Release (AMD)\">Dawn Mac x64 Experimental Release (AMD)</a></li></ul>" } builders { name: "dawn-try-mac-arm64-rel" @@ -72223,6 +72674,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Mac arm64 Release (Apple M2)\">Dawn Mac arm64 Release (Apple M2)</a></li></ul>" } builders { name: "dawn-try-mac-intel-exp" @@ -72311,6 +72763,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Mac x64 Builder\">Dawn Mac x64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Mac x64 Experimental Release (Intel)\">Dawn Mac x64 Experimental Release (Intel)</a></li></ul>" } builders { name: "dawn-try-win-x64-intel-exp" @@ -72400,6 +72853,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Win10 x64 Builder\">Dawn Win10 x64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Win10 x64 Experimental Release (Intel)\">Dawn Win10 x64 Experimental Release (Intel)</a></li></ul>" } builders { name: "dawn-try-win-x86-intel-exp" @@ -72489,6 +72943,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Win10 x86 Builder\">Dawn Win10 x86 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Win10 x86 Experimental Release (Intel)\">Dawn Win10 x86 Experimental Release (Intel)</a></li></ul>" } builders { name: "dawn-try-win10-x64-intel-asan" @@ -72578,6 +73033,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Win10 x64 ASAN Builder\">Dawn Win10 x64 ASAN Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Win10 x64 ASAN Release (Intel)\">Dawn Win10 x64 ASAN Release (Intel)</a></li></ul>" } builders { name: "dawn-try-win10-x64-nvidia-asan" @@ -72667,6 +73123,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Win10 x64 ASAN Builder\">Dawn Win10 x64 ASAN Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Win10 x64 ASAN Release (NVIDIA)\">Dawn Win10 x64 ASAN Release (NVIDIA)</a></li></ul>" } builders { name: "dawn-try-win10-x86-rel" @@ -72755,6 +73212,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Win10 x86 Builder\">Dawn Win10 x86 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Win10 x86 Release (Intel)\">Dawn Win10 x86 Release (Intel)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Win10 x86 Release (NVIDIA)\">Dawn Win10 x86 Release (NVIDIA)</a></li></ul>" } builders { name: "dawn-win10-x64-deps-rel" @@ -72844,6 +73302,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Win10 x64 DEPS Builder\">Dawn Win10 x64 DEPS Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Win10 x64 DEPS Release (Intel)\">Dawn Win10 x64 DEPS Release (Intel)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Win10 x64 DEPS Release (NVIDIA)\">Dawn Win10 x64 DEPS Release (NVIDIA)</a></li></ul>" } builders { name: "dawn-win10-x86-deps-rel" @@ -72933,6 +73392,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Win10 x86 DEPS Builder\">Dawn Win10 x86 DEPS Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Win10 x86 DEPS Release (Intel)\">Dawn Win10 x86 DEPS Release (Intel)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Win10 x86 DEPS Release (NVIDIA)\">Dawn Win10 x86 DEPS Release (NVIDIA)</a></li></ul>" } builders { name: "fuchsia-angle-try" @@ -73059,6 +73519,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/fuchsia-angle-builder\">fuchsia-angle-builder</a></li></ul>" } builders { name: "fuchsia-arm64-cast-receiver-rel" @@ -73150,6 +73611,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/fuchsia-arm64-cast-receiver-rel\">fuchsia-arm64-cast-receiver-rel</a></li></ul>" } builders { name: "fuchsia-arm64-rel" @@ -73253,6 +73715,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/fuchsia-arm64-rel\">fuchsia-arm64-rel</a></li></ul>" } builders { name: "fuchsia-binary-size" @@ -73521,6 +73984,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/fuchsia-code-coverage\">fuchsia-code-coverage</a></li></ul>" } builders { name: "fuchsia-compile-x64-dbg" @@ -73612,6 +74076,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/fuchsia-x64-dbg\">fuchsia-x64-dbg</a></li></ul>" } builders { name: "fuchsia-deterministic-dbg" @@ -73785,6 +74250,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/fuchsia-fyi-arm64-dbg\">fuchsia-fyi-arm64-dbg</a></li></ul>" } builders { name: "fuchsia-fyi-x64-dbg" @@ -73875,6 +74341,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/fuchsia-fyi-x64-dbg\">fuchsia-fyi-x64-dbg</a></li></ul>" } builders { name: "fuchsia-official" @@ -73965,6 +74432,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/fuchsia-official\">fuchsia-official</a></li></ul>" } builders { name: "fuchsia-x64-accessibility-rel" @@ -74056,6 +74524,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/fuchsia-x64-accessibility-rel\">fuchsia-x64-accessibility-rel</a></li></ul>" } builders { name: "fuchsia-x64-cast-receiver-rel" @@ -74158,7 +74627,7 @@ use_invocation_timestamp: true } } - description_html: "This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel-compilator\">fuchsia-x64-cast-receiver-rel-compilator</a>." + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/fuchsia-x64-cast-receiver-rel\">fuchsia-x64-cast-receiver-rel</a></li></ul><br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/fuchsia-x64-cast-receiver-rel-compilator\">fuchsia-x64-cast-receiver-rel-compilator</a>." } builders { name: "fuchsia-x64-cast-receiver-rel-compilator" @@ -74352,7 +74821,7 @@ use_invocation_timestamp: true } } - description_html: "This builder shadows fuchsia-x64-cast-receiver-rel builder to compare between Siso builds and Ninja builds.<br/>\nThis builder should be removed after migrating fuchsia-x64-cast-receiver-rel from Ninja to Siso. b/277863839\n<br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/fuchsia-x64-cast-receiver-siso-rel-compilator\">fuchsia-x64-cast-receiver-siso-rel-compilator</a>." + description_html: "This builder shadows fuchsia-x64-cast-receiver-rel builder to compare between Siso builds and Ninja builds.<br/>\nThis builder should be removed after migrating fuchsia-x64-cast-receiver-rel from Ninja to Siso. b/277863839\n<br/>This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/fuchsia-x64-cast-receiver-rel\">fuchsia-x64-cast-receiver-rel</a></li></ul><br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/fuchsia-x64-cast-receiver-siso-rel-compilator\">fuchsia-x64-cast-receiver-siso-rel-compilator</a>." } builders { name: "fuchsia-x64-cast-receiver-siso-rel-compilator" @@ -74546,6 +75015,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/fuchsia-x64-rel\">fuchsia-x64-rel</a></li></ul>" } builders { name: "gpu-fyi-cq-android-arm64" @@ -74636,6 +75106,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Android arm64 Builder\">GPU FYI Android arm64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android FYI Release (Pixel 6)\">Android FYI Release (Pixel 6)</a></li></ul>" } builders { name: "gpu-fyi-try-android-m-nexus-5x-64" @@ -74722,6 +75193,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Android arm64 Builder\">GPU FYI Android arm64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android FYI Release (Nexus 5X)\">Android FYI Release (Nexus 5X)</a></li></ul>" } builders { name: "gpu-fyi-try-android-nvidia-shield-tv" @@ -74808,6 +75280,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Android arm Builder\">GPU FYI Android arm Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android FYI Release (NVIDIA Shield TV)\">Android FYI Release (NVIDIA Shield TV)</a></li></ul>" } builders { name: "gpu-fyi-try-android-p-pixel-2-32" @@ -74894,6 +75367,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Android arm Builder\">GPU FYI Android arm Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android FYI Release (Pixel 2)\">Android FYI Release (Pixel 2)</a></li></ul>" } builders { name: "gpu-fyi-try-android-pixel-6-64" @@ -74980,6 +75454,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Android arm64 Builder\">GPU FYI Android arm64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android FYI Release (Pixel 6)\">Android FYI Release (Pixel 6)</a></li></ul>" } builders { name: "gpu-fyi-try-android-r-pixel-4-32" @@ -75066,6 +75541,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Android arm Builder\">GPU FYI Android arm Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android FYI Release (Pixel 4)\">Android FYI Release (Pixel 4)</a></li></ul>" } builders { name: "gpu-fyi-try-chromeos-amd64-generic" @@ -75152,6 +75628,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/ChromeOS FYI Release (amd64-generic)\">ChromeOS FYI Release (amd64-generic)</a></li></ul>" } builders { name: "gpu-fyi-try-chromeos-kevin" @@ -75238,6 +75715,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/ChromeOS FYI Release (kevin)\">ChromeOS FYI Release (kevin)</a></li></ul>" } builders { name: "gpu-fyi-try-chromeos-skylab-kevin" @@ -75324,6 +75802,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/ChromeOS FYI Release Skylab (kevin)\">ChromeOS FYI Release Skylab (kevin)</a></li></ul>" } builders { name: "gpu-fyi-try-lacros-amd-rel" @@ -75410,6 +75889,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Lacros x64 Builder\">GPU FYI Lacros x64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Lacros FYI x64 Release (AMD)\">Lacros FYI x64 Release (AMD)</a></li></ul>" } builders { name: "gpu-fyi-try-lacros-intel-rel" @@ -75496,6 +75976,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Lacros x64 Builder\">GPU FYI Lacros x64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Lacros FYI x64 Release (Intel)\">Lacros FYI x64 Release (Intel)</a></li></ul>" } builders { name: "gpu-fyi-try-linux-amd-rel" @@ -75582,6 +76063,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Linux Builder\">GPU FYI Linux Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux FYI Release (AMD RX 5500 XT)\">Linux FYI Release (AMD RX 5500 XT)</a></li></ul>" } builders { name: "gpu-fyi-try-linux-intel-exp" @@ -75668,6 +76150,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Linux Builder\">GPU FYI Linux Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux FYI Experimental Release (Intel UHD 630)\">Linux FYI Experimental Release (Intel UHD 630)</a></li></ul>" } builders { name: "gpu-fyi-try-linux-intel-rel" @@ -75754,6 +76237,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Linux Builder\">GPU FYI Linux Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux FYI Release (Intel UHD 630)\">Linux FYI Release (Intel UHD 630)</a></li></ul>" } builders { name: "gpu-fyi-try-linux-nvidia-dbg" @@ -75840,6 +76324,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Linux Builder (dbg)\">GPU FYI Linux Builder (dbg)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux FYI Debug (NVIDIA)\">Linux FYI Debug (NVIDIA)</a></li></ul>" } builders { name: "gpu-fyi-try-linux-nvidia-exp" @@ -75926,6 +76411,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Linux Builder\">GPU FYI Linux Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux FYI Experimental Release (NVIDIA)\">Linux FYI Experimental Release (NVIDIA)</a></li></ul>" } builders { name: "gpu-fyi-try-linux-nvidia-rel" @@ -76012,6 +76498,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Linux Builder\">GPU FYI Linux Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux FYI Release (NVIDIA)\">Linux FYI Release (NVIDIA)</a></li></ul>" } builders { name: "gpu-fyi-try-linux-nvidia-tsn" @@ -76098,6 +76585,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux FYI GPU TSAN Release\">Linux FYI GPU TSAN Release</a></li></ul>" } builders { name: "gpu-fyi-try-mac-amd-pro-rel" @@ -76183,6 +76671,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Mac Builder\">GPU FYI Mac Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac Pro FYI Release (AMD)\">Mac Pro FYI Release (AMD)</a></li></ul>" } builders { name: "gpu-fyi-try-mac-amd-retina-asan" @@ -76268,6 +76757,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Mac Builder (asan)\">GPU FYI Mac Builder (asan)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac FYI Retina ASAN (AMD)\">Mac FYI Retina ASAN (AMD)</a></li></ul>" } builders { name: "gpu-fyi-try-mac-amd-retina-dbg" @@ -76353,6 +76843,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Mac Builder (dbg)\">GPU FYI Mac Builder (dbg)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac FYI Retina Debug (AMD)\">Mac FYI Retina Debug (AMD)</a></li></ul>" } builders { name: "gpu-fyi-try-mac-amd-retina-exp" @@ -76438,6 +76929,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Mac Builder\">GPU FYI Mac Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac FYI Experimental Retina Release (AMD)\">Mac FYI Experimental Retina Release (AMD)</a></li></ul>" } builders { name: "gpu-fyi-try-mac-amd-retina-rel" @@ -76523,6 +77015,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Mac Builder\">GPU FYI Mac Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac FYI Retina Release (AMD)\">Mac FYI Retina Release (AMD)</a></li></ul>" } builders { name: "gpu-fyi-try-mac-arm64-apple-m1-exp" @@ -76608,6 +77101,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Mac arm64 Builder\">GPU FYI Mac arm64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac FYI Experimental Release (Apple M1)\">Mac FYI Experimental Release (Apple M1)</a></li></ul>" } builders { name: "gpu-fyi-try-mac-arm64-apple-m1-rel" @@ -76693,6 +77187,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Mac arm64 Builder\">GPU FYI Mac arm64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac FYI Release (Apple M1)\">Mac FYI Release (Apple M1)</a></li></ul>" } builders { name: "gpu-fyi-try-mac-arm64-apple-m2-retina-rel" @@ -76778,6 +77273,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Mac arm64 Builder\">GPU FYI Mac arm64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac FYI Retina Release (Apple M2)\">Mac FYI Retina Release (Apple M2)</a></li></ul>" } builders { name: "gpu-fyi-try-mac-intel-asan" @@ -76863,6 +77359,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Mac Builder (asan)\">GPU FYI Mac Builder (asan)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac FYI ASAN (Intel)\">Mac FYI ASAN (Intel)</a></li></ul>" } builders { name: "gpu-fyi-try-mac-intel-dbg" @@ -76948,6 +77445,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Mac Builder (dbg)\">GPU FYI Mac Builder (dbg)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac FYI Debug (Intel)\">Mac FYI Debug (Intel)</a></li></ul>" } builders { name: "gpu-fyi-try-mac-intel-exp" @@ -77033,6 +77531,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Mac Builder\">GPU FYI Mac Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac FYI Experimental Release (Intel)\">Mac FYI Experimental Release (Intel)</a></li></ul>" } builders { name: "gpu-fyi-try-mac-intel-rel" @@ -77118,6 +77617,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Mac Builder\">GPU FYI Mac Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac FYI Release (Intel)\">Mac FYI Release (Intel)</a></li></ul>" } builders { name: "gpu-fyi-try-mac-nvidia-retina-exp" @@ -77203,6 +77703,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Mac Builder\">GPU FYI Mac Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac FYI Experimental Retina Release (NVIDIA)\">Mac FYI Experimental Retina Release (NVIDIA)</a></li></ul>" } builders { name: "gpu-fyi-try-mac-nvidia-retina-rel" @@ -77288,6 +77789,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Mac Builder\">GPU FYI Mac Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac FYI Retina Release (NVIDIA)\">Mac FYI Retina Release (NVIDIA)</a></li></ul>" } builders { name: "gpu-fyi-try-win10-amd-rel-64" @@ -77374,6 +77876,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Win x64 Builder\">GPU FYI Win x64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win10 FYI x64 Release (AMD RX 5500 XT)\">Win10 FYI x64 Release (AMD RX 5500 XT)</a></li></ul>" } builders { name: "gpu-fyi-try-win10-intel-exp-64" @@ -77460,6 +77963,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Win x64 Builder\">GPU FYI Win x64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win10 FYI x64 Experimental Release (Intel)\">Win10 FYI x64 Experimental Release (Intel)</a></li></ul>" } builders { name: "gpu-fyi-try-win10-intel-rel-64" @@ -77546,6 +78050,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Win x64 Builder\">GPU FYI Win x64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win10 FYI x64 Release (Intel)\">Win10 FYI x64 Release (Intel)</a></li></ul>" } builders { name: "gpu-fyi-try-win10-nvidia-dbg-64" @@ -77632,6 +78137,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Win x64 Builder (dbg)\">GPU FYI Win x64 Builder (dbg)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win10 FYI x64 Debug (NVIDIA)\">Win10 FYI x64 Debug (NVIDIA)</a></li></ul>" } builders { name: "gpu-fyi-try-win10-nvidia-dx12vk-dbg-64" @@ -77718,6 +78224,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Win x64 DX12 Vulkan Builder (dbg)\">GPU FYI Win x64 DX12 Vulkan Builder (dbg)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win10 FYI x64 DX12 Vulkan Debug (NVIDIA)\">Win10 FYI x64 DX12 Vulkan Debug (NVIDIA)</a></li></ul>" } builders { name: "gpu-fyi-try-win10-nvidia-dx12vk-rel-64" @@ -77804,6 +78311,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Win x64 DX12 Vulkan Builder\">GPU FYI Win x64 DX12 Vulkan Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win10 FYI x64 DX12 Vulkan Release (NVIDIA)\">Win10 FYI x64 DX12 Vulkan Release (NVIDIA)</a></li></ul>" } builders { name: "gpu-fyi-try-win10-nvidia-exp-64" @@ -77890,6 +78398,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Win x64 Builder\">GPU FYI Win x64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win10 FYI x64 Exp Release (NVIDIA)\">Win10 FYI x64 Exp Release (NVIDIA)</a></li></ul>" } builders { name: "gpu-fyi-try-win10-nvidia-rel-32" @@ -77976,6 +78485,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Win Builder\">GPU FYI Win Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win10 FYI x86 Release (NVIDIA)\">Win10 FYI x86 Release (NVIDIA)</a></li></ul>" } builders { name: "gpu-fyi-try-win10-nvidia-rel-64" @@ -78062,6 +78572,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU FYI Win x64 Builder\">GPU FYI Win x64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win10 FYI x64 Release (NVIDIA)\">Win10 FYI x64 Release (NVIDIA)</a></li></ul>" } builders { name: "gpu-try-android-m-nexus-5x-64" @@ -78148,6 +78659,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android Release (Nexus 5X)\">Android Release (Nexus 5X)</a></li></ul>" } builders { name: "gpu-try-linux-nvidia-dbg" @@ -78234,6 +78746,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU Linux Builder (dbg)\">GPU Linux Builder (dbg)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Debug (NVIDIA)\">Linux Debug (NVIDIA)</a></li></ul>" } builders { name: "gpu-try-linux-nvidia-rel" @@ -78320,6 +78833,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU Linux Builder\">GPU Linux Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Release (NVIDIA)\">Linux Release (NVIDIA)</a></li></ul>" } builders { name: "gpu-try-mac-amd-retina-dbg" @@ -78405,6 +78919,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU Mac Builder (dbg)\">GPU Mac Builder (dbg)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac Retina Debug (AMD)\">Mac Retina Debug (AMD)</a></li></ul>" } builders { name: "gpu-try-mac-intel-dbg" @@ -78490,6 +79005,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU Mac Builder (dbg)\">GPU Mac Builder (dbg)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac Debug (Intel)\">Mac Debug (Intel)</a></li></ul>" } builders { name: "ios-angle-try-intel" @@ -78660,6 +79176,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/ios-angle-builder\">ios-angle-builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/ios-angle-intel\">ios-angle-intel</a></li></ul>" } builders { name: "ios-asan" @@ -78752,6 +79269,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/ios-asan\">ios-asan</a></li></ul>" } builders { name: "ios-blink-dbg-fyi" @@ -78844,6 +79362,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/ios-blink-dbg-fyi\">ios-blink-dbg-fyi</a></li></ul>" } builders { name: "ios-catalyst" @@ -78936,6 +79455,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/ios-catalyst\">ios-catalyst</a></li></ul>" } builders { name: "ios-device" @@ -79028,6 +79548,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/ios-device\">ios-device</a></li></ul>" } builders { name: "ios-fieldtrial-rel" @@ -79120,6 +79641,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/ios-fieldtrial-rel\">ios-fieldtrial-rel</a></li></ul>" } builders { name: "ios-m1-simulator" @@ -79212,6 +79734,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/ios-m1-simulator\">ios-m1-simulator</a></li></ul>" } builders { name: "ios-m1-simulator-cronet" @@ -79304,6 +79827,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/ios-m1-simulator-cronet\">ios-m1-simulator-cronet</a></li></ul>" } builders { name: "ios-simulator" @@ -79398,7 +79922,7 @@ use_invocation_timestamp: true } } - description_html: "This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/ios-simulator-compilator\">ios-simulator-compilator</a>." + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/ios-simulator\">ios-simulator</a></li></ul><br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/ios-simulator-compilator\">ios-simulator-compilator</a>." } builders { name: "ios-simulator-code-coverage" @@ -79491,6 +80015,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/ios-simulator-code-coverage\">ios-simulator-code-coverage</a></li></ul>" } builders { name: "ios-simulator-compilator" @@ -79677,6 +80202,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/ios-simulator-cronet\">ios-simulator-cronet</a></li></ul>" } builders { name: "ios-simulator-full-configs" @@ -79770,6 +80296,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/ios-simulator-full-configs\">ios-simulator-full-configs</a></li></ul>" } builders { name: "ios-simulator-inverse-fieldtrials-fyi" @@ -79862,6 +80389,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/ios-simulator\">ios-simulator</a></li></ul>" } builders { name: "ios-simulator-multi-window" @@ -79954,6 +80482,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/ios-simulator-multi-window\">ios-simulator-multi-window</a></li></ul>" } builders { name: "ios-simulator-noncq" @@ -80047,6 +80576,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/ios-simulator-noncq\">ios-simulator-noncq</a></li></ul>" } builders { name: "ios-wpt-fyi-rel" @@ -80139,6 +80669,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/ios-wpt-fyi-rel\">ios-wpt-fyi-rel</a></li></ul>" } builders { name: "ios16-beta-simulator" @@ -80231,6 +80762,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/ios16-beta-simulator\">ios16-beta-simulator</a></li></ul>" } builders { name: "ios16-sdk-simulator" @@ -80323,6 +80855,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/ios16-sdk-simulator\">ios16-sdk-simulator</a></li></ul>" } builders { name: "ios17-beta-simulator" @@ -80415,6 +80948,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/ios17-beta-simulator\">ios17-beta-simulator</a></li></ul>" } builders { name: "ios17-sdk-simulator" @@ -80507,6 +81041,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/ios17-sdk-simulator\">ios17-sdk-simulator</a></li></ul>" } builders { name: "lacros-amd64-generic-rel" @@ -80597,6 +81132,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/lacros-amd64-generic-rel\">lacros-amd64-generic-rel</a></li></ul>" } builders { name: "lacros-amd64-generic-rel-skylab" @@ -80777,6 +81313,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/lacros-arm-generic-rel\">lacros-arm-generic-rel</a></li></ul>" } builders { name: "lacros-arm64-generic-rel" @@ -80867,6 +81404,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/lacros-arm64-generic-rel\">lacros-arm64-generic-rel</a></li></ul>" } builders { name: "layout_test_leak_detection" @@ -80957,6 +81495,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/WebKit Linux Leak\">WebKit Linux Leak</a></li></ul>" } builders { name: "leak_detection_linux" @@ -81047,6 +81586,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Leak Detection Linux\">Leak Detection Linux</a></li></ul>" } builders { name: "linux-afl-asan-rel" @@ -81332,6 +81872,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-angle-chromium-builder\">linux-angle-chromium-builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-angle-chromium-intel\">linux-angle-chromium-intel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-angle-chromium-nvidia\">linux-angle-chromium-nvidia</a></li></ul>" } builders { name: "linux-annotator-rel" @@ -81422,6 +81963,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-annotator-rel\">linux-annotator-rel</a></li></ul>" } builders { name: "linux-arm64-castos" @@ -81513,6 +82055,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Cast Linux ARM64\">Cast Linux ARM64</a></li></ul>" } builders { name: "linux-arm64-rel-cft" @@ -81603,6 +82146,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-arm64-rel-cft\">linux-arm64-rel-cft</a></li></ul>" } builders { name: "linux-bfcache-rel" @@ -81693,6 +82237,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-bfcache-rel\">linux-bfcache-rel</a></li></ul>" } builders { name: "linux-blink-heap-verification-try" @@ -81783,6 +82328,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-blink-heap-verification\">linux-blink-heap-verification</a></li></ul>" } builders { name: "linux-blink-rel" @@ -81964,6 +82510,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-blink-web-tests-force-accessibility-rel\">linux-blink-web-tests-force-accessibility-rel</a></li></ul>" } builders { name: "linux-centipede-asan-rel" @@ -82137,6 +82684,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-cfm-rel\">linux-cfm-rel</a></li></ul>" } builders { name: "linux-chromeos-annotator-rel" @@ -82227,6 +82775,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-chromeos-annotator-rel\">linux-chromeos-annotator-rel</a></li></ul>" } builders { name: "linux-chromeos-clang-tidy-rel" @@ -82399,6 +82948,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-chromeos-code-coverage\">linux-chromeos-code-coverage</a></li></ul>" } builders { name: "linux-chromeos-compile-dbg" @@ -82489,6 +83039,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-chromeos-dbg\">linux-chromeos-dbg</a></li></ul>" } builders { name: "linux-chromeos-dbg" @@ -82579,6 +83130,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-chromeos-dbg\">linux-chromeos-dbg</a></li></ul>" } builders { name: "linux-chromeos-inverse-fieldtrials-fyi-rel" @@ -82669,6 +83221,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-chromeos-rel\">linux-chromeos-rel</a></li></ul>" } builders { name: "linux-chromeos-rel" @@ -82763,7 +83316,7 @@ use_invocation_timestamp: true } } - description_html: "This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-chromeos-rel-compilator\">linux-chromeos-rel-compilator</a>." + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-chromeos-rel\">linux-chromeos-rel</a></li></ul><br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-chromeos-rel-compilator\">linux-chromeos-rel-compilator</a>." } builders { name: "linux-chromeos-rel-compilator" @@ -82949,7 +83502,7 @@ use_invocation_timestamp: true } } - description_html: "This builder shadows linux-chromeos-rel builder to compare between Siso builds and Ninja builds.<br/>\nThis builder should be removed after migrating linux-chromeos-rel from Ninja to Siso. b/277863839\n<br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-chromeos-siso-rel-compilator\">linux-chromeos-siso-rel-compilator</a>." + description_html: "This builder shadows linux-chromeos-rel builder to compare between Siso builds and Ninja builds.<br/>\nThis builder should be removed after migrating linux-chromeos-rel from Ninja to Siso. b/277863839\n<br/>This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-chromeos-rel\">linux-chromeos-rel</a></li></ul><br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-chromeos-siso-rel-compilator\">linux-chromeos-siso-rel-compilator</a>." } builders { name: "linux-chromeos-siso-rel-compilator" @@ -83213,6 +83766,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-code-coverage\">linux-code-coverage</a></li></ul>" } builders { name: "linux-dawn-rel" @@ -83301,6 +83855,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Linux x64 Builder\">Dawn Linux x64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Linux x64 Release (Intel UHD 630)\">Dawn Linux x64 Release (Intel UHD 630)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Linux x64 Release (NVIDIA)\">Dawn Linux x64 Release (NVIDIA)</a></li></ul>" } builders { name: "linux-dcheck-off-rel" @@ -83391,6 +83946,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Builder\">Linux Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Tests\">Linux Tests</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU Linux Builder\">GPU Linux Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Release (NVIDIA)\">Linux Release (NVIDIA)</a></li></ul>" } builders { name: "linux-exp-asan-lsan-fyi-rel" @@ -83481,6 +84037,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-exp-asan-lsan-fyi-rel\">linux-exp-asan-lsan-fyi-rel</a></li></ul>" } builders { name: "linux-exp-msan-fyi-rel" @@ -83571,6 +84128,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-exp-msan-fyi-rel\">linux-exp-msan-fyi-rel</a></li></ul>" } builders { name: "linux-exp-tsan-fyi-rel" @@ -83661,6 +84219,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-exp-tsan-fyi-rel\">linux-exp-tsan-fyi-rel</a></li></ul>" } builders { name: "linux-extended-tracing-rel" @@ -83751,6 +84310,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-extended-tracing-rel\">linux-extended-tracing-rel</a></li></ul>" } builders { name: "linux-fieldtrial-rel" @@ -83841,6 +84401,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-fieldtrial-rel\">linux-fieldtrial-rel</a></li></ul>" } builders { name: "linux-gcc-rel" @@ -83931,6 +84492,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-gcc-rel\">linux-gcc-rel</a></li></ul>" } builders { name: "linux-headless-shell-rel" @@ -84022,6 +84584,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-headless-shell-rel\">linux-headless-shell-rel</a></li></ul>" } builders { name: "linux-inverse-fieldtrials-fyi-rel" @@ -84112,6 +84675,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Builder\">Linux Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Tests\">Linux Tests</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU Linux Builder\">GPU Linux Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Release (NVIDIA)\">Linux Release (NVIDIA)</a></li></ul>" } builders { name: "linux-js-code-coverage" @@ -84202,6 +84766,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-js-code-coverage\">linux-js-code-coverage</a></li></ul>" } builders { name: "linux-js-coverage-rel" @@ -84293,6 +84858,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-js-code-coverage\">linux-js-code-coverage</a></li></ul>" } builders { name: "linux-lacros-asan-lsan-rel" @@ -84383,6 +84949,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-lacros-asan-lsan-rel\">linux-lacros-asan-lsan-rel</a></li></ul>" } builders { name: "linux-lacros-clang-tidy-rel" @@ -84556,6 +85123,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-lacros-code-coverage\">linux-lacros-code-coverage</a></li></ul>" } builders { name: "linux-lacros-dbg" @@ -84646,6 +85214,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-lacros-dbg\">linux-lacros-dbg</a></li></ul>" } builders { name: "linux-lacros-fyi-rel" @@ -84736,6 +85305,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-lacros-builder-fyi-rel\">linux-lacros-builder-fyi-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-lacros-tester-fyi-rel\">linux-lacros-tester-fyi-rel</a></li></ul>" } builders { name: "linux-lacros-rel" @@ -84826,7 +85396,7 @@ use_invocation_timestamp: true } } - description_html: "This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-lacros-rel-compilator\">linux-lacros-rel-compilator</a>." + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-lacros-builder-rel\">linux-lacros-builder-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-lacros-tester-rel\">linux-lacros-tester-rel</a></li></ul><br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-lacros-rel-compilator\">linux-lacros-rel-compilator</a>." } builders { name: "linux-lacros-rel-compilator" @@ -85008,7 +85578,7 @@ use_invocation_timestamp: true } } - description_html: "This builder shadows linux-lacros-rel builder to compare between Siso builds and Ninja builds.<br/>\nThis builder should be removed after migrating linux-lacros-rel from Ninja to Siso. b/277863839\n<br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-lacros-siso-rel-compilator\">linux-lacros-siso-rel-compilator</a>." + description_html: "This builder shadows linux-lacros-rel builder to compare between Siso builds and Ninja builds.<br/>\nThis builder should be removed after migrating linux-lacros-rel from Ninja to Siso. b/277863839\n<br/>This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-lacros-builder-rel\">linux-lacros-builder-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-lacros-tester-rel\">linux-lacros-tester-rel</a></li></ul><br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-lacros-siso-rel-compilator\">linux-lacros-siso-rel-compilator</a>." } builders { name: "linux-lacros-siso-rel-compilator" @@ -85190,6 +85760,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-lacros-version-skew-fyi\">linux-lacros-version-skew-fyi</a></li></ul>" } builders { name: "linux-layout-tests-edit-ng" @@ -85456,6 +86027,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Builder\">Linux Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Tests\">Linux Tests</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU Linux Builder\">GPU Linux Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Release (NVIDIA)\">Linux Release (NVIDIA)</a></li></ul>" } builders { name: "linux-mbi-mode-per-site-instance-rel" @@ -85546,6 +86118,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Builder\">Linux Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Tests\">Linux Tests</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU Linux Builder\">GPU Linux Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Release (NVIDIA)\">Linux Release (NVIDIA)</a></li></ul>" } builders { name: "linux-official" @@ -85636,6 +86209,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-official\">linux-official</a></li></ul>" } builders { name: "linux-perfetto-rel" @@ -85727,6 +86301,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-perfetto-rel\">linux-perfetto-rel</a></li></ul>" } builders { name: "linux-rel" @@ -85821,7 +86396,7 @@ use_invocation_timestamp: true } } - description_html: "This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-rel-compilator\">linux-rel-compilator</a>." + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Builder\">Linux Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Tests\">Linux Tests</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU Linux Builder\">GPU Linux Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Release (NVIDIA)\">Linux Release (NVIDIA)</a></li></ul><br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-rel-compilator\">linux-rel-compilator</a>." } builders { name: "linux-rel-cft" @@ -85912,6 +86487,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-rel-cft\">linux-rel-cft</a></li></ul>" } builders { name: "linux-rel-compilator" @@ -86093,6 +86669,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-rust-x64-dbg\">linux-rust-x64-dbg</a></li></ul>" } builders { name: "linux-rust-x64-rel" @@ -86183,6 +86760,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-rust-x64-rel\">linux-rust-x64-rel</a></li></ul>" } builders { name: "linux-siso-rel" @@ -86277,7 +86855,7 @@ use_invocation_timestamp: true } } - description_html: "This builder shadows linux-rel builder to compare between Siso builds and Ninja builds.<br/>\nThis builder should be removed after migrating linux-rel from Ninja to Siso. b/277863839\n<br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-siso-rel-compilator\">linux-siso-rel-compilator</a>." + description_html: "This builder shadows linux-rel builder to compare between Siso builds and Ninja builds.<br/>\nThis builder should be removed after migrating linux-rel from Ninja to Siso. b/277863839\n<br/>This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Builder\">Linux Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Tests\">Linux Tests</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU Linux Builder\">GPU Linux Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Release (NVIDIA)\">Linux Release (NVIDIA)</a></li></ul><br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-siso-rel-compilator\">linux-siso-rel-compilator</a>." } builders { name: "linux-siso-rel-compilator" @@ -86456,6 +87034,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-swangle-chromium-x64\">linux-swangle-chromium-x64</a></li></ul>" } builders { name: "linux-swangle-chromium-try-x64-exp" @@ -86543,6 +87122,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-swangle-chromium-x64-exp\">linux-swangle-chromium-x64-exp</a></li></ul>" } builders { name: "linux-swangle-try-tot-swiftshader-x64" @@ -86666,6 +87246,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-swangle-tot-swiftshader-x64\">linux-swangle-tot-swiftshader-x64</a></li></ul>" } builders { name: "linux-swangle-try-x64" @@ -86753,6 +87334,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-swangle-x64\">linux-swangle-x64</a></li></ul>" } builders { name: "linux-swangle-try-x64-exp" @@ -86840,6 +87422,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-swangle-x64-exp\">linux-swangle-x64-exp</a></li></ul>" } builders { name: "linux-ubsan-fyi-rel" @@ -86930,6 +87513,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-ubsan-fyi-rel\">linux-ubsan-fyi-rel</a></li></ul>" } builders { name: "linux-ubsan-vptr" @@ -87020,6 +87604,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-ubsan-vptr\">linux-ubsan-vptr</a></li></ul>" } builders { name: "linux-updater-try-builder-dbg" @@ -87110,6 +87695,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-updater-builder-dbg\">linux-updater-builder-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-updater-tester-dbg\">linux-updater-tester-dbg</a></li></ul>" } builders { name: "linux-updater-try-builder-rel" @@ -87200,6 +87786,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-updater-builder-rel\">linux-updater-builder-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-updater-tester-rel\">linux-updater-tester-rel</a></li></ul>" } builders { name: "linux-v4l2-codec-rel" @@ -87290,6 +87877,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-v4l2-codec-rel\">linux-v4l2-codec-rel</a></li></ul>" } builders { name: "linux-viz-rel" @@ -87380,6 +87968,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Viz\">Linux Viz</a></li></ul>" } builders { name: "linux-wayland-rel" @@ -87470,7 +88059,7 @@ use_invocation_timestamp: true } } - description_html: "This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-wayland-rel-compilator\">linux-wayland-rel-compilator</a>." + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Builder (Wayland)\">Linux Builder (Wayland)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Tests (Wayland)\">Linux Tests (Wayland)</a></li></ul><br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-wayland-rel-compilator\">linux-wayland-rel-compilator</a>." } builders { name: "linux-wayland-rel-compilator" @@ -87652,7 +88241,7 @@ use_invocation_timestamp: true } } - description_html: "This builder shadows linux-wayland-rel builder to compare between Siso builds and Ninja builds.<br/>\nThis builder should be removed after migrating linux-wayland-rel from Ninja to Siso. b/277863839\n<br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-wayland-siso-rel-compilator\">linux-wayland-siso-rel-compilator</a>." + description_html: "This builder shadows linux-wayland-rel builder to compare between Siso builds and Ninja builds.<br/>\nThis builder should be removed after migrating linux-wayland-rel from Ninja to Siso. b/277863839\n<br/>This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Builder (Wayland)\">Linux Builder (Wayland)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Tests (Wayland)\">Linux Tests (Wayland)</a></li></ul><br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/linux-wayland-siso-rel-compilator\">linux-wayland-siso-rel-compilator</a>." } builders { name: "linux-wayland-siso-rel-compilator" @@ -87834,6 +88423,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/WebKit Linux MSAN\">WebKit Linux MSAN</a></li></ul>" } builders { name: "linux-wpt-content-shell-fyi-rel" @@ -87924,6 +88514,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-wpt-content-shell-fyi-rel\">linux-wpt-content-shell-fyi-rel</a></li></ul>" } builders { name: "linux-wpt-content-shell-leak-detection" @@ -88014,6 +88605,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-wpt-content-shell-leak-detection\">linux-wpt-content-shell-leak-detection</a></li></ul>" } builders { name: "linux-wpt-fyi-rel" @@ -88104,6 +88696,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-wpt-fyi-rel\">linux-wpt-fyi-rel</a></li></ul>" } builders { name: "linux-wpt-identity-fyi-rel" @@ -88194,6 +88787,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-wpt-identity-fyi-rel\">linux-wpt-identity-fyi-rel</a></li></ul>" } builders { name: "linux-wpt-input-fyi-rel" @@ -88284,6 +88878,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-wpt-input-fyi-rel\">linux-wpt-input-fyi-rel</a></li></ul>" } builders { name: "linux-x64-castos" @@ -88374,6 +88969,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Cast Linux\">Cast Linux</a></li></ul>" } builders { name: "linux-x64-castos-audio" @@ -88464,6 +89060,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Cast Audio Linux\">Cast Audio Linux</a></li></ul>" } builders { name: "linux-x64-castos-dbg" @@ -88555,6 +89152,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Cast Linux Debug\">Cast Linux Debug</a></li></ul>" } builders { name: "linux_chromium_archive_rel_ng" @@ -88645,6 +89243,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-archive-rel\">linux-archive-rel</a></li></ul>" } builders { name: "linux_chromium_asan_rel_ng" @@ -88739,7 +89338,7 @@ use_invocation_timestamp: true } } - description_html: "This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_asan_rel_ng-compilator\">linux_chromium_asan_rel_ng-compilator</a>." + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux ASan LSan Builder\">Linux ASan LSan Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux ASan LSan Tests (1)\">Linux ASan LSan Tests (1)</a></li></ul><br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_asan_rel_ng-compilator\">linux_chromium_asan_rel_ng-compilator</a>." } builders { name: "linux_chromium_asan_rel_ng-compilator" @@ -88925,7 +89524,7 @@ use_invocation_timestamp: true } } - description_html: "This builder shadows linux_chromium_asan_rel_ng builder to compare between Siso builds and Ninja builds.<br/>\nThis builder should be removed after migrating linux_chromium_asan_rel_ng from Ninja to Siso. b/277863839\n<br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_asan_siso_rel_ng-compilator\">linux_chromium_asan_siso_rel_ng-compilator</a>." + description_html: "This builder shadows linux_chromium_asan_rel_ng builder to compare between Siso builds and Ninja builds.<br/>\nThis builder should be removed after migrating linux_chromium_asan_rel_ng from Ninja to Siso. b/277863839\n<br/>This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux ASan LSan Builder\">Linux ASan LSan Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux ASan LSan Tests (1)\">Linux ASan LSan Tests (1)</a></li></ul><br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_asan_siso_rel_ng-compilator\">linux_chromium_asan_siso_rel_ng-compilator</a>." } builders { name: "linux_chromium_asan_siso_rel_ng-compilator" @@ -89108,6 +89707,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux CFI\">Linux CFI</a></li></ul>" } builders { name: "linux_chromium_chromeos_asan_rel_ng" @@ -89198,6 +89798,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Chromium OS ASan LSan Builder\">Linux Chromium OS ASan LSan Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Chromium OS ASan LSan Tests (1)\">Linux Chromium OS ASan LSan Tests (1)</a></li></ul>" } builders { name: "linux_chromium_chromeos_msan_rel_ng" @@ -89288,6 +89889,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux ChromiumOS MSan Builder\">Linux ChromiumOS MSan Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux ChromiumOS MSan Tests\">Linux ChromiumOS MSan Tests</a></li></ul>" } builders { name: "linux_chromium_clobber_deterministic" @@ -89461,6 +90063,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/linux-archive-rel\">linux-archive-rel</a></li></ul>" } builders { name: "linux_chromium_compile_dbg_ng" @@ -89555,6 +90158,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Builder (dbg)\">Linux Builder (dbg)</a></li></ul>" } builders { name: "linux_chromium_compile_rel_ng" @@ -89645,6 +90249,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Builder\">Linux Builder</a></li></ul>" } builders { name: "linux_chromium_dbg_ng" @@ -89740,6 +90345,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Builder (dbg)\">Linux Builder (dbg)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux Tests (dbg)(1)\">Linux Tests (dbg)(1)</a></li></ul>" } builders { name: "linux_chromium_msan_rel_ng" @@ -89830,6 +90436,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux MSan Builder\">Linux MSan Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux MSan Tests\">Linux MSan Tests</a></li></ul>" } builders { name: "linux_chromium_tsan_rel_ng" @@ -89924,7 +90531,7 @@ use_invocation_timestamp: true } } - description_html: "This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_tsan_rel_ng-compilator\">linux_chromium_tsan_rel_ng-compilator</a>." + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux TSan Builder\">Linux TSan Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux TSan Tests\">Linux TSan Tests</a></li></ul><br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_tsan_rel_ng-compilator\">linux_chromium_tsan_rel_ng-compilator</a>." } builders { name: "linux_chromium_tsan_rel_ng-compilator" @@ -90110,7 +90717,7 @@ use_invocation_timestamp: true } } - description_html: "This builder shadows linux_chromium_tsan_rel_ng builder to compare between Siso builds and Ninja builds.<br/>\nThis builder should be removed after migrating linux_chromium_tsan_rel_ng from Ninja to Siso. b/277863839\n<br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_tsan_siso_rel_ng-compilator\">linux_chromium_tsan_siso_rel_ng-compilator</a>." + description_html: "This builder shadows linux_chromium_tsan_rel_ng builder to compare between Siso builds and Ninja builds.<br/>\nThis builder should be removed after migrating linux_chromium_tsan_rel_ng from Ninja to Siso. b/277863839\n<br/>This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux TSan Builder\">Linux TSan Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Linux TSan Tests\">Linux TSan Tests</a></li></ul><br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/linux_chromium_tsan_siso_rel_ng-compilator\">linux_chromium_tsan_siso_rel_ng-compilator</a>." } builders { name: "linux_chromium_tsan_siso_rel_ng-compilator" @@ -90658,6 +91265,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac-angle-chromium-amd\">mac-angle-chromium-amd</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac-angle-chromium-builder\">mac-angle-chromium-builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac-angle-chromium-intel\">mac-angle-chromium-intel</a></li></ul>" } builders { name: "mac-arm64-on-arm64-rel" @@ -90747,6 +91355,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac-arm64-on-arm64-rel\">mac-arm64-on-arm64-rel</a></li></ul>" } builders { name: "mac-builder-next" @@ -90836,6 +91445,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac Builder Next\">Mac Builder Next</a></li></ul>" } builders { name: "mac-clang-tidy-rel" @@ -91012,6 +91622,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac-code-coverage\">mac-code-coverage</a></li></ul>" } builders { name: "mac-dawn-rel" @@ -91100,6 +91711,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Mac x64 Builder\">Dawn Mac x64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Mac x64 Release (AMD)\">Dawn Mac x64 Release (AMD)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Mac x64 Release (Intel)\">Dawn Mac x64 Release (Intel)</a></li></ul>" } builders { name: "mac-fieldtrial-tester" @@ -91189,6 +91801,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac-arm64-rel\">mac-arm64-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac-fieldtrial-tester\">mac-fieldtrial-tester</a></li></ul>" } builders { name: "mac-intel-on-arm64-rel" @@ -91278,6 +91891,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac-intel-on-arm64-rel\">mac-intel-on-arm64-rel</a></li></ul>" } builders { name: "mac-inverse-fieldtrials-fyi-rel" @@ -91367,6 +91981,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac Builder\">Mac Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac13 Tests\">Mac13 Tests</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU Mac Builder\">GPU Mac Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac Release (Intel)\">Mac Release (Intel)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac Retina Release (AMD)\">Mac Retina Release (AMD)</a></li></ul>" } builders { name: "mac-official" @@ -91455,6 +92070,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac-official\">mac-official</a></li></ul>" } builders { name: "mac-osxbeta-rel" @@ -91544,6 +92160,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac-osxbeta-rel\">mac-osxbeta-rel</a></li></ul>" } builders { name: "mac-perfetto-rel" @@ -91633,6 +92250,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac-perfetto-rel\">mac-perfetto-rel</a></li></ul>" } builders { name: "mac-rel" @@ -91727,7 +92345,7 @@ use_invocation_timestamp: true } } - description_html: "This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-rel-compilator\">mac-rel-compilator</a>." + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac Builder\">Mac Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac13 Tests\">Mac13 Tests</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU Mac Builder\">GPU Mac Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac Release (Intel)\">Mac Release (Intel)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac Retina Release (AMD)\">Mac Retina Release (AMD)</a></li></ul><br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/mac-rel-compilator\">mac-rel-compilator</a>." } builders { name: "mac-rel-cft" @@ -91816,6 +92434,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac-rel-cft\">mac-rel-cft</a></li></ul>" } builders { name: "mac-rel-compilator" @@ -91993,6 +92612,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac-rust-x64-dbg\">mac-rust-x64-dbg</a></li></ul>" } builders { name: "mac-swangle-chromium-try-x64" @@ -92078,6 +92698,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac-swangle-chromium-x64\">mac-swangle-chromium-x64</a></li></ul>" } builders { name: "mac-updater-try-builder-dbg" @@ -92167,6 +92788,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac-updater-builder-dbg\">mac-updater-builder-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac10.15-updater-tester-dbg\">mac10.15-updater-tester-dbg</a></li></ul>" } builders { name: "mac-updater-try-builder-rel" @@ -92256,6 +92878,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac-updater-builder-rel\">mac-updater-builder-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac10.15-updater-tester-rel\">mac10.15-updater-tester-rel</a></li></ul>" } builders { name: "mac10.15-blink-rel" @@ -92434,6 +93057,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac10.15-wpt-content-shell-fyi-rel\">mac10.15-wpt-content-shell-fyi-rel</a></li></ul>" } builders { name: "mac11-arm64-rel" @@ -92523,6 +93147,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac-arm64-rel\">mac-arm64-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac11-arm64-rel-tests\">mac11-arm64-rel-tests</a></li></ul>" } builders { name: "mac11-arm64-wpt-content-shell-fyi-rel" @@ -92612,6 +93237,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac11-arm64-wpt-content-shell-fyi-rel\">mac11-arm64-wpt-content-shell-fyi-rel</a></li></ul>" } builders { name: "mac11-wpt-content-shell-fyi-rel" @@ -92701,6 +93327,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac11-wpt-content-shell-fyi-rel\">mac11-wpt-content-shell-fyi-rel</a></li></ul>" } builders { name: "mac11.0-blink-rel" @@ -92968,6 +93595,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac-arm64-rel\">mac-arm64-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac12-arm64-rel-tests\">mac12-arm64-rel-tests</a></li></ul>" } builders { name: "mac12-arm64-wpt-content-shell-fyi-rel" @@ -93057,6 +93685,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac12-arm64-wpt-content-shell-fyi-rel\">mac12-arm64-wpt-content-shell-fyi-rel</a></li></ul>" } builders { name: "mac12-tests" @@ -93146,6 +93775,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac Builder\">Mac Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac12 Tests\">Mac12 Tests</a></li></ul>" } builders { name: "mac12-wpt-content-shell-fyi-rel" @@ -93235,6 +93865,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac12-wpt-content-shell-fyi-rel\">mac12-wpt-content-shell-fyi-rel</a></li></ul>" } builders { name: "mac12.0-blink-rel" @@ -93503,7 +94134,7 @@ use_invocation_timestamp: true } } - description_html: "This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/mac13-arm64-rel-compilator\">mac13-arm64-rel-compilator</a>." + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac-arm64-rel\">mac-arm64-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac13-arm64-rel-tests\">mac13-arm64-rel-tests</a></li></ul><br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/mac13-arm64-rel-compilator\">mac13-arm64-rel-compilator</a>." } builders { name: "mac13-arm64-rel-compilator" @@ -93683,6 +94314,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac13-arm64-wpt-content-shell-fyi-rel\">mac13-arm64-wpt-content-shell-fyi-rel</a></li></ul>" } builders { name: "mac13-blink-rel" @@ -93861,6 +94493,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac Builder\">Mac Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac13 Tests\">Mac13 Tests</a></li></ul>" } builders { name: "mac13-wpt-content-shell-fyi-rel" @@ -93950,6 +94583,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac13-wpt-content-shell-fyi-rel\">mac13-wpt-content-shell-fyi-rel</a></li></ul>" } builders { name: "mac13.arm64-blink-rel" @@ -94128,6 +94762,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac Builder\">Mac Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac10.15 Tests\">Mac10.15 Tests</a></li></ul>" } builders { name: "mac_chromium_11.0_rel_ng" @@ -94217,6 +94852,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac Builder\">Mac Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac11 Tests\">Mac11 Tests</a></li></ul>" } builders { name: "mac_chromium_archive_rel_ng" @@ -94306,6 +94942,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/mac-archive-rel\">mac-archive-rel</a></li></ul>" } builders { name: "mac_chromium_asan_rel_ng" @@ -94395,6 +95032,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac ASan 64 Builder\">Mac ASan 64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac ASan 64 Tests (1)\">Mac ASan 64 Tests (1)</a></li></ul>" } builders { name: "mac_chromium_compile_dbg_ng" @@ -94485,6 +95123,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac Builder (dbg)\">Mac Builder (dbg)</a></li></ul>" } builders { name: "mac_chromium_compile_rel_ng" @@ -94574,6 +95213,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac Builder\">Mac Builder</a></li></ul>" } builders { name: "mac_chromium_dbg_ng" @@ -94663,6 +95303,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac Builder (dbg)\">Mac Builder (dbg)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Mac13 Tests (dbg)\">Mac13 Tests (dbg)</a></li></ul>" } builders { name: "mac_optional_gpu_tests_rel" @@ -95166,6 +95807,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Network Service Linux\">Network Service Linux</a></li></ul>" } builders { name: "reclient-config-deployment-verifier" @@ -95844,6 +96486,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Android arm64 Builder (dbg)\">Android arm64 Builder (dbg)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Nougat Phone Tester\">Nougat Phone Tester</a></li></ul>" } builders { name: "win-angle-chromium-x64-try" @@ -96047,6 +96690,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win-angle-chromium-x64-builder\">win-angle-chromium-x64-builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win10-angle-chromium-x64-intel\">win10-angle-chromium-x64-intel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win10-angle-chromium-x64-nvidia\">win10-angle-chromium-x64-nvidia</a></li></ul>" } builders { name: "win-angle-chromium-x86-try" @@ -96173,6 +96817,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win-angle-chromium-x86-builder\">win-angle-chromium-x86-builder</a></li></ul>" } builders { name: "win-annotator-rel" @@ -96263,6 +96908,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win-annotator-rel\">win-annotator-rel</a></li></ul>" } builders { name: "win-asan" @@ -96353,6 +96999,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win-asan\">win-asan</a></li></ul>" } builders { name: "win-celab-try-rel" @@ -96528,6 +97175,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Win10 x64 Builder\">Dawn Win10 x64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Win10 x64 Release (Intel)\">Dawn Win10 x64 Release (Intel)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Dawn Win10 x64 Release (NVIDIA)\">Dawn Win10 x64 Release (NVIDIA)</a></li></ul>" } builders { name: "win-fieldtrial-rel" @@ -96618,6 +97266,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win-fieldtrial-rel\">win-fieldtrial-rel</a></li></ul>" } builders { name: "win-libfuzzer-asan-rel" @@ -96795,6 +97444,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win-official\">win-official</a></li></ul>" } builders { name: "win-perfetto-rel" @@ -96885,6 +97535,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win-perfetto-rel\">win-perfetto-rel</a></li></ul>" } builders { name: "win-presubmit" @@ -97066,7 +97717,7 @@ use_invocation_timestamp: true } } - description_html: "This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/win-rel-compilator\">win-rel-compilator</a>." + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win x64 Builder\">Win x64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win10 Tests x64\">Win10 Tests x64</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU Win x64 Builder\">GPU Win x64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win10 x64 Release (NVIDIA)\">Win10 x64 Release (NVIDIA)</a></li></ul><br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/win-rel-compilator\">win-rel-compilator</a>." } builders { name: "win-rel-cft" @@ -97157,6 +97808,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win-rel-cft\">win-rel-cft</a></li></ul>" } builders { name: "win-rel-compilator" @@ -97338,6 +97990,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win-rust-x64-dbg\">win-rust-x64-dbg</a></li></ul>" } builders { name: "win-rust-x64-rel" @@ -97428,6 +98081,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win-rust-x64-rel\">win-rust-x64-rel</a></li></ul>" } builders { name: "win-siso-rel" @@ -97522,7 +98176,7 @@ use_invocation_timestamp: true } } - description_html: "This builder shadows win-rel builder to compare between Siso builds and Ninja builds.<br/>\nThis builder should be removed after migrating win-rel from Ninja to Siso. b/277863839\n<br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/win-siso-rel-compilator\">win-siso-rel-compilator</a>." + description_html: "This builder shadows win-rel builder to compare between Siso builds and Ninja builds.<br/>\nThis builder should be removed after migrating win-rel from Ninja to Siso. b/277863839\n<br/>This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win x64 Builder\">Win x64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win10 Tests x64\">Win10 Tests x64</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU Win x64 Builder\">GPU Win x64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win10 x64 Release (NVIDIA)\">Win10 x64 Release (NVIDIA)</a></li></ul><br/>This is the orchestrator half of an orchestrator + compilator pair of builders. The compilator is <a href=\"https://ci.chromium.org/p/chromium/builders/try/win-siso-rel-compilator\">win-siso-rel-compilator</a>." } builders { name: "win-siso-rel-compilator" @@ -97701,6 +98355,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win-swangle-chromium-x86\">win-swangle-chromium-x86</a></li></ul>" } builders { name: "win-swangle-try-tot-swiftshader-x64" @@ -97824,6 +98479,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win-swangle-tot-swiftshader-x64\">win-swangle-tot-swiftshader-x64</a></li></ul>" } builders { name: "win-swangle-try-tot-swiftshader-x86" @@ -97947,6 +98603,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win-swangle-tot-swiftshader-x86\">win-swangle-tot-swiftshader-x86</a></li></ul>" } builders { name: "win-swangle-try-x64" @@ -98034,6 +98691,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win-swangle-x64\">win-swangle-x64</a></li></ul>" } builders { name: "win-swangle-try-x86" @@ -98121,6 +98779,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win-swangle-x86\">win-swangle-x86</a></li></ul>" } builders { name: "win-updater-try-builder-dbg" @@ -98212,6 +98871,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win-updater-builder-dbg\">win-updater-builder-dbg</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win10-updater-tester-dbg\">win10-updater-tester-dbg</a></li></ul>" } builders { name: "win-updater-try-builder-rel" @@ -98303,6 +98963,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win-updater-builder-rel\">win-updater-builder-rel</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win10-updater-tester-rel\">win10-updater-tester-rel</a></li></ul>" } builders { name: "win10-clang-tidy-rel" @@ -98476,6 +99137,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win10-code-coverage\">win10-code-coverage</a></li></ul>" } builders { name: "win10-wpt-content-shell-fyi-rel" @@ -98566,6 +99228,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win10-wpt-content-shell-fyi-rel\">win10-wpt-content-shell-fyi-rel</a></li></ul>" } builders { name: "win10.20h2-blink-rel" @@ -98746,6 +99409,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win x64 Builder\">Win x64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win10 Tests x64\">Win10 Tests x64</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/GPU Win x64 Builder\">GPU Win x64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win10 x64 Release (NVIDIA)\">Win10 x64 Release (NVIDIA)</a></li></ul>" } builders { name: "win10_chromium_x64_dbg_ng" @@ -98836,6 +99500,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win x64 Builder (dbg)\">Win x64 Builder (dbg)</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win10 Tests x64 (dbg)\">Win10 Tests x64 (dbg)</a></li></ul>" } builders { name: "win11-arm64-blink-rel" @@ -99106,6 +99771,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win11-wpt-content-shell-fyi-rel\">win11-wpt-content-shell-fyi-rel</a></li></ul>" } builders { name: "win11-x64-fyi-rel" @@ -99197,6 +99863,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win x64 Builder\">Win x64 Builder</a></li><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win11 Tests x64\">Win11 Tests x64</a></li></ul>" } builders { name: "win32-official" @@ -99287,6 +99954,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win32-official\">win32-official</a></li></ul>" } builders { name: "win_archive" @@ -99377,6 +100045,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win32-archive-rel\">win32-archive-rel</a></li></ul>" } builders { name: "win_chromium_compile_dbg_ng" @@ -99468,6 +100137,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win Builder (dbg)\">Win Builder (dbg)</a></li></ul>" } builders { name: "win_chromium_compile_rel_ng" @@ -99558,6 +100228,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win Builder\">Win Builder</a></li></ul>" } builders { name: "win_chromium_x64_rel_ng" @@ -99648,6 +100319,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/Win x64 Builder\">Win x64 Builder</a></li></ul>" } builders { name: "win_optional_gpu_tests_rel" @@ -99980,6 +100652,7 @@ use_invocation_timestamp: true } } + description_html: "This builder mirrors the following CI builders:<br/><ul><li><a href=\"https://ci.chromium.org/p/chromium/builders/ci/win-archive-rel\">win-archive-rel</a></li></ul>" } } shadow: "try.shadow"
diff --git a/infra/config/lib/builder_config.star b/infra/config/lib/builder_config.star index a523ba1..08dbfe4 100644 --- a/infra/config/lib/builder_config.star +++ b/infra/config/lib/builder_config.star
@@ -7,6 +7,7 @@ load("@stdlib//internal/graph.star", "graph") load("@stdlib//internal/luci/common.star", "keys", "kinds", "triggerer") load("./args.star", "args") +load("./builder_url.star", "linkify_builder") load("./nodes.star", "nodes") load("./structs.star", "structs") load("//project.star", "settings") @@ -578,6 +579,38 @@ ), )) +def _get_builder_mirror_description(bucket_name, builder, bc_state): + node = _BUILDER_CONFIG.get(bucket_name, builder.name) + if not node: + return builder.description_html + mirrored_builders = bc_state.mirrors(node) + mirroring_builders = _get_mirroring_builders(bc_state, node) + if not mirrored_builders and not mirroring_builders: + return builder.description_html + elif mirrored_builders and mirroring_builders: + # Need to change the descriptions below if this assertion no + # longer holds true. + fail("A builder can't both mirror and be mirrored:", builder.name) + + description = builder.description_html + if description: + description += "<br/>" + if mirrored_builders: + description += "This builder mirrors the following CI builders:<br/>" + else: + description += "This builder is mirrored by any of the following try builders:<br/>" + + description += "<ul>" + for m in mirrored_builders or mirroring_builders: + m_id = _builder_id(m) + if (bucket_name, m_id["bucket"]) not in [("try", "ci"), ("ci", "try")]: + # Change the descriptions above if this assertion no + # longer holds true. + fail("{} to {} mirroring is not allowed. Only 'try' can mirror 'ci'.".format(bucket_name, m_id["bucket"])) + link = linkify_builder(m_id["bucket"], m_id["builder"]) + description += "<li>%s</li>" % link + return description + "</ul>" + def _set_builder_config_property(ctx): cfg = None for f in ctx.output: @@ -681,6 +714,8 @@ ) builder.properties = json.encode(builder_properties) + builder.description_html = _get_builder_mirror_description(bucket_name, builder, bc_state) + lucicfg.generator(_set_builder_config_property) # Capture the details of working with the graph in methods that use caching so
diff --git a/infra/config/lib/builder_url.star b/infra/config/lib/builder_url.star index b80c91e..0f39856 100644 --- a/infra/config/lib/builder_url.star +++ b/infra/config/lib/builder_url.star
@@ -13,3 +13,10 @@ builder, ) return url + +def linkify_builder(bucket, builder, project = None): + """Returns an HTML link to a builder compatible with Milo-descriptions.""" + return "<a href=\"{}\">{}</a>".format( + builder_url(bucket, builder, project), + builder, + )
diff --git a/infra/config/subprojects/chromium/try/tryserver.chromium.android.star b/infra/config/subprojects/chromium/try/tryserver.chromium.android.star index 136a226..d56fc51 100644 --- a/infra/config/subprojects/chromium/try/tryserver.chromium.android.star +++ b/infra/config/subprojects/chromium/try/tryserver.chromium.android.star
@@ -100,8 +100,6 @@ name = "android-12-x64-rel-compilator", branch_selector = branches.selector.ANDROID_BRANCHES, main_list_view = "try", - # TODO: b/297443583 - Enable remote typescript on production. - siso_configs = ["builder", "local_typescript"], siso_enabled = True, ) @@ -504,6 +502,7 @@ branch_selector = branches.selector.ANDROID_BRANCHES, cores = 64 if settings.is_main else 32, main_list_view = "try", + siso_enabled = True, ) try_.builder(
diff --git a/internal b/internal index daac40a..79116fa 160000 --- a/internal +++ b/internal
@@ -1 +1 @@ -Subproject commit daac40a8c36b8511e43db0ede65732c6b67d1ad2 +Subproject commit 79116fa67c8a1a0806af034eb2a9a7a3557607c0
diff --git a/ios/chrome/browser/ui/autofill/autofill_app_interface.h b/ios/chrome/browser/ui/autofill/autofill_app_interface.h index 9270e07..b147273 100644 --- a/ios/chrome/browser/ui/autofill/autofill_app_interface.h +++ b/ios/chrome/browser/ui/autofill/autofill_app_interface.h
@@ -97,6 +97,11 @@ // Sets the risk data for payments. + (void)setPaymentsRiskData:(NSString*)riskData; +// Make it that we consider the credit card form to be a secure in the current +// context. This will allow us to fill the textfields on the web page. We only +// want to use this for tests. ++ (void)considerCreditCardFormSecureForTesting; + @end #endif // IOS_CHROME_BROWSER_UI_AUTOFILL_AUTOFILL_APP_INTERFACE_H_
diff --git a/ios/chrome/browser/ui/autofill/autofill_app_interface.mm b/ios/chrome/browser/ui/autofill/autofill_app_interface.mm index 3a729be9..3395b53 100644 --- a/ios/chrome/browser/ui/autofill/autofill_app_interface.mm +++ b/ios/chrome/browser/ui/autofill/autofill_app_interface.mm
@@ -427,7 +427,7 @@ + (NSString*)saveMaskedCreditCard { autofill::PersonalDataManager* personalDataManager = [self personalDataManager]; - autofill::CreditCard card = autofill::test::GetMaskedServerCard(); + autofill::CreditCard card = autofill::test::GetMaskedServerCardWithCvc(); DCHECK(card.record_type() != autofill::CreditCard::RecordType::kLocalCard); personalDataManager->AddServerCreditCardForTest( @@ -472,6 +472,17 @@ ->SetPaymentsRiskData(base::SysNSStringToUTF8(riskData)); } ++ (void)considerCreditCardFormSecureForTesting { + web::WebState* web_state = chrome_test_util::GetCurrentWebState(); + web::WebFramesManager* frames_manager = + autofill::AutofillJavaScriptFeature::GetInstance()->GetWebFramesManager( + web_state); + web::WebFrame* main_frame = frames_manager->GetMainWebFrame(); + autofill::AutofillDriverIOS::FromWebStateAndWebFrame(web_state, main_frame) + ->GetAutofillManager() + .SetConsiderFormAsSecureForTesting(true); +} + + (NSString*)paymentsRiskData { return ios::provider::GetRiskData(); }
diff --git a/ios/chrome/browser/ui/autofill/bottom_sheet/payments_suggestion_bottom_sheet_egtest.mm b/ios/chrome/browser/ui/autofill/bottom_sheet/payments_suggestion_bottom_sheet_egtest.mm index a5ac01f..87fa807 100644 --- a/ios/chrome/browser/ui/autofill/bottom_sheet/payments_suggestion_bottom_sheet_egtest.mm +++ b/ios/chrome/browser/ui/autofill/bottom_sheet/payments_suggestion_bottom_sheet_egtest.mm
@@ -29,6 +29,9 @@ const char kCreditCardUrl[] = "/credit_card.html"; const char kFormCardName[] = "CCName"; +const char kFormCardNumber[] = "CCNo"; +const char kFormCardExpirationMonth[] = "CCExpiresMonth"; +const char kFormCardExpirationYear[] = "CCExpiresYear"; using base::test::ios::kWaitForActionTimeout; @@ -125,6 +128,48 @@ // Loads simple page. It is on localhost so it is considered a secure context. [ChromeEarlGrey loadURL:self.testServer->GetURL(kCreditCardUrl)]; [ChromeEarlGrey waitForWebStateContainingText:"Autofill Test"]; + + // Localhost is not considered secure, therefore form security needs to be + // overridden for the tests to work. This will allow us to fill the textfields + // on the web page. + [AutofillAppInterface considerCreditCardFormSecureForTesting]; +} + +// Verify credit card infos are filled. +- (void)verifyCreditCardInfosHaveBeenFilled:(autofill::CreditCard)card { + std::string locale = l10n_util::GetLocaleOverride(); + + // Credit card name. + NSString* name = base::SysUTF16ToNSString( + card.GetInfo(autofill::CREDIT_CARD_NAME_FULL, locale)); + NSString* condition = [NSString + stringWithFormat:@"window.document.getElementById('%s').value === '%@'", + kFormCardName, name]; + [ChromeEarlGrey waitForJavaScriptCondition:condition]; + + // Credit card number. + NSString* number = base::SysUTF16ToNSString( + card.GetInfo(autofill::CREDIT_CARD_NUMBER, locale)); + condition = [NSString + stringWithFormat:@"window.document.getElementById('%s').value === '%@'", + kFormCardNumber, number]; + [ChromeEarlGrey waitForJavaScriptCondition:condition]; + + // Credit card expiration month. + NSString* expMonth = base::SysUTF16ToNSString( + card.GetInfo(autofill::CREDIT_CARD_EXP_MONTH, locale)); + condition = [NSString + stringWithFormat:@"window.document.getElementById('%s').value === '%@'", + kFormCardExpirationMonth, expMonth]; + [ChromeEarlGrey waitForJavaScriptCondition:condition]; + + // Credit card expiration year. + NSString* expYear = base::SysUTF16ToNSString( + card.GetInfo(autofill::CREDIT_CARD_EXP_4_DIGIT_YEAR, locale)); + condition = [NSString + stringWithFormat:@"window.document.getElementById('%s').value === '%@'", + kFormCardExpirationYear, expYear]; + [ChromeEarlGrey waitForJavaScriptCondition:condition]; } #pragma mark - Tests @@ -141,7 +186,18 @@ [ChromeEarlGrey waitForUIElementToAppearWithMatcher:continueButton]; + // Verify that the credit card is visible to the user. + [[EarlGrey selectElementWithMatcher:grey_text(_lastDigits)] + assertWithMatcher:grey_notNil()]; + + // Make sure the user is seeing 1 card on the bottom sheet. + GREYAssertEqual(1, [AutofillAppInterface localCreditCount], + @"Wrong number of stored credit cards."); + [[EarlGrey selectElementWithMatcher:continueButton] performAction:grey_tap()]; + + // Verify that the page is filled properly. + [self verifyCreditCardInfosHaveBeenFilled:autofill::test::GetCreditCard()]; } // Tests that the Payments Bottom Sheet updates its contents when a new credit @@ -167,11 +223,30 @@ id<GREYMatcher> localCreditCardEntry = grey_text(_lastDigits); [ChromeEarlGrey waitForUIElementToAppearWithMatcher:localCreditCardEntry]; + // Make sure the user is seeing 2 cards on the bottom sheet. + GREYAssertEqual(2, [AutofillAppInterface localCreditCount], + @"Wrong number of stored credit cards."); + // Select and use the new credit card. [[EarlGrey selectElementWithMatcher:serverCreditCardEntry] performAction:grey_tap()]; + // Verify that the accessory view (checkmark) is visible. + id<GREYMatcher> accessoryView = grey_allOf( + grey_kindOfClassName(@"UIImageView"), + grey_ancestor(grey_kindOfClassName(@"_UITableCellAccessoryButton")), + grey_sufficientlyVisible(), nil); + [[EarlGrey selectElementWithMatcher:accessoryView] + assertWithMatcher:grey_notNil()]; + [[EarlGrey selectElementWithMatcher:continueButton] performAction:grey_tap()]; + + // Verify the CVC requester is visible. + [[EarlGrey selectElementWithMatcher:grey_text(@"Confirm Card")] + assertWithMatcher:grey_notNil()]; + + // TODO(crbug.com/845472): Figure out a way to enter CVC and get the unlocked + // card result. } // Tests that accessing a long press menu does not disable the bottom sheet. @@ -385,4 +460,22 @@ assertWithMatcher:grey_nil()]; } +// Verify that tapping outside the Payments Bottom Sheet opens the keyboard. +- (void)testTapOutsideThePaymentsBottomSheetShowsKeyboard { + [self loadPaymentsPage]; + + [[EarlGrey selectElementWithMatcher:chrome_test_util::WebViewMatcher()] + performAction:chrome_test_util::TapWebElementWithId(kFormCardName)]; + + id<GREYMatcher> continueButton = ContinueButton(); + + [ChromeEarlGrey waitForUIElementToAppearWithMatcher:continueButton]; + + // Dismiss the bottom sheet by tapping outside. + [[EarlGrey selectElementWithMatcher:grey_keyWindow()] + performAction:grey_tap()]; + + WaitForKeyboardToAppear(); +} + @end
diff --git a/ios/chrome/browser/ui/settings/password/password_settings/BUILD.gn b/ios/chrome/browser/ui/settings/password/password_settings/BUILD.gn index acba48aa..aa12b881 100644 --- a/ios/chrome/browser/ui/settings/password/password_settings/BUILD.gn +++ b/ios/chrome/browser/ui/settings/password/password_settings/BUILD.gn
@@ -42,6 +42,7 @@ "//ios/chrome/browser/ui/settings/password:features", "//ios/chrome/browser/ui/settings/password:password_ui", "//ios/chrome/browser/ui/settings/password/passwords_in_other_apps", + "//ios/chrome/browser/ui/settings/password/reauthentication", "//ios/chrome/browser/ui/settings/utils", "//ios/chrome/common/ui/reauthentication", "//ui/base", @@ -94,18 +95,31 @@ source_set("unit_tests") { testonly = true - sources = [ "password_settings_mediator_unittest.mm" ] + sources = [ + "password_settings_coordinator_unittest.mm", + "password_settings_mediator_unittest.mm", + ] deps = [ + ":common", ":password_settings", + ":password_settings_ui", "//base/test:test_support", "//components/password_manager/core/browser:test_support", "//components/password_manager/core/common:features", "//components/signin/public/identity_manager/objc", "//ios/chrome/browser/passwords:store_factory", + "//ios/chrome/browser/shared/coordinator/scene:scene_state_browser_agent", + "//ios/chrome/browser/shared/coordinator/scene:scene_state_header", + "//ios/chrome/browser/shared/model/browser/test:test_support", "//ios/chrome/browser/shared/model/browser_state:test_support", + "//ios/chrome/browser/shared/public/commands", "//ios/chrome/browser/signin", "//ios/chrome/browser/sync", + "//ios/chrome/browser/ui/settings/password:features", + "//ios/chrome/browser/ui/settings/password/reauthentication:reauthentication_ui", "//ios/chrome/common/ui/reauthentication", + "//ios/chrome/test:test_support", + "//ios/chrome/test/app:test_support", "//ios/web/public/test", "//testing/gmock", "//testing/gtest",
diff --git a/ios/chrome/browser/ui/settings/password/password_settings/password_settings_coordinator.h b/ios/chrome/browser/ui/settings/password/password_settings/password_settings_coordinator.h index 5c598f31..c24eccf2de 100644 --- a/ios/chrome/browser/ui/settings/password/password_settings/password_settings_coordinator.h +++ b/ios/chrome/browser/ui/settings/password/password_settings/password_settings_coordinator.h
@@ -15,6 +15,14 @@ // Delegate. @property(nonatomic, weak) id<PasswordSettingsCoordinatorDelegate> delegate; +// Whether Local Authentication should be skipped when the coordinator is +// started. Defaults to NO. Authentication should be required when starting the +// coordinator unless it was already required by the starting coordinator or +// another ancestor higher in the ancestor chain. This property is most likely +// used only by coordinators for other password manager subpages as the password +// manager requires authentication upon entry. +@property(nonatomic) BOOL skipAuthenticationOnStart; + @end #endif // IOS_CHROME_BROWSER_UI_SETTINGS_PASSWORD_PASSWORD_SETTINGS_PASSWORD_SETTINGS_COORDINATOR_H_
diff --git a/ios/chrome/browser/ui/settings/password/password_settings/password_settings_coordinator.mm b/ios/chrome/browser/ui/settings/password/password_settings/password_settings_coordinator.mm index e69914a..a7d4c3c 100644 --- a/ios/chrome/browser/ui/settings/password/password_settings/password_settings_coordinator.mm +++ b/ios/chrome/browser/ui/settings/password/password_settings/password_settings_coordinator.mm
@@ -6,6 +6,7 @@ #import <UIKit/UIKit.h> +#import "base/debug/dump_without_crashing.h" #import "base/i18n/message_formatter.h" #import "base/metrics/user_metrics.h" #import "base/strings/sys_string_conversions.h" @@ -37,6 +38,7 @@ #import "ios/chrome/browser/ui/settings/password/password_settings/password_settings_view_controller.h" #import "ios/chrome/browser/ui/settings/password/password_settings/scoped_password_settings_reauth_module_override.h" #import "ios/chrome/browser/ui/settings/password/passwords_in_other_apps/passwords_in_other_apps_coordinator.h" +#import "ios/chrome/browser/ui/settings/password/reauthentication/reauthentication_coordinator.h" #import "ios/chrome/browser/ui/settings/settings_navigation_controller.h" #import "ios/chrome/browser/ui/settings/utils/password_utils.h" #import "ios/chrome/browser/ui/settings/utils/settings_utils.h" @@ -47,6 +49,8 @@ #import "ui/base/l10n/l10n_util.h" #import "ui/base/l10n/l10n_util_mac.h" +using password_manager::features::IsAuthOnEntryV2Enabled; + namespace { // The user action for when the bulk move passwords to account confirmation @@ -110,6 +114,7 @@ PasswordSettingsPresentationDelegate, PasswordsInOtherAppsCoordinatorDelegate, PopoverLabelViewControllerDelegate, + ReauthenticationCoordinatorDelegate, SettingsNavigationControllerDelegate> { // Service which gives us a view on users' saved passwords. std::unique_ptr<password_manager::SavedPasswordsPresenter> @@ -142,6 +147,12 @@ @property(nonatomic, strong) PasswordsInOtherAppsCoordinator* passwordsInOtherAppsCoordinator; +// Coordinator for blocking Password Settings until Local Authentication is +// passed. Used for requiring authentication when opening Password Settings +// from outside the Password Manager and when the app is +// backgrounded/foregrounded with Password Settings opened. +@property(nonatomic, strong) ReauthenticationCoordinator* reauthCoordinator; + @end @implementation PasswordSettingsCoordinator @@ -188,10 +199,15 @@ self.mediator.consumer = self.passwordSettingsViewController; self.passwordSettingsViewController.delegate = self.mediator; + // Don't animate presentation when content will be covered for authentication. + // Otherwise content can be visible during the animation phase. [self.baseViewController presentViewController:self.settingsNavigationController - animated:YES + animated:_skipAuthenticationOnStart || + !IsAuthOnEntryV2Enabled() completion:nil]; + + [self startReauthCoordinatorWithAuthOnStart:!_skipAuthenticationOnStart]; } - (void)stop { @@ -221,6 +237,8 @@ self.mediator.consumer = nil; self.mediator = nil; _savedPasswordsPresenter.reset(); + + [self stopReauthenticationCoordinator]; } #pragma mark - PasswordSettingsPresentationDelegate @@ -289,6 +307,7 @@ - (void)showPasswordsInOtherAppsScreen { DCHECK(!self.passwordsInOtherAppsCoordinator); + [self stopReauthCoordinatorBeforeStartingChildCoordinator]; self.passwordsInOtherAppsCoordinator = [[PasswordsInOtherAppsCoordinator alloc] initWithBaseNavigationController:self.settingsNavigationController @@ -324,7 +343,7 @@ (NSString*)message { // No need to auth if AuthOnEntryV2 is enabled, since user is presumed to have // just recently authed. - if (password_manager::features::IsAuthOnEntryV2Enabled()) { + if (IsAuthOnEntryV2Enabled()) { [self.mediator userDidStartBulkMoveLocalPasswordsToAccountFlow]; return; } @@ -495,7 +514,7 @@ IDS_IOS_EXPORT_PASSWORDS_CANCEL_BUTTON) style:UIAlertActionStyleCancel handler:^(UIAlertAction*) { - [weakSelf.mediator userDidCancelExportFlow]; + [weakSelf.mediator exportFlowCanceled]; }]; [_preparingPasswordsAlert addAction:cancelAction]; [self.passwordSettingsViewController @@ -524,6 +543,7 @@ [self.passwordsInOtherAppsCoordinator stop]; self.passwordsInOtherAppsCoordinator.delegate = nil; self.passwordsInOtherAppsCoordinator = nil; + [self restartReauthCoordinator]; } #pragma mark - SettingsNavigationControllerDelegate @@ -557,6 +577,22 @@ SnackbarCommands); } +#pragma mark - ReauthenticationCoordinatorDelegate + +- (void)successfulReauthenticationWithCoordinator: + (ReauthenticationCoordinator*)coordinator { + // No-op. +} + +- (void)willPushReauthenticationViewController { + // Cancel password export flow before authentication UI is presented. + if (_preparingPasswordsAlert.beingPresented) { + [_preparingPasswordsAlert dismissViewControllerAnimated:NO completion:nil]; + [self.mediator exportFlowCanceled]; + _preparingPasswordsAlert = nil; + } +} + #pragma mark - Private // Helper to show the "set passcode" dialog with customizable content. @@ -609,4 +645,66 @@ } } +// Starts reauthCoordinator. +// - authOnStart: Pass `YES` to cover Password Settings with an empty view +// controller until successful Local Authentication when reauthCoordinator +// starts. +// +// Local authentication is required every time the current +// scene is backgrounded and foregrounded until reauthCoordinator is stopped. +- (void)startReauthCoordinatorWithAuthOnStart:(BOOL)authOnStart { + // No-op if Auth on Entry is not enabled for the password manager. + if (!IsAuthOnEntryV2Enabled()) { + return; + } + + if (_reauthCoordinator) { + // The previous reauth coordinator should have been stopped and deallocated + // by now. Create a crash report without crashing and gracefully handle the + // error by cleaning up the old coordinator. + base::debug::DumpWithoutCrashing(); + [_reauthCoordinator stopAndPopViewController]; + } + + _reauthCoordinator = [[ReauthenticationCoordinator alloc] + initWithBaseNavigationController:_settingsNavigationController + browser:self.browser + reauthenticationModule:_reauthModule + authOnStart:authOnStart]; + + _reauthCoordinator.delegate = self; + + [_reauthCoordinator start]; +} + +// Stops reauthCoordinator. +- (void)stopReauthenticationCoordinator { + [_reauthCoordinator stop]; + _reauthCoordinator.delegate = nil; + _reauthCoordinator = nil; +} + +// Stop reauth coordinator when a child coordinator will be started. +// +// Needed so reauth coordinator doesn't block for reauth if the scene state +// changes while the child coordinator is presenting its content. The child +// coordinator will add its own reauth coordinator to block its content for +// reauth. +- (void)stopReauthCoordinatorBeforeStartingChildCoordinator { + // See PasswordsCoordinator + // stopReauthCoordinatorBeforeStartingChildCoordinator. + [_reauthCoordinator stopAndPopViewController]; + _reauthCoordinator.delegate = nil; + _reauthCoordinator = nil; +} + +// Starts reauthCoordinator after a child coordinator content was dismissed. +- (void)restartReauthCoordinator { + // Restart reauth coordinator so it monitors scene state changes and requests + // local authentication after the scene goes to the background. + if (IsAuthOnEntryV2Enabled()) { + [self startReauthCoordinatorWithAuthOnStart:NO]; + } +} + @end
diff --git a/ios/chrome/browser/ui/settings/password/password_settings/password_settings_coordinator_unittest.mm b/ios/chrome/browser/ui/settings/password/password_settings/password_settings_coordinator_unittest.mm new file mode 100644 index 0000000..e592dfb9 --- /dev/null +++ b/ios/chrome/browser/ui/settings/password/password_settings/password_settings_coordinator_unittest.mm
@@ -0,0 +1,155 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#import <UIKit/UIKit.h> + +#import "base/apple/foundation_util.h" +#import "base/test/bind.h" +#import "base/test/ios/wait_util.h" +#import "base/test/scoped_feature_list.h" +#import "components/password_manager/core/browser/password_manager_test_utils.h" +#import "components/password_manager/core/browser/test_password_store.h" +#import "ios/chrome/browser/passwords/ios_chrome_password_store_factory.h" +#import "ios/chrome/browser/shared/coordinator/scene/scene_state.h" +#import "ios/chrome/browser/shared/coordinator/scene/scene_state_browser_agent.h" +#import "ios/chrome/browser/shared/model/browser/test/test_browser.h" +#import "ios/chrome/browser/shared/model/browser_state/chrome_browser_state.h" +#import "ios/chrome/browser/shared/model/browser_state/test_chrome_browser_state.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/ui/settings/password/password_manager_ui_features.h" +#import "ios/chrome/browser/ui/settings/password/password_settings/password_settings_coordinator.h" +#import "ios/chrome/browser/ui/settings/password/password_settings/password_settings_view_controller.h" +#import "ios/chrome/browser/ui/settings/password/password_settings/scoped_password_settings_reauth_module_override.h" +#import "ios/chrome/browser/ui/settings/password/reauthentication/reauthentication_view_controller.h" +#import "ios/chrome/test/app/mock_reauthentication_module.h" +#import "ios/chrome/test/scoped_key_window.h" +#import "ios/web/public/test/web_task_environment.h" +#import "testing/gtest/include/gtest/gtest.h" +#import "testing/platform_test.h" +#import "third_party/ocmock/OCMock/OCMock.h" +#import "third_party/ocmock/gtest_support.h" + +namespace password_manager { + +// Test fixture for PasswordSettingsCoordinator. +class PasswordSettingsCoordinatorTest : public PlatformTest { + protected: + void SetUp() override { + PlatformTest::SetUp(); + + scoped_feature_list_.InitAndEnableFeature( + password_manager::features::kIOSPasswordAuthOnEntryV2); + + TestChromeBrowserState::Builder builder; + // Add test password store. Used by the mediator. + builder.AddTestingFactory( + IOSChromePasswordStoreFactory::GetInstance(), + base::BindRepeating( + &password_manager::BuildPasswordStore< + web::BrowserState, password_manager::TestPasswordStore>)); + + browser_state_ = builder.Build(); + browser_ = std::make_unique<TestBrowser>(browser_state_.get()); + + // Mock ApplicationCommands. Since ApplicationCommands conforms to + // ApplicationSettingsCommands, it must be mocked as well. + mocked_application_commands_handler_ = + OCMStrictProtocolMock(@protocol(ApplicationCommands)); + [browser_->GetCommandDispatcher() + startDispatchingToTarget:mocked_application_commands_handler_ + forProtocol:@protocol(ApplicationCommands)]; + id mocked_application_settings_command_handler = + OCMProtocolMock(@protocol(ApplicationSettingsCommands)); + [browser_->GetCommandDispatcher() + startDispatchingToTarget:mocked_application_settings_command_handler + forProtocol:@protocol(ApplicationSettingsCommands)]; + + mock_reauth_module_ = [[MockReauthenticationModule alloc] init]; + // Delay auth result so auth doesn't pass right after starting coordinator. + // Needed for verifying behavior when auth is required. + mock_reauth_module_.shouldReturnSynchronously = NO; + mock_reauth_module_.expectedResult = ReauthenticationResult::kSuccess; + // Make coordinator use mock reauth module. + scoped_reauth_override_ = + ScopedPasswordSettingsReauthModuleOverride::MakeAndArmForTesting( + mock_reauth_module_); + + root_view_controller_ = [[UIViewController alloc] init]; + scoped_window_.Get().rootViewController = root_view_controller_; + + coordinator_ = [[PasswordSettingsCoordinator alloc] + initWithBaseViewController:root_view_controller_ + browser:browser_.get()]; + + // Create scene state for reauthentication coordinator. + scene_state_ = [[SceneState alloc] initWithAppState:nil]; + scene_state_.activationLevel = SceneActivationLevelForegroundActive; + SceneStateBrowserAgent::CreateForBrowser(browser_.get(), scene_state_); + } + + void TearDown() override { + [coordinator_ stop]; + PlatformTest::TearDown(); + } + + // Starts the coordinator. + // - skip_auth_on_start: Whether to skip local authentication when the + // coordinator is started. + void StartCoordinatorSkippingAuth(BOOL skip_auth_on_start) { + coordinator_.skipAuthenticationOnStart = skip_auth_on_start; + + [coordinator_ start]; + + // Wait for presentation animation of the coordinator's view controller. + base::test::ios::SpinRunLoopWithMaxDelay( + base::test::ios::kWaitForUIElementTimeout); + } + + // Whether PasswordSettingsViewController was pushed in the + // navigation controller. + bool IsPasswordSettingsPresented() { + UINavigationController* navigation_controller = + base::apple::ObjCCastStrict<UINavigationController>( + root_view_controller_.presentedViewController); + + return [navigation_controller.topViewController + isKindOfClass:[PasswordSettingsViewController class]]; + } + + web::WebTaskEnvironment task_environment_; + std::unique_ptr<ChromeBrowserState> browser_state_; + std::unique_ptr<TestBrowser> browser_; + SceneState* scene_state_; + UIViewController* root_view_controller_; + ScopedKeyWindow scoped_window_; + MockReauthenticationModule* mock_reauth_module_ = nil; + std::unique_ptr<ScopedPasswordSettingsReauthModuleOverride> + scoped_reauth_override_; + base::test::ScopedFeatureList scoped_feature_list_; + id mocked_application_commands_handler_; + PasswordSettingsCoordinator* coordinator_ = nil; +}; + +// Tests that Password Settings is presented without authentication required. +TEST_F(PasswordSettingsCoordinatorTest, PasswordSettingsPresentedWithoutAuth) { + StartCoordinatorSkippingAuth(/*skip_auth_on_start=*/YES); + + ASSERT_TRUE(IsPasswordSettingsPresented()); +} + +// Tests that Password Settings is presented only after passing authentication +TEST_F(PasswordSettingsCoordinatorTest, PasswordSettingsPresentedWithAuth) { + StartCoordinatorSkippingAuth(/*skip_auth_on_start=*/NO); + + // Password Settings should be covered until auth is passed. + ASSERT_FALSE(IsPasswordSettingsPresented()); + + [mock_reauth_module_ returnMockedReathenticationResult]; + + // Successful auth should leave Password Settings visible. + ASSERT_TRUE(IsPasswordSettingsPresented()); +} + +} // namespace password_manager
diff --git a/ios/chrome/browser/ui/settings/password/password_settings/password_settings_mediator.h b/ios/chrome/browser/ui/settings/password/password_settings/password_settings_mediator.h index 22f9b3a..70c79049 100644 --- a/ios/chrome/browser/ui/settings/password/password_settings/password_settings_mediator.h +++ b/ios/chrome/browser/ui/settings/password/password_settings/password_settings_mediator.h
@@ -58,8 +58,10 @@ // Indicates that the user completed the export flow. - (void)userDidCompleteExportFlow; -// Indicates that the user canceled the export flow while it was processing. -- (void)userDidCancelExportFlow; +// Indicates that the export flow was canceled while it was processing. +// The export flow can be canceled by the user or when reauthentication is +// required due to the app going to the background. +- (void)exportFlowCanceled; // Detaches observers. - (void)disconnect;
diff --git a/ios/chrome/browser/ui/settings/password/password_settings/password_settings_mediator.mm b/ios/chrome/browser/ui/settings/password/password_settings/password_settings_mediator.mm index bf9360ab..a0e6d362 100644 --- a/ios/chrome/browser/ui/settings/password/password_settings/password_settings_mediator.mm +++ b/ios/chrome/browser/ui/settings/password/password_settings/password_settings_mediator.mm
@@ -224,7 +224,7 @@ [self.passwordExporter resetExportState]; } -- (void)userDidCancelExportFlow { +- (void)exportFlowCanceled { [self.passwordExporter cancelExport]; }
diff --git a/ios/chrome/browser/ui/settings/password/passwords_coordinator.mm b/ios/chrome/browser/ui/settings/password/passwords_coordinator.mm index 0bc9497d..5adca18 100644 --- a/ios/chrome/browser/ui/settings/password/passwords_coordinator.mm +++ b/ios/chrome/browser/ui/settings/password/passwords_coordinator.mm
@@ -398,6 +398,8 @@ initWithBaseViewController:self.viewController browser:self.browser]; self.passwordSettingsCoordinator.delegate = self; + // No auth required as Passwords Coordinator already is auth protected. + self.passwordSettingsCoordinator.skipAuthenticationOnStart = YES; base::RecordAction(base::UserMetricsAction("PasswordManager_OpenSettings")); [self.passwordSettingsCoordinator start];
diff --git a/ios/chrome/browser/ui/settings/password/reauthentication/reauthentication_view_controller.mm b/ios/chrome/browser/ui/settings/password/reauthentication/reauthentication_view_controller.mm index a4a5465..c78a4c1 100644 --- a/ios/chrome/browser/ui/settings/password/reauthentication/reauthentication_view_controller.mm +++ b/ios/chrome/browser/ui/settings/password/reauthentication/reauthentication_view_controller.mm
@@ -29,6 +29,10 @@ _reauthModule = reauthenticationModule; _reauthUponPresentation = reauthUponPresentation; self.navigationItem.hidesBackButton = YES; + + // This view does not support large titles as it uses a custom title view. + self.navigationItem.largeTitleDisplayMode = + UINavigationItemLargeTitleDisplayModeNever; } return self;
diff --git a/media/audio/BUILD.gn b/media/audio/BUILD.gn index 93cf87a3..6f6ba6a4 100644 --- a/media/audio/BUILD.gn +++ b/media/audio/BUILD.gn
@@ -191,14 +191,23 @@ sources += [ "mac/audio_device_listener_mac.cc", "mac/audio_device_listener_mac.h", + "mac/audio_loopback_input_mac.h", + "mac/audio_loopback_input_mac_impl.h", + "mac/audio_loopback_input_mac_impl.mm", "mac/audio_low_latency_input_mac.cc", "mac/audio_low_latency_input_mac.h", "mac/audio_manager_mac.cc", "mac/audio_manager_mac.h", "mac/coreaudio_dispatch_override.cc", "mac/coreaudio_dispatch_override.h", + "mac/screen_capture_kit_swizzler.h", + "mac/screen_capture_kit_swizzler.mm", ] - frameworks += [ "AudioUnit.framework" ] + frameworks += [ + "AudioUnit.framework", + "CoreMedia.framework", + ] + weak_frameworks = [ "ScreenCaptureKit.framework" ] # macOS 13.0 } if (is_ios) { @@ -468,9 +477,13 @@ if (is_mac) { sources += [ "mac/audio_device_listener_mac_unittest.cc", + "mac/audio_loopback_input_mac_unittest.mm", "mac/audio_low_latency_input_mac_unittest.cc", "mac/audio_manager_mac_unittest.cc", ] + deps += [ "//third_party/ocmock" ] + frameworks = [ "CoreMedia.framework" ] + weak_frameworks = [ "ScreenCaptureKit.framework" ] # macOS 13.0 } if (is_chromeos_ash || is_castos || is_cast_android) {
diff --git a/media/audio/mac/DEPS b/media/audio/mac/DEPS new file mode 100644 index 0000000..3c7dec4 --- /dev/null +++ b/media/audio/mac/DEPS
@@ -0,0 +1,3 @@ +include_rules = [ + "+third_party/ocmock" +] \ No newline at end of file
diff --git a/media/audio/mac/audio_loopback_input_mac.h b/media/audio/mac/audio_loopback_input_mac.h new file mode 100644 index 0000000..8c7ab34 --- /dev/null +++ b/media/audio/mac/audio_loopback_input_mac.h
@@ -0,0 +1,29 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef MEDIA_AUDIO_MAC_AUDIO_LOOPBACK_INPUT_MAC_H_ +#define MEDIA_AUDIO_MAC_AUDIO_LOOPBACK_INPUT_MAC_H_ + +#include "media/audio/mac/audio_manager_mac.h" +#include "media/base/audio_parameters.h" + +namespace media { + +// ScreenCaptureKit uses the default sample rate of 48kHz. +static constexpr uint32_t kLoopbackSampleRate = 48000; + +// Documentation for the AudioInputStream implementation in +// audio_loopback_input_mac.h. +// Returns a nullptr if the API is unavailable. +// Supported sample rates: 8000Hz, 16000Hz, 24000Hz, 48000Hz. +// Supported channel layouts: mono, stereo. +AudioInputStream* CreateSCKAudioInputStream( + const AudioParameters& params, + const std::string& device_id, + AudioManager::LogCallback log_callback, + const base::RepeatingCallback<void(AudioInputStream*)> close_callback); + +} // namespace media + +#endif // MEDIA_AUDIO_MAC_AUDIO_LOOPBACK_INPUT_MAC_H_
diff --git a/media/audio/mac/audio_loopback_input_mac_impl.h b/media/audio/mac/audio_loopback_input_mac_impl.h new file mode 100644 index 0000000..db44d72 --- /dev/null +++ b/media/audio/mac/audio_loopback_input_mac_impl.h
@@ -0,0 +1,156 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef MEDIA_AUDIO_MAC_AUDIO_LOOPBACK_INPUT_MAC_IMPL_H_ +#define MEDIA_AUDIO_MAC_AUDIO_LOOPBACK_INPUT_MAC_IMPL_H_ + +#include <string> + +#include "base/apple/scoped_cftyperef.h" +#include "base/memory/raw_ptr.h" +#include "base/memory/scoped_refptr.h" +#include "base/memory/weak_ptr.h" +#include "base/time/time.h" +#include "media/audio/agc_audio_stream.h" +#include "media/audio/audio_io.h" +#include "media/audio/mac/audio_manager_mac.h" +#include "media/base/audio_parameters.h" + +@class NSError; +@class SCContentFilter; +@class ScreenCaptureKitAudioHelper; +@class SCShareableContent; +@class SCStream; +@class SCStreamConfiguration; +@protocol SCStreamDelegate; +using CMSampleBufferRef = struct opaqueCMSampleBuffer*; + +namespace media { + +class SharedHelper; + +// Implementation of AudioInputStream using the ScreenCaptureKit (SCK) API for +// macOS 13.0 and later, intended solely for system audio loopback capture. +// +// Overview of operation: +// - An instance of SCKAudioInputStream is created by AudioManagerMac. +// - Open() is called, prompting enumeration of available shareable content. The +// function synchronously waits for the content to be enumerated and sets up +// the stream with the created filter. +// - Start(sink) is called, causing the stream to start delivering samples. +// - Audio samples are being received by OnStreamSample() and forwarded to the +// sink. +// - Stop() is called, causing the stream to stop. +// - Close() is called, causing the stream output to be removed and the stream +// to be destroyed. +// +// API notes: +// - ScreenCaptureKit requires TCC screen capture permissions, which are granted +// to the browser process and inherited by the audio service. For the +// inheritance to work correctly, Chromium must be code signed. +// - The audio service sandbox requires +[SCStreamManager +// requestUserPermissionForScreenCapture] to be swizzled so that it reports +// that permissions have been granted. This is currently done in +// AudioManagerMac. +class MEDIA_EXPORT API_AVAILABLE(macos(13.0)) SCKAudioInputStream + : public AgcAudioStream<AudioInputStream> { + using NotifyOnCloseCallback = + base::RepeatingCallback<void(AudioInputStream*)>; + using StartSCStreamMockingCallback = + base::RepeatingCallback<void(SCStream*, + SCContentFilter*, + SCStreamConfiguration*, + id<SCStreamDelegate>)>; + + public: + SCKAudioInputStream(const AudioParameters& params, + const std::string& device_id, + const AudioManager::LogCallback log_callback, + const NotifyOnCloseCallback close_callback); + SCKAudioInputStream( + const AudioParameters& params, + const std::string& device_id, + const AudioManager::LogCallback log_callback, + const NotifyOnCloseCallback close_callback, + const StartSCStreamMockingCallback start_scstream_mocking_callback, + const base::TimeDelta shareable_content_timeout); + + SCKAudioInputStream(const SCKAudioInputStream&) = delete; + SCKAudioInputStream(SCKAudioInputStream&&) = delete; + SCKAudioInputStream(const SCKAudioInputStream&&) = delete; + SCKAudioInputStream& operator=(const SCKAudioInputStream&) = delete; + SCKAudioInputStream& operator=(SCKAudioInputStream&&) = delete; + SCKAudioInputStream& operator=(const SCKAudioInputStream&&) = delete; + + ~SCKAudioInputStream() override; + + // AudioInputStream:: implementation. + AudioInputStream::OpenOutcome Open() override; + void Start(AudioInputCallback* callback) override; + void Stop() override; + void Close() override; + double GetMaxVolume() override; + void SetVolume(double volume) override; + double GetVolume() override; + bool IsMuted() override; + void SetOutputDeviceForAec(const std::string& output_device_id) override; + + private: + // Processes the audio data received from the system. Runs on a SCK thread. + void OnStreamSample( + base::apple::ScopedCFTypeRef<CMSampleBufferRef> sample_buffer, + const double volume); + + // Invoked when an error occurs while starting or running the stream. Runs on + // a SCK thread. + void OnStreamError(); + + // Send log messages to the stream creator. + void SendLogMessage(const char* format, ...); + + // Audio parameters passed to the constructor. + const AudioParameters params_; + + // One of AudioDeviceDescription::kLoopback*. + const std::string device_id_; + + // Wraps the non-interleaved audio buffer received from the system. + const std::unique_ptr<AudioBus> audio_bus_; + + // Receives the processed audio data and errors. Must not be modified while + // |shared_helper_| has callbacks set. + raw_ptr<AudioInputCallback> sink_; + + // Callback to send log messages to the client. + AudioManager::LogCallback log_callback_; + + // Called when the stream is closed and can be safely deleted. + const NotifyOnCloseCallback close_callback_; + + // Used by tests to get notified of a new SCStream creation. + StartSCStreamMockingCallback start_scstream_mocking_callback_; + + // Refcounted helper which helps us sync operation between browser and SCK + // threads. + scoped_refptr<SharedHelper> shared_helper_; + + // Stream output and delegate registered with the API to receive and handle + // samples and errors. + ScreenCaptureKitAudioHelper* __strong sck_helper_; + + // The stream object created by the API. + SCStream* __strong stream_; + + // Serial queue used by the API for new samples. + dispatch_queue_t __strong queue_; + + // The length of time covered by the audio data in a single audio buffer. + const base::TimeDelta buffer_frames_duration_; + + SEQUENCE_CHECKER(sequence_checker_); +}; + +} // namespace media + +#endif // MEDIA_AUDIO_MAC_AUDIO_LOOPBACK_INPUT_MAC_IMPL_H_
diff --git a/media/audio/mac/audio_loopback_input_mac_impl.mm b/media/audio/mac/audio_loopback_input_mac_impl.mm new file mode 100644 index 0000000..283c010 --- /dev/null +++ b/media/audio/mac/audio_loopback_input_mac_impl.mm
@@ -0,0 +1,564 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "media/audio/mac/audio_loopback_input_mac_impl.h" + +#import <ScreenCaptureKit/ScreenCaptureKit.h> + +#include "base/functional/bind.h" +#include "base/functional/callback.h" +#include "base/logging.h" +#include "base/metrics/histogram_functions.h" +#include "base/strings/stringprintf.h" +#include "base/strings/sys_string_conversions.h" +#include "base/synchronization/lock.h" +#include "base/synchronization/waitable_event.h" +#include "media/audio/mac/audio_loopback_input_mac.h" +#include "media/base/audio_timestamp_helper.h" + +using SampleCallback = base::RepeatingCallback< + void(base::apple::ScopedCFTypeRef<CMSampleBufferRef>, const double)>; +using ErrorCallback = base::RepeatingCallback<void()>; + +namespace media { + +constexpr float kMaxVolume = 1.0; + +// Used for synchronized data access between SCKAudioInputStream and +// ScreenCaptureKitAudioHelper. In case callbacks from ScreenCaptureKit are +// invoked after the client no longer wants to receive data, or +// SCKAudioInputStream has already been destroyed, this reference counted class +// outlives both objects and helps prevent use-after-free situations. +class API_AVAILABLE(macos(13.0)) SharedHelper + : public base::RefCountedThreadSafe<SharedHelper> { + public: + SharedHelper(const base::TimeDelta shareable_content_timeout) + : volume_(kMaxVolume), + shareable_content_timeout_(shareable_content_timeout) {} + SharedHelper(SharedHelper&) = delete; + SharedHelper(SharedHelper&&) = delete; + SharedHelper& operator=(SharedHelper&) = delete; + SharedHelper& operator=(SharedHelper&&) = delete; + + // Set the sample and error callback to be invoked by the helper. + void SetStreamCallbacks(SampleCallback sample_callback, + ErrorCallback error_callback) { + base::AutoLock auto_lock(lock_); + sample_callback_ = std::move(sample_callback); + error_callback_ = std::move(error_callback); + } + + // Reset the sample and error callbacks, resulting in no more samples being + // delivered. + void ResetStreamCallbacks() { + base::AutoLock auto_lock(lock_); + sample_callback_.Reset(); + error_callback_.Reset(); + } + + void SetVolume(float volume) { + base::AutoLock auto_lock(lock_); + volume_ = volume; + } + + float GetVolume() { + base::AutoLock auto_lock(lock_); + return volume_; + } + + // Invokes the sample callback, if one is set. + void OnStreamSample( + base::apple::ScopedCFTypeRef<CMSampleBufferRef> sample_buffer) { + base::AutoTryLock auto_try_lock(lock_); + if (auto_try_lock.is_acquired() && !sample_callback_.is_null()) { + // |volume_| is passed in as a parameter, as it is guarded by |lock_|, + // which also protects the callbacks and is already acquired. + sample_callback_.Run(sample_buffer, volume_); + } + } + + // Logs the error and reports it via the error callback, if one is set. + void OnStreamError(NSError* error) { + if (!error) { + return; + } + + LOG(ERROR) << "Stream error: " + << base::SysNSStringToUTF8([error localizedDescription]); + + base::UmaHistogramSparse("Media.Audio.Capture.SCK.StreamError", + [error code]); + + base::AutoTryLock auto_try_lock(lock_); + if (auto_try_lock.is_acquired() && !error_callback_.is_null()) { + error_callback_.Run(); + } + } + + // Synchronously retrieves a stream filter. + AudioInputStream::OpenOutcome GetContentFilter(SCContentFilter** filter) { + // We want to avoid any deadlocks due to issues with ScreenCaptureKit. Thus, + // we use a WaitableEvent with a timeout. + const auto data = base::MakeRefCounted<ShareableContentData>(); + [SCShareableContent getShareableContentWithCompletionHandler:^( + SCShareableContent* content, NSError* error) { + // |data| is captured by value, so the reference count increases. + OnShareableContentCreated(data, content, error); + data->event.Signal(); + }]; + + base::TimeTicks enumeration_start = base::TimeTicks::Now(); + // Wait for shareable content to be enumerated. + const bool timed_out = !data->event.TimedWait(shareable_content_timeout_); + base::TimeDelta enumeration_time = + base::TimeTicks::Now() - enumeration_start; + + base::UmaHistogramBoolean( + "Media.Audio.Capture.SCK.ContentEnumerationTimedOut", timed_out); + + if (timed_out) { + LOG(ERROR) << "Shareable content enumeration timed out."; + return AudioInputStream::OpenOutcome::kFailed; + } else { + base::UmaHistogramTimes( + "Media.Audio.Capture.SCK.ContentEnumerationTimeMs", enumeration_time); + } + + if (data->open_outcome == AudioInputStream::OpenOutcome::kSuccess) { + *filter = data->filter; + } + + return data->open_outcome; + } + + private: + friend class base::RefCountedThreadSafe<SharedHelper>; + + class ShareableContentData + : public base::RefCountedThreadSafe<ShareableContentData> { + public: + // Event used to signal completion of shareable content enumeration. + base::WaitableEvent event; + + // Outcome of shareable content enumeration. + AudioInputStream::OpenOutcome open_outcome = + AudioInputStream::OpenOutcome::kFailed; + + // Filter to be generated based on the enumerated shareable content. + SCContentFilter* filter{nil}; + + private: + friend class base::RefCountedThreadSafe<ShareableContentData>; + ~ShareableContentData() = default; + }; + + ~SharedHelper() = default; + + // Invoked when shareable content (displays, applications, windows) has been + // enumerated. Generates a filter based on the available content. Runs on a + // SCK thread. + static void OnShareableContentCreated( + scoped_refptr<ShareableContentData> data, + SCShareableContent* content, + NSError* error) { + CHECK(data); + + data->open_outcome = AudioInputStream::OpenOutcome::kFailed; + if (error) { + if ([error code] == SCStreamErrorUserDeclined) { + data->open_outcome = + AudioInputStream::OpenOutcome::kFailedSystemPermissions; + } + return; + } + + CHECK(content); + + if ([[content displays] count] == 0) { + VLOG(1) << "No displays found."; + return; + } + + // Capturing any display will capture the entire system's audio. + SCDisplay* display = [[content displays] firstObject]; + + VLOG(1) << "Capturing display with ID " << [display displayID] + << " and resolution " << [display width] << "x" << [display height]; + + data->filter = [[SCContentFilter alloc] initWithDisplay:display + excludingWindows:@[]]; + + data->open_outcome = AudioInputStream::OpenOutcome::kSuccess; + } + + // Lock must be used when accessing the callbacks. + base::Lock lock_; + + // Callbacks registered by SCKAudioInputStream and invoked by + // ScreenCaptureKitAudioHelper. + SampleCallback sample_callback_ GUARDED_BY(lock_); + ErrorCallback error_callback_ GUARDED_BY(lock_); + + // Current volume. + double volume_ GUARDED_BY(lock_); + + // Timeout for shareable content enumeration. + const base::TimeDelta shareable_content_timeout_; +}; + +} // namespace media + +API_AVAILABLE(macos(13.0)) +@interface ScreenCaptureKitAudioHelper + : NSObject <SCStreamDelegate, SCStreamOutput> { + scoped_refptr<media::SharedHelper> _sharedHelper; +} + +- (instancetype)initWithSharedHelper: + (scoped_refptr<media::SharedHelper>)sharedHelper; +- (void)stream:(SCStream*)stream didStopWithError:(NSError*)error; +- (void)stream:(SCStream*)stream + didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer + ofType:(SCStreamOutputType)type; + +@end + +@implementation ScreenCaptureKitAudioHelper + +- (instancetype)initWithSharedHelper: + (scoped_refptr<media::SharedHelper>)sharedHelper { + self = [super init]; + if (self) { + _sharedHelper = sharedHelper; + } + + return self; +} + +- (void)stream:(SCStream*)stream didStopWithError:(NSError*)error { + _sharedHelper->OnStreamError(error); +} + +- (void)stream:(SCStream*)stream + didOutputSampleBuffer:(CMSampleBufferRef)sampleBuffer + ofType:(SCStreamOutputType)type { + if (type != SCStreamOutputTypeAudio || !sampleBuffer) { + return; + } + + _sharedHelper->OnStreamSample(base::apple::ScopedCFTypeRef<CMSampleBufferRef>( + sampleBuffer, base::scoped_policy::RETAIN)); +} + +@end + +namespace media { + +SCKAudioInputStream::SCKAudioInputStream( + const AudioParameters& params, + const std::string& device_id, + const AudioManager::LogCallback log_callback, + const NotifyOnCloseCallback close_callback) + : SCKAudioInputStream(params, + device_id, + std::move(log_callback), + std::move(close_callback), + StartSCStreamMockingCallback(), + base::Seconds(5)) {} + +SCKAudioInputStream::SCKAudioInputStream( + const AudioParameters& params, + const std::string& device_id, + const AudioManager::LogCallback log_callback, + const NotifyOnCloseCallback close_callback, + StartSCStreamMockingCallback start_scstream_mocking_callback, + base::TimeDelta shareable_content_timeout) + : params_(params), + device_id_(device_id), + audio_bus_(AudioBus::CreateWrapper(params.channels())), + sink_(nullptr), + log_callback_(std::move(log_callback)), + close_callback_(std::move(close_callback)), + start_scstream_mocking_callback_(start_scstream_mocking_callback), + shared_helper_( + base::MakeRefCounted<SharedHelper>(shareable_content_timeout)), + sck_helper_([[ScreenCaptureKitAudioHelper alloc] + initWithSharedHelper:shared_helper_]), + buffer_frames_duration_( + AudioTimestampHelper::FramesToTime(params_.frames_per_buffer(), + params_.sample_rate())) { + CHECK(AudioDeviceDescription::IsLoopbackDevice(device_id_)); + CHECK(!log_callback_.is_null()); + // TODO(crbug.com/1480224): Update getDisplayMedia to handle sample rate + // constraints + // ScreenCaptureKit supports only certain sample rates: + // https://developer.apple.com/documentation/screencapturekit/scstreamconfiguration/3931903-samplerate + CHECK(params_.sample_rate() == 48000 || params_.sample_rate() == 24000 || + params_.sample_rate() == 16000 || params_.sample_rate() == 8000); + // Only mono and stereo audio is supported: + // https://developer.apple.com/documentation/screencapturekit/scstreamconfiguration/3931901-channelcount + CHECK(params_.channels() == 1 || params_.channels() == 2); + + // We need a wrapper because we set the channel data to point directly into + // the sample buffer. + audio_bus_->set_frames(params_.frames_per_buffer()); +} + +SCKAudioInputStream::~SCKAudioInputStream() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); +} + +AudioInputStream::OpenOutcome SCKAudioInputStream::Open() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + if (stream_) { + return OpenOutcome::kAlreadyOpen; + } + + SCContentFilter* filter = nil; + OpenOutcome open_outcome = shared_helper_->GetContentFilter(&filter); + + if (open_outcome != OpenOutcome::kSuccess) { + if (open_outcome == OpenOutcome::kFailedSystemPermissions) { + SendLogMessage("%s => Missing screen capture permissions.", __func__); + } else { + SendLogMessage("%s => Failed to retrieve shareable content.", __func__); + } + + return open_outcome; + } + + // All settings related to video capture must remain at their default values, + // otherwise a video sample stream output must also be added. + SCStreamConfiguration* config = [[SCStreamConfiguration alloc] init]; + [config setCapturesAudio:YES]; + [config setSampleRate:params_.sample_rate()]; + [config setChannelCount:params_.channels()]; + if (device_id_ == AudioDeviceDescription::kLoopbackWithoutChromeId) { + // Excludes audio from all browser subprocesses outputting audio through + // the audio service. + [config setExcludesCurrentProcessAudio:YES]; + } + + stream_ = [[SCStream alloc] initWithFilter:filter + configuration:config + delegate:sck_helper_]; + + // Notifies the test so that it can start mocking the new SCStream object. + if (!start_scstream_mocking_callback_.is_null()) { + start_scstream_mocking_callback_.Run(stream_, filter, config, sck_helper_); + } + + // |queue_| is used internally by the API to store |config.queueDepth| number + // of frames (default is 3). + queue_ = dispatch_queue_create("org.chromium.SCKAudioInputStream", + DISPATCH_QUEUE_SERIAL); + + NSError* add_stream_output_error = nil; + const bool stream_output_added = + [stream_ addStreamOutput:sck_helper_ + type:SCStreamOutputTypeAudio + sampleHandlerQueue:queue_ + error:&add_stream_output_error]; + if (!stream_output_added) { + SendLogMessage( + "%s => Failed to add stream output: %s", __func__, + base::SysNSStringToUTF8([add_stream_output_error localizedDescription]) + .c_str()); + stream_ = nil; + queue_ = nil; + return OpenOutcome::kFailed; + } + + return OpenOutcome::kSuccess; +} + +void SCKAudioInputStream::Start(AudioInputCallback* callback) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + CHECK(callback); + + // Don't do anything if the stream isn't open and ignore any consecutive + // Start() calls. + if (!stream_ || sink_) { + return; + } + + sink_ = callback; + + // Sample and error callbacks are set and reset by SCKAudioInputStream when + // starting and stopping the stream, respectively. Thus, |this| will always be + // valid if the callback is not null. + shared_helper_->SetStreamCallbacks( + base::BindRepeating(&SCKAudioInputStream::OnStreamSample, + base::Unretained(this)), + base::BindRepeating(&SCKAudioInputStream::OnStreamError, + base::Unretained(this))); + + [stream_ startCaptureWithCompletionHandler:^(NSError* error) { + if (!error) { + return; + } + + shared_helper_->OnStreamError(error); + }]; +} + +void SCKAudioInputStream::Close() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + CHECK(!sink_); + + // It is valid to call Close() before calling Open(). + if (stream_) { + NSError* error = nil; + bool stream_output_removed = + [stream_ removeStreamOutput:sck_helper_ + type:SCStreamOutputTypeAudio + error:&error]; + if (!stream_output_removed) { + SendLogMessage( + "%s => Failed to remove stream output: %s", __func__, + base::SysNSStringToUTF8([error localizedDescription]).c_str()); + } + } + + // Notify the owner that the stream can be deleted. + close_callback_.Run(this); +} + +void SCKAudioInputStream::Stop() { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + // Reset the callbacks since the client is asking to stop the stream and + // does not want to receive any more samples and errors. This must be done + // before setting |sink_| to null, to avoid a race. + shared_helper_->ResetStreamCallbacks(); + + if (!sink_) { + return; + } + + // An attempt to stop an already stopped stream (due to an error) will + // simply result in an error, which can be ignored. + [stream_ stopCaptureWithCompletionHandler:^(NSError* error) { + if (!error) { + return; + } + + LOG(ERROR) << "Error while stopping the stream: " + << base::SysNSStringToUTF8([error localizedDescription]); + }]; + + sink_ = nullptr; +} + +double SCKAudioInputStream::GetMaxVolume() { + return kMaxVolume; +} + +void SCKAudioInputStream::SetVolume(double volume) { + CHECK_GE(volume, 0.0); + CHECK_LE(volume, kMaxVolume); + shared_helper_->SetVolume(volume); +} + +double SCKAudioInputStream::GetVolume() { + return shared_helper_->GetVolume(); +} + +bool SCKAudioInputStream::IsMuted() { + return GetVolume() == 0.0; +} + +void SCKAudioInputStream::SetOutputDeviceForAec( + const std::string& output_device_id) { + return; +} + +void SCKAudioInputStream::OnStreamSample( + base::apple::ScopedCFTypeRef<CMSampleBufferRef> sample_buffer, + const double volume) { + const CMBlockBufferRef block_buffer = + CMSampleBufferGetDataBuffer(sample_buffer); + if (!block_buffer) { + VLOG(1) << "Sample buffer is empty."; + return; + } + + char* buffer = nullptr; + if (CMBlockBufferGetDataPointer(block_buffer, 0, nullptr, nullptr, &buffer) != + kCMBlockBufferNoErr) { + VLOG(1) << "Cannot access block buffer data."; + return; + } + + const CMTime time_stamp = + CMSampleBufferGetPresentationTimeStamp(sample_buffer); + const CMFormatDescriptionRef format_description = + CMSampleBufferGetFormatDescription(sample_buffer); + const AudioStreamBasicDescription* audio_description = + CMAudioFormatDescriptionGetStreamBasicDescription(format_description); + + CHECK(static_cast<int>(audio_description->mChannelsPerFrame) == + params_.channels() && + audio_description->mSampleRate == params_.sample_rate()); + CHECK_EQ(audio_description->mBytesPerFrame, sizeof(float)) + << "Expected non-interleaved data."; + + const size_t total_frame_count = CMSampleBufferGetNumSamples(sample_buffer); + + base::TimeTicks capture_time; + capture_time += base::Seconds(CMTimeGetSeconds(time_stamp)); + + // |sample_buffer| can deliver more frames than specified in |params_|, but + // the amount should always be a multiple of the one specified. + CHECK(total_frame_count % params_.frames_per_buffer() == 0); + + for (size_t frames_delivered = 0; frames_delivered < total_frame_count; + frames_delivered += params_.frames_per_buffer()) { + // Data in |buffer| is non-interleaved and immutable. Since we don't copy + // the audio data, we must retain a reference to |sample_buffer| until + // |audio_bus_| is no longer used. + for (int channel = 0; channel < params_.channels(); channel++) { + float* channel_data = reinterpret_cast<float*>(buffer) + + channel * total_frame_count + frames_delivered; + audio_bus_->SetChannelData(channel, channel_data); + } + + // Adjust the volume. + audio_bus_->Scale(volume); + + // OnStreamSample() is only called if |shared_helper_| has callbacks set. + sink_->OnData(audio_bus_.get(), capture_time, volume, {}); + + capture_time += buffer_frames_duration_; + } +} + +void SCKAudioInputStream::OnStreamError() { + CHECK(sink_); + // |sink_| is safe to access, as OnStreamError() is called from + // |shared_helper_| with the lock acquired. + sink_->OnError(); +} + +void SCKAudioInputStream::SendLogMessage(const char* format, ...) { + DCHECK_CALLED_ON_VALID_SEQUENCE(sequence_checker_); + va_list args; + va_start(args, format); + log_callback_.Run("SCKAudioInputStream::" + base::StringPrintV(format, args)); + va_end(args); +} + +AudioInputStream* CreateSCKAudioInputStream( + const AudioParameters& params, + const std::string& device_id, + AudioManager::LogCallback log_callback, + const base::RepeatingCallback<void(AudioInputStream*)> close_callback) { + if (@available(macOS 13.0, *)) { + return new SCKAudioInputStream(params, device_id, std::move(log_callback), + std::move(close_callback)); + } + + return nullptr; +} + +} // namespace media
diff --git a/media/audio/mac/audio_loopback_input_mac_unittest.mm b/media/audio/mac/audio_loopback_input_mac_unittest.mm new file mode 100644 index 0000000..e071109 --- /dev/null +++ b/media/audio/mac/audio_loopback_input_mac_unittest.mm
@@ -0,0 +1,562 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "media/audio/mac/audio_loopback_input_mac.h" +#include "media/audio/mac/audio_loopback_input_mac_impl.h" + +#include <ScreenCaptureKit/ScreenCaptureKit.h> + +#include <cstdint> +#include <vector> + +#include "base/apple/scoped_cftyperef.h" +#include "base/apple/scoped_objc_class_swizzler.h" +#include "base/functional/callback.h" +#include "base/logging.h" +#include "base/run_loop.h" +#include "base/task/single_thread_task_runner.h" +#include "base/test/task_environment.h" +#include "media/audio/audio_io.h" +#include "media/base/audio_parameters.h" +#include "media/base/limits.h" +#include "media/base/mac/audio_latency_mac.h" +#include "testing/gmock/include/gmock/gmock.h" +#include "testing/gtest/include/gtest/gtest.h" +#include "testing/platform_test.h" +#import "third_party/ocmock/OCMock/OCMock.h" +#include "ui/gfx/geometry/rect.h" + +using ::testing::_; + +namespace media { + +constexpr int kSampleRate = 48000; +constexpr int kFramesPerBuffer = 480; + +constexpr gfx::Rect kDisplayPrimary(0, 0, 1920, 1080); +constexpr gfx::Rect kDisplaySecondary(-1920, 10, 1920, 1080); + +class SCKAudioInputStreamTest : public PlatformTest { + protected: + static SCDisplay* API_AVAILABLE(macos(13.0)) CreateSCDisplay(CGRect frame) { + id display = OCMClassMock([SCDisplay class]); + OCMStub([display frame]).andReturn(frame); + return display; + } + + // Reports 2 displays when enumerating shareable content. + static void API_AVAILABLE(macos(13.0)) + ShareableContentSuccess(NSInvocation* invocation) { + void (^handler)(SCShareableContent* _Nullable, NSError* _Nullable); + [invocation getArgument:&handler atIndex:2]; + + NSArray* displays = @[ + CreateSCDisplay(kDisplayPrimary.ToCGRect()), + CreateSCDisplay(kDisplaySecondary.ToCGRect()) + ]; + + id content = OCMClassMock([SCShareableContent class]); + OCMStub([content displays]).andReturn(displays); + + handler(content, nil); + } + + SCKAudioInputStreamTest() + : task_environment_( + base::test::SingleThreadTaskEnvironment::MainThreadType::UI) {} + + ~SCKAudioInputStreamTest() override = default; + + void API_AVAILABLE(macos(13.0)) SetUp() override { + stream_delegates_.clear(); + playing_stream_count_ = 0; + } + + void API_AVAILABLE(macos(13.0)) + SetUpShareableContentMock(void (^handler)(NSInvocation* invocation)) { + shareable_content_mock_ = OCMClassMock([SCShareableContent class]); + OCMStub([shareable_content_mock_ + getShareableContentWithCompletionHandler:[OCMArg any]]) + .andDo(handler); + } + + // Mocks instance methods of an SCStream. + API_AVAILABLE(macos(13.0)) + void StartSCStreamMocking(SCStream* stream, + SCContentFilter* filter, + SCStreamConfiguration* config, + id<SCStreamDelegate> delegate) { + if (@available(macOS 13.0, *)) { + EXPECT_TRUE(stream); + EXPECT_TRUE(filter); + EXPECT_TRUE(config); + EXPECT_TRUE(delegate); + + stream_delegates_.emplace_back(delegate); + + scstream_mock_ = OCMPartialMock(stream); + + OCMStub([scstream_mock_ addStreamOutput:[OCMArg any] + type:SCStreamOutputTypeAudio + sampleHandlerQueue:[OCMArg any] + error:[OCMArg anyObjectRef]]) + .andDo(^(NSInvocation* invocation) { + __unsafe_unretained id<SCStreamOutput> stream_output; + [invocation getArgument:&stream_output atIndex:2]; + stream_outputs_.emplace_back(stream_output); + }) + .andReturn(TRUE); + + OCMStub([scstream_mock_ removeStreamOutput:[OCMArg any] + type:SCStreamOutputTypeAudio + error:[OCMArg anyObjectRef]]) + .andDo(^(NSInvocation* invocation) { + __unsafe_unretained id<SCStreamOutput> stream_output; + [invocation getArgument:&stream_output atIndex:2]; + stream_outputs_.erase( + std::remove(stream_outputs_.begin(), stream_outputs_.end(), + stream_output), + stream_outputs_.end()); + }) + .andReturn(TRUE); + + OCMStub([scstream_mock_ startCaptureWithCompletionHandler:[OCMArg any]]) + .andDo(^(NSInvocation* invocation) { + playing_stream_count_++; + }); + + OCMStub([scstream_mock_ stopCaptureWithCompletionHandler:[OCMArg any]]) + .andDo(^(NSInvocation* invocation) { + playing_stream_count_--; + }); + } + } + + // Create an instance of SCKAudioInputStream with default parameters. + API_AVAILABLE(macos(13.0)) + SCKAudioInputStream* CreateAudioInputStream() { + const auto params = AudioParameters(AudioParameters::AUDIO_PCM_LOW_LATENCY, + ChannelLayoutConfig::Stereo(), + kSampleRate, kFramesPerBuffer); + auto* stream = new SCKAudioInputStream( + params, AudioDeviceDescription::kLoopbackInputDeviceId, + base::BindRepeating(&SCKAudioInputStreamTest::OnLogMessage, + base::Unretained(this)), + base::BindRepeating([](AudioInputStream* stream) { delete stream; }), + base::BindRepeating(&SCKAudioInputStreamTest::StartSCStreamMocking, + base::Unretained(this)), + base::Milliseconds(100)); + + return stream; + } + + // Create a CMSampleBuffer from a given stereo audio buffer with default + // parameters. `buffer` must outlive the returned CMSampleBufferRef. + base::apple::ScopedCFTypeRef<CMSampleBufferRef> CreateStereoAudioSampleBuffer( + std::array<float, 2 * kFramesPerBuffer>& buffer) { + CMBlockBufferCustomBlockSource custom_block_source{}; + custom_block_source.FreeBlock = [](void* refcon, void* doomedMemoryBlock, + size_t sizeInBytes) { + // Memory block is allocated and deallocated by the caller, which must + // guarantee it outlives `block_buffer`, and should not be freed during + // `block_buffer` release. + }; + + base::apple::ScopedCFTypeRef<CMBlockBufferRef> block_buffer; + CMBlockBufferCreateWithMemoryBlock( + NULL, buffer.data(), buffer.size() * sizeof(float), NULL, + &custom_block_source, 0, buffer.size() * sizeof(float), 0, + block_buffer.InitializeInto()); + + AudioStreamBasicDescription asbd; + asbd.mFormatID = kAudioFormatLinearPCM; + asbd.mFormatFlags = 0; // Raw. + asbd.mSampleRate = kSampleRate; + asbd.mBitsPerChannel = 8 * sizeof(float); + asbd.mBytesPerFrame = sizeof(float); // Non-interleaved data. + asbd.mChannelsPerFrame = 2; // Stereo. + asbd.mBytesPerPacket = + 2 * kFramesPerBuffer * + sizeof(float); // 2 channels, |kFramesPerBuffer| frames each. + asbd.mFramesPerPacket = kFramesPerBuffer; + + base::apple::ScopedCFTypeRef<CMAudioFormatDescriptionRef> + format_description; + CMAudioFormatDescriptionCreate(kCFAllocatorDefault, &asbd, 0, NULL, 0, NULL, + NULL, format_description.InitializeInto()); + + base::apple::ScopedCFTypeRef<CMSampleBufferRef> sample_buffer; + CMAudioSampleBufferCreateReadyWithPacketDescriptions( + kCFAllocatorDefault, block_buffer, format_description, kFramesPerBuffer, + CMTimeMakeWithSeconds( + base::TimeTicks::Now().since_origin().InMicrosecondsF(), 1000000), + NULL, sample_buffer.InitializeInto()); + + return sample_buffer; + } + + // Send an audio sample packet to the registered SCStreamOutput. + void SendAudioSample(std::array<float, 2 * kFramesPerBuffer> buffer) { + if (@available(macOS 13.0, *)) { + for (auto& stream_output : stream_outputs_) { + EXPECT_TRUE(stream_output); + + // Pass |stream| as a variable to bypass the nullability check as + // |stream| is not needed. + SCStream* stream = nil; + [stream_output stream:stream + didOutputSampleBuffer:CreateStereoAudioSampleBuffer(buffer) + ofType:SCStreamOutputTypeAudio]; + } + } + } + + // Send an audio sample with dummy data. + void SendAudioSample() { + // Buffer must be 16-bit aligned. + alignas(16) std::array<float, 2 * kFramesPerBuffer> buffer; + for (size_t i = 0; i < buffer.size(); i++) { + buffer[i] = i; + } + + SendAudioSample(buffer); + } + + // Send an error to the registered SCStreamDelegate. + void SendError() { + if (@available(macOS 13.0, *)) { + for (auto& stream_delegate : stream_delegates_) { + // Pass |stream| as a variable to bypass the nullability check as + // |stream| is not needed. + SCStream* stream = nil; + [stream_delegate + stream:stream + didStopWithError:[NSError errorWithDomain:SCStreamErrorDomain + code:SCStreamErrorInternalError + userInfo:nil]]; + } + } + } + + // Fake log callback. + void OnLogMessage(const std::string& message) {} + + base::test::SingleThreadTaskEnvironment task_environment_; + + // Mock SCShareableContent. + id shareable_content_mock_; + + // Mock SCStream. + id scstream_mock_; + + // Keep track of open SCStream related objects. + // Must be __unsafe_unretained as they come from an NSInvocation. + API_AVAILABLE(macos(13.0)) + std::vector<__unsafe_unretained id<SCStreamDelegate>> stream_delegates_; + API_AVAILABLE(macos(13.0)) + std::vector<__unsafe_unretained id<SCStreamOutput>> stream_outputs_; + + // Number of currently playing streams; incremented on a successful start of + // SCK stream and decremented on stop. + int playing_stream_count_; +}; + +class MockAudioInputCallback : public AudioInputStream::AudioInputCallback { + public: + MOCK_METHOD4(OnData, + void(const AudioBus* src, + base::TimeTicks capture_time, + double volume, + const AudioGlitchInfo& glitch_info)); + MOCK_METHOD0(OnError, void()); +}; + +class FakeAudioInputCallback : public AudioInputStream::AudioInputCallback { + public: + FakeAudioInputCallback() = default; + + FakeAudioInputCallback(const FakeAudioInputCallback&) = delete; + FakeAudioInputCallback& operator=(const FakeAudioInputCallback&) = delete; + + void OnData(const AudioBus* src, + base::TimeTicks capture_time, + double volume, + const AudioGlitchInfo& glitch_info) override { + EXPECT_GE(capture_time, base::TimeTicks()); + for (int i = 0; i < src->channels(); i++) { + channel_data_.insert(channel_data_.end(), src->channel(i), + src->channel(i) + src->frames()); + } + } + + void OnError() override {} + + std::vector<float> channel_data() const { return channel_data_; } + + private: + std::vector<float> channel_data_; +}; + +// Test starting a single stream. +TEST_F(SCKAudioInputStreamTest, StartOneStream) { + if (@available(macOS 13.0, *)) { + SetUpShareableContentMock(^(NSInvocation* invocation) { + ShareableContentSuccess(invocation); + }); + + SCKAudioInputStream* stream = CreateAudioInputStream(); + + EXPECT_EQ(stream->Open(), AudioInputStream::OpenOutcome::kSuccess); + EXPECT_EQ(stream_delegates_.size(), 1u); + EXPECT_EQ(stream_outputs_.size(), 1u); + EXPECT_EQ(playing_stream_count_, 0); + + MockAudioInputCallback sink; + stream->Start(&sink); + EXPECT_EQ(playing_stream_count_, 1); + + stream->Stop(); + EXPECT_EQ(playing_stream_count_, 0); + + stream->Close(); + EXPECT_TRUE(stream_outputs_.empty()); + + // Remove dangling references to stream delegates. + stream_delegates_.clear(); + } +} + +// Test opening and starting two streams simultaneously. +TEST_F(SCKAudioInputStreamTest, StartTwoStreams) { + if (@available(macOS 13.0, *)) { + SetUpShareableContentMock(^(NSInvocation* invocation) { + ShareableContentSuccess(invocation); + }); + + SCKAudioInputStream* first_stream = CreateAudioInputStream(); + SCKAudioInputStream* second_stream = CreateAudioInputStream(); + + EXPECT_EQ(first_stream->Open(), AudioInputStream::OpenOutcome::kSuccess); + + // For some reason, only the first call to [SCShareableContent + // getShareableContentWithCompletionHandler:] is getting mocked. As a + // workaround, destroy the existing mock object and create a new one. + [shareable_content_mock_ stopMocking]; + SetUpShareableContentMock(^(NSInvocation* invocation) { + ShareableContentSuccess(invocation); + }); + + EXPECT_EQ(second_stream->Open(), AudioInputStream::OpenOutcome::kSuccess); + EXPECT_EQ(stream_delegates_.size(), 2u); + EXPECT_EQ(stream_outputs_.size(), 2u); + + MockAudioInputCallback first_sink; + MockAudioInputCallback second_sink; + first_stream->Start(&first_sink); + second_stream->Start(&second_sink); + + EXPECT_EQ(playing_stream_count_, 2); + + first_stream->Stop(); + second_stream->Stop(); + + EXPECT_EQ(playing_stream_count_, 0); + + first_stream->Close(); + second_stream->Close(); + + EXPECT_TRUE(stream_outputs_.empty()); + + // Remove dangling references to stream delegates. + stream_delegates_.clear(); + } +} + +// Test Start(), Stop(), Start(), Stop(). +TEST_F(SCKAudioInputStreamTest, StreamPausing) { + if (@available(macOS 13.0, *)) { + SetUpShareableContentMock(^(NSInvocation* invocation) { + ShareableContentSuccess(invocation); + }); + + SCKAudioInputStream* stream = CreateAudioInputStream(); + + EXPECT_EQ(stream->Open(), AudioInputStream::OpenOutcome::kSuccess); + + MockAudioInputCallback sink; + stream->Start(&sink); + EXPECT_EQ(playing_stream_count_, 1); + stream->Stop(); + EXPECT_EQ(playing_stream_count_, 0); + stream->Start(&sink); + EXPECT_EQ(playing_stream_count_, 1); + stream->Stop(); + EXPECT_EQ(playing_stream_count_, 0); + + stream->Close(); + EXPECT_TRUE(stream_outputs_.empty()); + + // Remove dangling references to stream delegates. + stream_delegates_.clear(); + } +} + +// Test that the stream can only be opened once. +TEST_F(SCKAudioInputStreamTest, DoubleOpenStart) { + if (@available(macOS 13.0, *)) { + SetUpShareableContentMock(^(NSInvocation* invocation) { + ShareableContentSuccess(invocation); + }); + + SCKAudioInputStream* stream = CreateAudioInputStream(); + + EXPECT_EQ(stream->Open(), AudioInputStream::OpenOutcome::kSuccess); + EXPECT_EQ(stream->Open(), AudioInputStream::OpenOutcome::kAlreadyOpen); + + MockAudioInputCallback sink; + stream->Start(&sink); + stream->Start(&sink); + EXPECT_EQ(playing_stream_count_, 1); + + stream->Stop(); + stream->Close(); + EXPECT_TRUE(stream_outputs_.empty()); + + // Remove dangling references to stream delegates. + stream_delegates_.clear(); + } +} + +// Test that Open() fails if shareable content enumeration times out. +TEST_F(SCKAudioInputStreamTest, OpenTimeout) { + if (@available(macOS 13.0, *)) { + SetUpShareableContentMock(^(NSInvocation* invocation){ + // Don't invoke the handler. + }); + + SCKAudioInputStream* stream = CreateAudioInputStream(); + + EXPECT_EQ(stream->Open(), AudioInputStream::OpenOutcome::kFailed); + stream->Close(); + + EXPECT_TRUE(stream_outputs_.empty()); + // Remove dangling references to stream delegates. + stream_delegates_.clear(); + } +} + +// Test Open() with system screen capture permissions denied. +TEST_F(SCKAudioInputStreamTest, ScreenCapturePermissionsDenied) { + if (@available(macOS 13.0, *)) { + SetUpShareableContentMock(^(NSInvocation* invocation) { + void (^handler)(SCShareableContent* _Nullable, NSError* _Nullable); + [invocation getArgument:&handler atIndex:2]; + + // Error reported by the API in case screen capture permissions + // haven't been granted. + NSError* error = [NSError errorWithDomain:SCStreamErrorDomain + code:SCStreamErrorUserDeclined + userInfo:nil]; + handler(nil, error); + }); + + SCKAudioInputStream* stream = CreateAudioInputStream(); + + EXPECT_EQ(stream->Open(), + AudioInputStream::OpenOutcome::kFailedSystemPermissions); + stream->Close(); + + EXPECT_TRUE(stream_outputs_.empty()); + // Remove dangling references to stream delegates. + stream_delegates_.clear(); + } +} + +// Test that no samples and errors are received by the callbacks after the +// stream is stopped. +TEST_F(SCKAudioInputStreamTest, NoStreamSamplesAfterStop) { + if (@available(macOS 13.0, *)) { + SetUpShareableContentMock(^(NSInvocation* invocation) { + ShareableContentSuccess(invocation); + }); + + SCKAudioInputStream* stream = CreateAudioInputStream(); + + EXPECT_EQ(stream->Open(), AudioInputStream::OpenOutcome::kSuccess); + + MockAudioInputCallback sink; + EXPECT_CALL(sink, OnData(_, _, _, _)).Times(0); + + stream->Start(&sink); + stream->Stop(); + SendAudioSample(); + stream->Close(); + + EXPECT_TRUE(stream_outputs_.empty()); + // Remove dangling references to stream delegates. + stream_delegates_.clear(); + } +} + +TEST_F(SCKAudioInputStreamTest, CaptureSamples) { + if (@available(macOS 13.0, *)) { + SetUpShareableContentMock(^(NSInvocation* invocation) { + ShareableContentSuccess(invocation); + }); + + SCKAudioInputStream* stream = CreateAudioInputStream(); + + EXPECT_EQ(stream->Open(), AudioInputStream::OpenOutcome::kSuccess); + + FakeAudioInputCallback sink; + stream->Start(&sink); + + // Buffer must be 16-bit aligned. + alignas(16) std::array<float, 2 * kFramesPerBuffer> buffer; + for (size_t i = 0; i < buffer.size(); i++) { + buffer[i] = i; + } + + SendAudioSample(buffer); + + stream->Stop(); + stream->Close(); + + // Verify sample data matches. + EXPECT_EQ(sink.channel_data().size(), buffer.size()); + for (size_t i = 0; i < buffer.size(); i++) { + EXPECT_EQ(sink.channel_data()[i], buffer[i]); + } + + EXPECT_TRUE(stream_outputs_.empty()); + // Remove dangling references to stream delegates. + stream_delegates_.clear(); + } +} + +TEST_F(SCKAudioInputStreamTest, ReportErrorToClient) { + if (@available(macOS 13.0, *)) { + SetUpShareableContentMock(^(NSInvocation* invocation) { + ShareableContentSuccess(invocation); + }); + + SCKAudioInputStream* stream = CreateAudioInputStream(); + + EXPECT_EQ(stream->Open(), AudioInputStream::OpenOutcome::kSuccess); + + MockAudioInputCallback sink; + EXPECT_CALL(sink, OnError()).Times(1); + + stream->Start(&sink); + SendError(); + stream->Stop(); + stream->Close(); + + EXPECT_TRUE(stream_outputs_.empty()); + // Remove dangling references to stream delegates. + stream_delegates_.clear(); + } +} + +} // namespace media
diff --git a/media/audio/mac/audio_manager_mac.cc b/media/audio/mac/audio_manager_mac.cc index f834373..c97d1ff 100644 --- a/media/audio/mac/audio_manager_mac.cc +++ b/media/audio/mac/audio_manager_mac.cc
@@ -27,10 +27,12 @@ #include "media/audio/audio_device_description.h" #include "media/audio/mac/audio_auhal_mac.h" #include "media/audio/mac/audio_input_mac.h" +#include "media/audio/mac/audio_loopback_input_mac.h" #include "media/audio/mac/audio_low_latency_input_mac.h" #include "media/audio/mac/core_audio_util_mac.h" #include "media/audio/mac/coreaudio_dispatch_override.h" #include "media/audio/mac/scoped_audio_unit.h" +#include "media/audio/mac/screen_capture_kit_swizzler.h" #include "media/base/audio_parameters.h" #include "media/base/audio_timestamp_helper.h" #include "media/base/channel_layout.h" @@ -103,14 +105,13 @@ kAudioObjectPropertyElementMain // mElement }; UInt32 output_device_id_size = static_cast<UInt32>(sizeof(output_device_id)); - OSStatus err = AudioObjectGetPropertyData(kAudioObjectSystemObject, - &property_address, - 0, // inQualifierDataSize - NULL, // inQualifierData - &output_device_id_size, - &output_device_id); + OSStatus err = + AudioObjectGetPropertyData(kAudioObjectSystemObject, &property_address, + 0, // inQualifierDataSize + NULL, // inQualifierData + &output_device_id_size, &output_device_id); return err == kAudioHardwareNoError && - output_device_id != kAudioObjectUnknown; + output_device_id != kAudioObjectUnknown; } static std::string GetAudioDeviceNameFromDeviceId(AudioDeviceID device_id, @@ -142,23 +143,27 @@ (is_input ? core_audio_mac::IsInputDevice(device_id) : core_audio_mac::IsOutputDevice(device_id)); - if (!is_valid_for_direction) + if (!is_valid_for_direction) { continue; + } absl::optional<std::string> unique_id = core_audio_mac::GetDeviceUniqueID(device_id); - if (!unique_id) + if (!unique_id) { continue; + } absl::optional<std::string> label = core_audio_mac::GetDeviceLabel(device_id, is_input); - if (!label) + if (!label) { continue; + } // Filter out aggregate devices, e.g. those that get created by using // kAudioUnitSubType_VoiceProcessingIO. - if (core_audio_mac::IsPrivateAggregateDevice(device_id)) + if (core_audio_mac::IsPrivateAggregateDevice(device_id)) { continue; + } device_names->emplace_back(std::move(*label), std::move(*unique_id)); } @@ -184,16 +189,13 @@ if (AudioDeviceDescription::IsDefaultDevice(device_id)) { // Default Device. - property_address.mSelector = is_input ? - kAudioHardwarePropertyDefaultInputDevice : - kAudioHardwarePropertyDefaultOutputDevice; + property_address.mSelector = + is_input ? kAudioHardwarePropertyDefaultInputDevice + : kAudioHardwarePropertyDefaultOutputDevice; - result = AudioObjectGetPropertyData(kAudioObjectSystemObject, - &property_address, - 0, - 0, - &device_size, - &audio_device_id); + result = + AudioObjectGetPropertyData(kAudioObjectSystemObject, &property_address, + 0, 0, &device_size, &audio_device_id); } else { // Non-default device. base::apple::ScopedCFTypeRef<CFStringRef> uid( @@ -206,17 +208,14 @@ UInt32 translation_size = sizeof(AudioValueTranslation); property_address.mSelector = kAudioHardwarePropertyDeviceForUID; - result = AudioObjectGetPropertyData(kAudioObjectSystemObject, - &property_address, - 0, - 0, - &translation_size, - &value); + result = + AudioObjectGetPropertyData(kAudioObjectSystemObject, &property_address, + 0, 0, &translation_size, &value); } if (result) { - OSSTATUS_DLOG(WARNING, result) << "Unable to query device " << device_id - << " for AudioDeviceID"; + OSSTATUS_DLOG(WARNING, result) + << "Unable to query device " << device_id << " for AudioDeviceID"; } return audio_device_id; @@ -264,23 +263,26 @@ UInt32 size; OSStatus result = AudioObjectGetPropertyDataSize(device, &pa, 0, 0, &size); - if (result != noErr || !size) + if (result != noErr || !size) { return false; + } std::unique_ptr<uint8_t[]> list_storage(new uint8_t[size]); AudioBufferList* buffer_list = reinterpret_cast<AudioBufferList*>(list_storage.get()); result = AudioObjectGetPropertyData(device, &pa, 0, 0, &size, buffer_list); - if (result != noErr) + if (result != noErr) { return false; + } // Determine number of channels based on the AudioBufferList. // |mNumberBuffers] is the number of interleaved channels in the buffer. // If the number is 1, the buffer is noninterleaved. *channels = 0; - for (UInt32 i = 0; i < buffer_list->mNumberBuffers; ++i) + for (UInt32 i = 0; i < buffer_list->mNumberBuffers; ++i) { *channels += buffer_list->mBuffers[i].mNumberChannels; + } DVLOG(1) << __FUNCTION__ << (scope == kAudioDevicePropertyScopeInput ? " Input" : " Output") @@ -324,8 +326,9 @@ // input element, or confirm that we can't. if (element == AUElement::INPUT) { ScopedAudioUnit au(device, element); - if (!au.is_valid()) + if (!au.is_valid()) { return false; + } if (!GetAudioUnitStreamFormatChannelCount(au.audio_unit(), element, channels)) { @@ -356,8 +359,9 @@ } ScopedAudioUnit au(device, element); - if (!au.is_valid()) + if (!au.is_valid()) { return false; + } return GetDeviceChannels(au.audio_unit(), element, channels); } @@ -435,8 +439,9 @@ *channels = 0; for (UInt32 i = 0; i < layout->mNumberChannelDescriptions; ++i) { if (layout->mChannelDescriptions[i].mChannelLabel != - kAudioChannelLabel_Unknown) + kAudioChannelLabel_Unknown) { (*channels)++; + } } } @@ -453,8 +458,9 @@ // The PowerMonitor requires significant setup (a CFRunLoop and preallocated // IO ports) so it's not available under unit tests. See the OSX impl of // base::PowerMonitorDeviceSource for more details. - if (!is_monitoring_) + if (!is_monitoring_) { return; + } base::PowerMonitor::AddPowerSuspendObserver(this); } @@ -463,8 +469,9 @@ ~AudioPowerObserver() override { DCHECK(thread_checker_.CalledOnValidThread()); - if (!is_monitoring_) + if (!is_monitoring_) { return; + } base::PowerMonitor::RemovePowerSuspendObserver(this); } @@ -647,12 +654,9 @@ static const AudioObjectPropertyAddress kNominalSampleRateAddress = { kAudioDevicePropertyNominalSampleRate, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMain}; - OSStatus result = AudioObjectGetPropertyData(device_id, - &kNominalSampleRateAddress, - 0, - 0, - &info_size, - &nominal_sample_rate); + OSStatus result = + AudioObjectGetPropertyData(device_id, &kNominalSampleRateAddress, 0, 0, + &info_size, &nominal_sample_rate); if (result != noErr) { OSSTATUS_DLOG(WARNING, result) << "Could not get default sample rate for device: " << device_id; @@ -666,8 +670,9 @@ int AudioManagerMac::HardwareSampleRate() { // Determine the default output device's sample-rate. AudioDeviceID device_id = kAudioObjectUnknown; - if (!GetDefaultOutputDevice(&device_id)) + if (!GetDefaultOutputDevice(&device_id)) { return kFallbackSampleRate; + } return HardwareSampleRateForDevice(device_id); } @@ -687,6 +692,12 @@ AudioParameters AudioManagerMac::GetInputStreamParameters( const std::string& device_id) { DCHECK(GetTaskRunner()->BelongsToCurrentThread()); + if (AudioDeviceDescription::IsLoopbackDevice(device_id)) { + return AudioParameters(AudioParameters::AUDIO_PCM_LOW_LATENCY, + ChannelLayoutConfig::Stereo(), kLoopbackSampleRate, + ChooseBufferSize(true, kLoopbackSampleRate)); + } + AudioDeviceID device = GetAudioDeviceIdByUId(true, device_id); if (device == kAudioObjectUnknown) { DLOG(ERROR) << "Invalid device " << device_id; @@ -705,8 +716,9 @@ } int sample_rate = HardwareSampleRateForDevice(device); - if (!sample_rate) + if (!sample_rate) { sample_rate = kFallbackSampleRate; + } // Due to the sharing of the input and output buffer sizes, we need to choose // the input buffer size based on the output sample rate. See @@ -744,8 +756,9 @@ DCHECK(GetTaskRunner()->BelongsToCurrentThread()); AudioObjectID input_device_id = GetAudioDeviceIdByUId(true, input_device_unique_id); - if (input_device_id == kAudioObjectUnknown) + if (input_device_id == kAudioObjectUnknown) { return std::string(); + } std::vector<AudioObjectID> related_device_ids = GetRelatedDeviceIDs(input_device_id); @@ -754,8 +767,9 @@ // GetRelatedDeviceIDs(). base::flat_set<AudioObjectID> related_output_device_ids; for (AudioObjectID device_id : related_device_ids) { - if (core_audio_mac::GetNumStreams(device_id, false /* is_input */) > 0) + if (core_audio_mac::GetNumStreams(device_id, false /* is_input */) > 0) { related_output_device_ids.insert(device_id); + } } // Return the device ID if there is only one associated device. @@ -765,8 +779,9 @@ if (related_output_device_ids.size() == 1) { absl::optional<std::string> related_unique_id = GetDeviceUniqueID(*related_output_device_ids.begin()); - if (related_unique_id) + if (related_unique_id) { return std::move(*related_unique_id); + } } return std::string(); @@ -819,8 +834,9 @@ // listener. if (device_listener_first_init) { // Only set the current output device for the default device. - if (AudioDeviceDescription::IsDefaultDevice(device_id)) + if (AudioDeviceDescription::IsDefaultDevice(device_id)) { current_output_device_ = device; + } // Just use the current sample rate since we don't allow non-native sample // rates on OSX. current_sample_rate_ = params.sample_rate(); @@ -844,22 +860,20 @@ std::string AudioManagerMac::GetDefaultDeviceID(bool is_input) { DCHECK(GetTaskRunner()->BelongsToCurrentThread()); AudioDeviceID device_id = kAudioObjectUnknown; - if (!GetDefaultDevice(&device_id, is_input)) + if (!GetDefaultDevice(&device_id, is_input)) { return std::string(); + } const AudioObjectPropertyAddress property_address = { kAudioDevicePropertyDeviceUID, kAudioObjectPropertyScopeGlobal, kAudioObjectPropertyElementMain}; CFStringRef device_uid = NULL; UInt32 size = sizeof(device_uid); - OSStatus status = AudioObjectGetPropertyData(device_id, - &property_address, - 0, - NULL, - &size, - &device_uid); - if (status != kAudioHardwareNoError || !device_uid) + OSStatus status = AudioObjectGetPropertyData(device_id, &property_address, 0, + NULL, &size, &device_uid); + if (status != kAudioHardwareNoError || !device_uid) { return std::string(); + } std::string ret(base::SysCFStringRefToUTF8(device_uid)); CFRelease(device_uid); @@ -884,6 +898,16 @@ const LogCallback& log_callback) { DCHECK(GetTaskRunner()->BelongsToCurrentThread()); DCHECK_EQ(AudioParameters::AUDIO_PCM_LOW_LATENCY, params.format()); + + if (AudioDeviceDescription::IsLoopbackDevice(device_id)) { + screen_capture_kit_swizzler_ = SwizzleScreenCaptureKit(); + + return CreateSCKAudioInputStream( + params, device_id, log_callback, + base::BindRepeating(&AudioManagerBase::ReleaseInputStream, + base::Unretained(this))); + } + // Gets the AudioDeviceID that refers to the AudioInputDevice with the device // unique id. This AudioDeviceID is used to set the device for Audio Unit. AudioDeviceID audio_device_id = GetAudioDeviceIdByUId(true, device_id); @@ -942,8 +966,9 @@ } int hardware_channels; - if (!GetDeviceChannels(device, AUElement::OUTPUT, &hardware_channels)) + if (!GetDeviceChannels(device, AUElement::OUTPUT, &hardware_channels)) { hardware_channels = 2; + } // Use the input channel count and channel layout if possible. Let OSX take // care of remapping the channels; this lets user specified channel layouts @@ -953,8 +978,9 @@ if (!has_valid_input_params || output_channels > hardware_channels) { output_channels = hardware_channels; channel_layout = GuessChannelLayout(output_channels); - if (channel_layout == CHANNEL_LAYOUT_UNSUPPORTED) + if (channel_layout == CHANNEL_LAYOUT_UNSUPPORTED) { channel_layout = CHANNEL_LAYOUT_DISCRETE; + } } AudioParameters params( @@ -1092,8 +1118,9 @@ // stream can't handle buffer size larger than its requested buffer size. // See http://crbug.com/428706 for a reason why. - if (buffer_size == desired_buffer_size) + if (buffer_size == desired_buffer_size) { return true; + } if (desired_buffer_size > buffer_size) { // Do NOT set the buffer size if there is another output stream using @@ -1135,10 +1162,11 @@ DVLOG(1) << __FUNCTION__ << " valid IO buffer size range: [" << minimum << ", " << maximum << "]"; buffer_size = desired_buffer_size; - if (buffer_size < minimum) + if (buffer_size < minimum) { buffer_size = minimum; - else if (buffer_size > maximum) + } else if (buffer_size > maximum) { buffer_size = maximum; + } DVLOG(1) << "validated desired buffer size: " << buffer_size; // Set new (and valid) I/O buffer size for the specified device. The property @@ -1170,8 +1198,9 @@ OSStatus result = AudioObjectGetPropertyData(device_id, &kNoiseReductionPropertyAddress, 0, nullptr, &size, &initially_enabled); - if (result != noErr) + if (result != noErr) { return false; + } if (initially_enabled) { const UInt32 disable = 0; @@ -1222,14 +1251,16 @@ // Preferences. AudioDeviceID default_id; GetDefaultDevice(&default_id, true); - if (default_id == device_id) + if (default_id == device_id) { return true; + } } // Each low latency streams has its own device ID. for (auto* stream : low_latency_input_streams_) { - if (stream->device_id() == device_id) + if (stream->device_id() == device_id) { return true; + } } return false; } @@ -1269,10 +1300,11 @@ AudioInputStream* stream) { DCHECK(GetTaskRunner()->BelongsToCurrentThread()); auto stream_it = base::ranges::find(basic_input_streams_, stream); - if (stream_it == basic_input_streams_.end()) + if (stream_it == basic_input_streams_.end()) { low_latency_input_streams_.remove(static_cast<AUAudioInputStream*>(stream)); - else + } else { basic_input_streams_.erase(stream_it); + } AudioManagerBase::ReleaseInputStream(stream); }
diff --git a/media/audio/mac/audio_manager_mac.h b/media/audio/mac/audio_manager_mac.h index 6355b7e9..ecdeec6 100644 --- a/media/audio/mac/audio_manager_mac.h +++ b/media/audio/mac/audio_manager_mac.h
@@ -20,6 +20,13 @@ #include "media/audio/mac/audio_auhal_mac.h" #include "media/audio/mac/audio_device_listener_mac.h" +namespace base { + +namespace apple { +class ScopedObjCClassSwizzler; +} // namespace apple +} // namespace base + namespace media { class AUAudioInputStream; @@ -223,6 +230,10 @@ std::list<AUAudioInputStream*> low_latency_input_streams_; std::list<AUHALStream*> output_streams_; + // Used to swizzle SCStreamManager when performing loopback capture. + std::unique_ptr<base::apple::ScopedObjCClassSwizzler> + screen_capture_kit_swizzler_; + // Set to true in the destructor. Ensures that methods that touches native // Core Audio APIs are not executed during shutdown. bool in_shutdown_;
diff --git a/media/audio/mac/screen_capture_kit_swizzler.h b/media/audio/mac/screen_capture_kit_swizzler.h new file mode 100644 index 0000000..987ae1a --- /dev/null +++ b/media/audio/mac/screen_capture_kit_swizzler.h
@@ -0,0 +1,16 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#ifndef MEDIA_AUDIO_MAC_SCREEN_CAPTURE_KIT_SWIZZLER_H_ +#define MEDIA_AUDIO_MAC_SCREEN_CAPTURE_KIT_SWIZZLER_H_ + +#include <memory> + +#include "base/apple/scoped_objc_class_swizzler.h" + +namespace media { +std::unique_ptr<base::apple::ScopedObjCClassSwizzler> SwizzleScreenCaptureKit(); +} + +#endif // MEDIA_AUDIO_MAC_SCREEN_CAPTURE_KIT_SWIZZLER_H_
diff --git a/media/audio/mac/screen_capture_kit_swizzler.mm b/media/audio/mac/screen_capture_kit_swizzler.mm new file mode 100644 index 0000000..06099323 --- /dev/null +++ b/media/audio/mac/screen_capture_kit_swizzler.mm
@@ -0,0 +1,42 @@ +// Copyright 2023 The Chromium Authors +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +#include "screen_capture_kit_swizzler.h" + +#import <Foundation/NSObject.h> + +@interface SCStreamManagerSwizzler : NSObject +@end + +@implementation SCStreamManagerSwizzler + ++ (id)requestUserPermissionForScreenCapture { + // Returning nil indicates that the permission is granted. + return nil; +} + +@end + +namespace media { + +std::unique_ptr<base::apple::ScopedObjCClassSwizzler> +SwizzleScreenCaptureKit() { + if (@available(macOS 13.0, *)) { + // ScreenCaptureKit internally performs a TCC permission check before + // attempting any operations. This requires access to the TCC daemon, + // which we would like to avoid granting to helper processes due to + // security concerns. Skipping this preliminary check is acceptable, as + // permissions are afterward externally checked by system services. To + // do this, we swizzle the private API +[SCStreamManager + // requestUserPermissionForScreenCapture], always returning to the + // caller that the process has permissions. + return std::make_unique<base::apple::ScopedObjCClassSwizzler>( + NSClassFromString(@"SCStreamManager"), [SCStreamManagerSwizzler class], + @selector(requestUserPermissionForScreenCapture)); + } + + return nullptr; +} + +} // namespace media
diff --git a/media/base/media_switches.cc b/media/base/media_switches.cc index 00d35ea..91c4e39 100644 --- a/media/base/media_switches.cc +++ b/media/base/media_switches.cc
@@ -365,6 +365,20 @@ #endif ); +#if BUILDFLAG(IS_MAC) +// Enables system audio mirroring using ScreenCaptureKit when casting the +// screen on macOS 13.0+. +BASE_FEATURE(kMacLoopbackAudioForCast, + "MacLoopbackAudioForCast", + base::FEATURE_DISABLED_BY_DEFAULT); + +// Enables system audio sharing using ScreenCaptureKit when screen sharing on +// macOS 13.0+. +BASE_FEATURE(kMacLoopbackAudioForScreenShare, + "MacLoopbackAudioForScreenShare", + base::FEATURE_DISABLED_BY_DEFAULT); +#endif + // When enabled, MediaCapabilities will check with GPU Video Accelerator // Factories to determine isPowerEfficient = true/false. BASE_FEATURE(kMediaCapabilitiesQueryGpuFactories,
diff --git a/media/base/media_switches.h b/media/base/media_switches.h index 6213100..3e1e6d22 100644 --- a/media/base/media_switches.h +++ b/media/base/media_switches.h
@@ -255,6 +255,10 @@ MEDIA_EXPORT BASE_DECLARE_FEATURE(kLiveCaptionSystemWideOnChromeOS); MEDIA_EXPORT BASE_DECLARE_FEATURE(kLiveTranslate); MEDIA_EXPORT BASE_DECLARE_FEATURE(kLowDelayVideoRenderingOnLiveStream); +#if BUILDFLAG(IS_MAC) +MEDIA_EXPORT BASE_DECLARE_FEATURE(kMacLoopbackAudioForCast); +MEDIA_EXPORT BASE_DECLARE_FEATURE(kMacLoopbackAudioForScreenShare); +#endif // BUILDFLAG(IS_MAC) MEDIA_EXPORT BASE_DECLARE_FEATURE(kMediaCapabilitiesQueryGpuFactories); MEDIA_EXPORT BASE_DECLARE_FEATURE(kMediaCapabilitiesWithParameters); MEDIA_EXPORT BASE_DECLARE_FEATURE(kMediaCastOverlayButton);
diff --git a/media/gpu/test/video_encode_accelerator_perf_tests.cc b/media/gpu/test/video_encode_accelerator_perf_tests.cc index 29c19a4..22fa5ad6 100644 --- a/media/gpu/test/video_encode_accelerator_perf_tests.cc +++ b/media/gpu/test/video_encode_accelerator_perf_tests.cc
@@ -338,6 +338,7 @@ const DecoderBufferValidator* const decoder_buffer_validator, const absl::optional<size_t>& spatial_idx, const absl::optional<size_t>& temporal_idx, + size_t num_spatial_layers, SVCInterLayerPredMode inter_layer_pred_mode); void Output(uint32_t target_bitrate, uint32_t actual_bitrate); @@ -380,6 +381,7 @@ uint32_t target_bitrate, uint32_t actual_bitrate) const; + const size_t num_spatial_layers_; const SVCInterLayerPredMode inter_layer_pred_mode; const raw_ptr<const PSNRVideoFrameValidator> psnr_validator; @@ -398,9 +400,11 @@ const DecoderBufferValidator* const decoder_buffer_validator, const absl::optional<size_t>& spatial_idx, const absl::optional<size_t>& temporal_idx, + size_t num_spatial_layers, SVCInterLayerPredMode inter_layer_pred_mode) : spatial_idx(spatial_idx), temporal_idx(temporal_idx), + num_spatial_layers_(num_spatial_layers), inter_layer_pred_mode(inter_layer_pred_mode), psnr_validator(psnr_validator), ssim_validator(ssim_validator), @@ -459,9 +463,11 @@ uint32_t actual_bitrate) { std::string svc_text; if (spatial_idx) { - svc_text += - (inter_layer_pred_mode == SVCInterLayerPredMode::kOff ? "S" : "L") + - base::NumberToString(*spatial_idx + 1); + svc_text += (inter_layer_pred_mode == SVCInterLayerPredMode::kOff && + num_spatial_layers_ > 1 + ? "S" + : "L") + + base::NumberToString(*spatial_idx + 1); } if (temporal_idx) svc_text += "T" + base::NumberToString(*temporal_idx + 1); @@ -709,7 +715,8 @@ psnr_validator.get(), ssim_validator.get(), bottom_row_psnr_validator.get(), log_likelihood_validator.get(), decoder_buffer_validator, spatial_layer_index_to_decode, - temporal_layer_index_to_decode, inter_layer_pred_mode)); + temporal_layer_index_to_decode, spatial_layer_resolutions.size(), + inter_layer_pred_mode)); video_frame_processors.push_back(std::move(ssim_validator)); video_frame_processors.push_back(std::move(psnr_validator)); video_frame_processors.push_back(std::move(bottom_row_psnr_validator));
diff --git a/media/gpu/test/video_encode_accelerator_tests.cc b/media/gpu/test/video_encode_accelerator_tests.cc index 8dc8008..dcd6c36 100644 --- a/media/gpu/test/video_encode_accelerator_tests.cc +++ b/media/gpu/test/video_encode_accelerator_tests.cc
@@ -191,7 +191,8 @@ base::FilePath::StringType output_file_prefix; if (spatial_layer_index_to_decode) { output_file_prefix += - (inter_layer_pred_mode == SVCInterLayerPredMode::kOff + (inter_layer_pred_mode == SVCInterLayerPredMode::kOff && + spatial_layer_resolutions.size() > 1 ? FILE_PATH_LITERAL("S") : FILE_PATH_LITERAL("L")) + base::NumberToString(*spatial_layer_index_to_decode);
diff --git a/net/cookies/canonical_cookie_unittest.cc b/net/cookies/canonical_cookie_unittest.cc index e4c8d8d..f1bd758 100644 --- a/net/cookies/canonical_cookie_unittest.cc +++ b/net/cookies/canonical_cookie_unittest.cc
@@ -4026,7 +4026,7 @@ CookieSameSite::NO_RESTRICTION, COOKIE_PRIORITY_DEFAULT, false /*same_party*/, absl::nullopt /*partition_key*/, &status)); EXPECT_TRUE(status.HasExactlyExclusionReasonsForTesting( - {CookieInclusionStatus::EXCLUDE_FAILURE_TO_STORE})); + {CookieInclusionStatus::EXCLUDE_NO_COOKIE_CONTENT})); // Check that value can contain an equal sign, even when no name is present. // Note that in newer drafts of RFC6265bis, it is specified that a cookie with @@ -4362,7 +4362,8 @@ COOKIE_PRIORITY_DEFAULT, true /*same_party*/, absl::nullopt /*partition_key*/, &status)); EXPECT_TRUE(status.HasExactlyExclusionReasonsForTesting( - {CookieInclusionStatus::EXCLUDE_FAILURE_TO_STORE, + {CookieInclusionStatus::EXCLUDE_NO_COOKIE_CONTENT, + CookieInclusionStatus::EXCLUDE_FAILURE_TO_STORE, CookieInclusionStatus::EXCLUDE_INVALID_DOMAIN})); // Check that RFC6265bis name + value string length limits are enforced.
diff --git a/net/cookies/cookie_inclusion_status.cc b/net/cookies/cookie_inclusion_status.cc index 368a4ef..b18464e 100644 --- a/net/cookies/cookie_inclusion_status.cc +++ b/net/cookies/cookie_inclusion_status.cc
@@ -231,6 +231,7 @@ {EXCLUDE_SHADOWING_DOMAIN, "EXCLUDE_SHADOWING_DOMAIN"}, {EXCLUDE_DISALLOWED_CHARACTER, "EXCLUDE_DISALLOWED_CHARACTER"}, {EXCLUDE_THIRD_PARTY_PHASEOUT, "EXCLUDE_THIRD_PARTY_PHASEOUT"}, + {EXCLUDE_NO_COOKIE_CONTENT, "EXCLUDE_NO_COOKIE_CONTENT"}, }; static_assert( std::size(exclusion_reasons) == ExclusionReason::NUM_EXCLUSION_REASONS,
diff --git a/net/cookies/cookie_inclusion_status.h b/net/cookies/cookie_inclusion_status.h index e197c98..6ef4bd77 100644 --- a/net/cookies/cookie_inclusion_status.h +++ b/net/cookies/cookie_inclusion_status.h
@@ -107,6 +107,8 @@ EXCLUDE_DISALLOWED_CHARACTER = 24, // Cookie is blocked for third-party cookie phaseout. EXCLUDE_THIRD_PARTY_PHASEOUT = 25, + // Cookie contains no content or only whitespace. + EXCLUDE_NO_COOKIE_CONTENT = 26, // This should be kept last. NUM_EXCLUSION_REASONS
diff --git a/net/cookies/parsed_cookie.cc b/net/cookies/parsed_cookie.cc index 9d01b106..359bb32 100644 --- a/net/cookies/parsed_cookie.cc +++ b/net/cookies/parsed_cookie.cc
@@ -477,9 +477,8 @@ // Ignore cookies with neither name nor value. if (name.empty() && value.empty()) { if (status_out != nullptr) { - // TODO(crbug.com/1228815): Apply more specific exclusion reasons. status_out->AddExclusionReason( - CookieInclusionStatus::EXCLUDE_FAILURE_TO_STORE); + CookieInclusionStatus::EXCLUDE_NO_COOKIE_CONTENT); } // TODO(crbug.com/1228815) Note - if the exclusion reasons change to no // longer be the same, we'll need to not return right away and evaluate all @@ -554,9 +553,8 @@ // Exit early for an empty cookie string. if (it == end) { - // TODO(crbug.com/1228815): Apply more specific exclusion reasons. status_out.AddExclusionReason( - CookieInclusionStatus::EXCLUDE_FAILURE_TO_STORE); + CookieInclusionStatus::EXCLUDE_NO_COOKIE_CONTENT); return; }
diff --git a/net/cookies/parsed_cookie_unittest.cc b/net/cookies/parsed_cookie_unittest.cc index ddd6b3990..d089b25 100644 --- a/net/cookies/parsed_cookie_unittest.cc +++ b/net/cookies/parsed_cookie_unittest.cc
@@ -62,9 +62,11 @@ } TEST(ParsedCookieTest, TestSetEmptyNameValue) { - ParsedCookie empty(""); + CookieInclusionStatus status; + ParsedCookie empty("", /*block_truncated=*/false, &status); EXPECT_FALSE(empty.IsValid()); - EXPECT_FALSE(empty.SetName("")); + EXPECT_TRUE(status.HasExclusionReason( + CookieInclusionStatus::ExclusionReason::EXCLUDE_NO_COOKIE_CONTENT)); EXPECT_FALSE(empty.SetValue("")); EXPECT_FALSE(empty.IsValid());
diff --git a/pdf/pdfium/pdfium_engine.cc b/pdf/pdfium/pdfium_engine.cc index 5750915..4637d0a3 100644 --- a/pdf/pdfium/pdfium_engine.cc +++ b/pdf/pdfium/pdfium_engine.cc
@@ -559,6 +559,10 @@ } PDFiumEngine::~PDFiumEngine() { + // Clear all the containers that can prevent unloading. + find_results_.clear(); + selection_.clear(); + for (auto& page : pages_) page->Unload();
diff --git a/pdf/pdfium/pdfium_page.cc b/pdf/pdfium/pdfium_page.cc index 96b85c16..18e0c52 100644 --- a/pdf/pdfium/pdfium_page.cc +++ b/pdf/pdfium/pdfium_page.cc
@@ -384,7 +384,8 @@ } void PDFiumPage::Unload() { - // Do not unload while in the middle of a load. + // Do not unload while in the middle of a load, or if some external source + // expects `this` to stay loaded. if (preventing_unload_count_) return; @@ -1760,6 +1761,20 @@ page_->preventing_unload_count_++; } +PDFiumPage::ScopedUnloadPreventer::ScopedUnloadPreventer( + const ScopedUnloadPreventer& that) + : ScopedUnloadPreventer(that.page_) {} + +PDFiumPage::ScopedUnloadPreventer& PDFiumPage::ScopedUnloadPreventer::operator=( + const ScopedUnloadPreventer& that) { + if (page_ != that.page_) { + page_->preventing_unload_count_--; + page_ = that.page_; + page_->preventing_unload_count_++; + } + return *this; +} + PDFiumPage::ScopedUnloadPreventer::~ScopedUnloadPreventer() { page_->preventing_unload_count_--; }
diff --git a/pdf/pdfium/pdfium_page.h b/pdf/pdfium/pdfium_page.h index 05f348a..67fe82f 100644 --- a/pdf/pdfium/pdfium_page.h +++ b/pdf/pdfium/pdfium_page.h
@@ -43,6 +43,17 @@ // Wrapper around a page from the document. class PDFiumPage { public: + class ScopedUnloadPreventer { + public: + explicit ScopedUnloadPreventer(PDFiumPage* page); + ScopedUnloadPreventer(const ScopedUnloadPreventer& that); + ScopedUnloadPreventer& operator=(const ScopedUnloadPreventer& that); + ~ScopedUnloadPreventer(); + + private: + raw_ptr<PDFiumPage> page_; + }; + PDFiumPage(PDFiumEngine* engine, int i); PDFiumPage(const PDFiumPage&) = delete; PDFiumPage& operator=(const PDFiumPage&) = delete; @@ -244,15 +255,6 @@ FRIEND_TEST_ALL_PREFIXES(PDFiumPageOverlappingTest, CountPartialOverlaps); FRIEND_TEST_ALL_PREFIXES(PDFiumPageTextFieldTest, PopulateTextFields); - class ScopedUnloadPreventer { - public: - explicit ScopedUnloadPreventer(PDFiumPage* page); - ~ScopedUnloadPreventer(); - - private: - const raw_ptr<PDFiumPage> page_; - }; - struct Link { Link(); Link(const Link& that);
diff --git a/pdf/pdfium/pdfium_page_unittest.cc b/pdf/pdfium/pdfium_page_unittest.cc index 6c90911..7ecf983 100644 --- a/pdf/pdfium/pdfium_page_unittest.cc +++ b/pdf/pdfium/pdfium_page_unittest.cc
@@ -46,6 +46,21 @@ EXPECT_EQ(ToPDFiumRotation(PageOrientation::kClockwise270), 3); } +TEST(PDFiumPageHelperTest, ScopedUnloadPreventer) { + // Should not DCHECK in its dtor due to ScopedUnloadPreventer usage. + PDFiumPage page1(/*engine=*/nullptr, 1); + PDFiumPage page2(/*engine=*/nullptr, 2); + PDFiumPage::ScopedUnloadPreventer prevent_unload1(&page1); + PDFiumPage::ScopedUnloadPreventer prevent_unload2(&page2); + PDFiumPage::ScopedUnloadPreventer prevent_unload3(prevent_unload2); + PDFiumPage::ScopedUnloadPreventer prevent_unload4(&page2); + prevent_unload2 = prevent_unload1; + prevent_unload1 = prevent_unload2; + prevent_unload1 = prevent_unload4; + prevent_unload4 = prevent_unload1; + prevent_unload3 = prevent_unload4; +} + void CompareTextRuns(const AccessibilityTextRunInfo& expected_text_run, const AccessibilityTextRunInfo& actual_text_run) { EXPECT_EQ(expected_text_run.len, actual_text_run.len);
diff --git a/pdf/pdfium/pdfium_range.cc b/pdf/pdfium/pdfium_range.cc index 4e057eb..88f6371 100644 --- a/pdf/pdfium/pdfium_range.cc +++ b/pdf/pdfium/pdfium_range.cc
@@ -31,11 +31,18 @@ } PDFiumRange::PDFiumRange(PDFiumPage* page, int char_index, int char_count) - : page_(page), char_index_(char_index), char_count_(char_count) { + : page_unload_preventer_(page), + page_(page), + char_index_(char_index), + char_count_(char_count) { DCHECK(page_); + // Ensure page load, while `page_unload_preventer_` prevents page unload. + // This prevents GetScreenRects() from triggering page loads, which can have + // surprising side effects, considering GetScreenRects() is const. + [[maybe_unused]] FPDF_TEXTPAGE text_page = page_->GetTextPage(); #if DCHECK_IS_ON() AdjustForBackwardsRange(char_index, char_count); - DCHECK_LE(char_count, FPDFText_CountChars(page_->GetTextPage())); + DCHECK_LE(char_count, FPDFText_CountChars(text_page)); #endif }
diff --git a/pdf/pdfium/pdfium_range.h b/pdf/pdfium/pdfium_range.h index 5ce122a7..6c877e5 100644 --- a/pdf/pdfium/pdfium_range.h +++ b/pdf/pdfium/pdfium_range.h
@@ -49,6 +49,8 @@ std::u16string GetText() const; private: + PDFiumPage::ScopedUnloadPreventer page_unload_preventer_; + // The page containing the range. Must outlive `this`. raw_ptr<PDFiumPage> page_; // Index of first character.
diff --git a/third_party/angle b/third_party/angle index eb0d599..ecf11ec 160000 --- a/third_party/angle +++ b/third_party/angle
@@ -1 +1 @@ -Subproject commit eb0d59973d21f845b5785563f5d56b8ebb617478 +Subproject commit ecf11ecaea1a4ed9fd08180bc85f6f07dbc0e9b1
diff --git a/third_party/blink/public/devtools_protocol/browser_protocol.pdl b/third_party/blink/public/devtools_protocol/browser_protocol.pdl index cafca57..c25cfabc 100644 --- a/third_party/blink/public/devtools_protocol/browser_protocol.pdl +++ b/third_party/blink/public/devtools_protocol/browser_protocol.pdl
@@ -5783,6 +5783,8 @@ # character if it appears in the middle of the cookie name, value, an # attribute name, or an attribute value. DisallowedCharacter + # Cookie contains no content or only whitespace. + NoCookieContent # Types of reasons why a cookie may not be sent with a request. experimental type CookieBlockedReason extends string @@ -9335,8 +9337,6 @@ loaded bid win - additionalBid - additionalBidWin # Ad advertising element inside an interest group. type InterestGroupAd extends object
diff --git a/third_party/blink/public/mojom/interest_group/ad_auction_service.mojom b/third_party/blink/public/mojom/interest_group/ad_auction_service.mojom index 32388d7..c823dca8 100644 --- a/third_party/blink/public/mojom/interest_group/ad_auction_service.mojom +++ b/third_party/blink/public/mojom/interest_group/ad_auction_service.mojom
@@ -41,6 +41,12 @@ kPerBuyerCumulativeTimeouts }; +// Coordinator which is conducting the auction. +enum AdAuctionCoordinator { + kAWS, + kGCP, +}; + // Used to provide a way of aborting a call to AdAuctionService.RunAdAuction interface AbortableAdAuction { // These methods should be called to provide a value for part of auction @@ -237,6 +243,6 @@ // Gets the ad auction data for running an external auction on a bidding and // auction server. - GetInterestGroupAdAuctionData(url.mojom.Origin seller) + GetInterestGroupAdAuctionData(url.mojom.Origin seller, AdAuctionCoordinator coordinator) => (mojo_base.mojom.BigBuffer request, mojo_base.mojom.Uuid? request_id); };
diff --git a/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom b/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom index ad15ed0ce..3b0ac05 100644 --- a/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom +++ b/third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom
@@ -3999,6 +3999,9 @@ kPercentOrCalcStickyUsedOffset = 4659, kPercentOrCalcRelativeUsedOffset = 4660, kAutoRelativeUsedOffset = 4661, + kViewportFitContain = 4662, + kViewportFitCover = 4663, + kViewportFitCoverOrSafeAreaInsetBottom = 4664, // Add new features immediately above this line. Don't change assigned // numbers of any item, and don't reuse removed slots. // Also, run update_use_counter_feature_enum.py in
diff --git a/third_party/blink/public/platform/web_theme_engine.h b/third_party/blink/public/platform/web_theme_engine.h index c11dec4..14a48c2 100644 --- a/third_party/blink/public/platform/web_theme_engine.h +++ b/third_party/blink/public/platform/web_theme_engine.h
@@ -271,6 +271,9 @@ // NativeTheme so these fields are unused in non-Android WebThemeEngines. } + virtual bool IsFluentOverlayScrollbarEnabled() const { return false; } + virtual int GetPaintedScrollbarTrackInset() const { return 0; } + // Paint the given the given theme part. virtual void Paint( cc::PaintCanvas*,
diff --git a/third_party/blink/renderer/bindings/generated_in_modules.gni b/third_party/blink/renderer/bindings/generated_in_modules.gni index c0516b1c..1199581 100644 --- a/third_party/blink/renderer/bindings/generated_in_modules.gni +++ b/third_party/blink/renderer/bindings/generated_in_modules.gni
@@ -1198,6 +1198,8 @@ "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_aac_bitstream_format.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ad_signals.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ad_signals.h", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ad_auction_coordinator.cc", + "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ad_auction_coordinator.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_alpha_option.cc", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_alpha_option.h", "$root_gen_dir/third_party/blink/renderer/bindings/modules/v8/v8_ancestor_status.cc",
diff --git a/third_party/blink/renderer/core/animation/compositor_animations.cc b/third_party/blink/renderer/core/animation/compositor_animations.cc index 9f1099b4..af84a5db 100644 --- a/third_party/blink/renderer/core/animation/compositor_animations.cc +++ b/third_party/blink/renderer/core/animation/compositor_animations.cc
@@ -555,7 +555,7 @@ // DCHECK_GE(GetDocument().Lifecycle().GetState(), // DocumentLifecycle::kPrePaintClean); bool has_direct_compositing_reasons = false; - if (layout_object->FirstFragment().NextFragment()) { + if (layout_object->IsFragmented()) { // Composited animation on multiple fragments is not supported. reasons |= kTargetHasInvalidCompositingState; } else if (const auto* paint_properties =
diff --git a/third_party/blink/renderer/core/animation/compositor_animations_test.cc b/third_party/blink/renderer/core/animation/compositor_animations_test.cc index b08d4a0..67be634 100644 --- a/third_party/blink/renderer/core/animation/compositor_animations_test.cc +++ b/third_party/blink/renderer/core/animation/compositor_animations_test.cc
@@ -2552,7 +2552,7 @@ Element* target = GetDocument().getElementById(AtomicString("target")); const Animation& animation = *target->GetElementAnimations()->Animations().begin()->key; - EXPECT_TRUE(target->GetLayoutObject()->FirstFragment().NextFragment()); + EXPECT_TRUE(target->GetLayoutObject()->IsFragmented()); EXPECT_EQ(CompositorAnimations::kTargetHasInvalidCompositingState, animation.CheckCanStartAnimationOnCompositor( GetDocument().View()->GetPaintArtifactCompositor()));
diff --git a/third_party/blink/renderer/core/css/document_style_environment_variables.cc b/third_party/blink/renderer/core/css/document_style_environment_variables.cc index 78f0c6b1..04eea6b1 100644 --- a/third_party/blink/renderer/core/css/document_style_environment_variables.cc +++ b/third_party/blink/renderer/core/css/document_style_environment_variables.cc
@@ -7,6 +7,7 @@ #include "third_party/blink/renderer/core/css/style_engine.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" +#include "third_party/blink/renderer/core/frame/local_frame.h" #include "third_party/blink/renderer/core/frame/web_feature.h" #include "third_party/blink/renderer/platform/instrumentation/use_counter.h" #include "third_party/blink/renderer/platform/wtf/text/string_hasher.h" @@ -93,6 +94,13 @@ case 0x898873a2: UseCounter::Count( document_, WebFeature::kCSSEnvironmentVariable_SafeAreaInsetBottom); + // Record usage for viewport-fit histogram. + // TODO(https://crbug.com/1482559) remove after data captured (end of + // 2023). + if (document_->GetFrame()->IsOutermostMainFrame()) { + UseCounter::Count(document_, + WebFeature::kViewportFitCoverOrSafeAreaInsetBottom); + } break; case 0xd99fe75b: UseCounter::Count(document_,
diff --git a/third_party/blink/renderer/core/css/style_environment_variables_test.cc b/third_party/blink/renderer/core/css/style_environment_variables_test.cc index 516f833..e9bc8edb 100644 --- a/third_party/blink/renderer/core/css/style_environment_variables_test.cc +++ b/third_party/blink/renderer/core/css/style_environment_variables_test.cc
@@ -422,6 +422,18 @@ WebFeature::kCSSEnvironmentVariable_SafeAreaInsetBottom)); } +// TODO(https://crbug.com/1430288) remove after data collected (end of '23) +TEST_F(StyleEnvironmentVariablesTest, + RecordUseCounter_ViewportFitCoverOrSafeAreaInsetBottom) { + InitializeWithHTML(GetFrame(), ""); + EXPECT_FALSE(GetDocument().IsUseCounted( + WebFeature::kViewportFitCoverOrSafeAreaInsetBottom)); + InitializeTestPageWithVariableNamed(GetFrame(), + UADefinedVariable::kSafeAreaInsetBottom); + EXPECT_TRUE(GetDocument().IsUseCounted( + WebFeature::kViewportFitCoverOrSafeAreaInsetBottom)); +} + TEST_F(StyleEnvironmentVariablesTest, RecordUseCounter_SafeAreaInsetLeft) { InitializeTestPageWithVariableNamed(GetFrame(), UADefinedVariable::kSafeAreaInsetLeft);
diff --git a/third_party/blink/renderer/core/frame/viewport_data.cc b/third_party/blink/renderer/core/frame/viewport_data.cc index e9c36939..c136911 100644 --- a/third_party/blink/renderer/core/frame/viewport_data.cc +++ b/third_party/blink/renderer/core/frame/viewport_data.cc
@@ -4,6 +4,8 @@ #include "third_party/blink/renderer/core/frame/viewport_data.h" +#include "third_party/blink/public/mojom/use_counter/metrics/web_feature.mojom-blink.h" + #include "third_party/blink/public/common/associated_interfaces/associated_interface_provider.h" #include "third_party/blink/renderer/core/dom/document.h" #include "third_party/blink/renderer/core/execution_context/execution_context.h" @@ -113,6 +115,21 @@ // Even though we bind the mojo interface above there still may be cases // where this will fail (e.g. unit tests). display_cutout_host_->NotifyViewportFitChanged(current_viewport_fit); + + // Track usage of any non-default viewport-fit. + if (document_->GetFrame()->IsOutermostMainFrame()) { + if (current_viewport_fit == mojom::blink::ViewportFit::kContain) { + UseCounter::Count(document_, WebFeature::kViewportFitContain); + } else if (current_viewport_fit == mojom::blink::ViewportFit::kCover || + current_viewport_fit == + mojom::blink::ViewportFit::kCoverForcedByUserAgent) { + UseCounter::Count(document_, WebFeature::kViewportFitCover); + // TODO(https://crbug.com/1430288) remove tracking this union of + // features after data collected (end of '23) + UseCounter::Count(document_, + WebFeature::kViewportFitCoverOrSafeAreaInsetBottom); + } + } } viewport_fit_ = current_viewport_fit;
diff --git a/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc b/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc index ba84359..bfb3a70cd8 100644 --- a/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc +++ b/third_party/blink/renderer/core/frame/web_frame_widget_impl.cc
@@ -3324,12 +3324,6 @@ !presentation_time.is_null() && (presentation_time > swap_time); UMA_HISTOGRAM_BOOLEAN("PageLoad.Internal.Renderer.PresentationTime.Valid", presentation_time_is_valid); - if (presentation_time_is_valid) { - // This measures from 1ms to 10seconds. - UMA_HISTOGRAM_TIMES( - "PageLoad.Internal.Renderer.PresentationTime.DeltaFromSwapTime", - presentation_time - swap_time); - } ReportTime(std::move(presentation_time_callback), presentation_time_is_valid ? presentation_time : swap_time); }
diff --git a/third_party/blink/renderer/core/frame/web_frame_widget_test.cc b/third_party/blink/renderer/core/frame/web_frame_widget_test.cc index e1f9f95..e1429897 100644 --- a/third_party/blink/renderer/core/frame/web_frame_widget_test.cc +++ b/third_party/blink/renderer/core/frame/web_frame_widget_test.cc
@@ -565,10 +565,6 @@ EXPECT_THAT(histograms.GetAllSamples( "PageLoad.Internal.Renderer.PresentationTime.Valid"), testing::ElementsAre(base::Bucket(true, 1))); - EXPECT_THAT( - histograms.GetAllSamples( - "PageLoad.Internal.Renderer.PresentationTime.DeltaFromSwapTime"), - testing::ElementsAre(base::Bucket(2, 1))); } TEST_F(NotifySwapTimesWebFrameWidgetTest, PresentationTimestampInvalid) { @@ -579,10 +575,6 @@ EXPECT_THAT(histograms.GetAllSamples( "PageLoad.Internal.Renderer.PresentationTime.Valid"), testing::ElementsAre(base::Bucket(false, 1))); - EXPECT_THAT( - histograms.GetAllSamples( - "PageLoad.Internal.Renderer.PresentationTime.DeltaFromSwapTime"), - testing::IsEmpty()); } TEST_F(NotifySwapTimesWebFrameWidgetTest, @@ -594,10 +586,6 @@ EXPECT_THAT(histograms.GetAllSamples( "PageLoad.Internal.Renderer.PresentationTime.Valid"), testing::ElementsAre(base::Bucket(false, 1))); - EXPECT_THAT( - histograms.GetAllSamples( - "PageLoad.Internal.Renderer.PresentationTime.DeltaFromSwapTime"), - testing::IsEmpty()); } // Verifies that the presentation callback is called after the first successful @@ -693,12 +681,6 @@ EXPECT_THAT(histograms.GetAllSamples( "PageLoad.Internal.Renderer.PresentationTime.Valid"), testing::ElementsAre(base::Bucket(true, 1))); - const auto expected_sample = static_cast<base::HistogramBase::Sample>( - (swap_to_failed + failed_to_successful).InMilliseconds()); - EXPECT_THAT( - histograms.GetAllSamples( - "PageLoad.Internal.Renderer.PresentationTime.DeltaFromSwapTime"), - testing::ElementsAre(base::Bucket(expected_sample, 1))); } // Tests that the presentation callback is only triggered if there’s @@ -759,12 +741,9 @@ // Wait for the presentation callback to be called. presentation_run_loop.Run(); - const auto expected_sample = static_cast<base::HistogramBase::Sample>( - delta_from_swap_time.InMilliseconds()); - EXPECT_THAT( - histograms.GetAllSamples( - "PageLoad.Internal.Renderer.PresentationTime.DeltaFromSwapTime"), - testing::ElementsAre(base::Bucket(expected_sample, 1))); + EXPECT_THAT(histograms.GetAllSamples( + "PageLoad.Internal.Renderer.PresentationTime.Valid"), + testing::ElementsAre(base::Bucket(true, 1))); } // Tests that the value of VisualProperties::is_pinch_gesture_active is
diff --git a/third_party/blink/renderer/core/html/html_meta_element_test.cc b/third_party/blink/renderer/core/html/html_meta_element_test.cc index bbed764..f76b5f3 100644 --- a/third_party/blink/renderer/core/html/html_meta_element_test.cc +++ b/third_party/blink/renderer/core/html/html_meta_element_test.cc
@@ -97,6 +97,38 @@ LoadTestPageAndReturnViewportFit("invalid")); } +// TODO(https://crbug.com/1430288) remove after data collected (end of '23) +TEST_F(HTMLMetaElementTest, ViewportFit_Auto_NotUseCounted) { + EXPECT_EQ(mojom::ViewportFit::kAuto, + LoadTestPageAndReturnViewportFit("auto")); + EXPECT_FALSE(GetDocument().IsUseCounted(WebFeature::kViewportFitContain)); + EXPECT_FALSE(GetDocument().IsUseCounted(WebFeature::kViewportFitCover)); + // TODO(https://crbug.com/1430288) remove tracking this union of features + // after data collected (end of '23) + EXPECT_FALSE(GetDocument().IsUseCounted( + WebFeature::kViewportFitCoverOrSafeAreaInsetBottom)); +} + +TEST_F(HTMLMetaElementTest, ViewportFit_Contain_IsUseCounted) { + EXPECT_EQ(mojom::ViewportFit::kContain, + LoadTestPageAndReturnViewportFit("contain")); + EXPECT_FALSE(GetDocument().IsUseCounted(WebFeature::kViewportFitCover)); + EXPECT_FALSE(GetDocument().IsUseCounted( + WebFeature::kViewportFitCoverOrSafeAreaInsetBottom)); + EXPECT_TRUE(GetDocument().IsUseCounted(WebFeature::kViewportFitContain)); +} + +// TODO(https://crbug.com/1430288) remove after data collected (end of '23) +TEST_F(HTMLMetaElementTest, ViewportFit_Cover_IsUseCounted) { + EXPECT_EQ(mojom::ViewportFit::kCover, + LoadTestPageAndReturnViewportFit("cover")); + EXPECT_TRUE(GetDocument().IsUseCounted(WebFeature::kViewportFitCover)); + // TODO(https://crbug.com/1430288) remove tracking this union of features + // after data collected (end of '23) + EXPECT_TRUE(GetDocument().IsUseCounted( + WebFeature::kViewportFitCoverOrSafeAreaInsetBottom)); +} + TEST_F(HTMLMetaElementTest, ColorSchemeProcessing_FirstWins) { GetDocument().head()->setInnerHTML(R"HTML( <meta name="color-scheme" content="dark">
diff --git a/third_party/blink/renderer/core/input/boundary_event_dispatcher.cc b/third_party/blink/renderer/core/input/boundary_event_dispatcher.cc index 6937354..8dfa5c0 100644 --- a/third_party/blink/renderer/core/input/boundary_event_dispatcher.cc +++ b/third_party/blink/renderer/core/input/boundary_event_dispatcher.cc
@@ -62,7 +62,7 @@ // Dispatch out event if (event_handling_util::IsInDocument(exited_target)) - DispatchOut(exited_target, entered_target); + Dispatch(exited_target, entered_target, out_event_, false); // Create lists of all exited/entered ancestors, locate the common ancestor // Based on httparchive, in more than 97% cases the depth of DOM is less @@ -97,38 +97,38 @@ &entered_ancestors_common_parent_index); bool exited_node_has_capturing_ancestor = false; - const AtomicString& leave_event = GetLeaveEvent(); for (wtf_size_t j = 0; j < exited_ancestors.size(); j++) { - if (exited_ancestors[j]->HasCapturingEventListeners(leave_event)) { + if (exited_ancestors[j]->HasCapturingEventListeners(leave_event_)) { exited_node_has_capturing_ancestor = true; break; } } // Dispatch leave events, in child-to-parent order. - for (wtf_size_t j = 0; j < exited_ancestors_common_parent_index; j++) - DispatchLeave(exited_ancestors[j], entered_target, - !exited_node_has_capturing_ancestor); + for (wtf_size_t j = 0; j < exited_ancestors_common_parent_index; j++) { + Dispatch(exited_ancestors[j], entered_target, leave_event_, + !exited_node_has_capturing_ancestor); + } // Dispatch over event if (event_handling_util::IsInDocument(entered_target)) - DispatchOver(entered_target, exited_target); + Dispatch(entered_target, exited_target, over_event_, false); // Defer locating capturing enter listener until /after/ dispatching the leave // events because the leave handlers might set a capturing enter handler. bool entered_node_has_capturing_ancestor = false; - const AtomicString& enter_event = GetEnterEvent(); for (wtf_size_t i = 0; i < entered_ancestors.size(); i++) { - if (entered_ancestors[i]->HasCapturingEventListeners(enter_event)) { + if (entered_ancestors[i]->HasCapturingEventListeners(enter_event_)) { entered_node_has_capturing_ancestor = true; break; } } // Dispatch enter events, in parent-to-child order. - for (wtf_size_t i = entered_ancestors_common_parent_index; i > 0; i--) - DispatchEnter(entered_ancestors[i - 1], exited_target, - !entered_node_has_capturing_ancestor); + for (wtf_size_t i = entered_ancestors_common_parent_index; i > 0; i--) { + Dispatch(entered_ancestors[i - 1], exited_target, enter_event_, + !entered_node_has_capturing_ancestor); + } } } // namespace blink
diff --git a/third_party/blink/renderer/core/input/boundary_event_dispatcher.h b/third_party/blink/renderer/core/input/boundary_event_dispatcher.h index 411b58a..1278d6b 100644 --- a/third_party/blink/renderer/core/input/boundary_event_dispatcher.h +++ b/third_party/blink/renderer/core/input/boundary_event_dispatcher.h
@@ -6,6 +6,7 @@ #define THIRD_PARTY_BLINK_RENDERER_CORE_INPUT_BOUNDARY_EVENT_DISPATCHER_H_ #include "third_party/blink/renderer/core/dom/events/event_target.h" +#include "third_party/blink/renderer/platform/wtf/text/atomic_string.h" namespace blink { @@ -16,23 +17,30 @@ STACK_ALLOCATED(); public: - BoundaryEventDispatcher() = default; + BoundaryEventDispatcher(AtomicString over_event, + AtomicString out_event, + AtomicString enter_event, + AtomicString leave_event) + : over_event_(over_event), + out_event_(out_event), + enter_event_(enter_event), + leave_event_(leave_event) {} virtual ~BoundaryEventDispatcher() = default; void SendBoundaryEvents(EventTarget* exited_target, EventTarget* entered_target); protected: - virtual void DispatchOut(EventTarget*, EventTarget* related_target) = 0; - virtual void DispatchOver(EventTarget*, EventTarget* related_target) = 0; - virtual void DispatchLeave(EventTarget*, - EventTarget* related_target, - bool check_for_listener) = 0; - virtual void DispatchEnter(EventTarget*, - EventTarget* related_target, - bool check_for_listener) = 0; - virtual AtomicString GetLeaveEvent() = 0; - virtual AtomicString GetEnterEvent() = 0; + virtual void Dispatch(EventTarget*, + EventTarget* related_target, + const AtomicString&, + bool check_for_listener) = 0; + + private: + AtomicString over_event_; + AtomicString out_event_; + AtomicString enter_event_; + AtomicString leave_event_; }; } // namespace blink
diff --git a/third_party/blink/renderer/core/input/mouse_event_manager.cc b/third_party/blink/renderer/core/input/mouse_event_manager.cc index d76ce9e9..cb097e5 100644 --- a/third_party/blink/renderer/core/input/mouse_event_manager.cc +++ b/third_party/blink/renderer/core/input/mouse_event_manager.cc
@@ -167,20 +167,19 @@ MouseEventManager::MouseEventBoundaryEventDispatcher:: MouseEventBoundaryEventDispatcher(MouseEventManager* mouse_event_manager, const WebMouseEvent* web_mouse_event) - : mouse_event_manager_(mouse_event_manager), + : BoundaryEventDispatcher(event_type_names::kMouseover, + event_type_names::kMouseout, + event_type_names::kMouseenter, + event_type_names::kMouseleave), + mouse_event_manager_(mouse_event_manager), web_mouse_event_(web_mouse_event) {} -void MouseEventManager::MouseEventBoundaryEventDispatcher::DispatchOut( +void MouseEventManager::MouseEventBoundaryEventDispatcher::Dispatch( EventTarget* target, - EventTarget* related_target) { - Dispatch(target, related_target, event_type_names::kMouseout, - *web_mouse_event_, false); -} - -void MouseEventManager::MouseEventBoundaryEventDispatcher::DispatchOver( - EventTarget* target, - EventTarget* related_target) { - if (target) { + EventTarget* related_target, + const AtomicString& type, + bool check_for_listener) { + if (target && type == event_type_names::kMouseover) { HTMLImageElement* image_element = DynamicTo<HTMLImageElement>(target->ToNode()); if (image_element && image_element->IsLCPElement()) { @@ -189,43 +188,7 @@ paint_timing.SetLCPMouseoverDispatched(); } } - Dispatch(target, related_target, event_type_names::kMouseover, - *web_mouse_event_, false); -} - -void MouseEventManager::MouseEventBoundaryEventDispatcher::DispatchLeave( - EventTarget* target, - EventTarget* related_target, - bool check_for_listener) { - Dispatch(target, related_target, event_type_names::kMouseleave, - *web_mouse_event_, check_for_listener); -} - -void MouseEventManager::MouseEventBoundaryEventDispatcher::DispatchEnter( - EventTarget* target, - EventTarget* related_target, - bool check_for_listener) { - Dispatch(target, related_target, event_type_names::kMouseenter, - *web_mouse_event_, check_for_listener); -} - -AtomicString -MouseEventManager::MouseEventBoundaryEventDispatcher::GetLeaveEvent() { - return event_type_names::kMouseleave; -} - -AtomicString -MouseEventManager::MouseEventBoundaryEventDispatcher::GetEnterEvent() { - return event_type_names::kMouseenter; -} - -void MouseEventManager::MouseEventBoundaryEventDispatcher::Dispatch( - EventTarget* target, - EventTarget* related_target, - const AtomicString& type, - const WebMouseEvent& web_mouse_event, - bool check_for_listener) { - mouse_event_manager_->DispatchMouseEvent(target, type, web_mouse_event, + mouse_event_manager_->DispatchMouseEvent(target, type, *web_mouse_event_, nullptr, related_target, check_for_listener); }
diff --git a/third_party/blink/renderer/core/input/mouse_event_manager.h b/third_party/blink/renderer/core/input/mouse_event_manager.h index 45151662c..d9edbacb 100644 --- a/third_party/blink/renderer/core/input/mouse_event_manager.h +++ b/third_party/blink/renderer/core/input/mouse_event_manager.h
@@ -161,23 +161,12 @@ const MouseEventBoundaryEventDispatcher&) = delete; protected: - void DispatchOut(EventTarget*, EventTarget* related_target) override; - void DispatchOver(EventTarget*, EventTarget* related_target) override; - void DispatchLeave(EventTarget*, - EventTarget* related_target, - bool check_for_listener) override; - void DispatchEnter(EventTarget*, - EventTarget* related_target, - bool check_for_listener) override; - AtomicString GetLeaveEvent() override; - AtomicString GetEnterEvent() override; - - private: void Dispatch(EventTarget*, EventTarget* related_target, const AtomicString&, - const WebMouseEvent&, - bool check_for_listener); + bool check_for_listener) override; + + private: MouseEventManager* mouse_event_manager_; const WebMouseEvent* web_mouse_event_; };
diff --git a/third_party/blink/renderer/core/input/pointer_event_manager.cc b/third_party/blink/renderer/core/input/pointer_event_manager.cc index 24d399b..79c216f8 100644 --- a/third_party/blink/renderer/core/input/pointer_event_manager.cc +++ b/third_party/blink/renderer/core/input/pointer_event_manager.cc
@@ -133,47 +133,13 @@ PointerEventBoundaryEventDispatcher( PointerEventManager* pointer_event_manager, PointerEvent* pointer_event) - : pointer_event_manager_(pointer_event_manager), + : BoundaryEventDispatcher(event_type_names::kPointerover, + event_type_names::kPointerout, + event_type_names::kPointerenter, + event_type_names::kPointerleave), + pointer_event_manager_(pointer_event_manager), pointer_event_(pointer_event) {} -void PointerEventManager::PointerEventBoundaryEventDispatcher::DispatchOut( - EventTarget* target, - EventTarget* related_target) { - Dispatch(target, related_target, event_type_names::kPointerout, false); -} - -void PointerEventManager::PointerEventBoundaryEventDispatcher::DispatchOver( - EventTarget* target, - EventTarget* related_target) { - Dispatch(target, related_target, event_type_names::kPointerover, false); -} - -void PointerEventManager::PointerEventBoundaryEventDispatcher::DispatchLeave( - EventTarget* target, - EventTarget* related_target, - bool check_for_listener) { - Dispatch(target, related_target, event_type_names::kPointerleave, - check_for_listener); -} - -void PointerEventManager::PointerEventBoundaryEventDispatcher::DispatchEnter( - EventTarget* target, - EventTarget* related_target, - bool check_for_listener) { - Dispatch(target, related_target, event_type_names::kPointerenter, - check_for_listener); -} - -AtomicString -PointerEventManager::PointerEventBoundaryEventDispatcher::GetLeaveEvent() { - return event_type_names::kPointerleave; -} - -AtomicString -PointerEventManager::PointerEventBoundaryEventDispatcher::GetEnterEvent() { - return event_type_names::kPointerenter; -} - void PointerEventManager::PointerEventBoundaryEventDispatcher::Dispatch( EventTarget* target, EventTarget* related_target,
diff --git a/third_party/blink/renderer/core/input/pointer_event_manager.h b/third_party/blink/renderer/core/input/pointer_event_manager.h index 208cb3d0f..7ef25093a 100644 --- a/third_party/blink/renderer/core/input/pointer_event_manager.h +++ b/third_party/blink/renderer/core/input/pointer_event_manager.h
@@ -132,22 +132,12 @@ const PointerEventBoundaryEventDispatcher&) = delete; protected: - void DispatchOut(EventTarget*, EventTarget* related_target) override; - void DispatchOver(EventTarget*, EventTarget* related_target) override; - void DispatchLeave(EventTarget*, - EventTarget* related_target, - bool check_for_listener) override; - void DispatchEnter(EventTarget*, - EventTarget* related_target, - bool check_for_listener) override; - AtomicString GetLeaveEvent() override; - AtomicString GetEnterEvent() override; - - private: void Dispatch(EventTarget*, EventTarget* related_target, const AtomicString&, - bool check_for_listener); + bool check_for_listener) override; + + private: PointerEventManager* pointer_event_manager_; PointerEvent* pointer_event_; };
diff --git a/third_party/blink/renderer/core/inspector/inspector_memory_agent.cc b/third_party/blink/renderer/core/inspector/inspector_memory_agent.cc index 7cbe0ee..cb195c0 100644 --- a/third_party/blink/renderer/core/inspector/inspector_memory_agent.cc +++ b/third_party/blink/renderer/core/inspector/inspector_memory_agent.cc
@@ -189,14 +189,14 @@ } Vector<String> InspectorMemoryAgent::Symbolize( - const WebVector<void*>& addresses) { + const WebVector<const void*>& addresses) { #if BUILDFLAG(IS_LINUX) || BUILDFLAG(IS_CHROMEOS) // TODO(alph): Move symbolization to the client. - Vector<void*> addresses_to_symbolize; - for (size_t i = 0; i < addresses.size(); i++) { - void* address = addresses[i]; - if (!symbols_cache_.Contains(address)) + Vector<const void*> addresses_to_symbolize; + for (const void* address : addresses) { + if (!symbols_cache_.Contains(address)) { addresses_to_symbolize.push_back(address); + } } String text(base::debug::StackTrace(addresses_to_symbolize.data(), @@ -217,7 +217,7 @@ #endif Vector<String> result; - for (void* address : addresses) { + for (const void* address : addresses) { char buffer[20]; std::snprintf(buffer, sizeof(buffer), "0x%" PRIxPTR, reinterpret_cast<uintptr_t>(address));
diff --git a/third_party/blink/renderer/core/inspector/inspector_memory_agent.h b/third_party/blink/renderer/core/inspector/inspector_memory_agent.h index 16f8af71..518ff13 100644 --- a/third_party/blink/renderer/core/inspector/inspector_memory_agent.h +++ b/third_party/blink/renderer/core/inspector/inspector_memory_agent.h
@@ -68,13 +68,13 @@ std::unique_ptr<protocol::Memory::SamplingProfile>*) override; private: - Vector<String> Symbolize(const WebVector<void*>& addresses); + Vector<String> Symbolize(const WebVector<const void*>& addresses); std::unique_ptr<protocol::Memory::SamplingProfile> GetSamplingProfileById( uint32_t id); Member<InspectedFrames> frames_; uint32_t profile_id_ = 0; - HashMap<void*, String> symbols_cache_; + HashMap<const void*, String> symbols_cache_; InspectorAgentState::Integer sampling_profile_interval_;
diff --git a/third_party/blink/renderer/core/layout/layout_box.cc b/third_party/blink/renderer/core/layout/layout_box.cc index 251c2204..2e119f70 100644 --- a/third_party/blink/renderer/core/layout/layout_box.cc +++ b/third_party/blink/renderer/core/layout/layout_box.cc
@@ -1061,6 +1061,7 @@ int LayoutBox::PixelSnappedClientWidth() const { NOT_DESTROYED(); + DCHECK(!RuntimeEnabledFeatures::LayoutNewOverflowLogicEnabled()); LayoutUnit left = RuntimeEnabledFeatures::LayoutNGNoLocationEnabled() ? PhysicalLocation().left : Location().X(); @@ -1070,6 +1071,7 @@ DISABLE_CFI_PERF int LayoutBox::PixelSnappedClientHeight() const { NOT_DESTROYED(); + DCHECK(!RuntimeEnabledFeatures::LayoutNewOverflowLogicEnabled()); LayoutUnit top = RuntimeEnabledFeatures::LayoutNGNoLocationEnabled() ? PhysicalLocation().top : Location().Y(); @@ -1156,6 +1158,7 @@ int LayoutBox::PixelSnappedScrollWidth() const { NOT_DESTROYED(); + DCHECK(!RuntimeEnabledFeatures::LayoutNewOverflowLogicEnabled()); LayoutUnit left = RuntimeEnabledFeatures::LayoutNGNoLocationEnabled() ? PhysicalLocation().left : Location().X(); @@ -1164,6 +1167,7 @@ int LayoutBox::PixelSnappedScrollHeight() const { NOT_DESTROYED(); + DCHECK(!RuntimeEnabledFeatures::LayoutNewOverflowLogicEnabled()); LayoutUnit top = RuntimeEnabledFeatures::LayoutNGNoLocationEnabled() ? PhysicalLocation().top : Location().Y();
diff --git a/third_party/blink/renderer/core/layout/layout_box.h b/third_party/blink/renderer/core/layout/layout_box.h index 7b5eb8b7..f487fae8 100644 --- a/third_party/blink/renderer/core/layout/layout_box.h +++ b/third_party/blink/renderer/core/layout/layout_box.h
@@ -1011,11 +1011,17 @@ bool HasScrollableOverflowX() const { NOT_DESTROYED(); + if (RuntimeEnabledFeatures::LayoutNewOverflowLogicEnabled()) { + return ScrollsOverflowX() && ScrollWidth() != ClientWidth(); + } return ScrollsOverflowX() && PixelSnappedScrollWidth() != PixelSnappedClientWidth(); } bool HasScrollableOverflowY() const { NOT_DESTROYED(); + if (RuntimeEnabledFeatures::LayoutNewOverflowLogicEnabled()) { + return ScrollsOverflowY() && ScrollHeight() != ClientHeight(); + } return ScrollsOverflowY() && PixelSnappedScrollHeight() != PixelSnappedClientHeight(); }
diff --git a/third_party/blink/renderer/core/layout/layout_inline.cc b/third_party/blink/renderer/core/layout/layout_inline.cc index d208ec1..1a2eb86 100644 --- a/third_party/blink/renderer/core/layout/layout_inline.cc +++ b/third_party/blink/renderer/core/layout/layout_inline.cc
@@ -602,7 +602,7 @@ // Fragment traversal requires a target fragment to be specified, // unless there's only one. DCHECK(!CanTraversePhysicalFragments() || target_fragment_idx >= 0 || - !FirstFragment().NextFragment()); + !IsFragmented()); // Convert from inline fragment index to container fragment index, as the // inline may not start in the first fragment generated for the inline // formatting context.
diff --git a/third_party/blink/renderer/core/layout/layout_object.cc b/third_party/blink/renderer/core/layout/layout_object.cc index c6731c2..9bb8aa17 100644 --- a/third_party/blink/renderer/core/layout/layout_object.cc +++ b/third_party/blink/renderer/core/layout/layout_object.cc
@@ -2234,8 +2234,9 @@ while (!property_container->FirstFragment().HasLocalBorderBoxProperties()) { property_container = property_container->Container(skip_info); if (!property_container || (skip_info && skip_info->AncestorSkipped()) || - property_container->FirstFragment().NextFragment()) + property_container->IsFragmented()) { return nullptr; + } } if (container_properties) { if (property_container == this) {
diff --git a/third_party/blink/renderer/core/layout/layout_tree_as_text.cc b/third_party/blink/renderer/core/layout/layout_tree_as_text.cc index f00b17da..0c0578bd 100644 --- a/third_party/blink/renderer/core/layout/layout_tree_as_text.cc +++ b/third_party/blink/renderer/core/layout/layout_tree_as_text.cc
@@ -337,7 +337,7 @@ static void WritePaintProperties(WTF::TextStream& ts, const LayoutObject& o, int indent) { - bool has_fragments = o.FirstFragment().NextFragment(); + bool has_fragments = o.IsFragmented(); if (has_fragments) { WriteIndent(ts, indent); ts << "fragments:\n"; @@ -482,15 +482,14 @@ ts << " scrollX " << scroll_position.x(); if (scroll_position.y()) ts << " scrollY " << scroll_position.y(); - if (layer.GetLayoutBox() && - layer.GetLayoutBox()->PixelSnappedClientWidth() != - layer.GetLayoutBox()->PixelSnappedScrollWidth()) - ts << " scrollWidth " << layer.GetLayoutBox()->PixelSnappedScrollWidth(); - if (layer.GetLayoutBox() && - layer.GetLayoutBox()->PixelSnappedClientHeight() != - layer.GetLayoutBox()->PixelSnappedScrollHeight()) - ts << " scrollHeight " - << layer.GetLayoutBox()->PixelSnappedScrollHeight(); + if (layer.GetLayoutBox() && layer.GetLayoutBox()->ClientWidth() != + layer.GetLayoutBox()->ScrollWidth()) { + ts << " scrollWidth " << layer.GetLayoutBox()->ScrollWidth(); + } + if (layer.GetLayoutBox() && layer.GetLayoutBox()->ClientHeight() != + layer.GetLayoutBox()->ScrollHeight()) { + ts << " scrollHeight " << layer.GetLayoutBox()->ScrollHeight(); + } } if (paint_phase == kLayerPaintPhaseBackground)
diff --git a/third_party/blink/renderer/core/paint/link_highlight_impl.cc b/third_party/blink/renderer/core/paint/link_highlight_impl.cc index 20fea98..23d68e6c 100644 --- a/third_party/blink/renderer/core/paint/link_highlight_impl.cc +++ b/third_party/blink/renderer/core/paint/link_highlight_impl.cc
@@ -301,7 +301,7 @@ bool use_rounded_rects = !node_->GetDocument() .GetSettings() ->GetMockGestureTapHighlightsEnabled() && - !object->FirstFragment().NextFragment(); + !object->IsFragmented(); wtf_size_t index = 0; for (FragmentDataIterator iterator(*object); !iterator.IsDone(); index++) {
diff --git a/third_party/blink/renderer/core/paint/paint_layer.cc b/third_party/blink/renderer/core/paint/paint_layer.cc index cb5c0db..7cb4572 100644 --- a/third_party/blink/renderer/core/paint/paint_layer.cc +++ b/third_party/blink/renderer/core/paint/paint_layer.cc
@@ -1686,8 +1686,7 @@ // As an optimization, pass nullptr as the new container_fragment if this // layer has only one fragment. const auto* new_container_fragment = - GetLayoutObject().FirstFragment().NextFragment() ? &local_fragment - : nullptr; + GetLayoutObject().IsFragmented() ? &local_fragment : nullptr; return HitTestLayer(*this, new_container_fragment, result, new_recursion_data, /*applied_transform*/ true, &new_transform_state, z_offset, overflow_controls_only);
diff --git a/third_party/blink/renderer/core/paint/paint_layer_painter.cc b/third_party/blink/renderer/core/paint/paint_layer_painter.cc index 92f0634a..9d9099161 100644 --- a/third_party/blink/renderer/core/paint/paint_layer_painter.cc +++ b/third_party/blink/renderer/core/paint/paint_layer_painter.cc
@@ -171,7 +171,7 @@ !paint_layer_.IsUnderSVGHiddenContainer() && is_self_painting_layer; PaintResult result = kFullyPainted; - if (object.FirstFragment().NextFragment() || + if (object.IsFragmented() || // When printing, the LayoutView's background should extend infinitely // regardless of LayoutView's visual rect, so don't check intersection // between the visual rect and the cull rect (custom for each page).
diff --git a/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc b/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc index 1168bda..f1c6fcc 100644 --- a/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc +++ b/third_party/blink/renderer/core/paint/paint_property_tree_builder.cc
@@ -3580,8 +3580,9 @@ // This fast path does not support iterating over each fragment, so do not // run the fast path in the presence of fragmentation. - if (object.FirstFragment().NextFragment()) + if (object.IsFragmented()) { return false; + } auto* properties = object.FirstFragment().PaintProperties(); // Cannot directly update properties if they have not been created yet. @@ -3606,8 +3607,9 @@ // This fast path does not support iterating over each fragment, so do not // run the fast path in the presence of fragmentation. - if (object.FirstFragment().NextFragment()) + if (object.IsFragmented()) { return false; + } auto* properties = object.FirstFragment().PaintProperties(); // Cannot directly update properties if they have not been created yet.
diff --git a/third_party/blink/renderer/core/paint/paint_property_tree_builder_test.cc b/third_party/blink/renderer/core/paint/paint_property_tree_builder_test.cc index 577fc66c..0d2f069c 100644 --- a/third_party/blink/renderer/core/paint/paint_property_tree_builder_test.cc +++ b/third_party/blink/renderer/core/paint/paint_property_tree_builder_test.cc
@@ -4302,12 +4302,12 @@ // top-left of the border box. EXPECT_EQ(PhysicalOffset(8, 8), target1->FirstFragment().PaintOffset()); // |target1| is only in the first column. - EXPECT_FALSE(target1->FirstFragment().NextFragment()); + EXPECT_FALSE(target1->IsFragmented()); LayoutObject* target2 = GetLayoutObjectByElementId("target2"); EXPECT_EQ(PhysicalOffset(158, 8), target2->FirstFragment().PaintOffset()); // |target2| is only in the second column. - EXPECT_FALSE(target2->FirstFragment().NextFragment()); + EXPECT_FALSE(target2->IsFragmented()); } TEST_P(PaintPropertyTreeBuilderTest, @@ -4367,9 +4367,9 @@ LayoutObject* first = GetLayoutObjectByElementId("first"); LayoutObject* second = GetLayoutObjectByElementId("second"); EXPECT_EQ(PhysicalOffset(), first->FirstFragment().PaintOffset()); - EXPECT_FALSE(first->FirstFragment().NextFragment()); + EXPECT_FALSE(first->IsFragmented()); EXPECT_EQ(PhysicalOffset(70, 0), second->FirstFragment().PaintOffset()); - EXPECT_FALSE(second->FirstFragment().NextFragment()); + EXPECT_FALSE(second->IsFragmented()); }; test();
diff --git a/third_party/blink/renderer/core/scroll/scrollbar_theme_aura.cc b/third_party/blink/renderer/core/scroll/scrollbar_theme_aura.cc index f069a96..7b49c6a5 100644 --- a/third_party/blink/renderer/core/scroll/scrollbar_theme_aura.cc +++ b/third_party/blink/renderer/core/scroll/scrollbar_theme_aura.cc
@@ -139,11 +139,13 @@ } // namespace ScrollbarTheme& ScrollbarTheme::NativeTheme() { - if (OverlayScrollbarsEnabled()) + if (OverlayScrollbarsEnabled()) { return ScrollbarThemeOverlay::GetInstance(); + } - if (FluentScrollbarsEnabled()) + if (FluentScrollbarsEnabled()) { return ScrollbarThemeFluent::GetInstance(); + } DEFINE_STATIC_LOCAL(ScrollbarThemeAura, theme, ()); return theme;
diff --git a/third_party/blink/renderer/core/scroll/scrollbar_theme_fluent.cc b/third_party/blink/renderer/core/scroll/scrollbar_theme_fluent.cc index cfd4748..0220360 100644 --- a/third_party/blink/renderer/core/scroll/scrollbar_theme_fluent.cc +++ b/third_party/blink/renderer/core/scroll/scrollbar_theme_fluent.cc
@@ -4,7 +4,9 @@ #include "third_party/blink/renderer/core/scroll/scrollbar_theme_fluent.h" +#include "base/numerics/safe_conversions.h" #include "third_party/blink/public/platform/web_theme_engine.h" +#include "third_party/blink/renderer/core/scroll/scrollbar.h" #include "third_party/blink/renderer/platform/theme/web_theme_engine_helper.h" #include "third_party/blink/renderer/platform/web_test_support.h" #include "ui/gfx/geometry/rect.h" @@ -30,6 +32,15 @@ ? scrollbar_track_thickness_ : theme_engine->GetSize(WebThemeEngine::kPartScrollbarUpArrow) .height(); + + is_fluent_overlay_scrollbar_enabled_ = + theme_engine->IsFluentOverlayScrollbarEnabled(); + if (!is_fluent_overlay_scrollbar_enabled_) { + return; + } + // Hit testable invisible border around the scrollbar's track. + scrollbar_track_inset_ = theme_engine->GetPaintedScrollbarTrackInset(); + scrollbar_track_thickness_ -= 2 * scrollbar_track_inset_; } int ScrollbarThemeFluent::ScrollbarThickness(float scale_from_dip, @@ -37,8 +48,12 @@ // The difference between track's and thumb's thicknesses should always be // even to have equal thumb offsets from both sides so the thumb can remain // in the middle of the track. Add one pixel if the difference is odd. - const int scrollbar_thickness = - static_cast<int>(scrollbar_track_thickness_ * scale_from_dip); + // TODO(https://crbug.com/1479169): Use ClampRound instead of ClampFloor. + int scrollbar_thickness = + base::ClampFloor(scrollbar_track_thickness_ * scale_from_dip); + if (UsesOverlayScrollbars()) { + scrollbar_thickness += 2 * ScrollbarTrackInsetPx(scale_from_dip); + } return (scrollbar_thickness - ThumbThickness(scale_from_dip)) % 2 != 0 ? scrollbar_thickness + 1 : scrollbar_thickness; @@ -99,4 +114,70 @@ } } +bool ScrollbarThemeFluent::UsesOverlayScrollbars() const { + return is_fluent_overlay_scrollbar_enabled_; +} + +void ScrollbarThemeFluent::PaintTrack(GraphicsContext& context, + const Scrollbar& scrollbar, + const gfx::Rect& rect) { + if (rect.IsEmpty()) { + return; + } + ScrollbarThemeAura::PaintTrack( + context, scrollbar, + UsesOverlayScrollbars() ? InsetTrackRect(scrollbar, rect) : rect); +} + +void ScrollbarThemeFluent::PaintButton(GraphicsContext& context, + const Scrollbar& scrollbar, + const gfx::Rect& rect, + ScrollbarPart part) { + ScrollbarThemeAura::PaintButton( + context, scrollbar, + UsesOverlayScrollbars() ? InsetButtonRect(scrollbar, rect, part) : rect, + part); +} + +gfx::Rect ScrollbarThemeFluent::InsetTrackRect(const Scrollbar& scrollbar, + gfx::Rect rect) { + int scaled_track_inset = ScrollbarTrackInsetPx(scrollbar.ScaleFromDIP()); + if (scrollbar.Orientation() == kHorizontalScrollbar) { + rect.Inset(gfx::Insets::TLBR(scaled_track_inset, 0, scaled_track_inset, 0)); + } else { + rect.Inset(gfx::Insets::TLBR(0, scaled_track_inset, 0, scaled_track_inset)); + } + return rect; +} + +gfx::Rect ScrollbarThemeFluent::InsetButtonRect(const Scrollbar& scrollbar, + gfx::Rect rect, + ScrollbarPart part) { + int scaled_track_inset = ScrollbarTrackInsetPx(scrollbar.ScaleFromDIP()); + // Inset all sides of the button *except* the one that borders with the + // scrollbar track. + if (scrollbar.Orientation() == kHorizontalScrollbar) { + if (part == kBackButtonStartPart) { + rect.Inset(gfx::Insets::TLBR(scaled_track_inset, scaled_track_inset, + scaled_track_inset, 0)); + } else { + rect.Inset(gfx::Insets::TLBR(scaled_track_inset, 0, scaled_track_inset, + scaled_track_inset)); + } + } else { + if (part == kBackButtonStartPart) { + rect.Inset(gfx::Insets::TLBR(scaled_track_inset, scaled_track_inset, 0, + scaled_track_inset)); + } else { + rect.Inset(gfx::Insets::TLBR(0, scaled_track_inset, scaled_track_inset, + scaled_track_inset)); + } + } + return rect; +} + +int ScrollbarThemeFluent::ScrollbarTrackInsetPx(float scale) { + return base::ClampRound(scale * scrollbar_track_inset_); +} + } // namespace blink
diff --git a/third_party/blink/renderer/core/scroll/scrollbar_theme_fluent.h b/third_party/blink/renderer/core/scroll/scrollbar_theme_fluent.h index 73be1f0..0aa1b07 100644 --- a/third_party/blink/renderer/core/scroll/scrollbar_theme_fluent.h +++ b/third_party/blink/renderer/core/scroll/scrollbar_theme_fluent.h
@@ -24,6 +24,7 @@ int ScrollbarThickness(float scale_from_dip, EScrollbarWidth scrollbar_width) override; + bool UsesOverlayScrollbars() const override; protected: ScrollbarThemeFluent(); @@ -31,14 +32,34 @@ gfx::Rect ThumbRect(const Scrollbar&) override; gfx::Size ButtonSize(const Scrollbar&) const override; + void PaintTrack(GraphicsContext&, + const Scrollbar&, + const gfx::Rect&) override; + void PaintButton(GraphicsContext& context, + const Scrollbar& scrollbar, + const gfx::Rect& rect, + ScrollbarPart part) override; + private: friend class ScrollbarThemeFluentMock; int ThumbThickness(const float scale_from_dip) const; + // Overlay scrollbar tracks have a invisible length-wise inset to give them a + // floating appearance. + gfx::Rect InsetButtonRect(const Scrollbar& scrollbar, + gfx::Rect rect, + ScrollbarPart part); + gfx::Rect InsetTrackRect(const Scrollbar& scrollbar, gfx::Rect rect); + int ScrollbarTrackInsetPx(float scale); + // Button's height for vertical and width for the horizontal scrollbar. int scrollbar_button_length_; int scrollbar_thumb_thickness_; int scrollbar_track_thickness_; + + // Overlay scrollbar-related variables. + int scrollbar_track_inset_ = 0; + bool is_fluent_overlay_scrollbar_enabled_ = false; }; } // namespace blink
diff --git a/third_party/blink/renderer/core/svg/graphics/filters/svg_fe_image.cc b/third_party/blink/renderer/core/svg/graphics/filters/svg_fe_image.cc index adc3d91..4538a04 100644 --- a/third_party/blink/renderer/core/svg/graphics/filters/svg_fe_image.cc +++ b/third_party/blink/renderer/core/svg/graphics/filters/svg_fe_image.cc
@@ -88,19 +88,28 @@ target_size.height() / viewport_size.height()); } +AffineTransform FEImage::SourceToDestinationTransform( + const LayoutObject& layout_object, + const gfx::RectF& dest_rect) const { + gfx::SizeF viewport_scale(GetFilter()->Scale(), GetFilter()->Scale()); + if (element_->HasRelativeLengths()) { + viewport_scale = + ComputeViewportAdjustmentScale(layout_object, dest_rect.size()); + } + AffineTransform transform; + transform.Translate(dest_rect.x(), dest_rect.y()); + transform.Scale(viewport_scale.width(), viewport_scale.height()); + return transform; +} + gfx::RectF FEImage::MapInputs(const gfx::RectF&) const { gfx::RectF dest_rect = GetFilter()->MapLocalRectToAbsoluteRect(FilterPrimitiveSubregion()); if (const LayoutObject* layout_object = ReferencedLayoutObject()) { - gfx::RectF src_rect = GetLayoutObjectRepaintRect(*layout_object); - if (element_->HasRelativeLengths()) { - const gfx::SizeF viewport_scale = - ComputeViewportAdjustmentScale(*layout_object, dest_rect.size()); - src_rect.Scale(viewport_scale.width(), viewport_scale.height()); - } else { - src_rect = GetFilter()->MapLocalRectToAbsoluteRect(src_rect); - } - src_rect.Offset(dest_rect.OffsetFromOrigin()); + const AffineTransform transform = + SourceToDestinationTransform(*layout_object, dest_rect); + const gfx::RectF src_rect = + transform.MapRect(GetLayoutObjectRepaintRect(*layout_object)); dest_rect.Intersect(src_rect); return dest_rect; } @@ -140,18 +149,10 @@ const LayoutObject& layout_object, const gfx::RectF& dst_rect, const gfx::RectF& crop_rect) { - gfx::RectF src_rect = GetLayoutObjectRepaintRect(layout_object); - AffineTransform transform; - transform.Translate(dst_rect.x(), dst_rect.y()); - if (element_->HasRelativeLengths()) { - const gfx::SizeF viewport_scale = - ComputeViewportAdjustmentScale(layout_object, dst_rect.size()); - src_rect.Scale(viewport_scale.width(), viewport_scale.height()); - transform.Scale(viewport_scale.width(), viewport_scale.height()); - } else { - src_rect = GetFilter()->MapLocalRectToAbsoluteRect(src_rect); - } - src_rect.Offset(dst_rect.OffsetFromOrigin()); + const AffineTransform transform = + SourceToDestinationTransform(layout_object, dst_rect); + const gfx::RectF src_rect = + transform.MapRect(GetLayoutObjectRepaintRect(layout_object)); // Intersect with the (transformed) source rect to remove "empty" bits of the // image. const gfx::RectF cull_rect = gfx::IntersectRects(crop_rect, src_rect);
diff --git a/third_party/blink/renderer/core/svg/graphics/filters/svg_fe_image.h b/third_party/blink/renderer/core/svg/graphics/filters/svg_fe_image.h index dad782fd..9dd98cd 100644 --- a/third_party/blink/renderer/core/svg/graphics/filters/svg_fe_image.h +++ b/third_party/blink/renderer/core/svg/graphics/filters/svg_fe_image.h
@@ -28,6 +28,7 @@ namespace blink { +class AffineTransform; class Image; class LayoutObject; class SVGElement; @@ -55,6 +56,9 @@ return kFilterEffectTypeImage; } + AffineTransform SourceToDestinationTransform( + const LayoutObject& layout_object, + const gfx::RectF& dest_rect) const; gfx::RectF MapInputs(const gfx::RectF&) const override; sk_sp<PaintFilter> CreateImageFilter() override;
diff --git a/third_party/blink/renderer/core/url_pattern/url_pattern_fuzzer.cc b/third_party/blink/renderer/core/url_pattern/url_pattern_fuzzer.cc index eb8e832..bc56df7d4 100644 --- a/third_party/blink/renderer/core/url_pattern/url_pattern_fuzzer.cc +++ b/third_party/blink/renderer/core/url_pattern/url_pattern_fuzzer.cc
@@ -20,7 +20,7 @@ auto* input = MakeGarbageCollected<V8URLPatternInput>( String::FromUTF8(reinterpret_cast<const char*>(data), size)); URLPattern::Create(input, exception_state); - V8PerIsolateData::MainThreadIsolate()->RequestGarbageCollectionForTesting( + test_support.GetIsolate()->RequestGarbageCollectionForTesting( v8::Isolate::kFullGarbageCollection); return 0; }
diff --git a/third_party/blink/renderer/modules/ad_auction/ad_auction_data_config.idl b/third_party/blink/renderer/modules/ad_auction/ad_auction_data_config.idl index 9272dff..d0aa07a 100644 --- a/third_party/blink/renderer/modules/ad_auction/ad_auction_data_config.idl +++ b/third_party/blink/renderer/modules/ad_auction/ad_auction_data_config.idl
@@ -5,8 +5,16 @@ // Information about a Bidding and Auction server style auction. // https://github.com/WICG/turtledove/blob/main/FLEDGE_browser_bidding_and_auction_API.md +enum AdAuctionCoordinator { +// Add coordinators here in alphabetical order. + "aws", + "gcp", +}; + dictionary AdAuctionDataConfig { required USVString seller; + // TODO(1473331): Make `coordinator` required. + AdAuctionCoordinator coordinator; }; dictionary AdAuctionData {
diff --git a/third_party/blink/renderer/modules/ad_auction/navigator_auction.cc b/third_party/blink/renderer/modules/ad_auction/navigator_auction.cc index 9d4d26c6..0a761b13 100644 --- a/third_party/blink/renderer/modules/ad_auction/navigator_auction.cc +++ b/third_party/blink/renderer/modules/ad_auction/navigator_auction.cc
@@ -3760,15 +3760,31 @@ return ScriptPromise(); } + mojom::blink::AdAuctionCoordinator coordinator = + mojom::blink::AdAuctionCoordinator::kGCP; + if (config->hasCoordinator()) { + if (config->coordinator() == blink::V8AdAuctionCoordinator::Enum::kGcp) { + coordinator = mojom::blink::AdAuctionCoordinator::kGCP; + } else if (config->coordinator() == + blink::V8AdAuctionCoordinator::Enum::kAws) { + coordinator = mojom::blink::AdAuctionCoordinator::kAWS; + } else { + // This should never happen because the error will be thrown by the IDL + // parser. + NOTREACHED_NORETURN(); + } + } + auto* resolver = MakeGarbageCollected<ScriptPromiseResolver>( script_state, exception_state.GetContext()); ScriptPromise promise = resolver->Promise(); ad_auction_service_->GetInterestGroupAdAuctionData( - seller, resolver->WrapCallbackInScriptScope(WTF::BindOnce( - &NavigatorAuction::GetInterestGroupAdAuctionDataComplete, - WrapPersistent(this)))); + seller, coordinator, + resolver->WrapCallbackInScriptScope(WTF::BindOnce( + &NavigatorAuction::GetInterestGroupAdAuctionDataComplete, + WrapPersistent(this)))); return promise; }
diff --git a/third_party/blink/renderer/modules/peerconnection/adapters/sctp_transport_proxy.cc b/third_party/blink/renderer/modules/peerconnection/adapters/sctp_transport_proxy.cc index 32b75a98..e9be331 100644 --- a/third_party/blink/renderer/modules/peerconnection/adapters/sctp_transport_proxy.cc +++ b/third_party/blink/renderer/modules/peerconnection/adapters/sctp_transport_proxy.cc
@@ -44,20 +44,20 @@ : proxy_thread_(std::move(proxy_thread)), host_thread_(std::move(host_thread)), sctp_transport_(std::move(sctp_transport)), - delegate_(delegate) {} + delegate_(MakeUnwrappingCrossThreadHandle(delegate)) {} void SctpTransportProxy::StartOnHostThread() { DCHECK(host_thread_->BelongsToCurrentThread()); sctp_transport_->RegisterObserver(this); PostCrossThreadTask( *proxy_thread_, FROM_HERE, - CrossThreadBindOnce(&Delegate::OnStartCompleted, delegate_, + CrossThreadBindOnce(&Delegate::OnStartCompleted, + MakeUnwrappingCrossThreadHandle(delegate_), sctp_transport_->Information())); } void SctpTransportProxy::OnStateChange(webrtc::SctpTransportInformation info) { DCHECK(host_thread_->BelongsToCurrentThread()); - DCHECK(delegate_); // Closed is the last state that can happen, so unregister when we see this. // Unregistering allows us to safely delete the proxy independent of the // state of the webrtc::SctpTransport. @@ -66,10 +66,11 @@ } PostCrossThreadTask( *proxy_thread_, FROM_HERE, - CrossThreadBindOnce(&Delegate::OnStateChange, delegate_, info)); + CrossThreadBindOnce(&Delegate::OnStateChange, + MakeUnwrappingCrossThreadHandle(delegate_), info)); if (info.state() == webrtc::SctpTransportState::kClosed) { // Don't hold on to |delegate| any more. - delegate_ = nullptr; + delegate_.Clear(); } }
diff --git a/third_party/blink/renderer/modules/peerconnection/adapters/sctp_transport_proxy.h b/third_party/blink/renderer/modules/peerconnection/adapters/sctp_transport_proxy.h index 3152f9b7..969d601 100644 --- a/third_party/blink/renderer/modules/peerconnection/adapters/sctp_transport_proxy.h +++ b/third_party/blink/renderer/modules/peerconnection/adapters/sctp_transport_proxy.h
@@ -8,7 +8,7 @@ #include "base/memory/scoped_refptr.h" #include "base/task/single_thread_task_runner.h" -#include "third_party/blink/renderer/platform/heap/cross_thread_persistent.h" +#include "third_party/blink/renderer/platform/heap/cross_thread_handle.h" #include "third_party/blink/renderer/platform/heap/garbage_collected.h" #include "third_party/blink/renderer/platform/heap/visitor.h" #include "third_party/webrtc/api/sctp_transport_interface.h" @@ -77,7 +77,7 @@ const scoped_refptr<base::SingleThreadTaskRunner> proxy_thread_; const scoped_refptr<base::SingleThreadTaskRunner> host_thread_; const rtc::scoped_refptr<webrtc::SctpTransportInterface> sctp_transport_; - CrossThreadPersistent<Delegate> delegate_; + UnwrappingCrossThreadHandle<Delegate> delegate_; }; } // namespace blink
diff --git a/third_party/blink/renderer/modules/webcodecs/audio_data_copy_to_fuzzer.cc b/third_party/blink/renderer/modules/webcodecs/audio_data_copy_to_fuzzer.cc index f02d2cf..306fe24 100644 --- a/third_party/blink/renderer/modules/webcodecs/audio_data_copy_to_fuzzer.cc +++ b/third_party/blink/renderer/modules/webcodecs/audio_data_copy_to_fuzzer.cc
@@ -27,7 +27,8 @@ }(); // Request a full GC upon returning. - auto scoped_gc = MakeScopedGarbageCollectionRequest(); + auto scoped_gc = + MakeScopedGarbageCollectionRequest(test_support.GetIsolate()); ScriptState* script_state = ToScriptStateForMainWorld(&page_holder->GetFrame());
diff --git a/third_party/blink/renderer/modules/webcodecs/audio_decoder_fuzzer.cc b/third_party/blink/renderer/modules/webcodecs/audio_decoder_fuzzer.cc index c9831883..ebb181f7 100644 --- a/third_party/blink/renderer/modules/webcodecs/audio_decoder_fuzzer.cc +++ b/third_party/blink/renderer/modules/webcodecs/audio_decoder_fuzzer.cc
@@ -37,7 +37,8 @@ }(); // Request a full GC upon returning. - auto scoped_gc = MakeScopedGarbageCollectionRequest(); + auto scoped_gc = + MakeScopedGarbageCollectionRequest(test_support.GetIsolate()); // // NOTE: GC objects that need to survive iterations of the loop below
diff --git a/third_party/blink/renderer/modules/webcodecs/audio_encoder_fuzzer.cc b/third_party/blink/renderer/modules/webcodecs/audio_encoder_fuzzer.cc index e5ef975..8ac0b3a 100644 --- a/third_party/blink/renderer/modules/webcodecs/audio_encoder_fuzzer.cc +++ b/third_party/blink/renderer/modules/webcodecs/audio_encoder_fuzzer.cc
@@ -157,7 +157,8 @@ }(); // Request a full GC upon returning. - auto scoped_gc = MakeScopedGarbageCollectionRequest(); + auto scoped_gc = + MakeScopedGarbageCollectionRequest(test_support.GetIsolate()); #if HAS_AAC_ENCODER base::test::ScopedFeatureList platform_aac(media::kPlatformAudioEncoder);
diff --git a/third_party/blink/renderer/modules/webcodecs/fuzzer_utils.cc b/third_party/blink/renderer/modules/webcodecs/fuzzer_utils.cc index a48dfcc8..6e7d0e2 100644 --- a/third_party/blink/renderer/modules/webcodecs/fuzzer_utils.cc +++ b/third_party/blink/renderer/modules/webcodecs/fuzzer_utils.cc
@@ -57,18 +57,21 @@ } // namespace -base::ScopedClosureRunner MakeScopedGarbageCollectionRequest() { - return base::ScopedClosureRunner(WTF::BindOnce([]() { - // Request a V8 GC. Oilpan will be invoked by the GC epilogue. - // - // Multiple GCs may be required to ensure everything is collected (due to - // a chain of persistent handles), so some objects may not be collected - // until a subsequent iteration. This is slow enough as is, so we compromise - // on one major GC, as opposed to the 5 used in V8GCController for unit - // tests. - V8PerIsolateData::MainThreadIsolate()->RequestGarbageCollectionForTesting( - v8::Isolate::kFullGarbageCollection); - })); +base::ScopedClosureRunner MakeScopedGarbageCollectionRequest( + v8::Isolate* isolate) { + return base::ScopedClosureRunner(WTF::BindOnce( + [](v8::Isolate* isolate) { + // Request a V8 GC. Oilpan will be invoked by the GC epilogue. + // + // Multiple GCs may be required to ensure everything is collected (due + // to a chain of persistent handles), so some objects may not be + // collected until a subsequent iteration. This is slow enough as is, so + // we compromise on one major GC, as opposed to the 5 used in + // V8GCController for unit tests. + isolate->RequestGarbageCollectionForTesting( + v8::Isolate::kFullGarbageCollection); + }, + WTF::Unretained(isolate))); } FakeFunction::FakeFunction(std::string name) : name_(std::move(name)) {}
diff --git a/third_party/blink/renderer/modules/webcodecs/fuzzer_utils.h b/third_party/blink/renderer/modules/webcodecs/fuzzer_utils.h index a630bf4..87d4356 100644 --- a/third_party/blink/renderer/modules/webcodecs/fuzzer_utils.h +++ b/third_party/blink/renderer/modules/webcodecs/fuzzer_utils.h
@@ -21,6 +21,7 @@ #include "third_party/blink/renderer/modules/webcodecs/fuzzer_inputs.pb.h" #include "third_party/blink/renderer/modules/webcodecs/video_frame.h" #include "third_party/blink/renderer/platform/wtf/text/wtf_string.h" +#include "v8/include/v8-forward.h" #include <string> @@ -33,7 +34,7 @@ class DOMRectInit; class PlaneLayout; -base::ScopedClosureRunner MakeScopedGarbageCollectionRequest(); +base::ScopedClosureRunner MakeScopedGarbageCollectionRequest(v8::Isolate*); class FakeFunction : public ScriptFunction::Callable { public:
diff --git a/third_party/blink/renderer/modules/webcodecs/image_decoder_fuzzer.cc b/third_party/blink/renderer/modules/webcodecs/image_decoder_fuzzer.cc index 8ceab1a..cde1f68 100644 --- a/third_party/blink/renderer/modules/webcodecs/image_decoder_fuzzer.cc +++ b/third_party/blink/renderer/modules/webcodecs/image_decoder_fuzzer.cc
@@ -86,7 +86,8 @@ }(); // Request a full GC upon returning. - auto scoped_gc = MakeScopedGarbageCollectionRequest(); + auto scoped_gc = + MakeScopedGarbageCollectionRequest(test_support.GetIsolate()); // // NOTE: GC objects that need to survive iterations of the loop below
diff --git a/third_party/blink/renderer/modules/webcodecs/video_decoder_fuzzer.cc b/third_party/blink/renderer/modules/webcodecs/video_decoder_fuzzer.cc index 7c9ac92..c12e61e 100644 --- a/third_party/blink/renderer/modules/webcodecs/video_decoder_fuzzer.cc +++ b/third_party/blink/renderer/modules/webcodecs/video_decoder_fuzzer.cc
@@ -37,7 +37,8 @@ }(); // Request a full GC upon returning. - auto scoped_gc = MakeScopedGarbageCollectionRequest(); + auto scoped_gc = + MakeScopedGarbageCollectionRequest(test_support.GetIsolate()); // // NOTE: GC objects that need to survive iterations of the loop below
diff --git a/third_party/blink/renderer/modules/webcodecs/video_encoder_fuzzer.cc b/third_party/blink/renderer/modules/webcodecs/video_encoder_fuzzer.cc index 942510a..1a66890 100644 --- a/third_party/blink/renderer/modules/webcodecs/video_encoder_fuzzer.cc +++ b/third_party/blink/renderer/modules/webcodecs/video_encoder_fuzzer.cc
@@ -39,7 +39,8 @@ }(); // Request a full GC upon returning. - auto scoped_gc = MakeScopedGarbageCollectionRequest(); + auto scoped_gc = + MakeScopedGarbageCollectionRequest(test_support.GetIsolate()); // // NOTE: GC objects that need to survive iterations of the loop below
diff --git a/third_party/blink/renderer/modules/webcodecs/video_frame_copy_to_fuzzer.cc b/third_party/blink/renderer/modules/webcodecs/video_frame_copy_to_fuzzer.cc index 39106c70..3a5db4f 100644 --- a/third_party/blink/renderer/modules/webcodecs/video_frame_copy_to_fuzzer.cc +++ b/third_party/blink/renderer/modules/webcodecs/video_frame_copy_to_fuzzer.cc
@@ -29,7 +29,8 @@ }(); // Request a full GC upon returning. - auto scoped_gc = MakeScopedGarbageCollectionRequest(); + auto scoped_gc = + MakeScopedGarbageCollectionRequest(test_support.GetIsolate()); ScriptState* script_state = ToScriptStateForMainWorld(&page_holder->GetFrame());
diff --git a/third_party/blink/renderer/platform/runtime_enabled_features.json5 b/third_party/blink/renderer/platform/runtime_enabled_features.json5 index 54bdd442..3bdd9c4 100644 --- a/third_party/blink/renderer/platform/runtime_enabled_features.json5 +++ b/third_party/blink/renderer/platform/runtime_enabled_features.json5
@@ -2169,6 +2169,10 @@ status: "stable", }, { + name: "LayoutNewOverflowLogic", + status: "stable", + }, + { name: "LayoutNewSnapLogic", status: "stable", },
diff --git a/third_party/blink/renderer/platform/testing/blink_fuzzer_test_support.cc b/third_party/blink/renderer/platform/testing/blink_fuzzer_test_support.cc index f48628cc..9cdc441 100644 --- a/third_party/blink/renderer/platform/testing/blink_fuzzer_test_support.cc +++ b/third_party/blink/renderer/platform/testing/blink_fuzzer_test_support.cc
@@ -36,4 +36,8 @@ #endif // defined(ADDRESS_SANITIZER) } +v8::Isolate* BlinkFuzzerTestSupport::GetIsolate() { + return content::GetMainThreadIsolateForTestEnvironment(); +} + } // namespace blink
diff --git a/third_party/blink/renderer/platform/testing/blink_fuzzer_test_support.h b/third_party/blink/renderer/platform/testing/blink_fuzzer_test_support.h index 083316e..449cbcc0 100644 --- a/third_party/blink/renderer/platform/testing/blink_fuzzer_test_support.h +++ b/third_party/blink/renderer/platform/testing/blink_fuzzer_test_support.h
@@ -7,6 +7,7 @@ #include "base/at_exit.h" #include "third_party/blink/renderer/platform/wtf/allocator/allocator.h" +#include "v8/include/v8-forward.h" namespace blink { @@ -23,6 +24,8 @@ BlinkFuzzerTestSupport(int argc, char** argv); ~BlinkFuzzerTestSupport(); + v8::Isolate* GetIsolate(); + private: base::AtExitManager at_exit_; };
diff --git a/third_party/blink/renderer/platform/text/platform_locale.cc b/third_party/blink/renderer/platform/text/platform_locale.cc index 088b3b8..768191f 100644 --- a/third_party/blink/renderer/platform/text/platform_locale.cc +++ b/third_party/blink/renderer/platform/text/platform_locale.cc
@@ -371,16 +371,9 @@ DCHECK_EQ(input.Find(IsASCIISpace), WTF::kNotFound); start_index = 0; end_index = input.length(); - if (negative_prefix_.empty() && negative_suffix_.empty()) { - if (input.StartsWith(positive_prefix_) && - input.EndsWith(positive_suffix_)) { - is_negative = false; - start_index = positive_prefix_.length(); - end_index -= positive_suffix_.length(); - } else { - is_negative = true; - } - } else { + const bool negative_empty = + negative_prefix_.empty() && negative_suffix_.empty(); + if (!negative_empty) { // For some locales the negative prefix and/or suffix are preceded or // followed by whitespace. Exclude that for the purposes of this search // since the input string has already been stripped of whitespace. @@ -393,18 +386,21 @@ is_negative = true; start_index = negative_prefix_without_whitespace.length(); end_index -= negative_suffix_without_whitespace.length(); - } else { - is_negative = false; - if (input.StartsWith(positive_prefix_) && - input.EndsWith(positive_suffix_)) { - start_index = positive_prefix_.length(); - end_index -= positive_suffix_.length(); - } else { - return false; - } + return true; } } - return true; + + // Note: Positive prefix and suffix may be empty, in which case this will + // always succeed. + if (input.StartsWith(positive_prefix_) && input.EndsWith(positive_suffix_)) { + is_negative = false; + start_index = positive_prefix_.length(); + end_index -= positive_suffix_.length(); + return true; + } + + is_negative = negative_empty; + return is_negative; } unsigned Locale::MatchedDecimalSymbolIndex(const String& input,
diff --git a/third_party/blink/renderer/platform/theme/web_theme_engine_default.cc b/third_party/blink/renderer/platform/theme/web_theme_engine_default.cc index a249f5b68..d707761f 100644 --- a/third_party/blink/renderer/platform/theme/web_theme_engine_default.cc +++ b/third_party/blink/renderer/platform/theme/web_theme_engine_default.cc
@@ -14,6 +14,7 @@ #include "ui/color/color_provider_utils.h" #include "ui/gfx/color_palette.h" #include "ui/native_theme/native_theme.h" +#include "ui/native_theme/native_theme_features.h" #include "ui/native_theme/overlay_scrollbar_constants_aura.h" namespace blink { @@ -278,6 +279,14 @@ NativeThemePart(part)); } +bool WebThemeEngineDefault::IsFluentOverlayScrollbarEnabled() const { + return ui::IsFluentOverlayScrollbarEnabled(); +} + +int WebThemeEngineDefault::GetPaintedScrollbarTrackInset() const { + return ui::NativeTheme::GetInstanceForWeb()->GetPaintedScrollbarTrackInset(); +} + absl::optional<SkColor> WebThemeEngineDefault::GetSystemColor( WebThemeEngine::SystemThemeColor system_theme_color) const { return ui::NativeTheme::GetInstanceForWeb()->GetSystemThemeColor(
diff --git a/third_party/blink/renderer/platform/theme/web_theme_engine_default.h b/third_party/blink/renderer/platform/theme/web_theme_engine_default.h index 2b753be..a432fa7 100644 --- a/third_party/blink/renderer/platform/theme/web_theme_engine_default.h +++ b/third_party/blink/renderer/platform/theme/web_theme_engine_default.h
@@ -51,6 +51,8 @@ bool UpdateColorProviders(const ui::RendererColorMap& light_colors, const ui::RendererColorMap& dark_colors) override; void EmulateForcedColors(bool is_dark_theme, bool is_web_test) override; + bool IsFluentOverlayScrollbarEnabled() const override; + int GetPaintedScrollbarTrackInset() const override; protected: const ui::ColorProvider* GetColorProviderForPainting(
diff --git a/third_party/blink/renderer/platform/widget/compositing/layer_tree_settings.cc b/third_party/blink/renderer/platform/widget/compositing/layer_tree_settings.cc index 6dd6faea..d6e8852 100644 --- a/third_party/blink/renderer/platform/widget/compositing/layer_tree_settings.cc +++ b/third_party/blink/renderer/platform/widget/compositing/layer_tree_settings.cc
@@ -307,7 +307,6 @@ bool is_threaded, bool is_for_embedded_frame, bool is_for_scalable_page, - bool is_for_web_test, const gfx::Size& initial_screen_size, float initial_device_scale_factor) { const base::CommandLine& cmd = *base::CommandLine::ForCurrentProcess(); @@ -679,8 +678,6 @@ settings.enable_variable_refresh_rate = ::features::IsVariableRefreshRateEnabled(); - settings.is_threaded_web_test = is_for_web_test && is_threaded; - std::tie(settings.tiling_interest_area_padding, settings.skewport_extrapolation_limit_in_screen_pixels) = GetTilingInterestAreaSizes();
diff --git a/third_party/blink/renderer/platform/widget/compositing/layer_tree_settings.h b/third_party/blink/renderer/platform/widget/compositing/layer_tree_settings.h index 7b9b0d26e..7db7809 100644 --- a/third_party/blink/renderer/platform/widget/compositing/layer_tree_settings.h +++ b/third_party/blink/renderer/platform/widget/compositing/layer_tree_settings.h
@@ -20,7 +20,6 @@ bool has_compositor, bool is_for_embedded_frame, bool is_for_scalable_page, - bool is_for_web_test, const gfx::Size& initial_screen_size, float initial_device_scale_factor);
diff --git a/third_party/blink/renderer/platform/widget/input/widget_input_handler_manager.h b/third_party/blink/renderer/platform/widget/input/widget_input_handler_manager.h index d4a4886..9eca4f59 100644 --- a/third_party/blink/renderer/platform/widget/input/widget_input_handler_manager.h +++ b/third_party/blink/renderer/platform/widget/input/widget_input_handler_manager.h
@@ -281,8 +281,6 @@ void HandleInputEventWithLatencyOnInputHandlingThread( std::unique_ptr<WebCoalescedInputEvent>); - void QueueInputProcessedClosure(); - // The kInputBlocking task runner is for tasks which are on the critical path // of showing the effect of an already-received input event, and should be // prioritized above handling new input.
diff --git a/third_party/blink/renderer/platform/widget/widget_base.cc b/third_party/blink/renderer/platform/widget/widget_base.cc index 7f66450c..23ebb09 100644 --- a/third_party/blink/renderer/platform/widget/widget_base.cc +++ b/third_party/blink/renderer/platform/widget/widget_base.cc
@@ -196,8 +196,7 @@ const display::ScreenInfo& screen_info = screen_infos.current(); default_settings = GenerateLayerTreeSettings( compositing_thread_scheduler, is_embedded_, is_for_scalable_page_, - WebTestMode(), screen_info.rect.size(), - screen_info.device_scale_factor); + screen_info.rect.size(), screen_info.device_scale_factor); settings = &default_settings.value(); } screen_infos_ = screen_infos; @@ -644,8 +643,7 @@ // state changes. const cc::LayerTreeSettings& settings = LayerTreeHost()->GetSettings(); if (settings.disable_frame_rate_limit || - settings.enable_variable_refresh_rate || - (for_web_tests && ThreadScheduler::CompositorThreadScheduler())) { + settings.enable_variable_refresh_rate) { params->use_begin_frame_presentation_feedback = base::FeatureList::IsEnabled( features::kUseBeginFramePresentationFeedback);
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-syntax-error-expected.txt b/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-syntax-error-expected.txt index 50f74a76..b42d5e5 100644 --- a/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-syntax-error-expected.txt +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-syntax-error-expected.txt
@@ -1,9 +1,9 @@ -Verifies that receiving a set-cookie header with invalid syntax sends a Network.ResponseReceivedExtraInfo event with the blocked cookie. +Verifies that receiving a set-cookie header with only whitespace sends a Network.ResponseReceivedExtraInfo event with the blocked cookie. -Invalid syntax blocked set-cookies:[ +NoCookieContent blocked set-cookies:[ [0] : { blockedReasons : [ - [0] : SyntaxError + [0] : NoCookieContent ] cookieLine : }
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-syntax-error.js b/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-syntax-error.js index 2461bd6..a18de796 100644 --- a/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-syntax-error.js +++ b/third_party/blink/web_tests/http/tests/inspector-protocol/network/blocked-setcookie-syntax-error.js
@@ -1,14 +1,14 @@ (async function(testRunner) { const {page, session, dp} = await testRunner.startBlank( - `Verifies that receiving a set-cookie header with invalid syntax sends a Network.ResponseReceivedExtraInfo event with the blocked cookie.\n`); + `Verifies that receiving a set-cookie header with only whitespace sends a Network.ResponseReceivedExtraInfo event with the blocked cookie.\n`); await dp.Network.enable(); - const setCookieInvalidSyntax = 'https://cookie.test:8443/inspector-protocol/network/resources/set-cookie-invalid-syntax.php'; + const setCookieInvalidSyntax = 'https://cookie.test:8443/inspector-protocol/network/resources/set-cookie-no-cookie-content.php'; const helper = (await testRunner.loadScript('resources/extra-info-helper.js'))(dp, session); const {requestExtraInfo, responseExtraInfo} = await helper.navigateWithExtraInfo(setCookieInvalidSyntax); - testRunner.log(responseExtraInfo.params.blockedCookies, 'Invalid syntax blocked set-cookies:'); + testRunner.log(responseExtraInfo.params.blockedCookies, 'NoCookieContent blocked set-cookies:'); testRunner.completeTest(); })
diff --git a/third_party/blink/web_tests/http/tests/inspector-protocol/network/resources/set-cookie-invalid-syntax.php b/third_party/blink/web_tests/http/tests/inspector-protocol/network/resources/set-cookie-no-cookie-content.php similarity index 100% rename from third_party/blink/web_tests/http/tests/inspector-protocol/network/resources/set-cookie-invalid-syntax.php rename to third_party/blink/web_tests/http/tests/inspector-protocol/network/resources/set-cookie-no-cookie-content.php
diff --git a/third_party/catapult b/third_party/catapult index 693c3fa..c9ccea1 160000 --- a/third_party/catapult +++ b/third_party/catapult
@@ -1 +1 @@ -Subproject commit 693c3fa3c2b617718dbbe1abd2ef0fc0910380b6 +Subproject commit c9ccea1a729cb6952cabdb42c192b87a9a08ba3a
diff --git a/third_party/chromium-variations b/third_party/chromium-variations index c7a1ed2..6099a97 160000 --- a/third_party/chromium-variations +++ b/third_party/chromium-variations
@@ -1 +1 @@ -Subproject commit c7a1ed20f78b82abdad55681d847beb9b965a3eb +Subproject commit 6099a9750a5666fa63898f7d004b36783d28e64e
diff --git a/third_party/depot_tools b/third_party/depot_tools index 4dac5d6..50b27a5 160000 --- a/third_party/depot_tools +++ b/third_party/depot_tools
@@ -1 +1 @@ -Subproject commit 4dac5d6b4b39a26d72698e701e59c47278d66fec +Subproject commit 50b27a5308a405646b627691b48c55e007eb5418
diff --git a/third_party/devtools-frontend-internal b/third_party/devtools-frontend-internal index 616289d..69e043f 160000 --- a/third_party/devtools-frontend-internal +++ b/third_party/devtools-frontend-internal
@@ -1 +1 @@ -Subproject commit 616289d464d11fbcc8c8b063af4d2b6c372f5e14 +Subproject commit 69e043f071f8ff003d40c9fe6ca3f266087119a5
diff --git a/third_party/devtools-frontend/src b/third_party/devtools-frontend/src index 614e1c8..257cb64 160000 --- a/third_party/devtools-frontend/src +++ b/third_party/devtools-frontend/src
@@ -1 +1 @@ -Subproject commit 614e1c8242dfa60a241368d72c31384c14afaba3 +Subproject commit 257cb6402543b90ddd45043d94242b1824238e48
diff --git a/third_party/libavif/src b/third_party/libavif/src index d1c26fa..3669d47 160000 --- a/third_party/libavif/src +++ b/third_party/libavif/src
@@ -1 +1 @@ -Subproject commit d1c26facaf5a8a97919ceee06814d05d10e25622 +Subproject commit 3669d47e1f9f3ea5ab0e3a923b15fad185ac2209
diff --git a/third_party/nearby/README.chromium b/third_party/nearby/README.chromium index 5b22fdf..403bb36 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: 94df1ffc4c00ff142d2f1f7c6c603f80d922bca4 +Version: 8846f8b57e53276687955562f58d2bfdbf63b3a9 License: Apache 2.0 License File: LICENSE Security Critical: yes
diff --git a/third_party/nearby/src b/third_party/nearby/src index 94df1ff..8846f8b 160000 --- a/third_party/nearby/src +++ b/third_party/nearby/src
@@ -1 +1 @@ -Subproject commit 94df1ffc4c00ff142d2f1f7c6c603f80d922bca4 +Subproject commit 8846f8b57e53276687955562f58d2bfdbf63b3a9
diff --git a/third_party/skia b/third_party/skia index c641367..0577d06 160000 --- a/third_party/skia +++ b/third_party/skia
@@ -1 +1 @@ -Subproject commit c6413673d2d4d6e3a4837d3cecfe152243042415 +Subproject commit 0577d064a86e401ad61ee1ea4203b97ce84cf50c
diff --git a/tools/binary_size/libsupersize/archive.py b/tools/binary_size/libsupersize/archive.py index 518bc49..5b8248d9 100644 --- a/tools/binary_size/libsupersize/archive.py +++ b/tools/binary_size/libsupersize/archive.py
@@ -538,6 +538,10 @@ help='Custom path to the root source directory.') group.add_argument('--output-directory', help='Path to the root build directory.') + group.add_argument('--symbols-dir', + default='lib.unstripped', + help='Relative path containing unstripped .so files ' + '(for symbols) w.r.t. the output directory.') group.add_argument('--no-string-literals', action='store_true', help=('Do not create symbols for string literals ' @@ -684,8 +688,8 @@ return map_path -def _CreateNativeSpecs(*, tentative_output_dir, apk_infolist, elf_path, - map_path, abi_filters, auto_abi_filters, +def _CreateNativeSpecs(*, tentative_output_dir, symbols_dir, apk_infolist, + elf_path, map_path, abi_filters, auto_abi_filters, track_string_literals, ignore_linker_map, json_config, on_config_error): if ignore_linker_map: @@ -737,7 +741,7 @@ # 'crazy.' when there is no longer interest in size comparisons for # these pre-N APKs. cur_elf_path = os.path.join( - tentative_output_dir, 'lib.unstripped', + tentative_output_dir, symbols_dir, posixpath.basename(apk_so_path.replace('crazy.', ''))) if os.path.exists(cur_elf_path): logging.debug('Detected elf_path=%s', cur_elf_path) @@ -910,6 +914,7 @@ auto_abi_filters = not abi_filters and split_name == 'base' abi_filters, native_specs = _CreateNativeSpecs( tentative_output_dir=top_args.output_directory, + symbols_dir=sub_args.symbols_dir, apk_infolist=apk_infolist, elf_path=sub_args.elf_file or aux_elf_file, map_path=sub_args.map_file or aux_map_file,
diff --git a/tools/cast3p/runtime.version b/tools/cast3p/runtime.version index a9d386a..ae9b866 100644 --- a/tools/cast3p/runtime.version +++ b/tools/cast3p/runtime.version
@@ -1 +1 @@ -377328 +380696
diff --git a/tools/mb/mb_config.pyl b/tools/mb/mb_config.pyl index da3c03d..bb231fd 100644 --- a/tools/mb/mb_config.pyl +++ b/tools/mb/mb_config.pyl
@@ -104,7 +104,7 @@ }, 'chromium.accessibility': { - 'fuchsia-x64-accessibility-rel': 'release_bot_fuchsia_reclient', + 'fuchsia-x64-accessibility-rel': 'release_bot_fuchsia_reclient_with_blink_symbol', 'linux-blink-web-tests-force-accessibility-rel': 'release_bot_blink_accessibility_reclient', }, @@ -1048,7 +1048,7 @@ }, 'tryserver.chromium.accessibility': { - 'fuchsia-x64-accessibility-rel': 'release_bot_fuchsia_reclient', + 'fuchsia-x64-accessibility-rel': 'release_bot_fuchsia_reclient_with_blink_symbol', 'linux-blink-web-tests-force-accessibility-rel': 'release_bot_blink_accessibility_reclient', }, @@ -3621,6 +3621,10 @@ 'release_bot_reclient', 'fuchsia', ], + 'release_bot_fuchsia_reclient_with_blink_symbol': [ + 'release_bot_reclient', 'fuchsia', 'blink_symbol', 'minimal_symbols', + ], + 'release_bot_mac_strip_minimal_symbols': [ 'release_bot', 'mac_strip', 'minimal_symbols', ], @@ -3978,6 +3982,10 @@ 'gn_args': 'blink_enable_generated_code_formatting=true' }, + 'blink_symbol': { + 'gn_args': 'blink_symbol_level=1' + }, + 'brya': { 'args_file': '//build/args/chromeos/brya.gni', },
diff --git a/tools/mb/mb_config_expectations/chromium.accessibility.json b/tools/mb/mb_config_expectations/chromium.accessibility.json index ce2b5bf..11f9e6c 100644 --- a/tools/mb/mb_config_expectations/chromium.accessibility.json +++ b/tools/mb/mb_config_expectations/chromium.accessibility.json
@@ -1,9 +1,11 @@ { "fuchsia-x64-accessibility-rel": { "gn_args": { + "blink_symbol_level": 1, "dcheck_always_on": false, "is_component_build": false, "is_debug": false, + "symbol_level": 1, "target_os": "fuchsia", "use_remoteexec": true }
diff --git a/tools/mb/mb_config_expectations/tryserver.chromium.accessibility.json b/tools/mb/mb_config_expectations/tryserver.chromium.accessibility.json index ce2b5bf..11f9e6c 100644 --- a/tools/mb/mb_config_expectations/tryserver.chromium.accessibility.json +++ b/tools/mb/mb_config_expectations/tryserver.chromium.accessibility.json
@@ -1,9 +1,11 @@ { "fuchsia-x64-accessibility-rel": { "gn_args": { + "blink_symbol_level": 1, "dcheck_always_on": false, "is_component_build": false, "is_debug": false, + "symbol_level": 1, "target_os": "fuchsia", "use_remoteexec": true }
diff --git a/tools/metrics/actions/actions.xml b/tools/metrics/actions/actions.xml index bc9124e..1594a51 100644 --- a/tools/metrics/actions/actions.xml +++ b/tools/metrics/actions/actions.xml
@@ -39657,6 +39657,8 @@ <suffix name="WebFeedFollow" label="For Web Feed follow recommendations."/> <suffix name="WebFeedPostFollowDialog" label="For Web Feed successful follow operations."/> + <suffix name="WebFeedPostFollowDialogWithUIUpdate" + label="For Web Feed successful follow operations after the UI update."/> <suffix name="WebUiHelpBubbleTest" label="For WebUiHelpBubbleTest feature."/> <suffix name="WebUITabStrip" label="For the WebUI tab strip."/> <affected-action name="InProductHelp.NotifyEvent.IPH"/>
diff --git a/tools/metrics/histograms/enums.xml b/tools/metrics/histograms/enums.xml index e2e0a6e..49c6b5c3 100644 --- a/tools/metrics/histograms/enums.xml +++ b/tools/metrics/histograms/enums.xml
@@ -44082,6 +44082,9 @@ <int value="4659" label="PercentOrCalcStickyUsedOffset"/> <int value="4660" label="PercentOrCalcRelativeUsedOffset"/> <int value="4661" label="AutoRelativeUsedOffset"/> + <int value="4662" label="ViewportFitContain"/> + <int value="4663" label="ViewportFitCover"/> + <int value="4664" label="ViewportFitCoverOrSafeAreaInsetBottom"/> </enum> <enum name="FeaturePolicyAllowlistType"> @@ -61994,6 +61997,7 @@ label="AutofillDoNotMigrateUnsupportedLocalCards:enabled"/> <int value="-1382918690" label="VirtualKeyboardApi:enabled"/> <int value="-1382671832" label="OmniboxUIExperimentVerticalMargin:enabled"/> + <int value="-1379844383" label="MacLoopbackAudioForCast:enabled"/> <int value="-1378071979" label="CroshSWA:enabled"/> <int value="-1377367284" label="SiteDataImprovements:disabled"/> <int value="-1377186702" label="DesktopIOSPromotion:disabled"/> @@ -62510,6 +62514,7 @@ <int value="-1134420065" label="CriticalPersistedTabData:disabled"/> <int value="-1134412904" label="PrivacySandboxSettings:disabled"/> <int value="-1134307340" label="stop-loading-in-background:enabled"/> + <int value="-1133285806" label="MacLoopbackAudioForScreenShare:disabled"/> <int value="-1132704128" label="AndroidPaymentAppsFilter:disabled"/> <int value="-1131726331" label="BackGestureRefactorAndroid:disabled"/> <int value="-1128981647" label="EnableOAuthIpp:enabled"/> @@ -64211,6 +64216,7 @@ <int value="-282770689" label="ExperimentalWebAppStoragePartitionIsolation:disabled"/> <int value="-281844827" label="AutofillCreditCardAblationExperiment:enabled"/> + <int value="-280129257" label="MacLoopbackAudioForScreenShare:enabled"/> <int value="-280064896" label="HelpAppAppsDiscovery:disabled"/> <int value="-279920685" label="affiliation-based-matching:enabled"/> <int value="-279493876" label="WebVRExperimentalRendering:enabled"/> @@ -66766,6 +66772,7 @@ <int value="996643125" label="EnableAppShortcutSearch:disabled"/> <int value="996701528" label="SystemKeyboardLock:enabled"/> <int value="996987392" label="SearchNavigationPrefetch:disabled"/> + <int value="997264173" label="MacLoopbackAudioForCast:disabled"/> <int value="998748600" label="SyncErrorInfoBarAndroid:disabled"/> <int value="998857679" label="DiscardExceptionsImprovements:enabled"/> <int value="1000045846" label="OverlayNewLayout:disabled"/>
diff --git a/tools/metrics/histograms/metadata/android/histograms.xml b/tools/metrics/histograms/metadata/android/histograms.xml index 740eca0..891d193 100644 --- a/tools/metrics/histograms/metadata/android/histograms.xml +++ b/tools/metrics/histograms/metadata/android/histograms.xml
@@ -5217,67 +5217,6 @@ </summary> </histogram> -<histogram name="Android.WebView.Metrics.PackagesAllowList.ParseStatus" - enum="AppPackageNameAllowlistParseStatus" expires_after="2024-04-01"> - <owner>avvall@chromium.org</owner> - <owner>src/android_webview/OWNERS</owner> - <summary> - Records the result of parsing the apps package names allowlist used to - populate the "app_package_name" field in UMA metrics logs. This is - recorded when the AwAppsPackageNamesAllowlistComponentLoaderPolicy is - successfully loaded by EmbeddedComponentLoader, i.e when ComponentLoaded is - called by the loader. - </summary> -</histogram> - -<histogram name="Android.WebView.Metrics.PackagesAllowList.RecordStatus" - enum="AppPackageNameLoggingRuleStatus" expires_after="2024-03-17"> - <owner>avvall@chromium.org</owner> - <owner>src/android_webview/OWNERS</owner> - <summary> - Records the status of the apps package names allowlist used to populate the - "app_package_name" field in UMA metrics log. The status tracks if - a new version is loaded, a cached one is used or if loading the allowlist - has failed. It's recorded everytime the app package name is queried when a - new metrics log is created. - </summary> -</histogram> - -<histogram - name="Android.WebView.Metrics.PackagesAllowList.ResultReceivingDelay" - units="ms" expires_after="2024-04-01"> - <owner>avvall@chromium.org</owner> - <owner>src/android_webview/OWNERS</owner> - <summary> - Records the time delta between creating a AwMetricsServiceClient instance - during WebView startup and the time when the app package names allowlist is - loaded and looked up. This only records when a new version of the allowlist - is loaded successfully. i.e it's not recorded if the loading the allowlist - fails or if a cached version is used. - </summary> -</histogram> - -<histogram name="Android.WebView.Metrics.PackagesAllowList.ThrottleStatus" - enum="Boolean" expires_after="2024-04-01"> - <owner>avvall@chromium.org</owner> - <owner>src/android_webview/OWNERS</owner> - <summary> - Whether requests to query the app package names allowlist component is - throttled or not. - </summary> -</histogram> - -<histogram name="Android.WebView.Metrics.PackagesAllowList.TimeToExpire" - units="hours" expires_after="2024-04-01"> - <owner>avvall@chromium.org</owner> - <owner>src/android_webview/OWNERS</owner> - <summary> - How long before the app package names allowlist record cached in the client - expires. This is only recorded from Apps that are in the app package names - allowlist. Recorded every time a metrics log is being created. - </summary> -</histogram> - <histogram name="Android.WebView.MixedContent.Mode" enum="WebViewMixedContentMode" expires_after="2024-08-25"> <owner>ntfschr@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/enterprise/histograms.xml b/tools/metrics/histograms/metadata/enterprise/histograms.xml index b342bc94..7b156b3 100644 --- a/tools/metrics/histograms/metadata/enterprise/histograms.xml +++ b/tools/metrics/histograms/metadata/enterprise/histograms.xml
@@ -398,7 +398,7 @@ </histogram> <histogram name="Enterprise.CBCMRealTimeReportEnqueue" - enum="EnterpriseCloudReportingStatusCode" expires_after="2023-10-01"> + enum="EnterpriseCloudReportingStatusCode" expires_after="2024-10-01"> <owner>zmin@chromium.org</owner> <owner>src/chrome/browser/enterprise/reporting/OWNERS</owner> <summary> @@ -408,7 +408,7 @@ </histogram> <histogram name="Enterprise.CBCMRemoteCommand.Executed" - enum="RemoteCommandExecutionStatus" expires_after="2023-10-01"> + enum="RemoteCommandExecutionStatus" expires_after="2024-10-01"> <owner>anthonyvd@chromium.org</owner> <owner>cbe-eng@google.com</owner> <summary> @@ -419,7 +419,7 @@ </histogram> <histogram name="Enterprise.CBCMRemoteCommand.Received" - enum="RemoteCommandReceivedStatus" expires_after="2023-12-31"> + enum="RemoteCommandReceivedStatus" expires_after="2024-10-01"> <owner>anthonyvd@chromium.org</owner> <owner>cbe-eng@google.com</owner> <summary> @@ -431,7 +431,7 @@ </histogram> <histogram name="Enterprise.CBCMRemoteCommandInvalidations" - enum="EnterprisePolicyInvalidations" expires_after="2023-10-01"> + enum="EnterprisePolicyInvalidations" expires_after="2024-10-01"> <owner>anthonyvd@chromium.org</owner> <owner>cbe-eng@google.com</owner> <summary> @@ -454,7 +454,7 @@ </histogram> <histogram name="Enterprise.CloudExtensionRequestUpdated" - enum="EnterpriseCloudExtensionRequestListUpdate" expires_after="2023-10-01"> + enum="EnterpriseCloudExtensionRequestListUpdate" expires_after="2024-10-01"> <owner>zmin@chromium.org</owner> <owner>src/chrome/browser/enterprise/reporting/OWNERS</owner> <summary> @@ -3169,7 +3169,7 @@ </histogram> <histogram name="EnterpriseCheck.IsLocalMachine" enum="Boolean" - expires_after="2023-10-01"> + expires_after="2024-10-01"> <owner>zmin@chromium.org</owner> <owner>pastarmovj@chromium.org</owner> <owner>rogerta@chromium.org</owner> @@ -3180,7 +3180,7 @@ </histogram> <histogram name="EnterpriseCheck.IsLocalUser" enum="Boolean" - expires_after="2023-10-01"> + expires_after="2024-10-01"> <owner>zmin@chromium.org</owner> <owner>pastarmovj@chromium.org</owner> <owner>rogerta@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/feature_engagement/histograms.xml b/tools/metrics/histograms/metadata/feature_engagement/histograms.xml index 076d204..869932a 100644 --- a/tools/metrics/histograms/metadata/feature_engagement/histograms.xml +++ b/tools/metrics/histograms/metadata/feature_engagement/histograms.xml
@@ -431,6 +431,8 @@ summary="proactive Web Feed follow recommendations"/> <variant name="IPH_WebFeedPostFollowDialog" summary="Web Feed successful follow operations"/> + <variant name="IPH_WebFeedPostFollowDialogWithUIUpdate" + summary="Web Feed successful follow operations with UI update"/> <variant name="IPH_WebUiHelpBubbleTest" summary="testing the WebUI help bubble"/> <variant name="IPH_WebUITabStrip" summary="opening the WebUI tab strip"/>
diff --git a/tools/metrics/histograms/metadata/media/histograms.xml b/tools/metrics/histograms/metadata/media/histograms.xml index 4106980..51c411e 100644 --- a/tools/metrics/histograms/metadata/media/histograms.xml +++ b/tools/metrics/histograms/metadata/media/histograms.xml
@@ -581,6 +581,45 @@ </summary> </histogram> +<histogram name="Media.Audio.Capture.SCK.ContentEnumerationTimedOut" + enum="Boolean" expires_after="2024-08-09"> + <owner>mfoltz@chromium.org</owner> + <owner>olka@chromium.org</owner> + <owner>webrtc-audio-uma@google.com</owner> + <summary> + Indicates if SCShareableContent enumeration has timed out during a call to + SCKAudioInputStream::Open(). The timeout exists to prevent a deadlock if the + API is misbehaving. We do not expect any timeouts under normal conditions. + </summary> +</histogram> + +<histogram name="Media.Audio.Capture.SCK.ContentEnumerationTimeMs" units="ms" + expires_after="2024-08-09"> + <owner>mfoltz@chromium.org</owner> + <owner>olka@chromium.org</owner> + <owner>webrtc-audio-uma@google.com</owner> + <summary> + Measures the time required for SCShareableContent enumeration (displays and + open applications/windows) when calling SCKAudioInputStream::Open(). The + duration can vary based on the amount of applications and windows open on + the system. This enumeration is a blocking operation, and as such should + complete as fast as possible. If metrics show long times, the operation + might have to be made asynchronous. + </summary> +</histogram> + +<histogram name="Media.Audio.Capture.SCK.StreamError" units="errorcode" + expires_after="2024-08-09"> + <owner>mfoltz@chromium.org</owner> + <owner>olka@chromium.org</owner> + <owner>webrtc-audio-uma@google.com</owner> + <summary> + Error codes reported by ScreenCaptureKit in + SCKAudioInputStream::OnStreamError() during stream setup or while streaming + samples. + </summary> +</histogram> + <histogram name="Media.Audio.Capture.StreamCallbackError2" enum="AudioCaptureDeviceError" expires_after="never"> <!-- expires-never: Audio pipeline health metric. -->
diff --git a/tools/metrics/histograms/metadata/page/histograms.xml b/tools/metrics/histograms/metadata/page/histograms.xml index bc055b5d..31fdb63 100644 --- a/tools/metrics/histograms/metadata/page/histograms.xml +++ b/tools/metrics/histograms/metadata/page/histograms.xml
@@ -2492,26 +2492,6 @@ </summary> </histogram> -<histogram name="PageLoad.Internal.Renderer.PresentationTime.DeltaFromSwapTime" - units="ms" expires_after="2023-08-08"> - <owner>jonross@chromium.org</owner> - <owner>graphics-dev@chromium.org</owner> - <summary> - 'Swap time' is the timestamp of the renderer submitting a CompositorFrame, - and 'Presentation time' is the timestamp of the frame becoming visible on - screen. This metric measures the duration between the swap-time and the - presentation-time. This is recorded only if a valid presentation-timestamp - is available. See PageLoad.Internal.Renderer.PresentationTime.Valid for how - often the presentation-timestamp is valid. This is reported only for - compositor-frames that report a paint-timing metric (e.g. - FirstContentfulPaint etc.), and after that frame has been displayed on - screen. - - The metric had expired on 2020-09-27, and re-enabled on 2021-03-17. So the - data within this period is incomplete. - </summary> -</histogram> - <histogram name="PageLoad.Internal.Renderer.PresentationTime.Valid" enum="Boolean" expires_after="2024-03-17"> <owner>jonross@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/power/histograms.xml b/tools/metrics/histograms/metadata/power/histograms.xml index 8746371..13b4f23 100644 --- a/tools/metrics/histograms/metadata/power/histograms.xml +++ b/tools/metrics/histograms/metadata/power/histograms.xml
@@ -1118,6 +1118,41 @@ </summary> </histogram> +<histogram name="Power.BatteryLife.Detail.RollingAverage.{BatteryCapacityType}" + units="minute" expires_after="2024-05-12"> + <owner>puthik@chromium.org</owner> + <owner>chromeos-platform-power@google.com</owner> + <summary> + ChromeOS rolling average of the battery life while in active state, measured + in minutes using the {BatteryCapacityType}. + + This is calculated by taking the average of the last 10 samples of the + Power.BatteryLife.{BatteryCapacityType} metrics. + + The detail version put the data outside of 5-13 hours in to the underflow + and overflow bucket to have more data resolution at the median range. + </summary> + <token key="BatteryCapacityType" variants="BatteryCapacityType"/> +</histogram> + +<histogram name="Power.BatteryLife.Detail.{BatteryCapacityType}" units="minute" + expires_after="2024-05-12"> + <owner>puthik@chromium.org</owner> + <owner>chromeos-platform-power@google.com</owner> + <summary> + Chrome OS battery life while in active state, measured in minutes using the + {BatteryCapacityType}. + + This is calculated using size of the battery divided by the battery + discharge rate sampling, i.e., Power.BatteryDischargeRate. Note that the + size of the battery is derated by the low battery shutdown percent. + + The detail version put the data outside of 5-13 hours in to the underflow + and overflow bucket to have more data resolution at the median range. + </summary> + <token key="BatteryCapacityType" variants="BatteryCapacityType"/> +</histogram> + <histogram name="Power.BatteryLife.RollingAverage.{BatteryCapacityType}" units="minute" expires_after="2024-05-12"> <owner>puthik@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/printing/histograms.xml b/tools/metrics/histograms/metadata/printing/histograms.xml index 01b5d9b..753fa42 100644 --- a/tools/metrics/histograms/metadata/printing/histograms.xml +++ b/tools/metrics/histograms/metadata/printing/histograms.xml
@@ -92,6 +92,35 @@ </summary> </histogram> +<histogram name="Printing.CUPS.AutomaticIppSetupResultOfUsbPrinterWithPpd" + enum="PrinterSetupResult" expires_after="2024-04-01"> + <owner>pawliczek@chromium.org</owner> + <owner>bmgordon@chromium.org</owner> + <owner>project-bolton@google.com</owner> + <summary> + The success or error code for the Ipp Everywhere setup of a USB printer. The + result is recorded only if all the following conditions are fulfilled: 1. + The setup procedure was initiated automatically when a USB printer was + physically connected to the device. 2. There is a matching PPD file that can + be used to setup the printer. 3. The printer supports IPP over USB protocol. + </summary> +</histogram> + +<histogram + name="Printing.CUPS.AutomaticPpdSetupResultOfUsbPrinterSupportingIpp" + enum="PrinterSetupResult" expires_after="2024-04-01"> + <owner>pawliczek@chromium.org</owner> + <owner>bmgordon@chromium.org</owner> + <owner>project-bolton@google.com</owner> + <summary> + The success or error code for the PPD-based setup of a USB printer. The + result is recorded only if all the following conditions are fulfilled: 1. + The setup procedure was initiated automatically when a USB printer was + physically connected to the device. 2. There is a matching PPD file that can + be used to setup the printer. 3. The printer supports IPP over USB protocol. + </summary> +</histogram> + <histogram name="Printing.CUPS.HighestIppVersion" enum="IppVersion" expires_after="2022-04-17"> <owner>skau@chromium.org</owner>
diff --git a/tools/metrics/histograms/metadata/uma/histograms.xml b/tools/metrics/histograms/metadata/uma/histograms.xml index 852074c..99192c5 100644 --- a/tools/metrics/histograms/metadata/uma/histograms.xml +++ b/tools/metrics/histograms/metadata/uma/histograms.xml
@@ -783,9 +783,10 @@ <summary> Sample rate applied to this client, expressed as number of clients per 1000 that are in the sample. Recorded on every log upload but only if the client - is eligible for sampling. (As of September 2019, the only clients eligible - for sampling are Windows and Android installs on which the UMA checkbox was - enabled by default.) + is eligible for sampling. (As of February 2021, all clients on Android and + Windows are eligible for sampling. Prior to Jan 26 2021, only Windows and + Android installs on which the UMA checkbox was enabled by default were + eligible, see b/161848997). Clients not eligible for sampling will not have this histogram recorded.
diff --git a/ui/aura/screen_ozone.cc b/ui/aura/screen_ozone.cc index 7c0c498b2..5d95311a 100644 --- a/ui/aura/screen_ozone.cc +++ b/ui/aura/screen_ozone.cc
@@ -19,13 +19,7 @@ ScreenOzone::ScreenOzone() { DCHECK(!display::Screen::HasScreen()); display::Screen::SetScreenInstance(this); -} -ScreenOzone::~ScreenOzone() { - display::Screen::SetScreenInstance(nullptr); -} - -void ScreenOzone::Initialize() { auto* platform = ui::OzonePlatform::GetInstance(); platform_screen_ = platform->CreateScreen(); if (platform_screen_) { @@ -40,6 +34,10 @@ } } +ScreenOzone::~ScreenOzone() { + display::Screen::SetScreenInstance(nullptr); +} + // static bool ScreenOzone::IsOzoneInitialized() { return ui::OzonePlatform::IsInitialized(); @@ -179,17 +177,4 @@ void ScreenOzone::OnBeforePlatformScreenInit() {} -ScopedScreenOzone::ScopedScreenOzone(const base::Location& location) - : ScopedNativeScreen(/*call_maybe_init=*/false, location) { - MaybeInit(); -} - -ScopedScreenOzone::~ScopedScreenOzone() = default; - -display::Screen* ScopedScreenOzone::CreateScreen() { - auto* screen = new ScreenOzone(); - screen->Initialize(); - return screen; -} - } // namespace aura
diff --git a/ui/aura/screen_ozone.h b/ui/aura/screen_ozone.h index 0e0ad353..73ffb221 100644 --- a/ui/aura/screen_ozone.h +++ b/ui/aura/screen_ozone.h
@@ -27,8 +27,6 @@ ~ScreenOzone() override; - void Initialize(); - // display::Screen interface. gfx::Point GetCursorScreenPoint() override; bool IsWindowUnderCursor(gfx::NativeWindow window) override; @@ -101,19 +99,6 @@ std::unique_ptr<ui::PlatformScreen> platform_screen_; }; -// ScopedScreenOzone creates a ScreenOzone instead of NativeScreen -// (created by `CreateNativeScreen()`) if the screen hasn't been set. -class AURA_EXPORT ScopedScreenOzone : public display::ScopedNativeScreen { - public: - explicit ScopedScreenOzone(const base::Location& location = FROM_HERE); - ScopedScreenOzone(const ScopedScreenOzone&) = delete; - ScopedScreenOzone operator=(const ScopedScreenOzone&) = delete; - ~ScopedScreenOzone() override; - - private: - display::Screen* CreateScreen() override; -}; - } // namespace aura #endif // UI_AURA_SCREEN_OZONE_H_
diff --git a/ui/display/display.cc b/ui/display/display.cc index 5200e03..96eb41e 100644 --- a/ui/display/display.cc +++ b/ui/display/display.cc
@@ -350,7 +350,16 @@ color_space = GetForcedDisplayColorProfile(); } #endif - return new DisplayColorSpacesRef(gfx::DisplayColorSpaces(color_space)); + // The default format on Mac is BGRA in screen_mac.cc, so we set it here + // too so that it matches with --ensure-forced-color-profile. + const gfx::BufferFormat format = +#if BUILDFLAG(IS_MAC) + gfx::BufferFormat::BGRA_8888; +#else + gfx::BufferFormat::RGBA_8888; +#endif + return base::MakeRefCounted<DisplayColorSpacesRef>( + gfx::DisplayColorSpaces(color_space, format)); }(); return default_color_spaces_ref; }
diff --git a/ui/display/mac/screen_mac.mm b/ui/display/mac/screen_mac.mm index 18d1dbb..074d92bd 100644 --- a/ui/display/mac/screen_mac.mm +++ b/ui/display/mac/screen_mac.mm
@@ -128,7 +128,7 @@ } } gfx::DisplayColorSpaces display_color_spaces(icc_profile.GetColorSpace(), - gfx::BufferFormat::RGBA_8888); + gfx::BufferFormat::BGRA_8888); if (HasForceDisplayColorProfile()) { if (Display::HasEnsureForcedColorProfile()) { if (display_color_spaces != display.GetColorSpaces()) {
diff --git a/ui/display/screen.cc b/ui/display/screen.cc index b74a058..5e8e23a 100644 --- a/ui/display/screen.cc +++ b/ui/display/screen.cc
@@ -217,38 +217,20 @@ return result; } -#if !BUILDFLAG(IS_ANDROID) +#if BUILDFLAG(IS_APPLE) ScopedNativeScreen::ScopedNativeScreen(const base::Location& location) { - MaybeInit(location); -} - -ScopedNativeScreen::ScopedNativeScreen(bool call_maybe_init, - const base::Location& location) { - if (call_maybe_init) - MaybeInit(location); -} - -ScopedNativeScreen::~ScopedNativeScreen() { - Shutdown(); -} - -void ScopedNativeScreen::MaybeInit(const base::Location& location) { - maybe_init_called_ = true; if (!Screen::HasScreen()) { #if BUILDFLAG(IS_IOS) Screen::GetScreen(); #else - screen_ = base::WrapUnique(CreateScreen()); - // ScreenOzone and DesktopScreenWin sets the instance by itself. - if (Screen::GetScreen() != screen_.get()) - Screen::SetScreenInstance(screen_.get(), location); + screen_ = base::WrapUnique(CreateNativeScreen()); + Screen::SetScreenInstance(screen_.get(), location); #endif } } -void ScopedNativeScreen::Shutdown() { - DCHECK(maybe_init_called_); +ScopedNativeScreen::~ScopedNativeScreen() { if (screen_) { DCHECK_EQ(screen_.get(), Screen::GetScreen()); Screen::SetScreenInstance(nullptr); @@ -256,10 +238,6 @@ } } -Screen* ScopedNativeScreen::CreateScreen() { - return CreateNativeScreen(); -} - #endif } // namespace display
diff --git a/ui/display/screen.h b/ui/display/screen.h index 71f50d32..04753f8 100644 --- a/ui/display/screen.h +++ b/ui/display/screen.h
@@ -237,37 +237,24 @@ #endif // BUILDFLAG(IS_CHROMEOS_LACROS) || BUILDFLAG(IS_LINUX) }; +#if BUILDFLAG(IS_APPLE) + +// TODO(oshima): move this to separate apple specific file. + // TODO(crbug.com/1317416): Make this static private member of // ScopedNativeScreen. DISPLAY_EXPORT Screen* CreateNativeScreen(); -// Android does not have `CreateNativeScreen()`. -#if !BUILDFLAG(IS_ANDROID) - // ScopedNativeScreen creates a native screen if there is no screen created yet // (e.g. by a unit test). -class DISPLAY_EXPORT ScopedNativeScreen { +class DISPLAY_EXPORT ScopedNativeScreen final { public: explicit ScopedNativeScreen(const base::Location& location = FROM_HERE); ScopedNativeScreen(const ScopedNativeScreen&) = delete; ScopedNativeScreen& operator=(const ScopedNativeScreen&) = delete; - virtual ~ScopedNativeScreen(); - - // Create and initialize the screen instance if the screen instance does not - // exist yet. - void MaybeInit(const base::Location& location = FROM_HERE); - void Shutdown(); - - Screen* screen() { return screen_.get(); } - - virtual Screen* CreateScreen(); - - protected: - explicit ScopedNativeScreen(bool call_maybe_init, - const base::Location& location = FROM_HERE); + ~ScopedNativeScreen(); private: - bool maybe_init_called_{false}; std::unique_ptr<Screen> screen_; };
diff --git a/ui/display/screen_aura.cc b/ui/display/screen_aura.cc index f880e318..dadad80b 100644 --- a/ui/display/screen_aura.cc +++ b/ui/display/screen_aura.cc
@@ -13,9 +13,4 @@ return view; } -Screen* CreateNativeScreen() { - NOTREACHED() << "Implementation should be installed at higher level."; - return NULL; -} - } // namespace display
diff --git a/ui/native_theme/native_theme.cc b/ui/native_theme/native_theme.cc index d017d73c..18722961 100644 --- a/ui/native_theme/native_theme.cc +++ b/ui/native_theme/native_theme.cc
@@ -349,4 +349,7 @@ return ShouldUseDarkColors() ? ColorScheme::kDark : ColorScheme::kLight; } +int NativeTheme::GetPaintedScrollbarTrackInset() const { + return 0; +} } // namespace ui
diff --git a/ui/native_theme/native_theme.h b/ui/native_theme/native_theme.h index 341248a..ddfd9e4 100644 --- a/ui/native_theme/native_theme.h +++ b/ui/native_theme/native_theme.h
@@ -381,6 +381,7 @@ virtual gfx::Size GetPartSize(Part part, State state, const ExtraParams& extra) const = 0; + virtual int GetPaintedScrollbarTrackInset() const; virtual float GetBorderRadiusForPart(Part part, float width,
diff --git a/ui/native_theme/native_theme_constants_fluent.h b/ui/native_theme/native_theme_constants_fluent.h index 8cfb69e..d76bd242 100644 --- a/ui/native_theme/native_theme_constants_fluent.h +++ b/ui/native_theme/native_theme_constants_fluent.h
@@ -61,6 +61,11 @@ constexpr char kFluentScrollbarLeftArrow[] = "\uEDD9"; constexpr char kFluentScrollbarRightArrow[] = "\uEDDA"; +// Track and button inset to be applied at the time of painting overlay +// scrollbars. This will yield a 1dp border around the track that is +// transparent yet interactive. +constexpr int kFluentPaintedScrollbarTrackInset = 1; + } // namespace ui #endif // UI_NATIVE_THEME_NATIVE_THEME_CONSTANTS_FLUENT_H_
diff --git a/ui/native_theme/native_theme_fluent.cc b/ui/native_theme/native_theme_fluent.cc index d1234e9..3c59bdc 100644 --- a/ui/native_theme/native_theme_fluent.cc +++ b/ui/native_theme/native_theme_fluent.cc
@@ -5,6 +5,7 @@ #include "ui/native_theme/native_theme_fluent.h" #include "base/no_destructor.h" +#include "base/notreached.h" #include "cc/paint/paint_canvas.h" #include "cc/paint/paint_flags.h" #include "third_party/skia/include/core/SkFont.h" @@ -16,6 +17,7 @@ #include "ui/gfx/geometry/rect_f.h" #include "ui/gfx/geometry/rrect_f.h" #include "ui/native_theme/native_theme_constants_fluent.h" +#include "ui/native_theme/native_theme_features.h" namespace ui { @@ -338,9 +340,11 @@ case Part::kScrollbarRightArrow: return kFluentScrollbarRightArrow; default: - NOTREACHED(); - return nullptr; + NOTREACHED_NORETURN(); } } +int NativeThemeFluent::GetPaintedScrollbarTrackInset() const { + return kFluentPaintedScrollbarTrackInset; +} } // namespace ui
diff --git a/ui/native_theme/native_theme_fluent.h b/ui/native_theme/native_theme_fluent.h index 90d097a..18945a2 100644 --- a/ui/native_theme/native_theme_fluent.h +++ b/ui/native_theme/native_theme_fluent.h
@@ -59,6 +59,7 @@ gfx::Size GetPartSize(Part part, State state, const ExtraParams& extra) const override; + int GetPaintedScrollbarTrackInset() const override; private: friend class NativeThemeFluentTest;
diff --git a/ui/views/test/test_desktop_screen_ozone.cc b/ui/views/test/test_desktop_screen_ozone.cc index f5ba433..bb9fa210 100644 --- a/ui/views/test/test_desktop_screen_ozone.cc +++ b/ui/views/test/test_desktop_screen_ozone.cc
@@ -11,9 +11,7 @@ // static std::unique_ptr<display::Screen> TestDesktopScreenOzone::Create() { - auto screen = std::make_unique<TestDesktopScreenOzone>(); - screen->Initialize(); - return screen; + return std::make_unique<TestDesktopScreenOzone>(); } TestDesktopScreenOzone* TestDesktopScreenOzone::GetInstance() {
diff --git a/ui/views/widget/desktop_aura/desktop_screen_ozone.cc b/ui/views/widget/desktop_aura/desktop_screen_ozone.cc index 13fe3b7..a6f4fea 100644 --- a/ui/views/widget/desktop_aura/desktop_screen_ozone.cc +++ b/ui/views/widget/desktop_aura/desktop_screen_ozone.cc
@@ -27,9 +27,7 @@ #if !BUILDFLAG(IS_LINUX) std::unique_ptr<display::Screen> CreateDesktopScreen() { - auto screen = std::make_unique<DesktopScreenOzone>(); - screen->Initialize(); - return screen; + return std::make_unique<DesktopScreenOzone>(); } #endif
diff --git a/ui/views/widget/desktop_aura/desktop_screen_ozone_linux.cc b/ui/views/widget/desktop_aura/desktop_screen_ozone_linux.cc index ca6f442..687eff5 100644 --- a/ui/views/widget/desktop_aura/desktop_screen_ozone_linux.cc +++ b/ui/views/widget/desktop_aura/desktop_screen_ozone_linux.cc
@@ -50,9 +50,7 @@ }; std::unique_ptr<display::Screen> CreateDesktopScreen() { - auto screen = std::make_unique<DesktopScreenOzoneLinux>(); - screen->Initialize(); - return screen; + return std::make_unique<DesktopScreenOzoneLinux>(); } } // namespace views
diff --git a/ui/webui/resources/cr_components/omnibox/realbox_match.ts b/ui/webui/resources/cr_components/omnibox/realbox_match.ts index 7548a3d0..c353d64 100644 --- a/ui/webui/resources/cr_components/omnibox/realbox_match.ts +++ b/ui/webui/resources/cr_components/omnibox/realbox_match.ts
@@ -244,14 +244,12 @@ // Only handle main (generally left) button presses. return; } - this.dispatchEvent(new CustomEvent('match-remove', { - bubbles: true, - composed: true, - detail: this.matchIndex, - })); e.preventDefault(); // Prevents default browser action (navigation). e.stopPropagation(); // Prevents <iron-selector> from selecting the match. + + this.pageHandler_.deleteAutocompleteMatch( + this.matchIndex, this.match.destinationUrl); } private onRemoveButtonMouseDown_(e: Event) {
diff --git a/v8 b/v8 index 160c55f..cf3e1f0 160000 --- a/v8 +++ b/v8
@@ -1 +1 @@ -Subproject commit 160c55f1d4b89c8a9e249130838d9e729325b528 +Subproject commit cf3e1f0da09e0b0f79590acafeca0ce554a4b16b